allow report abuse to work and alter helpers to be app/addon friendly (bug 693468)
This commit is contained in:
Родитель
3fe1961b62
Коммит
e2d37ab495
|
@ -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')
|
||||
)
|
||||
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче