X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Fmodels.py;h=d70fdb208eab49a29eb62daf1487c38db03993ab;hb=b261b3cff0c7f4aacb6c9bda5f5491d340b1af17;hp=f354acbdc96b038742d1b06f69c8bc9b628bfbbf;hpb=0521d8b2e26242fa3a161df50b3f61b9a05ae0dd;p=patchwork diff --git a/apps/patchwork/models.py b/apps/patchwork/models.py index f354acb..d70fdb2 100644 --- a/apps/patchwork/models.py +++ b/apps/patchwork/models.py @@ -129,35 +129,6 @@ class UserProfile(models.Model): def __str__(self): return self.name() -def _confirm_key(): - allowedchars = string.ascii_lowercase + string.digits - str = '' - for i in range(1, 32): - str += random.choice(allowedchars) - return str; - -class UserPersonConfirmation(models.Model): - user = models.ForeignKey(User) - email = models.CharField(max_length = 200) - key = models.CharField(max_length = 32, default = _confirm_key) - date = models.DateTimeField(default=datetime.datetime.now) - active = models.BooleanField(default = True) - - def confirm(self): - if not self.active: - return - person = None - try: - person = Person.objects.get(email = self.email) - except Exception: - pass - if not person: - person = Person(email = self.email) - - person.link_to_user(self.user) - person.save() - self.active = False - class State(models.Model): name = models.CharField(max_length = 100) ordering = models.IntegerField(unique = True) @@ -169,48 +140,32 @@ class State(models.Model): class Meta: ordering = ['ordering'] -class HashField(models.Field): +class HashField(models.CharField): __metaclass__ = models.SubfieldBase def __init__(self, algorithm = 'sha1', *args, **kwargs): self.algorithm = algorithm try: import hashlib - self.hashlib = True + def _construct(string = ''): + return hashlib.new(self.algorithm, string) + self.construct = _construct + self.n_bytes = len(hashlib.new(self.algorithm).hexdigest()) except ImportError: - self.hashlib = False - if algorithm == 'sha1': - import sha - self.hash_constructor = sha.new - elif algorithm == 'md5': - import md5 - self.hash_constructor = md5.new - else: + modules = { 'sha1': 'sha', 'md5': 'md5'} + + if algorithm not in modules.keys(): raise NameError("Unknown algorithm '%s'" % algorithm) - - super(HashField, self).__init__(*args, **kwargs) - def db_type(self): - if self.hashlib: - n_bytes = len(hashlib.new(self.algorithm).digest()) - else: - n_bytes = len(self.hash_constructor().digest()) - if settings.DATABASE_ENGINE.startswith('postgresql'): - return 'bytea' - elif settings.DATABASE_ENGINE == 'mysql': - return 'binary(%d)' % n_bytes - else: - raise Exception("Unknown database engine '%s'" % \ - settings.DATABASE_ENGINE) + self.construct = __import__(modules[algorithm]).new - def to_python(self, value): - return value + self.n_bytes = len(self.construct().hexdigest()) - def get_db_prep_save(self, value): - return ''.join(map(lambda x: '\\%03o' % ord(x), value)) + kwargs['max_length'] = self.n_bytes + super(HashField, self).__init__(*args, **kwargs) - def get_manipulator_field_objs(self): - return [oldforms.TextField] + def db_type(self): + return 'char(%d)' % self.n_bytes class Patch(models.Model): project = models.ForeignKey(Project) @@ -224,7 +179,7 @@ class Patch(models.Model): headers = models.TextField(blank = True) content = models.TextField() commit_ref = models.CharField(max_length=255, null = True, blank = True) - hash = HashField(null = True) + hash = HashField(null = True, db_index = True) def __str__(self): return self.name @@ -239,7 +194,7 @@ class Patch(models.Model): self.state = State.objects.get(ordering = 0) if self.hash is None: - self.hash = hash_patch(self.content).digest() + self.hash = hash_patch(self.content).hexdigest() super(Patch, self).save() @@ -265,7 +220,7 @@ class Patch(models.Model): def mbox(self): comment = None try: - comment = Comment.objects.get(msgid = self.msgid) + comment = Comment.objects.get(patch = self, msgid = self.msgid) except Exception: pass @@ -332,3 +287,34 @@ class Bundle(models.Model): return '\n'.join([p.mbox().as_string(True) \ for p in self.patches.all()]) +class UserPersonConfirmation(models.Model): + user = models.ForeignKey(User) + email = models.CharField(max_length = 200) + key = HashField() + date = models.DateTimeField(default=datetime.datetime.now) + active = models.BooleanField(default = True) + + def confirm(self): + if not self.active: + return + person = None + try: + person = Person.objects.get(email = self.email) + except Exception: + pass + if not person: + person = Person(email = self.email) + + person.link_to_user(self.user) + person.save() + self.active = False + self.save() + + def save(self): + max = 1 << 32 + if self.key == '': + str = '%s%s%d' % (self.user, self.email, random.randint(0, max)) + self.key = self._meta.get_field('key').construct(str).hexdigest() + super(UserPersonConfirmation, self).save() + +