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
-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)
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):
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()
+ else:
+ for person in people:
+ person.link_to_user(self.user)
+ person.save()
def __str__(self):
return self.name()
active = models.BooleanField(default = True)
def confirm(self):
- if not self.active:
- return
+ if not self.active:
+ return
person = None
try:
person = Person.objects.get(email = self.email)
class Meta:
ordering = ['ordering']
-class HashField(models.Field):
+class HashField(models.CharField):
__metaclass__ = models.SubfieldBase
def __init__(self, algorithm = 'sha1', *args, **kwargs):
try:
import hashlib
self.hashlib = True
+ self.n_bytes = len(hashlib.new(self.algorithm).hexdigest())
except ImportError:
self.hashlib = False
if algorithm == 'sha1':
import sha
- self.hash_constructor = sha.new
+ hash_constructor = sha.new
elif algorithm == 'md5':
import md5
- self.hash_constructor = md5.new
+ hash_constructor = md5.new
else:
raise NameError("Unknown algorithm '%s'" % algorithm)
-
+ self.n_bytes = len(hash_constructor().hexdigest())
+
+ kwargs['max_length'] = self.n_bytes
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 == 'postgresql':
- return 'bytea'
- elif settings.DATABASE_ENGINE == 'mysql':
- return 'binary(%d)' % n_bytes
-
- def to_python(self, value):
- return value
-
- def get_db_prep_save(self, value):
- return ''.join(map(lambda x: '\\%03o' % ord(x), value))
-
- def get_manipulator_field_objs(self):
- return [oldforms.TextField]
+ return 'char(%d)' % self.n_bytes
class Patch(models.Model):
project = models.ForeignKey(Project)
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):