# This code is under the MIT license. # Inspired by this StackOverflow question: http://stackoverflow.com/questions/3295405/creating-django-objects-with-a-random-primary-key import struct from Crypto.Cipher import DES from django.db import models def base36encode(number): """Encode number to string of alphanumeric characters (0 to z). (Code taken from Wikipedia).""" if not isinstance(number, (int, long)): raise TypeError('number must be an integer') if number < 0: raise ValueError('number must be positive') alphabet = '0123456789abcdefghijklmnopqrstuvwxyz' base36 = '' while number: number, i = divmod(number, 36) base36 = alphabet[i] + base36 return base36 or alphabet[0] def base36decode(numstr): """Convert a base-36 string (made of alphanumeric characters) to its numeric value.""" return int(numstr,36) class EncryptedPKModelManager(models.Manager): """This manager allows models to be identified based on their encrypted_pk value.""" def get(self, *args, **kwargs): encrypted_pk = kwargs.pop('encrypted_pk', None) if encrypted_pk: # If found, decrypt encrypted_pk argument and set pk argument to the appropriate value encryption_obj = DES.new(self.model.PK_SECRET_KEY) # This 8 character secret key should be changed! kwargs['pk'] = struct.unpack('