X-Git-Url: https://git.ozlabs.org/?p=patchwork;a=blobdiff_plain;f=apps%2Fpatchwork%2Fmodels.py;h=f21d07322c544d3860a3128f65f76a7faa12b880;hp=134e12f7f30bb0b74360986ce78822742770352f;hb=41f19b6643b44768dc06561c992c04ed6148477d;hpb=ab21927af7fa4003a0da8986c8448cb4cb134d6c diff --git a/apps/patchwork/models.py b/apps/patchwork/models.py index 134e12f..f21d073 100644 --- a/apps/patchwork/models.py +++ b/apps/patchwork/models.py @@ -26,7 +26,6 @@ from patchwork.parser import hash_patch import re import datetime, time -import string import random try: @@ -69,6 +68,11 @@ class Project(models.Model): def __unicode__(self): return self.name + def is_editable(self, user): + if not user.is_authenticated(): + return False + return self in user.get_profile().maintainer_projects.all() + class UserProfile(models.Model): user = models.ForeignKey(User, unique = True) primary_project = models.ForeignKey(Project, null = True, blank = True) @@ -89,11 +93,10 @@ class UserProfile(models.Model): def contributor_projects(self): submitters = Person.objects.filter(user = self.user) - return Project.objects \ - .filter(id__in = \ - Patch.objects.filter( - submitter__in = submitters) \ - .values('project_id').query) + return Project.objects.filter(id__in = + Patch.objects.filter( + submitter__in = submitters) + .values('project_id').query) def sync_person(self): @@ -112,8 +115,8 @@ class UserProfile(models.Model): qs = qs.filter(archived = False) \ .filter(delegate = self.user) \ - .filter(state__in = \ - State.objects.filter(action_required = True) \ + .filter(state__in = + State.objects.filter(action_required = True) .values('pk').query) return qs @@ -132,6 +135,14 @@ class UserProfile(models.Model): def __unicode__(self): return self.name() +def _user_created_callback(sender, created, instance, **kwargs): + if not created: + return + profile = UserProfile(user = instance) + profile.save() + +models.signals.post_save.connect(_user_created_callback, sender = User) + class State(models.Model): name = models.CharField(max_length = 100) ordering = models.IntegerField(unique = True) @@ -217,12 +228,7 @@ class Patch(models.Model): if self.submitter.user == user or self.delegate == user: return True - profile = user.get_profile() - return self.project in user.get_profile().maintainer_projects.all() - - def form(self): - f = PatchForm(instance = self, prefix = self.id) - return f + return self.project.is_editable(user) def filename(self): fname_re = re.compile('[^-_A-Za-z0-9\.]+') @@ -250,7 +256,6 @@ class Patch(models.Model): else: postscript = '' - responses = False for comment in Comment.objects.filter(patch = self) \ .exclude(msgid = self.msgid): body += comment.patch_responses() @@ -304,7 +309,7 @@ class Comment(models.Model): re.M | re.I) def patch_responses(self): - return ''.join([ match.group(0) + '\n' for match in \ + return ''.join([ match.group(0) + '\n' for match in self.response_re.finditer(self.content)]) class Meta: @@ -322,7 +327,7 @@ class Bundle(models.Model): return self.patches.all().count() def ordered_patches(self): - return self.patches.order_by('bundlepatch__order'); + return self.patches.order_by('bundlepatch__order') def append_patch(self, patch): # todo: use the aggregate queries in django 1.1 @@ -357,7 +362,7 @@ class Bundle(models.Model): })) def mbox(self): - return '\n'.join([p.mbox().as_string(True) \ + return '\n'.join([p.mbox().as_string(True) for p in self.ordered_patches()]) class BundlePatch(models.Model): @@ -369,34 +374,35 @@ class BundlePatch(models.Model): unique_together = [('bundle', 'patch')] ordering = ['order'] -class UserPersonConfirmation(models.Model): - user = models.ForeignKey(User) +class EmailConfirmation(models.Model): + validity = datetime.timedelta(days = settings.CONFIRMATION_VALIDITY_DAYS) + type = models.CharField(max_length = 20, choices = [ + ('userperson', 'User-Person association'), + ('registration', 'Registration'), + ('optout', 'Email opt-out'), + ]) email = models.CharField(max_length = 200) + user = models.ForeignKey(User, null = True) key = HashField() - date = models.DateTimeField(default=datetime.datetime.now) + 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__iexact = self.email) - except Exception: - pass - if not person: - person = Person(email = self.email) - - person.link_to_user(self.user) - person.save() + def deactivate(self): self.active = False self.save() + def is_valid(self): + return self.date + self.validity > datetime.datetime.now() + 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() + super(EmailConfirmation, self).save() +class EmailOptout(models.Model): + email = models.CharField(max_length = 200, primary_key = True) + def __unicode__(self): + return self.email