[extensions-web] Add a "trusted" permission



commit e3aadc8d7e2647e97802bb15f5b049c8b59ca19f
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Mon May 20 13:50:44 2013 -0400

    Add a "trusted" permission
    
    And auto-approve extensions by users who are on the trusted whitelist

 sweettooth/review/models.py                        |    1 +
 .../review/templates/review/auto_approved_mail.txt |   10 ------
 sweettooth/review/tests.py                         |   20 ++++++------
 sweettooth/review/views.py                         |   35 ++++++++++++--------
 4 files changed, 32 insertions(+), 34 deletions(-)
---
diff --git a/sweettooth/review/models.py b/sweettooth/review/models.py
index 605b36c..c2615d8 100644
--- a/sweettooth/review/models.py
+++ b/sweettooth/review/models.py
@@ -24,4 +24,5 @@ class CodeReview(models.Model):
     class Meta:
         permissions = (
             ("can-review-extensions", "Can review extensions"),
+            ("trusted", "Has his extensions auto-approved"),
         )
diff --git a/sweettooth/review/templates/review/auto_approved_mail.txt 
b/sweettooth/review/templates/review/auto_approved_mail.txt
index 9d3c7a7..c035351 100644
--- a/sweettooth/review/templates/review/auto_approved_mail.txt
+++ b/sweettooth/review/templates/review/auto_approved_mail.txt
@@ -1,15 +1,5 @@
 A new extension version, "{{ extension.name }}", version {{ version.version }}, was auto-approved.
 
-The diff between this version and the last approved version looks like this:
-{% for file in changeset.changed %}
-  M {{ file }}
-{% endfor %}
-{% for file in changeset.added %}
-  + {{ file }}
-{% endfor %}
-
-(where M means "modified" and "+" means "added")
-
 The full review details can be found at {{ review_url }}, and the extension's version page
 can be found at {{ version_url }}.
 
diff --git a/sweettooth/review/tests.py b/sweettooth/review/tests.py
index 01f2cb5..0d450ac 100644
--- a/sweettooth/review/tests.py
+++ b/sweettooth/review/tests.py
@@ -3,7 +3,7 @@ from django.test import TestCase
 from django.core.files.base import File, ContentFile, StringIO
 
 from extensions import models
-from review.views import get_old_version, should_auto_approve
+from review.views import get_old_version, should_auto_approve_changeset
 
 from testutils import BasicUserTestCase
 
@@ -39,12 +39,12 @@ class TestAutoApproveLogic(TestCase):
                     unchanged=unchanged or [])
 
     def test_auto_approve_logic(self):
-        self.assertTrue(should_auto_approve(self.build_changeset()))
-        self.assertTrue(should_auto_approve(self.build_changeset(changed=['metadata.json'])))
-        self.assertTrue(should_auto_approve(self.build_changeset(changed=['metadata.json', 'po/en_GB.po', 
'images/new_fedora.png', 'stylesheet.css'])))
-        self.assertTrue(should_auto_approve(self.build_changeset(changed=['stylesheet.css'], 
added=['po/zn_CH.po'])))
-
-        self.assertFalse(should_auto_approve(self.build_changeset(changed=['extension.js'])))
-        self.assertFalse(should_auto_approve(self.build_changeset(changed=['secret_keys.json'])))
-        self.assertFalse(should_auto_approve(self.build_changeset(changed=['libbignumber/BigInteger.js'])))
-        self.assertFalse(should_auto_approve(self.build_changeset(added=['libbignumber/BigInteger.js'])))
+        self.assertTrue(should_auto_approve_changeset(self.build_changeset()))
+        self.assertTrue(should_auto_approve_changeset(self.build_changeset(changed=['metadata.json'])))
+        self.assertTrue(should_auto_approve_changeset(self.build_changeset(changed=['metadata.json', 
'po/en_GB.po', 'images/new_fedora.png', 'stylesheet.css'])))
+        self.assertTrue(should_auto_approve_changeset(self.build_changeset(changed=['stylesheet.css'], 
added=['po/zn_CH.po'])))
+
+        self.assertFalse(should_auto_approve_changeset(self.build_changeset(changed=['extension.js'])))
+        self.assertFalse(should_auto_approve_changeset(self.build_changeset(changed=['secret_keys.json'])))
+        
self.assertFalse(should_auto_approve_changeset(self.build_changeset(changed=['libbignumber/BigInteger.js'])))
+        
self.assertFalse(should_auto_approve_changeset(self.build_changeset(added=['libbignumber/BigInteger.js'])))
diff --git a/sweettooth/review/views.py b/sweettooth/review/views.py
index f1a25cb..9795bf0 100644
--- a/sweettooth/review/views.py
+++ b/sweettooth/review/views.py
@@ -315,7 +315,7 @@ def send_email_submitted(request, version):
 
     message.send()
 
-def send_email_auto_approved(request, version, changeset):
+def send_email_auto_approved(request, version):
     extension = version.extension
 
     review_url = request.build_absolute_uri(reverse('review-version',
@@ -326,8 +326,7 @@ def send_email_auto_approved(request, version, changeset):
     recipient_list.append(extension.creator.email)
 
     data = dict(version_url=version_url,
-                review_url=review_url,
-                changeset=changeset)
+                review_url=review_url)
 
     message = render_mail(version, 'auto_approved', data)
     message.to = recipient_list
@@ -335,11 +334,7 @@ def send_email_auto_approved(request, version, changeset):
                                   'X-SweetTooth-ExtensionCreator': extension.creator.username})
     message.send()
 
-def should_auto_approve(changes, extension=None):
-    # If a user can approve extensions, don't bother making him do so.
-    if extension is not None and can_approve_extension(extension.creator, extension):
-        return True
-
+def should_auto_approve_changeset(changes):
     for filename in itertools.chain(changes['changed'], changes['added']):
         # metadata.json updates are safe.
         if filename == 'metadata.json':
@@ -363,12 +358,25 @@ def should_auto_approve(changes, extension=None):
 
     return True
 
-def extension_submitted(sender, request, version, **kwargs):
+def should_auto_approve(version):
+    extension = version.extension
+    user = extension.creator
+    can_review = can_approve_extension(user, extension)
+    trusted = user.has_perm("review.trusted")
+
+    if can_review or trusted:
+        return True 
+
     old_version = version.extension.latest_version
+    if old_version is None:
+        return False
+
     old_zipfile, new_zipfile = get_zipfiles(old_version, version)
     changeset = get_file_changeset(old_zipfile, new_zipfile)
+    return should_auto_approve_changeset(changeset)
 
-    if old_zipfile is not None and should_auto_approve(changeset, version.extension):
+def extension_submitted(sender, request, version, **kwargs):
+    if should_auto_approve(version):
         CodeReview.objects.create(version=version,
                                   reviewer=request.user,
                                   comments="",
@@ -376,10 +384,9 @@ def extension_submitted(sender, request, version, **kwargs):
                                   auto=True)
         version.status = models.STATUS_ACTIVE
         version.save()
-        send_email_auto_approved(request, version, changeset)
-        return
-
-    send_email_submitted(request, version)
+        send_email_auto_approved(request, version)
+    else:
+        send_email_submitted(request, version)
 
 models.submitted_for_review.connect(extension_submitted)
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]