aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2013-09-17 17:40:13 +0200
committerMichał Górny <mgorny@gentoo.org>2013-09-17 17:40:13 +0200
commit8ad28687fa35be3e3a493d84253a27f6c858bc57 (patch)
treed9a90ea0aaa40b08da3dc2714cc8a0982b7dcdb8
parentMerge pull request #94 from mgorny/tests-fix (diff)
downloadidentity.gentoo.org-8ad28687fa35be3e3a493d84253a27f6c858bc57.tar.gz
identity.gentoo.org-8ad28687fa35be3e3a493d84253a27f6c858bc57.tar.bz2
identity.gentoo.org-8ad28687fa35be3e3a493d84253a27f6c858bc57.zip
Import ACLField from our forked django-ldapdb.
We will work on getting a more generic field upstream. For now, let's just keep it local.
-rw-r--r--okupy/accounts/models.py3
-rw-r--r--okupy/common/fields.py34
2 files changed, 36 insertions, 1 deletions
diff --git a/okupy/accounts/models.py b/okupy/accounts/models.py
index 277f470..4da7ee4 100644
--- a/okupy/accounts/models.py
+++ b/okupy/accounts/models.py
@@ -3,9 +3,10 @@
from django.conf import settings
from django.db import models
from ldapdb.models.fields import (CharField, IntegerField, ListField,
- FloatField, ACLField, DateField)
+ FloatField, DateField)
import ldapdb.models
+from okupy.common.fields import ACLField
from okupy.crypto.models import EncryptedPKModel
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)