aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'okupy/common/fields.py')
-rw-r--r--okupy/common/fields.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/okupy/common/fields.py b/okupy/common/fields.py
new file mode 100644
index 0000000..86754f0
--- /dev/null
+++ b/okupy/common/fields.py
@@ -0,0 +1,34 @@
+# vim:fileencoding=utf8:et:ts=4:sts=4:sw=4:ft=python
+
+from django.db.models import fields
+
+from ldapdb import escape_ldap_filter
+
+class ACLField(fields.Field):
+ def _group(self):
+ return self.name.split('_')[1] + '.group'
+
+ def from_ldap(self, value, connection):
+ if self._group() in value:
+ return True
+ else:
+ return False
+
+ def get_db_prep_lookup(self, lookup_type, value, connection, prepared=False):
+ "Returns field's value prepared for database lookup."
+ return [self.get_prep_lookup(lookup_type, value)]
+
+ def get_db_prep_save(self, value, connection):
+ return [x.encode(connection.charset) for x in value]
+
+ def get_prep_lookup(self, lookup_type, value):
+ "Perform preliminary non-db specific lookup checks and conversions"
+ if value not in (False, True):
+ raise TypeError("Invalid value")
+ if lookup_type == 'exact':
+ if value:
+ return escape_ldap_filter(self._group())
+ else:
+ raise NotImplementedError(
+ "Negative lookups on ACLField are not yet implemented")
+ raise TypeError("ACLField has invalid lookup: %s" % lookup_type)