allow report abuse to work and alter helpers to be app/addon friendly (bug 693468)

This commit is contained in:
Andy McKay 2011-10-21 17:18:32 -07:00
Родитель 3fe1961b62
Коммит e2d37ab495
7 изменённых файлов: 61 добавлений и 6 удалений

Просмотреть файл

@ -10,9 +10,11 @@ from addons.models import Addon
def addon_view(f, qs=Addon.objects.all):
@functools.wraps(f)
def wrapper(request, addon_id, *args, **kw):
def wrapper(request, addon_id=None, app_slug=None, *args, **kw):
"""Provides an addon given either an addon_id or app_slug."""
assert addon_id or app_slug, 'Must provide addon_id or app_slug'
get = lambda **kw: get_object_or_404(qs(), **kw)
if addon_id.isdigit():
if addon_id and addon_id.isdigit():
addon = get(id=addon_id)
# Don't get in an infinite loop if addon.slug.isdigit().
if addon.slug != addon_id:
@ -20,8 +22,10 @@ def addon_view(f, qs=Addon.objects.all):
if request.GET:
url += '?' + request.GET.urlencode()
return http.HttpResponsePermanentRedirect(url)
else:
elif addon_id:
addon = get(slug=addon_id)
elif app_slug:
addon = get(app_slug=app_slug)
return f(request, addon, *args, **kw)
return wrapper

Просмотреть файл

@ -1,4 +1,4 @@
<form method="post" action="{{ url('addons.abuse', addon.slug) }}">
<form method="post" action="{{ addon_url('addons.abuse', addon) }}">
<fieldset class="abuse">
{% if hide %}
<legend><a href="{{ url('devhub.docs', 'policies', 'contact') }}"

Просмотреть файл

@ -84,6 +84,13 @@ class TestAddonView(amo.tests.TestCase):
request, addon = self.func.call_args[0]
eq_(addon, a)
def test_app(self):
a = Addon.objects.create(type=amo.ADDON_WEBAPP, name='xxxx')
a.update(slug=str(a.id) + 'foo', app_slug=str(a.id))
r = self.view(self.request, app_slug=str(a.id))
eq_(r, mock.sentinel.OK)
eq_(self.func.call_args[0][1].type, amo.ADDON_WEBAPP)
class TestPremiumDecorators(amo.tests.TestCase):

Просмотреть файл

@ -1377,9 +1377,9 @@ class TestReportAbuse(amo.tests.TestCase):
eq_(res.status_code, 200)
doc = pq(res.content)
eq_(doc('#abuse-modal form').attr('action'),
reverse('addons.abuse', args=['a15663']))
reverse('apps.abuse', args=['app-a15663']))
self.client.login(username='regular@mozilla.com', password='password')
r = self.client.post(reverse('addons.abuse', args=['a15663']),
r = self.client.post(reverse('apps.abuse', args=['app-a15663']),
{'text': 'this app is porn'})
self.assertRedirects(r, detail_url)

Просмотреть файл

@ -88,6 +88,23 @@ def url(viewname, *args, **kwargs):
return url
@register.function
def addon_url(viewname, addon, *args, **kwargs):
"""
Helper specifically for addons or apps to get urls. Requires
the viewname, addon (or app). It's assumed that we'll pass the
slug into the args and we'll look up the right slug (addon or app)
for you.
Viewname should be a normal view eg: addons.details or apps.details,
this will flip the first part for you. eg: addons.details > apps.details.
"""
slug = addon.app_slug if addon.is_webapp() else addon.slug
prefix = 'apps' if addon.is_webapp() else 'addons'
viewname = '%s.%s' % (prefix, viewname.split('.', 1)[-1])
return url(viewname, *([slug] + list(args)), **kwargs)
@register.function
def services_url(viewname, *args, **kwargs):
"""Helper for ``url`` with host=SERVICES_URL."""

Просмотреть файл

@ -207,6 +207,31 @@ def test_urlparams_unicode():
utils.urlparams(url)
class TestAddonURL(amo.tests.TestCase):
def setUp(self):
self.webapp = Mock()
self.webapp.type = amo.ADDON_WEBAPP
self.webapp.app_slug = 'webapp'
self.addon = Mock()
self.addon.type = amo.ADDON_EXTENSION
self.addon.slug = 'addon'
self.addon.is_webapp.return_value = False
def test_appurl(self):
eq_(helpers.addon_url('addons.detail', self.webapp),
'/en-US/apps/app/webapp/')
eq_(helpers.addon_url('apps.detail', self.webapp),
'/en-US/apps/app/webapp/')
def test_addonurl(self):
eq_(helpers.addon_url('addons.detail', self.addon),
'/en-US/firefox/addon/addon/')
eq_(helpers.addon_url('apps.detail', self.addon),
'/en-US/firefox/addon/addon/')
def test_isotime():
time = datetime(2009, 12, 25, 10, 11, 12)
s = render('{{ d|isotime }}', {'d': time})

Просмотреть файл

@ -1,6 +1,7 @@
from django.conf.urls.defaults import include, patterns, url
from . import views
from addons import views as addons_views
APP_SLUG = r"""(?P<app_slug>[^/<>"']+)"""
@ -10,6 +11,7 @@ detail_patterns = patterns('',
url('^$', views.app_detail, name='apps.detail'),
url('^more$', views.app_detail, name='apps.detail_more'),
url('^share$', views.share, name='apps.share'),
url('^abuse$', addons_views.report_abuse, name='apps.abuse')
)