summaryrefslogtreecommitdiff
path: root/coip/uuidfield.py
diff options
context:
space:
mode:
Diffstat (limited to 'coip/uuidfield.py')
-rw-r--r--coip/uuidfield.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/coip/uuidfield.py b/coip/uuidfield.py
new file mode 100644
index 0000000..44a789c
--- /dev/null
+++ b/coip/uuidfield.py
@@ -0,0 +1,61 @@
+'''
+Created on Jun 19, 2011
+
+@author: leifj
+'''
+
+from django.db.models import CharField
+
+try:
+ import uuid
+except ImportError:
+ from django.utils import uuid
+
+class UUIDVersionError(Exception):
+ pass
+
+class UUIDField(CharField):
+ """ UUIDField for Django, supports all uuid versions which are natively
+ suported by the uuid python module.
+ """
+
+ def __init__(self, verbose_name=None, name=None, auto=True, version=1, node=None, clock_seq=None, namespace=None, **kwargs):
+ kwargs['maxlength'] = 36
+ if auto:
+ kwargs['blank'] = True
+ kwargs['editable'] = kwargs.get('editable', False)
+ self.version = version
+ if version==1:
+ self.node, self.clock_seq = node, clock_seq
+ elif version==3 or version==5:
+ self.namespace, self.name = namespace, name
+ CharField.__init__(self, verbose_name, name, **kwargs)
+
+ def get_internal_type(self):
+ return "UUIDField"
+
+ def create_uuid(self):
+ if not self.version or self.version==4:
+ return uuid.uuid4()
+ elif self.version==1:
+ return uuid.uuid1(self.node, self.clock_seq)
+ elif self.version==2:
+ raise UUIDVersionError("UUID version 2 is not supported.")
+ elif self.version==3:
+ return uuid.uuid3(self.namespace, self.name)
+ elif self.version==5:
+ return uuid.uuid5(self.namespace, self.name)
+ else:
+ raise UUIDVersionError("UUID version %s is not valid." % self.version)
+
+ def pre_save(self, model_instance, add):
+ if self.auto and add:
+ value = unicode(self.create_uuid())
+ setattr(model_instance, self.attname, value)
+ return value
+ else:
+ value = super(UUIDField, self).pre_save(model_instance, add)
+ if self.auto and not value:
+ value = unicode(self.create_uuid())
+ setattr(model_instance, self.attname, value)
+ return value \ No newline at end of file