X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Fmodels.py;h=226a69c3a4037d64afbb3684189a2d446df8d3a5;hb=0deabd4014cbc9419d203356786e966c4f803ea3;hp=f6943fc5296553ff10050b8925fd563175d276e4;hpb=c561ebe710d6e6a43aa4afc6c2036a215378ce87;p=patchwork diff --git a/apps/patchwork/models.py b/apps/patchwork/models.py index f6943fc..226a69c 100644 --- a/apps/patchwork/models.py +++ b/apps/patchwork/models.py @@ -22,15 +22,22 @@ from django.contrib.auth.models import User from django.core.urlresolvers import reverse from django.contrib.sites.models import Site from django.conf import settings +from patchwork.parser import hash_patch import django.oldforms as oldforms import re import datetime, time import string import random -import hashlib -from email.mime.text import MIMEText -import email.utils + +try: + from email.mime.text import MIMEText + import email.utils +except ImportError: + # Python 2.4 compatibility + from email.MIMEText import MIMEText + import email.Utils + email.utils = email.Utils class Person(models.Model): email = models.CharField(max_length=255, unique = True) @@ -50,9 +57,6 @@ class Person(models.Model): class Meta: verbose_name_plural = 'People' - class Admin: - pass - class Project(models.Model): linkname = models.CharField(max_length=255, unique=True) name = models.CharField(max_length=255, unique=True) @@ -62,9 +66,6 @@ class Project(models.Model): def __str__(self): return self.name - class Admin: - pass - class UserProfile(models.Model): user = models.ForeignKey(User, unique = True) primary_project = models.ForeignKey(Project, null = True) @@ -79,8 +80,8 @@ class UserProfile(models.Model): def name(self): if self.user.first_name or self.user.last_name: - names = filter(bool, [self.user.first_name, self.user.last_name]) - return ' '.join(names) + names = filter(bool, [self.user.first_name, self.user.last_name]) + return ' '.join(names) return self.user.username def contributor_projects(self): @@ -114,19 +115,16 @@ class UserProfile(models.Model): return qs def save(self): - super(UserProfile, self).save() - people = Person.objects.filter(email = self.user.email) - if not people: - person = Person(email = self.user.email, - name = self.name(), user = self.user) + super(UserProfile, self).save() + people = Person.objects.filter(email = self.user.email) + if not people: + person = Person(email = self.user.email, + name = self.name(), user = self.user) person.save() - else: - for person in people: - person.user = self.user - person.save() - - class Admin: - pass + else: + for person in people: + person.link_to_user(self.user) + person.save() def __str__(self): return self.name() @@ -138,48 +136,16 @@ def _confirm_key(): str += random.choice(allowedchars) return str; -class RegistrationRequest(models.Model): - username = models.CharField(max_length = 30, unique = True) - first_name = models.CharField(max_length = 50) - last_name = models.CharField(max_length = 50) - email = models.CharField(max_length = 200, unique = True) - password = models.CharField(max_length = 200) - key = models.CharField(max_length = 32, default = _confirm_key) - - def create_user(self): - user = User.objects.create_user(self.username, - self.email, self.password) - user.first_name = self.first_name - user.last_name = self.last_name - user.save() - profile = UserProfile(user = user) - profile.save() - self.delete() - - # link a person to this user. if none exists, create. - person = None - try: - person = Person.objects.get(email = user.email) - except Exception: - pass - if not person: - person = Person(email = user.email) - - person.link_to_user(user) - person.save() - - return user - - class Admin: - pass - class UserPersonConfirmation(models.Model): user = models.ForeignKey(User) email = models.CharField(max_length = 200) - date = models.DateTimeField(default=datetime.datetime.now) 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) @@ -190,11 +156,7 @@ class UserPersonConfirmation(models.Model): person.link_to_user(self.user) person.save() - - - class Admin: - pass - + self.active = False class State(models.Model): name = models.CharField(max_length = 100) @@ -207,31 +169,32 @@ class State(models.Model): class Meta: ordering = ['ordering'] - class Admin: - pass - -class HashField(models.Field): +class HashField(models.CharField): __metaclass__ = models.SubfieldBase def __init__(self, algorithm = 'sha1', *args, **kwargs): self.algorithm = algorithm - super(HashField, self).__init__(*args, **kwargs) + try: + import hashlib + def _construct(string = ''): + return hashlib.new(self.algorithm, string) + self.construct = _construct + self.n_bytes = len(hashlib.new(self.algorithm).hexdigest()) + except ImportError: + modules = { 'sha1': 'sha', 'md5': 'md5'} - def db_type(self): - n_bytes = len(hashlib.new(self.algorithm).digest()) - if settings.DATABASE_ENGINE == 'postgresql': - return 'bytea' - elif settings.DATABASE_ENGINE == 'mysql': - return 'binary(%d)' % n_bytes + if algorithm not in modules.keys(): + raise NameError("Unknown algorithm '%s'" % algorithm) + + 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) @@ -245,21 +208,23 @@ 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() + hash = HashField(null = True, db_index = True) def __str__(self): return self.name def comments(self): - return Comment.objects.filter(patch = self) + return Comment.objects.filter(patch = self) def save(self): - try: + try: s = self.state except: self.state = State.objects.get(ordering = 0) - if hash is None: - print "no hash" + + if self.hash is None: + self.hash = hash_patch(self.content).hexdigest() + super(Patch, self).save() def is_editable(self, user): @@ -312,9 +277,6 @@ class Patch(models.Model): verbose_name_plural = 'Patches' ordering = ['date'] - class Admin: - pass - class Comment(models.Model): patch = models.ForeignKey(Patch) msgid = models.CharField(max_length=255, unique = True) @@ -323,9 +285,6 @@ class Comment(models.Model): headers = models.TextField(blank = True) content = models.TextField() - class Admin: - pass - class Meta: ordering = ['date'] @@ -342,9 +301,6 @@ class Bundle(models.Model): class Meta: unique_together = [('owner', 'name')] - class Admin: - pass - def public_url(self): if not self.public: return None