I am trying to create a Model Fields that is basically a AutoField, but in base 36.
Here my definition:
class AutoBase36Field(models.AutoField):
description = _("AutoField on base36")
@staticmethod
def base36encode(number):
try:
number = int(number)
except:
raise TypeError('number must be an integer')
if not isinstance(number, int):
raise TypeError('number must be an integer')
if number < 0:
raise ValueError('number must be positive')
alphabet, base36 = ['0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '']
while number:
number, i = divmod(number, 36)
base36 = alphabet[i] + base36
return base36 or alphabet[0]
@staticmethod
def base36decode(string):
if string is None:
return None
return int(string, 36)
def to_python(self, value):
if value is None:
return value
try:
return self.base36encode(value)
except (TypeError, ValueError):
raise exceptions.ValidationError(
self.error_messages['invalid'],
code='invalid',
params={'value': value},
)
def from_db_value(self, value, expression, connection, context):
if value is None:
return value
return self.base36encode(value)
def get_prep_value(self, value):
if value is None:
return None
return self.base36decode(value)
And here is a Model class I am using:
class Content(models.Model):
mzk_id = AutoBase36Field(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
name = models.TextField()
I have a test failing:
def test_incrementation_of_content_mzk_id(self):
content1 = Content(name="a")
content1.save()
mzk_id_1 = int(content1.mzk_id, 36)
As mzk_id is kept as an integer. Basically when creating the incremented field, Django doesn't go through to_python()... I am not sure why...
Does anyone could help me up?