def test_edit_review_form(self): r = self.client.get(helpers.url('addons.reviews.list', self.addon.slug)) self.assertTemplateUsed(r, 'reviews/edit_review.html') r = self.client.get(helpers.url('addons.reviews.detail', self.addon.slug, 218468)) self.assertTemplateUsed(r, 'reviews/edit_review.html')
def reply(request, addon, review_id): is_admin = acl.action_allowed(request, 'Addons', 'Edit') is_author = acl.check_addon_ownership(request, addon, dev=True) if not (is_admin or is_author): raise PermissionDenied review = get_object_or_404(Review.objects, pk=review_id, addon=addon) form = forms.ReviewReplyForm(request.POST or None) if request.method == 'POST' and form.is_valid(): d = dict(reply_to=review, addon=addon, defaults=dict(user=request.amo_user)) reply, new = Review.objects.get_or_create(**d) for key, val in _review_details(request, addon, form).items(): setattr(reply, key, val) reply.save() action = 'New' if new else 'Edited' log.debug('%s reply to %s: %s' % (action, review_id, reply.id)) if new: reply_url = helpers.url('addons.reviews.detail', addon.slug, review.id, add_prefix=False) data = {'name': addon.name, 'reply_title': reply.title, 'reply': reply.body, 'reply_url': helpers.absolutify(reply_url)} emails = [review.user.email] sub = u'Mozilla Add-on Developer Reply: %s' % addon.name send_mail('reviews/emails/reply_review.ltxt', sub, emails, Context(data), 'reply') return redirect(helpers.url('addons.reviews.detail', addon.slug, review_id)) ctx = dict(review=review, form=form, addon=addon) return render(request, 'reviews/reply.html', ctx)
def test_edit_review_form(self): r = self.client.get(helpers.url('addons.reviews.list', self.addon.slug)) self.assertTemplateUsed(r, 'reviews/edit_review.html') r = self.client.get( helpers.url('addons.reviews.detail', self.addon.slug, 218468)) self.assertTemplateUsed(r, 'reviews/edit_review.html')
def setUp(self): super(TestMobileReviews, self).setUp() self.addon = Addon.objects.get(id=1865) self.user = UserProfile.objects.get(email='*****@*****.**') self.login_regular() self.add = helpers.url('addons.reviews.add', self.addon.slug) self.list = helpers.url('addons.reviews.list', self.addon.slug)
def link(self, category): """Link for the feed as a whole""" if self.category: base = url('browse.search-tools.rss', self.category.slug) else: base = url('browse.search-tools.rss') return absolutify(base + '?sort=' + self.sort)
def reply(request, addon, review_id): is_admin = acl.action_allowed(request, 'Addons', 'Edit') is_author = acl.check_addon_ownership(request, addon, dev=True) if not (is_admin or is_author): raise PermissionDenied review = get_object_or_404(Review.objects, pk=review_id, addon=addon) form = forms.ReviewReplyForm(request.POST or None) if request.method == 'POST' and form.is_valid(): d = dict(reply_to=review, addon=addon, defaults=dict(user=request.user)) reply, new = Review.objects.get_or_create(**d) for key, val in _review_details(request, addon, form).items(): setattr(reply, key, val) reply.save() action = 'New' if new else 'Edited' log.debug('%s reply to %s: %s' % (action, review_id, reply.id)) if new: reply_url = helpers.url('addons.reviews.detail', addon.slug, review.id, add_prefix=False) data = {'name': addon.name, 'reply_title': reply.title, 'reply': reply.body, 'reply_url': helpers.absolutify(reply_url)} emails = [review.user.email] sub = u'Mozilla Add-on Developer Reply: %s' % addon.name send_mail('reviews/emails/reply_review.ltxt', sub, emails, Context(data), 'reply') return redirect(helpers.url('addons.reviews.detail', addon.slug, review_id)) ctx = dict(review=review, form=form, addon=addon) return render(request, 'reviews/reply.html', ctx)
def add(request, addon, template=None): if addon.has_author(request.user): raise PermissionDenied form = forms.ReviewForm(request.POST or None) if (request.method == 'POST' and form.is_valid() and not request.POST.get('detailed')): details = _review_details(request, addon, form) review = Review.objects.create(**details) if 'flag' in form.cleaned_data and form.cleaned_data['flag']: rf = ReviewFlag(review=review, user_id=request.user.id, flag=ReviewFlag.OTHER, note='URLs') rf.save() amo.log(amo.LOG.ADD_REVIEW, addon, review) log.debug('New review: %s' % review.id) reply_url = helpers.url('addons.reviews.reply', addon.slug, review.id, add_prefix=False) data = {'name': addon.name, 'rating': '%s out of 5 stars' % details['rating'], 'review': details['body'], 'reply_url': helpers.absolutify(reply_url)} emails = [a.email for a in addon.authors.all()] send_mail('reviews/emails/add_review.ltxt', u'Mozilla Add-on User Review: %s' % addon.name, emails, Context(data), 'new_review') return redirect(helpers.url('addons.reviews.list', addon.slug)) return render(request, template, dict(addon=addon, form=form))
def setUp(self): super(TestCreate, self).setUp() self.add = helpers.url('addons.reviews.add', self.addon.slug) self.client.login(username='******', password='******') self.user = UserProfile.objects.get(email='*****@*****.**') self.qs = Review.objects.filter(addon=1865) self.log_count = ActivityLog.objects.count self.more = self.addon.get_url_path(more=True) self.list = helpers.url('addons.reviews.list', self.addon.slug)
def test_edit(self): url = helpers.url('addons.reviews.edit', self.addon.slug, 218207) response = self.client.post(url, {'rating': 2, 'body': 'woo woo'}, X_REQUESTED_WITH='XMLHttpRequest') assert response.status_code == 200 assert '%s' % Review.objects.get(id=218207).body == 'woo woo' response = self.client.get(helpers.url('addons.reviews.list', self.addon.slug)) doc = pq(response.content) assert doc('#review-218207 .review-edit').text() == 'Edit review'
def test_edit(self): url = helpers.url('addons.reviews.edit', self.addon.slug, 218207) response = self.client.post(url, { 'rating': 2, 'body': 'woo woo' }, X_REQUESTED_WITH='XMLHttpRequest') assert response.status_code == 200 assert '%s' % Review.objects.get(id=218207).body == 'woo woo' response = self.client.get( helpers.url('addons.reviews.list', self.addon.slug)) doc = pq(response.content) assert doc('#review-218207 .review-edit').text() == 'Edit review'
def test_edit_reply(self): self.login_dev() url = helpers.url('addons.reviews.edit', self.addon.slug, 218468) response = self.client.post(url, {'title': 'fo', 'body': 'shizzle'}, X_REQUESTED_WITH='XMLHttpRequest') assert response.status_code == 200 reply = Review.objects.get(id=218468) assert '%s' % reply.title == 'fo' assert '%s' % reply.body == 'shizzle' response = self.client.get(helpers.url('addons.reviews.list', self.addon.slug)) doc = pq(response.content) assert doc('#review-218468 .review-reply-edit').text() == 'Edit reply'
def test_regular_call(self): review = self.review url = helpers.url('addons.reviews.translate', review.addon.slug, review.id, 'fr') r = self.client.get(url) eq_(r.status_code, 302) eq_(r.get('Location'), 'https://translate.google.com/#auto/fr/yes')
def test_invalid_api_key(self, requests): # Mock requests. response = mock.Mock() response.status_code = 400 response.json.return_value = { 'error': { 'code': 400, 'errors': [{ 'domain': 'usageLimits', 'message': 'Bad Request', 'reason': 'keyInvalid' }], 'message': 'Bad Request' } } requests.get.return_value = response # Call translation. review = self.review url = helpers.url('addons.reviews.translate', review.addon.slug, review.id, 'fr') r = self.client.get(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') eq_(r.status_code, 400)
def test_list(self): r = self.client.get(helpers.url('addons.reviews.list', self.addon.slug)) eq_(r.status_code, 200) doc = pq(r.content) reviews = doc('#reviews .item') eq_(reviews.length, Review.objects.count()) eq_(Review.objects.count(), 2) eq_(doc('.secondary .average-rating').length, 1) eq_(doc('.secondary .no-rating').length, 0) r = Review.objects.get(id=218207) item = reviews.filter('#review-218207') eq_(r.reply_to_id, None) eq_(item.hasClass('reply'), False) eq_(item.length, 1) eq_(item.attr('data-rating'), str(r.rating)) r = Review.objects.get(id=218468) item = reviews.filter('#review-218468') eq_(item.length, 1) eq_(r.reply_to_id, 218207) eq_(item.hasClass('reply'), True) eq_(r.rating, None) eq_(item.attr('data-rating'), '')
def test_edit_reply(self): self.login_dev() url = helpers.url('addons.reviews.edit', self.addon.slug, 218468) response = self.client.post(url, { 'title': 'fo', 'body': 'shizzle' }, X_REQUESTED_WITH='XMLHttpRequest') assert response.status_code == 200 reply = Review.objects.get(id=218468) assert '%s' % reply.title == 'fo' assert '%s' % reply.body == 'shizzle' response = self.client.get( helpers.url('addons.reviews.list', self.addon.slug)) doc = pq(response.content) assert doc('#review-218468 .review-edit').text() == 'Edit reply'
def test_edit_not_owner(self): url = helpers.url('addons.reviews.edit', self.addon.slug, 218468) r = self.client.post(url, { 'rating': 2, 'body': 'woo woo' }, X_REQUESTED_WITH='XMLHttpRequest') eq_(r.status_code, 403)
def test_edit_reply(self): self.login_dev() url = helpers.url("addons.reviews.edit", self.addon.slug, 218468) r = self.client.post(url, {"title": "fo", "body": "shizzle"}, X_REQUESTED_WITH="XMLHttpRequest") eq_(r.status_code, 200) review = Review.objects.get(id=218468) eq_("%s" % review.title, "fo") eq_("%s" % review.body, "shizzle")
def test_unicode_call(self): review = Review.objects.create(addon=self.addon, user=self.user, title='or', body=u'héhé 3%') url = helpers.url('addons.reviews.translate', review.addon.slug, review.id, 'fr') r = self.client.get(url) eq_(r.status_code, 302) eq_(r.get('Location'), 'https://translate.google.com/#auto/fr/h%C3%A9h%C3%A9%203%25')
def test_edit(self): url = helpers.url('addons.reviews.edit', self.addon.slug, 218207) r = self.client.post(url, { 'rating': 2, 'body': 'woo woo' }, X_REQUESTED_WITH='XMLHttpRequest') eq_(r.status_code, 200) eq_('%s' % Review.objects.get(id=218207).body, 'woo woo')
def test_edit_reply(self): self.login_dev() url = helpers.url('addons.reviews.edit', self.addon.slug, 218468) r = self.client.post(url, {'title': 'fo', 'body': 'shizzle'}, X_REQUESTED_WITH='XMLHttpRequest') eq_(r.status_code, 200) review = Review.objects.get(id=218468) eq_('%s' % review.title, 'fo') eq_('%s' % review.body, 'shizzle')
def test_delete_own_review(self): self.client.logout() self.login_dev() url = helpers.url('addons.reviews.delete', self.addon.slug, 218468) cnt = Review.objects.count() response = self.client.post(url) eq_(response.status_code, 200) eq_(Review.objects.count(), cnt - 1) eq_(Review.objects.filter(pk=218468).exists(), False)
def test_add_link_dev(self): """Ensure developer cannot see Add Review links.""" self.login_dev() r = self.client.get_ajax(self.more) eq_(pq(r.content)("#add-review").length, 0) r = self.client.get(helpers.url("addons.reviews.list", self.addon.slug)) doc = pq(r.content) eq_(doc("#add-review").length, 0) eq_(doc("#add-first-review").length, 0)
def test_add_link_dev(self): """Ensure developer cannot see Add Review links.""" self.login_dev() r = self.client.get_ajax(self.more) eq_(pq(r.content)('#add-review').length, 0) r = self.client.get(helpers.url('addons.reviews.list', self.addon.slug)) doc = pq(r.content) eq_(doc('#add-review').length, 0) eq_(doc('#add-first-review').length, 0)
def test_empty_list(self): Review.objects.all().delete() eq_(Review.objects.count(), 0) r = self.client.get(helpers.url("addons.reviews.list", self.addon.slug)) eq_(r.status_code, 200) doc = pq(r.content) eq_(doc("#reviews .item").length, 0) eq_(doc("#add-first-review").length, 1) eq_(doc(".secondary .average-rating").length, 0) eq_(doc(".secondary .no-rating").length, 1)
def test_empty_list(self): Review.objects.all().delete() eq_(Review.objects.count(), 0) r = self.client.get(helpers.url('addons.reviews.list', self.addon.slug)) eq_(r.status_code, 200) doc = pq(r.content) eq_(doc('#reviews .item').length, 0) eq_(doc('#add-first-review').length, 1) eq_(doc('.secondary .average-rating').length, 0) eq_(doc('.secondary .no-rating').length, 1)
def test_add_link_visitor(self): """ Ensure non-logged user can see Add Review links on details page but not on Reviews listing page. """ self.client.logout() r = self.client.get_ajax(self.more) eq_(pq(r.content)("#add-review").length, 1) r = self.client.get(helpers.url("addons.reviews.list", self.addon.slug)) doc = pq(r.content) eq_(doc("#add-review").length, 0) eq_(doc("#add-first-review").length, 0)
def test_edit_reply(self): self.login_dev() url = helpers.url('addons.reviews.edit', self.addon.slug, 218468) r = self.client.post(url, { 'title': 'fo', 'body': 'shizzle' }, X_REQUESTED_WITH='XMLHttpRequest') eq_(r.status_code, 200) review = Review.objects.get(id=218468) eq_('%s' % review.title, 'fo') eq_('%s' % review.body, 'shizzle')
def test_add_link_visitor(self): """ Ensure non-logged user can see Add Review links on details page but not on Reviews listing page. """ self.client.logout() r = self.client.get_ajax(self.more) eq_(pq(r.content)('#add-review').length, 1) r = self.client.get(helpers.url('addons.reviews.list', self.addon.slug)) doc = pq(r.content) eq_(doc('#add-review').length, 0) eq_(doc('#add-first-review').length, 0)
def test_ajax_call(self, requests): # Mock requests. response = mock.Mock() response.status_code = 200 response.json.return_value = { u"data": {u"translations": [{u"translatedText": u"oui", u"detectedSourceLanguage": u"en"}]} } requests.get.return_value = response # Call translation. review = self.review url = helpers.url("addons.reviews.translate", review.addon.slug, review.id, "fr") r = self.client.get(url, HTTP_X_REQUESTED_WITH="XMLHttpRequest") eq_(r.status_code, 200) eq_(json.loads(r.content), {"body": "oui", "title": "oui"})
def test_invalid_api_key(self, requests): # Mock requests. response = mock.Mock() response.status_code = 400 response.json.return_value = {'error': {'code': 400, 'errors': [{ 'domain': 'usageLimits', 'message': 'Bad Request', 'reason': 'keyInvalid'}], 'message': 'Bad Request'}} requests.get.return_value = response # Call translation. review = self.review url = helpers.url('addons.reviews.translate', review.addon.slug, review.id, 'fr') r = self.client.get(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') eq_(r.status_code, 400)
def test_ajax_call(self, requests): # Mock requests. response = mock.Mock() response.status_code = 200 response.json.return_value = {u'data': {u'translations': [{ u'translatedText': u'oui', u'detectedSourceLanguage': u'en' }]}} requests.get.return_value = response # Call translation. review = self.review url = helpers.url('addons.reviews.translate', review.addon.slug, review.id, 'fr') r = self.client.get(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') eq_(r.status_code, 200) eq_(r.content, '{"body": "oui", "title": "oui"}')
def test_invalid_api_key(self, requests): # Mock requests. response = mock.Mock() response.status_code = 400 response.json.return_value = { "error": { "code": 400, "errors": [{"domain": "usageLimits", "message": "Bad Request", "reason": "keyInvalid"}], "message": "Bad Request", } } requests.get.return_value = response # Call translation. review = self.review url = helpers.url("addons.reviews.translate", review.addon.slug, review.id, "fr") r = self.client.get(url, HTTP_X_REQUESTED_WITH="XMLHttpRequest") eq_(r.status_code, 400)
def test_list_item_actions(self): self.login_admin() self.make_it_my_review() r = self.client.get(helpers.url("addons.reviews.list", self.addon.slug)) reviews = pq(r.content)("#reviews .item") r = Review.objects.get(id=218207) item = reviews.filter("#review-218207") actions = item.find(".item-actions") eq_(actions.length, 1) classes = sorted(c.get("class") for c in actions.find("li a")) eq_(classes, ["delete-review", "flag-review"]) r = Review.objects.get(id=218468) item = reviews.filter("#review-218468") actions = item.find(".item-actions") eq_(actions.length, 1) classes = sorted(c.get("class") for c in actions.find("li a")) eq_(classes, ["delete-review", "review-edit"])
def test_list_item_actions(self): self.login_admin() self.make_it_my_review() r = self.client.get(helpers.url('addons.reviews.list', self.addon.slug)) reviews = pq(r.content)('#reviews .item') r = Review.objects.get(id=218207) item = reviews.filter('#review-218207') actions = item.find('.item-actions') eq_(actions.length, 1) classes = sorted(c.get('class') for c in actions.find('li a')) eq_(classes, ['delete-review', 'flag-review']) r = Review.objects.get(id=218468) item = reviews.filter('#review-218468') actions = item.find('.item-actions') eq_(actions.length, 1) classes = sorted(c.get('class') for c in actions.find('li a')) eq_(classes, ['delete-review', 'review-edit'])
def test_ajax_call(self, requests): # Mock requests. response = mock.Mock() response.status_code = 200 response.json.return_value = { u'data': { u'translations': [{ u'translatedText': u'oui', u'detectedSourceLanguage': u'en' }] } } requests.get.return_value = response # Call translation. review = self.review url = helpers.url('addons.reviews.translate', review.addon.slug, review.id, 'fr') r = self.client.get(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') eq_(r.status_code, 200) eq_(json.loads(r.content), {"body": "oui", "title": "oui"})
def test_edit(self): url = helpers.url('addons.reviews.edit', self.addon.slug, 218207) r = self.client.post(url, {'rating': 2, 'body': 'woo woo'}, X_REQUESTED_WITH='XMLHttpRequest') eq_(r.status_code, 200) eq_('%s' % Review.objects.get(id=218207).body, 'woo woo')
def link(self, category): """Link for the feed as a whole""" return absolutify(url('home'))
def test_dev_no_rss(self): url = helpers.url('addons.reviews.detail', self.addon.slug, 218468) r = self.client.get(url) doc = pq(r.content) eq_(doc('link[title=RSS]').length, 0)
def test_add_logged_out(self): self.client.logout() self.mobile_init() r = self.client.get(helpers.url('addons.reviews.add', self.addon.slug)) eq_(r.status_code, 302)
def link(self, addon): """Link for the feed""" return absolutify(url('home'))
def test_404_user_page(self): url = helpers.url('addons.reviews.user', self.addon.slug, 233452342) r = self.client.get(url) eq_(r.status_code, 404)
def test_list_rss(self): r = self.client.get(helpers.url('addons.reviews.list', self.addon.slug)) doc = pq(r.content) eq_(doc('link[title=RSS]').length, 1)
def link(self): return absolutify(url('apps.appversions'))
def test_appversions_feed(self): eq_(self.client.get(url('apps.appversions.rss')).status_code, 200)
def test_feed(self): url = helpers.url('addons.reviews.list.rss', self.addon.slug) r = self.client.get(url) eq_(r.status_code, 200)
def test_edit_not_owner(self): url = helpers.url('addons.reviews.edit', self.addon.slug, 218468) r = self.client.post(url, {'rating': 2, 'body': 'woo woo'}, X_REQUESTED_WITH='XMLHttpRequest') eq_(r.status_code, 403)
def get_url_path(self): return helpers.url('addons.reviews.detail', self.addon.slug, self.id)
def link(self): """Link for the feed as a whole""" return absolutify(url('devhub.feed_all'))
def admin_site_links(): if settings.MARKETPLACE: return mkt_admin_site_links() return { 'addons': [ ('Search for add-ons by name or id', url('zadmin.addon-search')), ('Featured add-ons', url('zadmin.features')), ('Discovery Pane promo modules', url('discovery.module_admin')), ('Monthly Pick', url('zadmin.monthly_pick')), ('Upgrade jetpack add-ons', url('zadmin.jetpack')), ('Name blocklist', url('zadmin.addon-name-blocklist')), ('Bulk add-on validation', url('zadmin.validation')), ('Fake mail', url('zadmin.mail')), ('Flagged reviews', url('zadmin.flagged')), ('ACR Reports', url('zadmin.compat')), ('Email Add-on Developers', url('zadmin.email_devs')), ], 'users': [ ('Configure groups', url('admin:access_group_changelist')), ], 'settings': [ ('View site settings', url('zadmin.settings')), ('Django admin pages', url('zadmin.home')), ('Site Events', url('zadmin.site_events')), ], 'tools': [ ('View request environment', url('amo.env')), ('Manage elasticsearch', url('zadmin.elastic')), ('View celery stats', url('zadmin.celery')), ('Purge data from memcache', url('zadmin.memcache')), ('Purge pages from zeus', url('zadmin.hera')), ('View graphite trends', url('amo.graphite', 'addons')), ('Create a new OAuth Consumer', url('zadmin.oauth-consumer-create')), ('View event log', url('admin:editors_eventlog_changelist')), ('View addon log', url('admin:devhub_activitylog_changelist')), ('Generate error', url('zadmin.generate-error')), ('Site Status', url('amo.monitor')), ], }