This commit is contained in:
Chris Van 2011-09-28 17:13:38 -07:00
Родитель 96baa6c282
Коммит 13e7b0bb6e
17 изменённых файлов: 238 добавлений и 648 удалений

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

@ -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) }}&nbsp;</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) }}&nbsp;</span>
<span class="item-note">{{ _('This review is for a previous version of the add-on ({0}).')|f(review.version.version) }}&nbsp;</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.