ship reviews pages
This commit is contained in:
Родитель
96baa6c282
Коммит
13e7b0bb6e
|
@ -15,9 +15,8 @@
|
|||
{% endif %}
|
||||
{% include "reviews/grouped_ratings.html" %}
|
||||
{% if addon.can_review(amo_user) %}
|
||||
{% set r_add = '%sreviews.add' % ('i_' if settings.IMPALA_REVIEWS else '') %}
|
||||
<div>
|
||||
<a class="button" id="add-review" href="{{ url(r_add, addon.slug) }}">{{ _('Write a review') }}</a>
|
||||
<a class="button" id="add-review" href="{{ url('reviews.add', addon.slug) }}">{{ _('Write a review') }}</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
<a id="report-abuse" href="{{ remora_url('developers/docs/policies/contact') }}"
|
||||
|
|
|
@ -18,8 +18,7 @@
|
|||
(None, addon.name)]) }}
|
||||
<aside class="secondary addon-vitals">
|
||||
{{ addon.average_rating|stars(large=True) }}
|
||||
{% set r_list = '%sreviews.list' % ('i_' if settings.IMPALA_REVIEWS else '') %}
|
||||
<div><a id="reviews-link" href="{{ url(r_list, addon.slug) }}">
|
||||
<div><a id="reviews-link" href="{{ addon.reviews_url }}">
|
||||
{% trans cnt=addon.total_reviews, num=addon.total_reviews|numberfmt %}
|
||||
{{ num }} user review
|
||||
{% pluralize %}
|
||||
|
|
|
@ -24,11 +24,7 @@
|
|||
{% endfor %}
|
||||
{% if addon %}
|
||||
<p>
|
||||
{% if settings.IMPALA_REVIEWS %}
|
||||
<a class="more-info" href="{{ url('i_reviews.list', addon.slug) }}">
|
||||
{% else %}
|
||||
<a class="more-info" href="{{ url('reviews.list', addon.slug) }}">
|
||||
{% endif %}
|
||||
<a class="more-info" href="{{ addon.reviews_url }}">
|
||||
{% trans num=addon.total_reviews, cnt=addon.total_reviews|numberfmt %}
|
||||
See all user reviews
|
||||
{% pluralize %}
|
||||
|
|
|
@ -44,11 +44,6 @@ detail_patterns = patterns('',
|
|||
)
|
||||
|
||||
|
||||
impala_detail_patterns = patterns('',
|
||||
('^reviews/', include('reviews.impala_urls')),
|
||||
)
|
||||
|
||||
|
||||
urlpatterns = patterns('',
|
||||
# The homepage.
|
||||
url('^$', views.home, name='home'),
|
||||
|
@ -57,8 +52,6 @@ urlpatterns = patterns('',
|
|||
|
||||
# URLs for a single add-on.
|
||||
('^addon/%s/' % ADDON_ID, include(detail_patterns)),
|
||||
# Impala deets.
|
||||
url('^i/addon/%s/' % ADDON_ID, include(impala_detail_patterns)),
|
||||
|
||||
# Personas submission.
|
||||
url('^personas/submit$', views.submit_persona, name='personas.submit'),
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
from django.conf.urls.defaults import patterns, url, include
|
||||
from reviews.feeds import ReviewsRss
|
||||
from . import views
|
||||
|
||||
|
||||
# These all start with /addon/:id/reviews/:review_id/.
|
||||
detail_patterns = patterns('',
|
||||
url('^$', views.impala_review_list, name='i_reviews.detail'),
|
||||
url('^reply$', views.impala_reply, name='i_reviews.reply'),
|
||||
url('^edit$', views.edit, name='i_reviews.edit'),
|
||||
)
|
||||
|
||||
urlpatterns = patterns('',
|
||||
url('^$', views.impala_review_list, name='i_reviews.list'),
|
||||
url('^add$', views.impala_add, name='i_reviews.add'),
|
||||
url('^(?P<review_id>\d+)/', include(detail_patterns)),
|
||||
url('^format:rss$', ReviewsRss(), name='i_reviews.list.rss'),
|
||||
url('^user:(?P<user_id>\d+)$', views.impala_review_list, name='i_reviews.user'),
|
||||
)
|
|
@ -1,56 +1,66 @@
|
|||
{% extends "base_side_categories.html" %}
|
||||
{% extends "impala/base.html" %}
|
||||
{% from 'includes/forms.html' import pretty_field, required_note %}
|
||||
|
||||
{% set title = _('Add a review for {0}')|f(addon.name) %}
|
||||
|
||||
{% block title %}{{ page_title(title) }}{% endblock %}
|
||||
|
||||
{% block bodyclass %}reviews gutter{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<header>
|
||||
{{ breadcrumbs([(addon.type_url(), amo.ADDON_TYPES[addon.type]),
|
||||
(addon.get_url_path(), addon.name),
|
||||
(url('reviews.list', addon.slug), _('Reviews')),
|
||||
(None, _('Add'))]) }}
|
||||
<h2>{{ title }}</h2>
|
||||
</header>
|
||||
{{ impala_breadcrumbs([(addon.type_url(), amo.ADDON_TYPES[addon.type]),
|
||||
(addon.get_url_path(), addon.name),
|
||||
(addon.reviews_url, _('Reviews')),
|
||||
(None, _('Add'))]) }}
|
||||
|
||||
<div class="prose">
|
||||
{% trans support=addon.get_url_path() + "#support",
|
||||
guide=remora_url('pages/review_guide') %}
|
||||
<p>Keep these tips in mind:</p>
|
||||
<ul>
|
||||
<li>
|
||||
Write like you're telling a friend about your experience with the add-on.
|
||||
Give specifics and helpful details, such as what features you liked and/or
|
||||
disliked, how easy to use it is, and any disadvantages it has. Avoid generic
|
||||
language such as calling it "Great" or "Bad" unless you can give reasons why
|
||||
you believe this is so.
|
||||
</li>
|
||||
<li>
|
||||
Please do not post bug reports in reviews. We do not make your email
|
||||
address available to add-on developers and they may need to contact you to help
|
||||
resolve your issue. See the <a href="{{ support }}">support section</a> to find out
|
||||
where to get assistance for this add-on.
|
||||
</li>
|
||||
<li>Please keep reviews clean, avoid the use of improper language and do not
|
||||
post any personal information.
|
||||
</li>
|
||||
</ul>
|
||||
<p>Please read the <a href="{{ guide }}" target="_blank">Review Guidelines</a> for more detail
|
||||
about user add-on reviews.</p>
|
||||
{% endtrans %}
|
||||
</div>
|
||||
<h1>{{ title }}</h1>
|
||||
|
||||
<form method="post" class="review-form" id="review-form"
|
||||
action="{{ url('reviews.add', addon.slug) }}">
|
||||
{{ csrf() }}
|
||||
<p>
|
||||
<label for="id_title">{{ _('Title:') }} <span class="optional">{{ _('(optional)') }}</span></label>
|
||||
{{ form.title }}
|
||||
</p>
|
||||
{{ field(form.rating, _('Rating:')) }}
|
||||
{{ field(form.body, _('Review:')) }}
|
||||
<input type="submit" value="{{ _('Submit review') }}">
|
||||
</form>
|
||||
<div class="secondary">
|
||||
{{ addon|sidebar_listing }}
|
||||
</div>
|
||||
|
||||
<div id="reviews" class="primary island hero prettyform c">
|
||||
<fieldset class="prose">
|
||||
{% trans support=addon.get_url_path() + "#support",
|
||||
guide=remora_url('pages/review_guide') %}
|
||||
<h2>Keep these tips in mind:</h2>
|
||||
<ul>
|
||||
<li>
|
||||
Write like you're telling a friend about your experience with the add-on.
|
||||
Give specifics and helpful details, such as what features you liked and/or
|
||||
disliked, how easy to use it is, and any disadvantages it has. Avoid generic
|
||||
language such as calling it "Great" or "Bad" unless you can give reasons why
|
||||
you believe this is so.
|
||||
</li>
|
||||
<li>
|
||||
Please do not post bug reports in reviews. We do not make your email
|
||||
address available to add-on developers and they may need to contact you to help
|
||||
resolve your issue. See the <a href="{{ support }}">support section</a> to find out
|
||||
where to get assistance for this add-on.
|
||||
</li>
|
||||
<li>Please keep reviews clean, avoid the use of improper language and do not
|
||||
post any personal information.
|
||||
</li>
|
||||
</ul>
|
||||
<p>Please read the <a href="{{ guide }}" target="_blank">Review Guidelines</a> for more detail
|
||||
about user add-on reviews.</p>
|
||||
{% endtrans %}
|
||||
</fieldset>
|
||||
<form method="post" class="review-form" id="review-form"
|
||||
action="{{ url('reviews.add', addon.slug) }}">
|
||||
{{ csrf() }}
|
||||
<fieldset>
|
||||
<ul>
|
||||
{{ pretty_field(form.title, label=_('Title')) }}
|
||||
{{ pretty_field(form.rating, label=_('Rating')) }}
|
||||
{{ pretty_field(form.body, label=_('Review')) }}
|
||||
</ul>
|
||||
</fieldset>
|
||||
<footer>
|
||||
{{ required_note() }}
|
||||
<button type="submit">{{ _('Submit review') }}</button>
|
||||
</footer>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,66 +0,0 @@
|
|||
{% extends "impala/base.html" %}
|
||||
{% from 'includes/forms.html' import pretty_field, required_note %}
|
||||
|
||||
{% set title = _('Add a review for {0}')|f(addon.name) %}
|
||||
|
||||
{% block title %}{{ page_title(title) }}{% endblock %}
|
||||
|
||||
{% block bodyclass %}reviews gutter{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ impala_breadcrumbs([(addon.type_url(), amo.ADDON_TYPES[addon.type]),
|
||||
(addon.get_url_path(), addon.name),
|
||||
(addon.reviews_url, _('Reviews')),
|
||||
(None, _('Add'))]) }}
|
||||
|
||||
<h1>{{ title }}</h1>
|
||||
|
||||
<div class="secondary">
|
||||
{{ addon|sidebar_listing }}
|
||||
</div>
|
||||
|
||||
<div id="reviews" class="primary island hero prettyform c">
|
||||
<fieldset class="prose">
|
||||
{% trans support=addon.get_url_path() + "#support",
|
||||
guide=remora_url('pages/review_guide') %}
|
||||
<h2>Keep these tips in mind:</h2>
|
||||
<ul>
|
||||
<li>
|
||||
Write like you're telling a friend about your experience with the add-on.
|
||||
Give specifics and helpful details, such as what features you liked and/or
|
||||
disliked, how easy to use it is, and any disadvantages it has. Avoid generic
|
||||
language such as calling it "Great" or "Bad" unless you can give reasons why
|
||||
you believe this is so.
|
||||
</li>
|
||||
<li>
|
||||
Please do not post bug reports in reviews. We do not make your email
|
||||
address available to add-on developers and they may need to contact you to help
|
||||
resolve your issue. See the <a href="{{ support }}">support section</a> to find out
|
||||
where to get assistance for this add-on.
|
||||
</li>
|
||||
<li>Please keep reviews clean, avoid the use of improper language and do not
|
||||
post any personal information.
|
||||
</li>
|
||||
</ul>
|
||||
<p>Please read the <a href="{{ guide }}" target="_blank">Review Guidelines</a> for more detail
|
||||
about user add-on reviews.</p>
|
||||
{% endtrans %}
|
||||
</fieldset>
|
||||
<form method="post" class="review-form" id="review-form"
|
||||
action="{{ url('i_reviews.add', addon.slug) }}">
|
||||
{{ csrf() }}
|
||||
<fieldset>
|
||||
<ul>
|
||||
{{ pretty_field(form.title, label=_('Title')) }}
|
||||
{{ pretty_field(form.rating, label=_('Rating')) }}
|
||||
{{ pretty_field(form.body, label=_('Review')) }}
|
||||
</ul>
|
||||
</fieldset>
|
||||
<footer>
|
||||
{{ required_note() }}
|
||||
<button type="submit">{{ _('Submit review') }}</button>
|
||||
</footer>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -1,45 +0,0 @@
|
|||
{% extends "impala/base.html" %}
|
||||
{% from 'includes/forms.html' import pretty_field, required_note %}
|
||||
|
||||
{% set title = _('Reply to review by {0}')|f(review.user.name) %}
|
||||
|
||||
{% block bodyclass %}reviews gutter{% endblock %}
|
||||
|
||||
{% block title %}{{ page_title(title) }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ impala_breadcrumbs([(addon.type_url(), amo.ADDON_TYPES[addon.type]),
|
||||
(addon.get_url_path(), addon.name),
|
||||
(addon.reviews_url, _('Reviews')),
|
||||
(None, _('Reply'))]) }}
|
||||
<h1>{{ title }}</h1>
|
||||
|
||||
<div class="secondary">
|
||||
{{ addon|sidebar_listing }}
|
||||
</div>
|
||||
|
||||
<div class="primary island hero" id="reviews">
|
||||
{% include "reviews/impala/review.html" %}
|
||||
<form method="post" class="prettyform c"
|
||||
action="{{ url('i_reviews.reply', addon.slug, review.id) }}">
|
||||
{{ csrf() }}
|
||||
<fieldset>
|
||||
<h2>{{ _('Write a Reply') }}</h2>
|
||||
<ul>
|
||||
{{ pretty_field(form.title, label=_('Title')) }}
|
||||
{{ pretty_field(form.body, label=_('Reply')) }}
|
||||
</ul>
|
||||
</fieldset>
|
||||
<footer>
|
||||
{{ required_note() }}
|
||||
<button type="submit">{{ _('Submit review') }}</button>
|
||||
{# L10n: this string is following a <button>. #}
|
||||
{% trans url=addon.reviews_url %}
|
||||
or <a href="{{ url }}">Cancel</a>
|
||||
{% endtrans %}
|
||||
</footer>
|
||||
</form>
|
||||
</div>
|
||||
{{ report_review_popup() }}
|
||||
{% endblock %}
|
|
@ -1,95 +0,0 @@
|
|||
{% set perms = review_perms or {} %}
|
||||
{% set outdated = (review.version_id
|
||||
and review.version_id != addon._current_version_id) %}
|
||||
{% set is_reply = review.reply_to_id is not none %}
|
||||
{% set has_reply = review.id in replies %}
|
||||
{% if flags %}
|
||||
{% set is_flagged = flags[review.id] %}
|
||||
{% endif %}
|
||||
|
||||
<div class="review c item{{ ' reply' if is_reply }}{{ ' flagged' if is_flagged }}"
|
||||
id="review-{{ review.id }}"
|
||||
data-rating="{{ review.rating }}">
|
||||
{% if show_addon %}
|
||||
<h3 class="addon-name"><a href="{{ addon.get_url_path() }}">{{ addon.name }}</a></h3>
|
||||
{% endif %}
|
||||
{% with tag = 'h4' if show_addon else 'h3' %}
|
||||
<{{ tag }}>
|
||||
{% if review.title %}
|
||||
<b>{{ review.title }}</b>
|
||||
{% endif %}
|
||||
{% if not is_reply %}
|
||||
{{ review.rating|stars }}
|
||||
{% endif %}
|
||||
</{{ tag }}>
|
||||
{% endwith %}
|
||||
<p class="byline">
|
||||
{% if is_reply %}
|
||||
{% trans user=review.user|user_link, date=review.created|datetime %}
|
||||
by {{ user }} <b>(Developer)</b> on {{ date }}
|
||||
{% endtrans %}
|
||||
{% else %}
|
||||
{% trans user=review.user|user_link, date=review.created|datetime %}
|
||||
by {{ user }} on {{ date }}
|
||||
{% endtrans %}
|
||||
{% endif %}
|
||||
{% if (perms.is_admin or perms.is_editor)
|
||||
and review.ip_address != '0.0.0.0' %}
|
||||
<span>[{{ review.ip_address }}]</span>
|
||||
{% endif %}
|
||||
<a class="permalink"
|
||||
href="{{ url('i_reviews.detail', addon.slug, review.id) }}">#</a>
|
||||
</p>
|
||||
<p class="description">{{ review.body|nl2br }}</p>
|
||||
{% if outdated and not is_reply %}
|
||||
{# L10n: {0} is a version number (like 1.01) #}
|
||||
<span class="item-note">{{ _('This review is for a previous version of the add-on ({0}).')|f(review.version.version) }} </span>
|
||||
{% endif %}
|
||||
{% if page != 'user' and review.previous_count %}
|
||||
<span class="item-note">
|
||||
{% with user_review_url = url('i_reviews.user', addon.slug, review.user.id) %}
|
||||
{% if review.is_latest %}
|
||||
{% trans num=review.previous_count, cnt=review.previous_count|numberfmt %}
|
||||
This user has a <a href="{{ user_review_url }}">previous review</a> of this add-on.
|
||||
{% pluralize %}
|
||||
This user has <a href="{{ user_review_url }}">{{ cnt }} previous reviews</a> of this add-on.
|
||||
{% endtrans %}
|
||||
{% else %}
|
||||
{% trans %}
|
||||
This user has <a href="{{ user_review_url }}">other reviews</a> of this add-on.
|
||||
{% endtrans %}
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
</span>
|
||||
{% endif %}
|
||||
{% if request.user.is_authenticated() %}
|
||||
<ul class="item-actions">
|
||||
{% if is_flagged %}
|
||||
<li class="flagged">{{ _('Flagged for review') }}</li>
|
||||
{% elif review.user_id != request.user.id %}
|
||||
<li>
|
||||
<a class="flag-review" href="{{ url('reviews.flag', addon.slug, review.id) }}">
|
||||
{{ _('Report this review') }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if not (is_reply or has_reply) and (perms.is_author or perms.is_admin) %}
|
||||
<li>
|
||||
<a class="review-delete" href="{{ url('i_reviews.reply', addon.slug, review.id) }}">
|
||||
{{ _('Reply to review') }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if review.user_id == request.user.id %}
|
||||
<li>
|
||||
<a class="review-edit" href="#">
|
||||
{{ _('Edit review') }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if perms.can_delete %}
|
||||
<li>
|
||||
<a class="delete-review" href="{{ url('reviews.delete', addon.slug, review.id) }}">
|
||||
{{ _('Delete review') }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
|
@ -1,118 +0,0 @@
|
|||
{% extends "impala/base.html" %}
|
||||
{% from 'includes/forms.html' import pretty_field, required_note %}
|
||||
{% set amo_user = request.amo_user if request.user.is_authenticated() else None %}
|
||||
|
||||
{# L10n: {0} is an add-on name. #}
|
||||
{% block title %}{{ page_title(_('{0} :: Reviews')|f(addon.name)) }}{% endblock %}
|
||||
|
||||
{% block bodyclass %}reviews gutter{% endblock %}
|
||||
|
||||
{% block rss_feed %}
|
||||
<link rel="alternate" type="application/rss+xml"
|
||||
title="RSS" href="{{ addon.reviews_url }}format:rss">
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{{ impala_breadcrumbs([(addon.type_url(), amo.ADDON_TYPES[addon.type]),
|
||||
(addon.get_url_path(), addon.name),
|
||||
(None if page == 'list' else addon.reviews_url, _('Reviews'))]) }}
|
||||
{% block review_header %}
|
||||
<header>
|
||||
<hgroup>
|
||||
{% if page == "list" %}
|
||||
<h1>{{ _('Reviews for {0}')|f(addon.name) }}</h1>
|
||||
{% with num = reviews.paginator.count %}
|
||||
{% if addon.is_webapp() %}
|
||||
{# L10n: {0} is a number. #}
|
||||
<h3>{{ ngettext('<b>{0}</b> review for this app',
|
||||
'<b>{0}</b> reviews for this app',
|
||||
num)|f(num|numberfmt)|safe }}</h3>
|
||||
{% else %}
|
||||
{# L10n: {0} is a number. #}
|
||||
<h3>{{ ngettext('<b>{0}</b> review for this add-on',
|
||||
'<b>{0}</b> reviews for this add-on',
|
||||
num)|f(num|numberfmt)|safe }}</h3>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% elif reply %}
|
||||
{# L10n: {0} is a developer's name. #}
|
||||
<h1>{{ _('Developer reply by {0}')|f(reply.user.name) }}</h1>
|
||||
{% elif reviews.object_list %}
|
||||
<h1>{% trans cnt=reviews.object_list|length, addon=addon.name,
|
||||
user=reviews.object_list[0].user.name %}
|
||||
Review for {{ addon }} by {{ user }}
|
||||
{% pluralize %}
|
||||
Reviews for {{ addon }} by {{ user }}
|
||||
{% endtrans %}</h1>
|
||||
{% else %}
|
||||
<h1>{{ _('No reviews found.') }}</h1>
|
||||
{% endif %}
|
||||
</hgroup>
|
||||
</header>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
|
||||
<div class="secondary">
|
||||
<section>
|
||||
{{ addon|sidebar_listing }}
|
||||
</section>
|
||||
<section class="average-rating">
|
||||
{{ addon.average_rating|float|stars }}
|
||||
{% trans total=addon.total_reviews|numberfmt %}
|
||||
<strong>Average</strong> ({{ total }})
|
||||
{% endtrans %}
|
||||
</section>
|
||||
<section>
|
||||
{% include "reviews/grouped_ratings.html" %}
|
||||
</section>
|
||||
<section>
|
||||
{% if amo_user and addon.can_review(amo_user) %}
|
||||
<a class="button" id="add-review" href="{{ url('i_reviews.add', addon.slug) }}">
|
||||
{{ _('Write a New Review') }}</a>
|
||||
{% endif %}
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="primary island hero c" id="reviews" role="main">
|
||||
{% block review_list %}
|
||||
{% if not reviews.object_list %}
|
||||
{% if addon.can_review(amo_user) %}
|
||||
<p id="add-first-review"><a href="{{ url('i_reviews.add', addon.slug) }}">
|
||||
{{ _('Be the first to write a review.') }}</a><p>
|
||||
{% else %}
|
||||
<p id="no-add-first-review">{{ _('No reviews found.') }}</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% for review in reviews.object_list %}
|
||||
{% include "reviews/impala/review.html" %}
|
||||
{% if review.id in replies %}
|
||||
{% with review=replies[review.id] %}
|
||||
{% include "reviews/impala/review.html" %}
|
||||
{% endwith %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{{ reviews|impala_paginator }}
|
||||
{% endblock review_list %}
|
||||
<div class="hidden">
|
||||
<form method="post" id="review-edit-form" action="#"
|
||||
class="review article review-form prettyform">
|
||||
{{ csrf() }}
|
||||
<fieldset>
|
||||
<ul>
|
||||
{{ pretty_field(form.title, _('Title')) }}
|
||||
{{ pretty_field(form.rating, _('Rating')) }}
|
||||
{{ pretty_field(form.body, _('Review')) }}
|
||||
</ul>
|
||||
</fieldset>
|
||||
<footer>
|
||||
{{ required_note() }}
|
||||
<input type="submit" value="{{ _('Submit review') }}">
|
||||
{{ _('or') }} <a href="#" id="review-edit-cancel">{{ _('Cancel') }}</a>
|
||||
</footer>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{ report_review_popup() }}
|
||||
{% endblock content %}
|
|
@ -1,38 +1,45 @@
|
|||
{% extends "reviews/review_list.html" %}
|
||||
{% extends "impala/base.html" %}
|
||||
{% from 'includes/forms.html' import pretty_field, required_note %}
|
||||
|
||||
{% set title = _('Reply to review by {0}')|f(review.user.name) %}
|
||||
|
||||
{% block bodyclass %}reviews gutter{% endblock %}
|
||||
|
||||
{% block title %}{{ page_title(title) }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block review_header %}
|
||||
<header>
|
||||
{{ breadcrumbs([(addon.type_url(), amo.ADDON_TYPES[addon.type]),
|
||||
(addon.get_url_path(), addon.name),
|
||||
(url('reviews.list', addon.slug), _('Reviews')),
|
||||
(None, _('Reply'))]) }}
|
||||
<h2>{{ title }}</h2>
|
||||
</header>
|
||||
{% endblock %}
|
||||
|
||||
{% block review_list %}
|
||||
{{ impala_breadcrumbs([(addon.type_url(), amo.ADDON_TYPES[addon.type]),
|
||||
(addon.get_url_path(), addon.name),
|
||||
(addon.reviews_url, _('Reviews')),
|
||||
(None, _('Reply'))]) }}
|
||||
<h1>{{ title }}</h1>
|
||||
|
||||
<div class="secondary">
|
||||
{{ addon|sidebar_listing }}
|
||||
</div>
|
||||
|
||||
<div class="primary island hero" id="reviews">
|
||||
{% include "reviews/review.html" %}
|
||||
<div class="review article reply-form">
|
||||
<h3>{{ _('Write a Reply') }}</h3>
|
||||
<form method="post" action="{{ url('reviews.reply', addon.slug, review.id) }}">
|
||||
{{ csrf() }}
|
||||
<p>
|
||||
<label for="id_title">{{ form.title.label }} <span class="optional">{{ _('(optional)') }}</span></label>
|
||||
{{ form.title }}
|
||||
</p>
|
||||
{{ field(form.body, _('Reply:')) }}
|
||||
<input type="submit" value="{{ _('Submit Your Reply') }}">
|
||||
<form method="post" class="prettyform c"
|
||||
action="{{ url('reviews.reply', addon.slug, review.id) }}">
|
||||
{{ csrf() }}
|
||||
<fieldset>
|
||||
<h2>{{ _('Write a Reply') }}</h2>
|
||||
<ul>
|
||||
{{ pretty_field(form.title, label=_('Title')) }}
|
||||
{{ pretty_field(form.body, label=_('Reply')) }}
|
||||
</ul>
|
||||
</fieldset>
|
||||
<footer>
|
||||
{{ required_note() }}
|
||||
<button type="submit">{{ _('Submit review') }}</button>
|
||||
{# L10n: this string is following a <button>. #}
|
||||
{% trans url=url('reviews.list', addon.slug) %}
|
||||
{% trans url=addon.reviews_url %}
|
||||
or <a href="{{ url }}">Cancel</a>
|
||||
{% endtrans %}
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{{ report_review_popup() }}
|
||||
</footer>
|
||||
</form>
|
||||
</div>
|
||||
{{ report_review_popup() }}
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,18 +1,29 @@
|
|||
{% set perms = review_perms or {} %}
|
||||
{% set outdated = (review.version_id
|
||||
and review.version_id != addon._current_version_id) %}
|
||||
and review.version_id != addon._current_version_id) %}
|
||||
{% set is_reply = review.reply_to_id is not none %}
|
||||
{% set has_reply = review.id in replies %}
|
||||
{% if flags %}
|
||||
{% set is_flagged = flags[review.id] %}
|
||||
{% endif %}
|
||||
<div class="review article {% if is_reply %}reply{% endif %}
|
||||
{% if is_flagged %}flagged{% endif %}"
|
||||
|
||||
<div class="review c item{{ ' reply' if is_reply }}{{ ' flagged' if is_flagged }}"
|
||||
id="review-{{ review.id }}"
|
||||
data-rating="{{ review.rating }}">
|
||||
<h5>{{ review.title }}</h5>
|
||||
{% if not is_reply %}{{ review.rating|float|stars }}{% endif %}
|
||||
<div class="reviewed-on">
|
||||
{% if show_addon %}
|
||||
<h3 class="addon-name"><a href="{{ addon.get_url_path() }}">{{ addon.name }}</a></h3>
|
||||
{% endif %}
|
||||
{% with tag = 'h4' if show_addon else 'h3' %}
|
||||
<{{ tag }}>
|
||||
{% if review.title %}
|
||||
<b>{{ review.title }}</b>
|
||||
{% endif %}
|
||||
{% if not is_reply %}
|
||||
{{ review.rating|stars }}
|
||||
{% endif %}
|
||||
</{{ tag }}>
|
||||
{% endwith %}
|
||||
<p class="byline">
|
||||
{% if is_reply %}
|
||||
{% trans user=review.user|user_link, date=review.created|datetime %}
|
||||
by {{ user }} <b>(Developer)</b> on {{ date }}
|
||||
|
@ -26,18 +37,19 @@
|
|||
and review.ip_address != '0.0.0.0' %}
|
||||
<span>[{{ review.ip_address }}]</span>
|
||||
{% endif %}
|
||||
<a class="permalink" href="{{ url('reviews.detail', addon.slug, review.id) }}">#</a>
|
||||
</div>
|
||||
<p class="review-body">{{ review.body|nl2br }}</p>
|
||||
<a class="permalink"
|
||||
href="{{ url('reviews.detail', addon.slug, review.id) }}">#</a>
|
||||
</p>
|
||||
<p class="description">{{ review.body|nl2br }}</p>
|
||||
{% if outdated and not is_reply %}
|
||||
{# L10n: {0} is a version number (like 1.01) #}
|
||||
<span class="review-note">{{ _('This review is for a previous version of the add-on ({0}).')|f(review.version.version) }} </span>
|
||||
<span class="item-note">{{ _('This review is for a previous version of the add-on ({0}).')|f(review.version.version) }} </span>
|
||||
{% endif %}
|
||||
{% if page != 'user' and review.previous_count %}
|
||||
<span class="review-note">
|
||||
<span class="item-note">
|
||||
{% with user_review_url = url('reviews.user', addon.slug, review.user.id) %}
|
||||
{% if review.is_latest %}
|
||||
{% trans cnt=review.previous_count %}
|
||||
{% trans num=review.previous_count, cnt=review.previous_count|numberfmt %}
|
||||
This user has a <a href="{{ user_review_url }}">previous review</a> of this add-on.
|
||||
{% pluralize %}
|
||||
This user has <a href="{{ user_review_url }}">{{ cnt }} previous reviews</a> of this add-on.
|
||||
|
@ -51,11 +63,11 @@
|
|||
</span>
|
||||
{% endif %}
|
||||
{% if request.user.is_authenticated() %}
|
||||
<ul class="review-options">
|
||||
<ul class="item-actions">
|
||||
{% if is_flagged %}
|
||||
<li>{{ _('Flagged for review') }}</li>
|
||||
{% else %}
|
||||
<li class="review-wrapper">
|
||||
<li class="flagged">{{ _('Flagged for review') }}</li>
|
||||
{% elif review.user_id != request.user.id %}
|
||||
<li>
|
||||
<a class="flag-review" href="{{ url('reviews.flag', addon.slug, review.id) }}">
|
||||
{{ _('Report this review') }}</a>
|
||||
</li>
|
||||
|
|
|
@ -1,109 +1,118 @@
|
|||
{% extends "base.html" %}
|
||||
{% extends "impala/base.html" %}
|
||||
{% from 'includes/forms.html' import pretty_field, required_note %}
|
||||
{% set amo_user = request.amo_user if request.user.is_authenticated() else None %}
|
||||
|
||||
{# L10n: {0} is an add-on name. #}
|
||||
{% block title %}{{ page_title(_('{0} :: Reviews')|f(addon.name)) }}{% endblock %}
|
||||
|
||||
{% block bodyclass %}reviews inverse{% endblock %}
|
||||
{% block bodyclass %}reviews gutter{% endblock %}
|
||||
|
||||
{% block rss_feed %}
|
||||
<link rel="alternate" type="application/rss+xml"
|
||||
title="RSS" href="{{ url('reviews.list', addon.slug) }}format:rss">
|
||||
title="RSS" href="{{ addon.reviews_url }}format:rss">
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block review_header %}
|
||||
<header>
|
||||
{# Give a link back to reviews if we're looking at user reviews or a detail page. #}
|
||||
{% with link = None if page == 'list' else url('reviews.list', addon.slug) %}
|
||||
{{ breadcrumbs([(addon.type_url(), amo.ADDON_TYPES[addon.type]),
|
||||
(addon.get_url_path(), addon.name),
|
||||
(link, _('Reviews'))]) }}
|
||||
{% endwith %}
|
||||
<hgroup>
|
||||
{% if page == "list" %}
|
||||
<h2>{{ _('Reviews for {0}')|f(addon.name) }}</h2>
|
||||
{% with num = reviews.paginator.count %}
|
||||
{# L10n: {0} is a number. #}
|
||||
<h3>{{ ngettext('<b>{0}</b> review for this add-on',
|
||||
'<b>{0}</b> reviews for this add-on',
|
||||
num)|f(num|numberfmt)|safe }}</h3>
|
||||
{% endwith %}
|
||||
{% elif reply %}
|
||||
{# L10n: {0} is a developer's name. #}
|
||||
<h2>{{ _('Developer reply by {0}')|f(reply.user.name) }}</h2>
|
||||
{% elif reviews.object_list %}
|
||||
<h2>{% trans cnt=reviews.object_list|length, addon=addon.name,
|
||||
user=reviews.object_list[0].user.name %}
|
||||
Review for {{ addon }} by {{ user }}
|
||||
{% pluralize %}
|
||||
Reviews for {{ addon }} by {{ user }}
|
||||
{% endtrans %}</h2>
|
||||
{% else %}
|
||||
<h2>{{ _('No reviews found.') }}</h2>
|
||||
{% endif %}
|
||||
</hgroup>
|
||||
</header>
|
||||
{% endblock %}
|
||||
<div class="primary" role="main">
|
||||
|
||||
{% block review_list %}
|
||||
{% if not reviews.object_list %}
|
||||
<p><a href="{{ url('reviews.add', addon.slug) }}">
|
||||
{{ _('Be the first to write a review.') }}</a><p>
|
||||
{% endif %}
|
||||
{% for review in reviews.object_list %}
|
||||
{% include "reviews/review.html" %}
|
||||
{% if review.id in replies %}
|
||||
{% with review=replies[review.id] %}
|
||||
{% include "reviews/review.html" %}
|
||||
{% endwith %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{{ reviews|paginator }}
|
||||
{% endblock review_list %}
|
||||
<div class="hidden">
|
||||
<form method="post" id="review-edit-form" action="#"
|
||||
class="review article review-form">
|
||||
{{ csrf() }}
|
||||
{{ field(form.title, _('Title:')) }}
|
||||
{{ field(form.rating, _('Rating:')) }}
|
||||
{{ field(form.body, _('Review:')) }}
|
||||
<p>
|
||||
<input type="submit" value="{{ _('Submit review') }}">
|
||||
or <a href="#" id="review-edit-cancel">Cancel</a>
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="secondary">
|
||||
<div class="highlight">
|
||||
{{ impala_breadcrumbs([(addon.type_url(), amo.ADDON_TYPES[addon.type]),
|
||||
(addon.get_url_path(), addon.name),
|
||||
(None if page == 'list' else addon.reviews_url, _('Reviews'))]) }}
|
||||
{% block review_header %}
|
||||
<header>
|
||||
<hgroup>
|
||||
<h5 {{ addon.name|locale_html }}>
|
||||
<a href="{{ addon.get_url_path() }}">
|
||||
<img src="{{ addon.icon_url }}" class="icon">
|
||||
<span>{{ addon.name }}</span>
|
||||
</a>
|
||||
</h5>
|
||||
<h6 class="author">{{ _('by') }} {{ users_list(addon.listed_authors) }}</h6>
|
||||
{% if page == 'list' %}
|
||||
<h1>{{ _('Reviews for {0}')|f(addon.name) }}</h1>
|
||||
{% with num = reviews.paginator.count %}
|
||||
{% if addon.is_webapp() %}
|
||||
{# L10n: {0} is a number. #}
|
||||
<h3>{{ ngettext('<b>{0}</b> review for this app',
|
||||
'<b>{0}</b> reviews for this app',
|
||||
num)|f(num|numberfmt)|safe }}</h3>
|
||||
{% else %}
|
||||
{# L10n: {0} is a number. #}
|
||||
<h3>{{ ngettext('<b>{0}</b> review for this add-on',
|
||||
'<b>{0}</b> reviews for this add-on',
|
||||
num)|f(num|numberfmt)|safe }}</h3>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% elif reply %}
|
||||
{# L10n: {0} is a developer's name. #}
|
||||
<h1>{{ _('Developer reply by {0}')|f(reply.user.name) }}</h1>
|
||||
{% elif reviews.object_list %}
|
||||
<h1>{% trans cnt=reviews.object_list|length, addon=addon.name,
|
||||
user=reviews.object_list[0].user.name %}
|
||||
Review for {{ addon }} by {{ user }}
|
||||
{% pluralize %}
|
||||
Reviews for {{ addon }} by {{ user }}
|
||||
{% endtrans %}</h1>
|
||||
{% else %}
|
||||
<h1>{{ _('No reviews found.') }}</h1>
|
||||
{% endif %}
|
||||
</hgroup>
|
||||
<div class="average_rating">
|
||||
<span>
|
||||
{{ addon.average_rating|float|stars }}
|
||||
{% trans total=addon.total_reviews|numberfmt %}
|
||||
<strong>Average Rating</strong> ({{ total }})
|
||||
{% endtrans %}
|
||||
</span>
|
||||
</div>
|
||||
{% include "reviews/grouped_ratings.html" %}
|
||||
{% if not review_perms.is_author and addon.can_review(request.amo_user) %}
|
||||
<div>
|
||||
<a class="button" href="{{ url('reviews.add', addon.slug) }}">
|
||||
{{ _('Write a New Review') }}</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
{% endblock %}
|
||||
|
||||
{{ report_review_popup() }}
|
||||
|
||||
|
||||
<div class="secondary">
|
||||
<section>
|
||||
{{ addon|sidebar_listing }}
|
||||
</section>
|
||||
<section class="average-rating">
|
||||
{{ addon.average_rating|float|stars }}
|
||||
{% trans total=addon.total_reviews|numberfmt %}
|
||||
<strong>Average</strong> ({{ total }})
|
||||
{% endtrans %}
|
||||
</section>
|
||||
<section>
|
||||
{% include "reviews/grouped_ratings.html" %}
|
||||
</section>
|
||||
<section>
|
||||
{% if amo_user and addon.can_review(amo_user) %}
|
||||
<a class="button" id="add-review" href="{{ url('reviews.add', addon.slug) }}">
|
||||
{{ _('Write a New Review') }}</a>
|
||||
{% endif %}
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="primary island hero c" id="reviews" role="main">
|
||||
{% block review_list %}
|
||||
{% if not reviews.object_list %}
|
||||
{% if addon.can_review(amo_user) %}
|
||||
<p id="add-first-review"><a href="{{ url('reviews.add', addon.slug) }}">
|
||||
{{ _('Be the first to write a review.') }}</a><p>
|
||||
{% else %}
|
||||
<p id="no-add-first-review">{{ _('No reviews found.') }}</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% for review in reviews.object_list %}
|
||||
{% include "reviews/review.html" %}
|
||||
{% if review.id in replies %}
|
||||
{% with review=replies[review.id] %}
|
||||
{% include "reviews/review.html" %}
|
||||
{% endwith %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{{ reviews|impala_paginator }}
|
||||
{% endblock review_list %}
|
||||
<div class="hidden">
|
||||
<form method="post" id="review-edit-form" action="#"
|
||||
class="review article review-form prettyform">
|
||||
{{ csrf() }}
|
||||
<fieldset>
|
||||
<ul>
|
||||
{{ pretty_field(form.title, _('Title')) }}
|
||||
{{ pretty_field(form.rating, _('Rating')) }}
|
||||
{{ pretty_field(form.body, _('Review')) }}
|
||||
</ul>
|
||||
</fieldset>
|
||||
<footer>
|
||||
{{ required_note() }}
|
||||
<input type="submit" value="{{ _('Submit review') }}">
|
||||
{{ _('or') }} <a href="#" id="review-edit-cancel">{{ _('Cancel') }}</a>
|
||||
</footer>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{ report_review_popup() }}
|
||||
{% endblock content %}
|
||||
|
|
|
@ -42,7 +42,7 @@ class TestViews(ReviewTest):
|
|||
eq_(r.status_code, 200)
|
||||
|
||||
def test_list(self):
|
||||
r = self.client.get(reverse('i_reviews.list', args=['a1865']))
|
||||
r = self.client.get(reverse('reviews.list', args=['a1865']))
|
||||
eq_(r.status_code, 200)
|
||||
reviews = pq(r.content)('#reviews .item')
|
||||
eq_(reviews.length, Review.objects.count())
|
||||
|
@ -66,7 +66,7 @@ class TestViews(ReviewTest):
|
|||
def test_list_item_actions(self):
|
||||
self.client.login(username='jbalogh@mozilla.com', password='password')
|
||||
self.make_it_my_review()
|
||||
r = self.client.get(reverse('i_reviews.list', args=['a1865']))
|
||||
r = self.client.get(reverse('reviews.list', args=['a1865']))
|
||||
reviews = pq(r.content)('#reviews .item')
|
||||
|
||||
r = Review.objects.get(id=218207)
|
||||
|
@ -182,7 +182,7 @@ class TestCreate(ReviewTest):
|
|||
self.qs = Review.objects.filter(addon=1865)
|
||||
self.log_count = ActivityLog.objects.count
|
||||
self.more = reverse('addons.detail_more', args=['a1865'])
|
||||
self.list = reverse('i_reviews.list', args=['a1865'])
|
||||
self.list = reverse('reviews.list', args=['a1865'])
|
||||
|
||||
def test_no_body(self):
|
||||
r = self.client.post(self.add, {'body': ''})
|
||||
|
@ -252,7 +252,7 @@ class TestCreate(ReviewTest):
|
|||
self.client.logout()
|
||||
r = self.client.get_ajax(self.more)
|
||||
eq_(pq(r.content)('#add-review').length, 1)
|
||||
r = self.client.get(reverse('i_reviews.list', args=['a1865']))
|
||||
r = self.client.get(reverse('reviews.list', args=['a1865']))
|
||||
doc = pq(r.content)
|
||||
eq_(doc('#add-review').length, 0)
|
||||
eq_(doc('#add-first-review').length, 0)
|
||||
|
@ -271,7 +271,7 @@ class TestCreate(ReviewTest):
|
|||
self.login_dev()
|
||||
r = self.client.get_ajax(self.more)
|
||||
eq_(pq(r.content)('#add-review').length, 0)
|
||||
r = self.client.get(reverse('i_reviews.list', args=['a1865']))
|
||||
r = self.client.get(reverse('reviews.list', args=['a1865']))
|
||||
doc = pq(r.content)
|
||||
eq_(doc('#add-review').length, 0)
|
||||
eq_(doc('#add-first-review').length, 0)
|
||||
|
|
|
@ -41,50 +41,6 @@ def send_mail(template, subject, emails, context, perm_setting):
|
|||
@addon_view
|
||||
@mobile_template('reviews/{mobile/}review_list.html')
|
||||
def review_list(request, addon, review_id=None, user_id=None, template=None):
|
||||
q = (Review.objects.valid().filter(addon=addon)
|
||||
.transform(Review.transformer).order_by('-created'))
|
||||
|
||||
ctx = {'addon': addon,
|
||||
'grouped_ratings': GroupedRating.get(addon.id)}
|
||||
ctx.update(flag_context())
|
||||
|
||||
ctx['form'] = forms.ReviewForm(None)
|
||||
|
||||
if review_id is not None:
|
||||
ctx['page'] = 'detail'
|
||||
# If this is a dev reply, find the first msg for context.
|
||||
review = get_object_or_404(Review.objects.all(), pk=review_id)
|
||||
if review.reply_to_id:
|
||||
review_id = review.reply_to_id
|
||||
ctx['reply'] = review
|
||||
q = q.filter(pk=review_id)
|
||||
elif user_id is not None:
|
||||
ctx['page'] = 'user'
|
||||
q = q.filter(user=user_id)
|
||||
if not q:
|
||||
raise http.Http404()
|
||||
else:
|
||||
ctx['page'] = 'list'
|
||||
q = q.filter(is_latest=True)
|
||||
|
||||
ctx['reviews'] = reviews = amo.utils.paginate(request, q)
|
||||
ctx['replies'] = Review.get_replies(reviews.object_list)
|
||||
if request.user.is_authenticated():
|
||||
ctx['review_perms'] = {
|
||||
'is_admin': acl.action_allowed(request, 'Admin', 'EditAnyAddon'),
|
||||
'is_editor': acl.action_allowed(request, 'Editor', '%'),
|
||||
'is_author': acl.check_addon_ownership(request, addon, dev=True),
|
||||
'can_delete': acl.action_allowed(request, 'Editors',
|
||||
'DeleteReview'),
|
||||
}
|
||||
ctx['flags'] = get_flags(request, reviews.object_list)
|
||||
else:
|
||||
ctx['review_perms'] = {}
|
||||
return jingo.render(request, template, ctx)
|
||||
|
||||
|
||||
@addon_view
|
||||
def impala_review_list(request, addon, review_id=None, user_id=None):
|
||||
q = (Review.objects.valid().filter(addon=addon)
|
||||
.order_by('-created'))
|
||||
|
||||
|
@ -124,7 +80,7 @@ def impala_review_list(request, addon, review_id=None, user_id=None):
|
|||
ctx['flags'] = get_flags(request, reviews.object_list)
|
||||
else:
|
||||
ctx['review_perms'] = {}
|
||||
return jingo.render(request, 'reviews/impala/review_list.html', ctx)
|
||||
return jingo.render(request, template, ctx)
|
||||
|
||||
|
||||
def get_flags(request, reviews):
|
||||
|
@ -209,10 +165,9 @@ def reply(request, addon, review_id):
|
|||
args=[addon.slug, review.id],
|
||||
add_prefix=False))}
|
||||
emails = [review.user.email]
|
||||
if settings.IMPALA_EDIT:
|
||||
sub = u'Mozilla Add-on Developer Reply: %s' % addon.name
|
||||
send_mail('reviews/emails/reply_review.ltxt',
|
||||
sub, emails, Context(data), 'reply')
|
||||
sub = u'Mozilla Add-on Developer Reply: %s' % addon.name
|
||||
send_mail('reviews/emails/reply_review.ltxt',
|
||||
sub, emails, Context(data), 'reply')
|
||||
|
||||
return redirect('reviews.detail', addon.slug, review_id)
|
||||
ctx = dict(review=review, form=form, addon=addon)
|
||||
|
@ -220,32 +175,6 @@ def reply(request, addon, review_id):
|
|||
return jingo.render(request, 'reviews/reply.html', ctx)
|
||||
|
||||
|
||||
@addon_view
|
||||
@login_required
|
||||
def impala_reply(request, addon, review_id):
|
||||
is_admin = acl.action_allowed(request, 'Admin', 'EditAnyAddon')
|
||||
is_author = acl.check_addon_ownership(request, addon, dev=True)
|
||||
if not (is_admin or is_author):
|
||||
return http.HttpResponseForbidden()
|
||||
|
||||
review = get_object_or_404(Review.objects, pk=review_id, addon=addon)
|
||||
form = forms.ReviewReplyForm(request.POST or None)
|
||||
if request.method == 'POST':
|
||||
if 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))
|
||||
return redirect('i_reviews.detail', addon.slug, review_id)
|
||||
ctx = dict(review=review, form=form, addon=addon)
|
||||
ctx.update(flag_context())
|
||||
return jingo.render(request, 'reviews/impala/reply.html', ctx)
|
||||
|
||||
|
||||
@addon_view
|
||||
@mobile_template('reviews/{mobile/}add.html')
|
||||
@login_required
|
||||
|
@ -268,32 +197,12 @@ def add(request, addon, template=None):
|
|||
args=[addon.slug, review.id], add_prefix=False))}
|
||||
|
||||
emails = [a.email for a in addon.authors.all()]
|
||||
if settings.IMPALA_EDIT:
|
||||
send_mail('reviews/emails/add_review.ltxt',
|
||||
u'Mozilla Add-on User Review: %s' % addon.name,
|
||||
emails, Context(data), 'new_review')
|
||||
send_mail('reviews/emails/add_review.ltxt',
|
||||
u'Mozilla Add-on User Review: %s' % addon.name,
|
||||
emails, Context(data), 'new_review')
|
||||
|
||||
return redirect('reviews.list', addon.slug)
|
||||
return jingo.render(request, template,
|
||||
dict(addon=addon, form=form))
|
||||
|
||||
|
||||
@addon_view
|
||||
@login_required
|
||||
@purchase_required
|
||||
def impala_add(request, addon):
|
||||
if acl.check_addon_ownership(request, addon, dev=True):
|
||||
return http.HttpResponseForbidden()
|
||||
form = forms.ReviewForm(request.POST or None)
|
||||
if request.method == 'POST':
|
||||
if form.is_valid():
|
||||
details = _review_details(request, addon, form)
|
||||
review = Review.objects.create(**details)
|
||||
amo.log(amo.LOG.ADD_REVIEW, addon, review)
|
||||
log.debug('New review: %s' % review.id)
|
||||
return redirect('i_reviews.list', addon.slug)
|
||||
return jingo.render(request, 'reviews/impala/add.html',
|
||||
dict(addon=addon, form=form))
|
||||
return jingo.render(request, template, dict(addon=addon, form=form))
|
||||
|
||||
|
||||
@addon_view
|
||||
|
@ -301,7 +210,7 @@ def impala_add(request, addon):
|
|||
@login_required(redirect=False)
|
||||
@post_required
|
||||
def edit(request, addon, review_id):
|
||||
review = get_object_or_404(Review.objects, pk=review_id, addon=addon)
|
||||
review = get_object_or_404(Review, pk=review_id, addon=addon)
|
||||
is_admin = acl.action_allowed(request, 'Admin', 'EditAnyAddon')
|
||||
if not (request.user.id == review.user.id or is_admin):
|
||||
return http.HttpResponseForbidden()
|
||||
|
|
|
@ -62,7 +62,7 @@
|
|||
{% for review in reviews %}
|
||||
{% set addon = review.addon %}
|
||||
{% with show_addon = True %}
|
||||
{% include "reviews/impala/review.html" %}
|
||||
{% include "reviews/review.html" %}
|
||||
{% endwith %}
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
|
|
|
@ -1068,7 +1068,6 @@ UNLINK_SITE_STATS = True
|
|||
NEW_FEATURES = False
|
||||
|
||||
# Impala flags.
|
||||
IMPALA_REVIEWS = False
|
||||
IMPALA_EDIT = True
|
||||
|
||||
# Set to True if we're allowed to use X-SENDFILE.
|
||||
|
|
Загрузка…
Ссылка в новой задаче