]> git.ozlabs.org Git - patchwork/blobdiff - apps/patchwork/models.py
models: Project.is_editable to check whether a user has edit rights
[patchwork] / apps / patchwork / models.py
index 6842622ef669650a8e950f903a2b505be5782901..737e8c5b28ebf03785d6e63d8840bcc6a962f28d 100644 (file)
@@ -21,12 +21,10 @@ from django.db import models
 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 re
 import datetime, time
-import string
 import random
 
 try:
@@ -44,12 +42,12 @@ except ImportError:
 
 class Person(models.Model):
     email = models.CharField(max_length=255, unique = True)
-    name = models.CharField(max_length=255, null = True)
-    user = models.ForeignKey(User, null = True)
+    name = models.CharField(max_length=255, null = True, blank = True)
+    user = models.ForeignKey(User, null = True, blank = True)
 
-    def __str__(self):
+    def __unicode__(self):
         if self.name:
-            return '%s <%s>' % (self.name, self.email)
+            return u'%s <%s>' % (self.name, self.email)
         else:
             return self.email
 
@@ -66,12 +64,17 @@ class Project(models.Model):
     listid = models.CharField(max_length=255, unique=True)
     listemail = models.CharField(max_length=200)
 
-    def __str__(self):
+    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)
+    primary_project = models.ForeignKey(Project, null = True, blank = True)
     maintainer_projects = models.ManyToManyField(Project,
             related_name = 'maintainer_project')
     send_email = models.BooleanField(default = False,
@@ -84,7 +87,7 @@ 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)
+            return u' '.join(names)
         return self.user.username
 
     def contributor_projects(self):
@@ -129,15 +132,23 @@ class UserProfile(models.Model):
                  person.link_to_user(self.user)
                  person.save()
 
-    def __str__(self):
+    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)
     action_required = models.BooleanField(default = True)
 
-    def __str__(self):
+    def __unicode__(self):
         return self.name
 
     class Meta:
@@ -188,12 +199,12 @@ class Patch(models.Model):
     state = models.ForeignKey(State)
     archived = models.BooleanField(default = False)
     headers = models.TextField(blank = True)
-    content = models.TextField(null = True)
-    pull_url = models.CharField(max_length=255, null = True)
+    content = models.TextField(null = True, blank = True)
+    pull_url = models.CharField(max_length=255, null = True, blank = True)
     commit_ref = models.CharField(max_length=255, null = True, blank = True)
-    hash = HashField(null = True, db_index = True)
+    hash = HashField(null = True, blank = True)
 
-    def __str__(self):
+    def __unicode__(self):
         return self.name
 
     def comments(self):
@@ -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()
@@ -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