Skip to content

Commit

Permalink
Merge branch 'reviews'
Browse files Browse the repository at this point in the history
  • Loading branch information
jbalogh committed Jun 23, 2010
2 parents ebe4f23 + c8ae516 commit 06939f6
Show file tree
Hide file tree
Showing 24 changed files with 991 additions and 170 deletions.
24 changes: 24 additions & 0 deletions apps/access/acl.py
@@ -1,3 +1,7 @@
import amo
from addons.models import Addon


def match_rules(rules, app, action):
"""
This will match rules found in Group.
Expand Down Expand Up @@ -25,3 +29,23 @@ def action_allowed(request, app, action):

return any(match_rules(group.rules, app, action)
for group in getattr(request, 'groups', ()))


def check_ownership(request, addon, require_owner=False):
"""Check if request.user has owner permissions for the add-on."""
if not request.user.is_authenticated():
return False

if not require_owner and action_allowed(request, 'Admin', 'EditAnyAddon'):
return True

if addon.status == amo.STATUS_DISABLED:
return False

roles = (amo.AUTHOR_ROLE_ADMINOWNER, amo.AUTHOR_ROLE_ADMIN,
amo.AUTHOR_ROLE_OWNER, amo.AUTHOR_ROLE_DEV)
if not require_owner:
roles += (amo.AUTHOR_ROLE_VIEWER,)

return bool(addon.authors.filter(addonuser__role__in=roles,
user=request.user))
40 changes: 38 additions & 2 deletions apps/access/tests.py
@@ -1,11 +1,13 @@
from django.http import HttpRequest
from nose.tools import assert_false

import mock
from nose.tools import assert_false, eq_

import amo
from cake.models import Session
from test_utils import TestCase

from .acl import match_rules, action_allowed
from .acl import match_rules, action_allowed, check_ownership


def test_match_rules():
Expand Down Expand Up @@ -83,3 +85,37 @@ def test_admin_login(self):
c.login(session=session)
response = c.get('/en-US/admin/models/')
self.assertContains(response, 'login-form')


class TestCheckOwnership(TestCase):

def setUp(self):
self.request = mock.Mock()
self.request.groups = ()
self.addon = mock.Mock()

def test_unauthenticated(self):
self.request.user.is_authenticated = lambda: False
eq_(False, check_ownership(self.request, self.addon))

@mock.patch('access.acl.action_allowed')
def test_admin(self, allowed):
eq_(True, check_ownership(self.request, self.addon))
eq_(True, check_ownership(self.request, self.addon,
require_owner=True))

def test_addon_status(self):
self.addon.status = amo.STATUS_DISABLED
eq_(False, check_ownership(self.request, self.addon))

def test_author_roles(self):
f = self.addon.authors.filter
roles = (amo.AUTHOR_ROLE_ADMINOWNER, amo.AUTHOR_ROLE_ADMIN,
amo.AUTHOR_ROLE_OWNER, amo.AUTHOR_ROLE_DEV)

check_ownership(self.request, self.addon, True)
eq_(f.call_args[1]['addonuser__role__in'], roles)

check_ownership(self.request, self.addon)
eq_(f.call_args[1]['addonuser__role__in'],
roles + (amo.AUTHOR_ROLE_VIEWER,))
2 changes: 1 addition & 1 deletion apps/addons/models.py
Expand Up @@ -102,7 +102,7 @@ class Addon(amo.models.ModelBase):
the_reason = TranslatedField()
the_future = TranslatedField()

average_rating = models.CharField(max_length=255, default=0,
average_rating = models.CharField(max_length=255, default=0, null=True,
db_column='averagerating')
bayesian_rating = models.FloatField(default=0, db_index=True,
db_column='bayesianrating')
Expand Down
6 changes: 4 additions & 2 deletions apps/addons/tests/test_models.py
Expand Up @@ -211,10 +211,12 @@ def test_review_replies(self):
addon = Addon.objects.get(id=3615)
u = UserProfile.objects.get(pk=2519)
version = addon.current_version
new_review = Review(version=version, user=u, rating=2, body='hello')
new_review = Review(version=version, user=u, rating=2, body='hello',
addon=addon)
new_review.save()
new_reply = Review(version=version, user=addon.authors.all()[0],
reply_to=new_review, rating=2, body='my reply')
addon=addon, reply_to=new_review,
rating=2, body='my reply')
new_reply.save()

review_list = [r.pk for r in addon.reviews]
Expand Down
119 changes: 0 additions & 119 deletions apps/amo/fixtures/amo/test_redirects.json

This file was deleted.

2 changes: 1 addition & 1 deletion apps/amo/tests/test_redirects.py
Expand Up @@ -11,7 +11,7 @@

class TestRedirects(test.TestCase):

fixtures = ['amo/test_redirects', 'base/global-stats']
fixtures = ['reviews/test_models', 'base/global-stats']

def test_persona_category(self):
"""`/personas/film and tv` should go to /personas/film-and-tv"""
Expand Down
2 changes: 1 addition & 1 deletion apps/cronjobs/management/commands/cron.py
Expand Up @@ -26,7 +26,7 @@ def handle(self, *args, **opts):

if not args:
log.error("Cron called but doesn't know what to do.")
print 'Try one of these: %s' % ', '.join(registered)
print 'Try one of these:\n%s' % '\n'.join(sorted(registered))
sys.exit(1)

script, args = args[0], args[1:]
Expand Down
31 changes: 31 additions & 0 deletions apps/reviews/cron.py
@@ -0,0 +1,31 @@
import logging

from celery.messaging import establish_connection

import cronjobs
from amo.utils import chunked
from addons.models import Addon

from . import tasks
from .models import Review

log = logging.getLogger('z.cron')


@cronjobs.register
def reviews_denorm():
"""Set is_latest and previous_count for all reviews."""
pairs = list(set(Review.objects.values_list('addon', 'user')))
with establish_connection() as conn:
for chunk in chunked(pairs, 50):
tasks.update_denorm.apply_async(args=chunk, connection=conn)


@cronjobs.register
def addon_reviews_ratings():
"""Update all add-on total_reviews and average/bayesian ratings."""
addons = Addon.objects.values_list('id', flat=True)
with establish_connection() as conn:
for chunk in chunked(addons, 100):
tasks.cron_review_aggregate.apply_async(args=chunk,
connection=conn)

0 comments on commit 06939f6

Please sign in to comment.