Skip to content

Commit

Permalink
Just modify the Django UUIDField for our 32 digit hex representation.
Browse files Browse the repository at this point in the history
  • Loading branch information
rtibbles committed Apr 28, 2022
1 parent 7c497ec commit 7d9efff
Showing 1 changed file with 8 additions and 40 deletions.
48 changes: 8 additions & 40 deletions morango/models/fields/uuids.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,67 +2,35 @@
import uuid

from django.db import models

from morango.utils import _assert


def sha2_uuid(*args):
return hashlib.sha256("::".join(args).encode("utf-8")).hexdigest()[:32]


class UUIDField(models.CharField):
class UUIDField(models.UUIDField):
"""
Adaptation of Django's UUIDField, but with 32-char hex representation as Python representation rather than a UUID instance.
"""

def __init__(self, *args, **kwargs):
kwargs["max_length"] = 32
super(UUIDField, self).__init__(*args, **kwargs)

def prepare_value(self, value):
if isinstance(value, uuid.UUID):
return value.hex
return value

def deconstruct(self):
name, path, args, kwargs = super(UUIDField, self).deconstruct()
del kwargs["max_length"]
return name, path, args, kwargs

def get_internal_type(self):
return "UUIDField"

def get_db_prep_value(self, value, connection, prepared=False):
if value is None:
return None
if not isinstance(value, uuid.UUID):
try:
value = uuid.UUID(value)
except AttributeError:
raise TypeError(self.error_messages["invalid"] % {"value": value})
value = super(UUIDField, self).to_python(value)

if connection.features.has_native_uuid_field:
return value
return value.hex

def from_db_value(self, value, expression, connection, context):
return self.to_python(value)

def to_python(self, value):
if isinstance(value, uuid.UUID):
return value.hex
return value

def get_default(self):
"""
Returns the default value for this field.
"""
if self.has_default():
if callable(self.default):
default = self.default()
if isinstance(default, uuid.UUID):
return default.hex
return default
if isinstance(self.default, uuid.UUID):
return self.default.hex
return self.default
return None
value = super(UUIDField, self).to_python(value)
return value.hex if isinstance(value, uuid.UUID) else value


class UUIDModelMixin(models.Model):
Expand Down

0 comments on commit 7d9efff

Please sign in to comment.