spree_reviews 0.30.0 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/app/controllers/admin/reviews_controller.rb +3 -11
- data/app/models/product_decorator.rb +8 -5
- data/app/models/review.rb +1 -1
- data/app/models/review_sweeper.rb +20 -0
- data/app/views/admin/review_settings/show.html.erb +2 -2
- data/app/views/admin/reviews/edit.html.erb +3 -3
- data/app/views/feedback_reviews/_form.html.erb +1 -1
- data/app/views/reviews/_fine_print.html.erb +8 -6
- data/app/views/reviews/_form.html.erb +23 -0
- data/app/views/reviews/_stars.html.erb +1 -9
- data/app/views/reviews/new.html.erb +1 -38
- data/app/views/shared/_review.html.erb +2 -2
- data/app/views/shared/_shortrating.html.erb +0 -3
- data/config/initializers/constants.rb +1 -0
- data/config/locales/en.yml +34 -32
- data/config/locales/ru.yml +41 -20
- data/db/migrate/20110406083603_add_rating_to_products.rb +17 -0
- data/lib/spree_reviews.rb +1 -0
- data/lib/spree_reviews_hook.rb +8 -1
- data/public/stylesheets/reviews.css +70 -18
- data/spree_reviews.gemspec +3 -5
- metadata +19 -17
- data/app/models/rating.rb +0 -20
- data/app/views/reviews/_stars0.html.erb +0 -1
- data/app/views/reviews/_stars1.html.erb +0 -1
- data/app/views/reviews/_stars2.html.erb +0 -1
- data/app/views/reviews/_stars3.html.erb +0 -1
- data/app/views/reviews/_stars4.html.erb +0 -1
- data/app/views/reviews/_stars5.html.erb +0 -1
- data/db/migrate/20081020220700_create_ratings.rb +0 -14
- data/spec/models/ratings_spec.rb +0 -11
| @@ -1,10 +1,7 @@ | |
| 1 1 | 
             
            class Admin::ReviewsController < Admin::BaseController
         | 
| 2 | 
            -
               
         | 
| 3 | 
            -
              layout 'admin'
         | 
| 4 | 
            -
             | 
| 5 2 | 
             
              resource_controller
         | 
| 6 3 |  | 
| 7 | 
            -
              index | 
| 4 | 
            +
              def index
         | 
| 8 5 | 
             
                @unapproved_reviews = Review.not_approved.find(:all, :order => "created_at DESC")
         | 
| 9 6 | 
             
                @approved_reviews   = Review.approved.find(:all, :order => "created_at DESC")
         | 
| 10 7 | 
             
              end
         | 
| @@ -20,13 +17,8 @@ class Admin::ReviewsController < Admin::BaseController | |
| 20 17 | 
             
              def approve
         | 
| 21 18 | 
             
                r = Review.find(params[:id])
         | 
| 22 19 |  | 
| 23 | 
            -
                r.approved  | 
| 24 | 
            -
             | 
| 25 | 
            -
                  r.product.rating = Rating.create :value => 0, :count => 0
         | 
| 26 | 
            -
                end
         | 
| 27 | 
            -
                r.product.rating.add_rating(r.rating)
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                if r.save
         | 
| 20 | 
            +
                if r.update_attribute(:approved, true)
         | 
| 21 | 
            +
                   r.product.recalculate_rating
         | 
| 30 22 | 
             
                   flash[:notice] = t("info_approve_review")
         | 
| 31 23 | 
             
                else
         | 
| 32 24 | 
             
                   flash[:error] = t("error_approve_review")
         | 
| @@ -1,14 +1,17 @@ | |
| 1 1 | 
             
            # Add access to reviews/ratings to the product model
         | 
| 2 2 | 
             
            Product.class_eval do
         | 
| 3 | 
            -
              has_one :rating
         | 
| 4 3 | 
             
              has_many :reviews
         | 
| 5 4 |  | 
| 6 5 | 
             
              def get_stars
         | 
| 7 | 
            -
                 | 
| 8 | 
            -
             | 
| 6 | 
            +
                [avg_rating.round, reviews_count]
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              def recalculate_rating
         | 
| 10 | 
            +
                reviews_count = reviews.approved.count    
         | 
| 11 | 
            +
                if reviews_count > 0
         | 
| 12 | 
            +
                  self.update_attribute :avg_rating, self.reviews.approved.sum(:rating).to_f / reviews_count
         | 
| 9 13 | 
             
                else
         | 
| 10 | 
            -
                   | 
| 14 | 
            +
                  self.update_attribute :avg_rating, 0
         | 
| 11 15 | 
             
                end
         | 
| 12 16 | 
             
              end
         | 
| 13 | 
            -
             | 
| 14 17 | 
             
            end
         | 
    
        data/app/models/review.rb
    CHANGED
    
    
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            class ReviewSweeper < ActionController::Caching::Sweeper
         | 
| 2 | 
            +
              observe Review
         | 
| 3 | 
            +
              def after_create(review)
         | 
| 4 | 
            +
                expire_cache_for(review)
         | 
| 5 | 
            +
              end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              def after_update(review)
         | 
| 8 | 
            +
                expire_cache_for(review)
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              def after_destroy(review)
         | 
| 12 | 
            +
                expire_cache_for(review)
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
              
         | 
| 15 | 
            +
              private
         | 
| 16 | 
            +
              
         | 
| 17 | 
            +
              def expire_cache_for(review)
         | 
| 18 | 
            +
                review.product.recalculate_rating
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
| @@ -5,11 +5,11 @@ | |
| 5 5 | 
             
            <table>
         | 
| 6 6 | 
             
              <tr>
         | 
| 7 7 | 
             
                <th scope="row"><%= t("reviews.include_unapproved") %>:</th>
         | 
| 8 | 
            -
                <td><%= Spree::Reviews::Config[:include_unapproved_reviews] %></td>
         | 
| 8 | 
            +
                <td><%= Spree::Reviews::Config[:include_unapproved_reviews] ? t('yes') : t('no') %></td>
         | 
| 9 9 | 
             
              </tr>
         | 
| 10 10 | 
             
              <tr>
         | 
| 11 11 | 
             
                <th scope="row"><%= t("reviews.preview_size") %>:</th>
         | 
| 12 | 
            -
                <td><%= | 
| 12 | 
            +
                <td><%= Spree::Reviews::Config[:preview_size] %></td>
         | 
| 13 13 | 
             
              </tr>
         | 
| 14 14 | 
             
            </table>
         | 
| 15 15 |  | 
| @@ -1,13 +1,13 @@ | |
| 1 | 
            -
            <h1 | 
| 1 | 
            +
            <h1><%= t(:editing_review_for) %> <%= link_to @review.product.name, product_path(@review.product) %></h1>
         | 
| 2 2 |  | 
| 3 | 
            -
            <h2 | 
| 3 | 
            +
            <h2><%= t(:original_version) %></h2>
         | 
| 4 4 |  | 
| 5 5 | 
             
            <p>
         | 
| 6 6 | 
             
            <%= @review.review %>
         | 
| 7 7 | 
             
            </p>
         | 
| 8 8 | 
             
            <br/>
         | 
| 9 9 |  | 
| 10 | 
            -
            <h2 | 
| 10 | 
            +
            <h2><%= t(:edited_version) %></h2>
         | 
| 11 11 |  | 
| 12 12 | 
             
            <% form_for([:admin, @review]) do |f| %>
         | 
| 13 13 | 
             
              <%= render :partial => f,
         | 
| @@ -6,7 +6,7 @@ | |
| 6 6 | 
             
            <% end %>
         | 
| 7 7 |  | 
| 8 8 | 
             
            <%= t(:was_this_review_helpful) %>
         | 
| 9 | 
            -
            <% for i in 1.. | 
| 9 | 
            +
            <% for i in 1..NB_STARS %>
         | 
| 10 10 | 
             
            <%= radio_button_tag "feedback_review[rating]", pluralize(i, 'stars'), false, :class => "star" %>
         | 
| 11 11 | 
             
            <% end %>
         | 
| 12 12 | 
             
            <%= hidden_field_tag "feedback_review[user_id]", current_user.try(:id) %>
         | 
| @@ -1,7 +1,9 @@ | |
| 1 | 
            -
            < | 
| 2 | 
            -
            <h2><%= t('the_fine_print') %></h2>
         | 
| 3 | 
            -
            <ul>
         | 
| 4 | 
            -
                <li><%= t('terms_text') %>: <%= link_to t( | 
| 1 | 
            +
            <div class="review_fine_print">
         | 
| 2 | 
            +
              <h2><%= t('the_fine_print') %></h2>
         | 
| 3 | 
            +
              <ul>
         | 
| 4 | 
            +
                <li><%= t('terms_text') %>: <%= link_to t(:terms_and_conditions), url_for(:action => 'terms') %></li>
         | 
| 5 5 | 
             
                <li><%= t('approved_text') %></li>
         | 
| 6 | 
            -
                <li><%= t('guideline_text')  | 
| 7 | 
            -
             | 
| 6 | 
            +
                <li><%= t('guideline_text') %>
         | 
| 7 | 
            +
                  : <%= link_to t(:review_guidelines), url_for(:action => 'submissionguidelines') %></li>
         | 
| 8 | 
            +
              </ul>
         | 
| 9 | 
            +
            </div>
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            <%= form_for review, :url => product_reviews_path(product), :html => {:method => :post} do |f| %>
         | 
| 2 | 
            +
              <%= render "shared/error_messages", :target => review %>
         | 
| 3 | 
            +
              <%= f.hidden_field :product_id, :value => product.id %>
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              <p class="review_rating_field">
         | 
| 6 | 
            +
                <%= f.label :rating, t("rating") %> <span class="required">*</span><br />
         | 
| 7 | 
            +
                <%= render :partial => "reviews/stars", :locals => {:stars => review.rating, :edit_enabled => true} %>
         | 
| 8 | 
            +
              </p>
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              <p class="review_title_field">
         | 
| 11 | 
            +
                <%= f.label :title, t("review_title") %> <span class="required">*</span><br />
         | 
| 12 | 
            +
                <%= f.text_field :title, :maxlength => "255", :size => "50" %>
         | 
| 13 | 
            +
              </p>
         | 
| 14 | 
            +
              
         | 
| 15 | 
            +
              <p class="review_review_field">
         | 
| 16 | 
            +
                <%= f.label :review, t("review_content") %> <span class="required">*</span><br />
         | 
| 17 | 
            +
                <%= f.text_area :review, :wrap => "virtual", :rows => "10", :cols => "50" %>
         | 
| 18 | 
            +
              </p>
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              <p class="review_submit">
         | 
| 21 | 
            +
                <%= f.submit I18n.t('submit_your_review'), :class => "button bg_darkfirst" %>
         | 
| 22 | 
            +
              </p>
         | 
| 23 | 
            +
            <% end %>
         | 
| @@ -1,8 +1,3 @@ | |
| 1 | 
            -
            <% content_for :head do %>
         | 
| 2 | 
            -
              <%= javascript_include_tag("jquery.rating.js") %>
         | 
| 3 | 
            -
              <%= javascript_tag("$(document).ready(function(){$('.stars').rating({required:true});});") %>
         | 
| 4 | 
            -
            <% end %>
         | 
| 5 | 
            -
             | 
| 6 1 | 
             
            <% if defined? edit_enabled 
         | 
| 7 2 | 
             
                state = "" 
         | 
| 8 3 | 
             
                name  = "review[rating]" 
         | 
| @@ -10,12 +5,9 @@ | |
| 10 5 | 
             
                state = 'disabled="disabled"' 
         | 
| 11 6 | 
             
                name  = defined?(review).nil? ? Time.now.tv_usec.to_s : "review_#{review}" 
         | 
| 12 7 | 
             
              end %>
         | 
| 13 | 
            -
            <% for i in 1.. | 
| 8 | 
            +
            <% for i in 1..NB_STARS %>
         | 
| 14 9 | 
             
              <input name="<%= name %>" 
         | 
| 15 10 | 
             
                     type="radio" class="star" 
         | 
| 16 11 | 
             
                     value="<%= pluralize(i, 'stars') %>" <%= state %> 
         | 
| 17 12 | 
             
                     <%= "checked=\"checked\"" if i==stars  %> />
         | 
| 18 13 | 
             
            <% end %>
         | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| @@ -5,43 +5,6 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            <h2> <%= I18n.t('leave_us_a_review_for') + ' "' + @product.name + '"' %> </h2>
         | 
| 7 7 |  | 
| 8 | 
            -
            <%=  | 
| 9 | 
            -
            <%= render "shared/error_messages", :target => @review %>
         | 
| 10 | 
            -
            <%= f.hidden_field :product_id, :value => @product.id %>
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            <table cellspacing="0" cellpadding="2">
         | 
| 13 | 
            -
              <tbody>
         | 
| 14 | 
            -
                <tr valign="top">
         | 
| 15 | 
            -
                  <td style="padding-top: 5px; padding-bottom: 5px;" class="fieldtitle right nowrap">
         | 
| 16 | 
            -
                	<strong><%= I18n.t('rating') %></strong>
         | 
| 17 | 
            -
                  </td>
         | 
| 18 | 
            -
                  <td style="padding-top: 5px; padding-bottom: 5px;">
         | 
| 19 | 
            -
                    <%= render :partial => "reviews/stars", :locals => {:stars => @review.rating, :edit_enabled => true} %>
         | 
| 20 | 
            -
                  </td>
         | 
| 21 | 
            -
                </tr>
         | 
| 22 | 
            -
                <tr valign="top">
         | 
| 23 | 
            -
                  <td class="fieldtitle right nowrap">
         | 
| 24 | 
            -
                	<%= f.label :title, raw("<strong>#{ I18n.t('review_title')}</strong>") %>
         | 
| 25 | 
            -
                  </td>
         | 
| 26 | 
            -
                  <td>
         | 
| 27 | 
            -
                    <%= f.text_field :title, :maxlength => "255", :size => "50" %>
         | 
| 28 | 
            -
                  </td>
         | 
| 29 | 
            -
                </tr>
         | 
| 30 | 
            -
                <tr valign="top">
         | 
| 31 | 
            -
                  <td class="fieldtitle right nowrap">
         | 
| 32 | 
            -
                	<%= f.label :review, raw("<strong>#{ I18n.t('review_content')}</strong>") %>
         | 
| 33 | 
            -
                  </td>
         | 
| 34 | 
            -
                  <td>
         | 
| 35 | 
            -
                	<%= f.text_area :review, :wrap => "virtual", :rows => "10", :cols => "50" %>
         | 
| 36 | 
            -
                  </td>
         | 
| 37 | 
            -
                </tr>
         | 
| 38 | 
            -
                <tr>
         | 
| 39 | 
            -
                  <td> </td>
         | 
| 40 | 
            -
                  <td style="padding-top: 5px;">
         | 
| 41 | 
            -
                	<%= f.submit I18n.t('submit_your_review'), :class => "button bg_darkfirst".html_safe %>
         | 
| 42 | 
            -
                  </td>
         | 
| 43 | 
            -
                </tr>
         | 
| 44 | 
            -
              </tbody></table>
         | 
| 45 | 
            -
            <% end %>
         | 
| 8 | 
            +
            <%= render 'form', { :review => @review, :product => @product } %>
         | 
| 46 9 |  | 
| 47 10 | 
             
            <%= render :partial => "fine_print" %>
         | 
| @@ -2,13 +2,13 @@ | |
| 2 2 | 
             
              <span title="<%= txt_stars(review.rating) %>">
         | 
| 3 3 | 
             
                <%= render :partial => "reviews/stars", :locals => {:stars => review.rating} %>
         | 
| 4 4 | 
             
              </span>
         | 
| 5 | 
            -
               | 
| 5 | 
            +
              <span class="title">  <%= review.title %> </span>
         | 
| 6 6 | 
             
              <br/>
         | 
| 7 7 | 
             
              <span class="attribution"><%= t('submitted_on') %> <strong><%= l review.created_at.to_date %></strong></span>
         | 
| 8 8 | 
             
              <p>
         | 
| 9 9 | 
             
              <%= review.review %>
         | 
| 10 10 | 
             
              </p>
         | 
| 11 | 
            -
              <div id="feedback_review_<%= review.id %>">
         | 
| 11 | 
            +
              <div class="feedback_review" id="feedback_review_<%= review.id %>">
         | 
| 12 12 | 
             
                <%= render :partial => "feedback_reviews/form", :locals => {:review => review} %>
         | 
| 13 13 | 
             
              </div>
         | 
| 14 14 | 
             
            </div>
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            NB_STARS = 5
         | 
    
        data/config/locales/en.yml
    CHANGED
    
    | @@ -1,17 +1,34 @@ | |
| 1 1 | 
             
            en:
         | 
| 2 | 
            -
               | 
| 3 | 
            -
               | 
| 4 | 
            -
               | 
| 5 | 
            -
              back_reviews: Back to the reviews
         | 
| 2 | 
            +
              approve: Approve
         | 
| 3 | 
            +
              Approved_reviews: Approved
         | 
| 4 | 
            +
              approved_text: Unlocked comments will be published within 1-2 business days.
         | 
| 6 5 | 
             
              are_you_sure_review: Are you sure to delete review ?
         | 
| 7 | 
            -
               | 
| 6 | 
            +
              average_customer_rating: Average rating
         | 
| 7 | 
            +
              back_reviews: Back to the reviews
         | 
| 8 | 
            +
              based_upon: based upon
         | 
| 9 | 
            +
              by: by
         | 
| 10 | 
            +
              date_: Date
         | 
| 11 | 
            +
              edited_version: 'Edited version'
         | 
| 12 | 
            +
              editing_review_for: 'Editing review for'
         | 
| 8 13 | 
             
              error_approve_review: Error approving review
         | 
| 9 | 
            -
               | 
| 14 | 
            +
              feedback: Feedback
         | 
| 15 | 
            +
              feedback_review_for: "Review: '%{review}'"
         | 
| 16 | 
            +
              for: for
         | 
| 17 | 
            +
              from: from
         | 
| 18 | 
            +
              guideline_text: We reserve the right not to post opinions unrelated to your product
         | 
| 19 | 
            +
              info_approve_review: Review approved
         | 
| 10 20 | 
             
              leave_us_a_review_for: Please leave us a review and a rating for our
         | 
| 11 | 
            -
               | 
| 21 | 
            +
              original_version: 'Original version'
         | 
| 22 | 
            +
              out_of_5: "out of 5"
         | 
| 12 23 | 
             
              rating: rating
         | 
| 13 | 
            -
               | 
| 24 | 
            +
              review:
         | 
| 25 | 
            +
                one: one review
         | 
| 26 | 
            +
                other: %{count} reviews
         | 
| 14 27 | 
             
              review_content: Content
         | 
| 28 | 
            +
              review_guidelines: Review Guidelines
         | 
| 29 | 
            +
              review_management: Review Management
         | 
| 30 | 
            +
              review_management_description: Manage the user-submitted reviews
         | 
| 31 | 
            +
              review_successfully_submitted: Review was successfully submitted
         | 
| 15 32 | 
             
              review_title: Title
         | 
| 16 33 | 
             
              reviews:
         | 
| 17 34 | 
             
                review_settings: Review Settings
         | 
| @@ -20,34 +37,19 @@ en: | |
| 20 37 | 
             
                include_unapproved: Include unapproved reviews in listings
         | 
| 21 38 | 
             
                your_name: Your name
         | 
| 22 39 | 
             
                your_location: Your location
         | 
| 23 | 
            -
              average_customer_rating: Average rating
         | 
| 24 | 
            -
              the_fine_print: The fine print
         | 
| 25 | 
            -
              terms_text: All opinions must comply with our terms and conditions
         | 
| 26 | 
            -
              approved_text: Unlocked comments will be published within 1-2 business days.
         | 
| 27 | 
            -
              guideline_text: We reserve the right not to post opinions unrelated to your product
         | 
| 28 | 
            -
              "terms and conditions": Terms & Conditions
         | 
| 29 | 
            -
              "review guidelines": Review Guidelines
         | 
| 30 | 
            -
              date_: Date
         | 
| 31 | 
            -
              for: for
         | 
| 32 | 
            -
              Unapproved_reviews: Unapproved
         | 
| 33 | 
            -
              Approved_reviews: Approved
         | 
| 34 | 
            -
              from: from
         | 
| 35 | 
            -
              by: by
         | 
| 36 | 
            -
              submitted_on: Submitted on
         | 
| 37 | 
            -
              based_upon: based upon
         | 
| 38 | 
            -
              review:
         | 
| 39 | 
            -
                one: one review
         | 
| 40 | 
            -
                other: %{count} reviews
         | 
| 41 40 | 
             
              star:
         | 
| 42 41 | 
             
                one: "1"
         | 
| 43 42 | 
             
                other: "%{count}"
         | 
| 43 | 
            +
              stars: Stars
         | 
| 44 | 
            +
              submit_your_review: Submit your review
         | 
| 45 | 
            +
              submitted_on: Submitted on
         | 
| 46 | 
            +
              terms_text: All opinions must comply with our terms and conditions
         | 
| 47 | 
            +
              terms_and_conditions: Terms & Conditions
         | 
| 48 | 
            +
              the_fine_print: The fine print
         | 
| 49 | 
            +
              Unapproved_reviews: Unapproved
         | 
| 44 50 | 
             
              voice:
         | 
| 45 51 | 
             
                one: "1 voice"
         | 
| 46 52 | 
             
                other: "%{count} voices"
         | 
| 47 | 
            -
             | 
| 48 | 
            -
              feedback: Feedback
         | 
| 49 | 
            -
              stars: Stars
         | 
| 50 | 
            -
              feedback_review_for: "Review: '%{review}'"
         | 
| 51 | 
            -
              out_of_5: "out of 5"
         | 
| 53 | 
            +
              write_your_own_review: Write your own review
         | 
| 52 54 | 
             
              was_this_review_helpful: "Was this review helpful to you?"
         | 
| 53 | 
            -
              you_must_enter_value_for_rating: "You must enter a value for rating."
         | 
| 55 | 
            +
              you_must_enter_value_for_rating: "You must enter a value for rating."
         | 
    
        data/config/locales/ru.yml
    CHANGED
    
    | @@ -1,4 +1,10 @@ | |
| 1 1 | 
             
            ru:
         | 
| 2 | 
            +
              activerecord:
         | 
| 3 | 
            +
                attributes:
         | 
| 4 | 
            +
                  review:
         | 
| 5 | 
            +
                    title: Заголовок
         | 
| 6 | 
            +
                    review: Содержание
         | 
| 7 | 
            +
                    rating: Рейтинг
         | 
| 2 8 | 
             
              write_your_own_review: Оставьте свой отзыв
         | 
| 3 9 | 
             
              review_management: Управление отзывами
         | 
| 4 10 | 
             
              review_management_description: Управляйте отзывами покупателей
         | 
| @@ -15,33 +21,48 @@ ru: | |
| 15 21 | 
             
              review_title: Заголовок
         | 
| 16 22 | 
             
              reviews:
         | 
| 17 23 | 
             
                review_settings: Настройки отзывов покупателей
         | 
| 18 | 
            -
                manage_review_settings:  | 
| 19 | 
            -
                preview_size:  | 
| 20 | 
            -
                include_unapproved:  | 
| 24 | 
            +
                manage_review_settings: Управление отображением отзывов
         | 
| 25 | 
            +
                preview_size: Количество отзывов на странице товара
         | 
| 26 | 
            +
                include_unapproved: Показывать неодобренные отзывы на странице товара
         | 
| 21 27 | 
             
                your_name: Ваше имя
         | 
| 22 28 | 
             
                your_location: Город
         | 
| 23 | 
            -
              average_customer_rating:  | 
| 24 | 
            -
              the_fine_print:  | 
| 25 | 
            -
              terms_text:  | 
| 26 | 
            -
              approved_text:  | 
| 27 | 
            -
              guideline_text:  | 
| 28 | 
            -
               | 
| 29 | 
            -
               | 
| 30 | 
            -
               | 
| 31 | 
            -
               | 
| 32 | 
            -
               | 
| 33 | 
            -
               | 
| 29 | 
            +
              average_customer_rating: Средняя оценка
         | 
| 30 | 
            +
              the_fine_print: Мелкий текст
         | 
| 31 | 
            +
              terms_text: Все отзывы должны быть написаны в соответствии с условиями и соглашениями
         | 
| 32 | 
            +
              approved_text: Разблокированные комментарии будут опубликованы в течение 1-2 рабочих дней.
         | 
| 33 | 
            +
              guideline_text: Мы оставляем за собой право не публиковать отзывы не имеющие отношения к продукту
         | 
| 34 | 
            +
              terms_and_conditions: Условия и соглашения
         | 
| 35 | 
            +
              review_guidelines: Советы по составлению отзывов
         | 
| 36 | 
            +
              review_header: Отзывы
         | 
| 37 | 
            +
              date_: Дата
         | 
| 38 | 
            +
              for: для
         | 
| 39 | 
            +
              Unapproved_reviews: Неутверждённые отзывы
         | 
| 40 | 
            +
              Approved_reviews: Утверждённые отзывы
         | 
| 34 41 | 
             
              from: from
         | 
| 35 42 | 
             
              by: by
         | 
| 36 | 
            -
              submitted_on:  | 
| 43 | 
            +
              submitted_on: Добавлено
         | 
| 37 44 | 
             
              based_upon: "на основе"
         | 
| 38 45 | 
             
              review:
         | 
| 39 | 
            -
                zero: "0  | 
| 40 | 
            -
                one: " | 
| 46 | 
            +
                zero: "0 отзывов"
         | 
| 47 | 
            +
                one: "%{count} отзыв"
         | 
| 41 48 | 
             
                few: "%{count} отзыва"
         | 
| 42 49 | 
             
                other: "%{count} отзывов"
         | 
| 50 | 
            +
              voice:
         | 
| 51 | 
            +
                zero: "0 голосов"
         | 
| 52 | 
            +
                one: "%{count} голос"
         | 
| 53 | 
            +
                few: "%{count} голоса"
         | 
| 54 | 
            +
                other: "%{count} голосов"
         | 
| 55 | 
            +
              star:
         | 
| 56 | 
            +
                one: "1"
         | 
| 57 | 
            +
                other: "%{count}"
         | 
| 43 58 |  | 
| 44 | 
            -
              feedback:  | 
| 45 | 
            -
              stars:  | 
| 46 | 
            -
              feedback_review_for: " | 
| 59 | 
            +
              feedback: Обратная связь
         | 
| 60 | 
            +
              stars: Звёзды
         | 
| 61 | 
            +
              feedback_review_for: "Отзывы: '%{review}'"
         | 
| 62 | 
            +
              out_of_5: "из 5"
         | 
| 63 | 
            +
              was_this_review_helpful: "Был ли Вам полезен этот отзыв?"
         | 
| 64 | 
            +
              you_must_enter_value_for_rating: "Вы должны оценить отзыв."
         | 
| 47 65 |  | 
| 66 | 
            +
              original_version: 'Исходная версия'
         | 
| 67 | 
            +
              edited_version: 'Отредактированная версия'
         | 
| 68 | 
            +
              editing_review_for: 'Редактируем отзыв для'
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            class AddRatingToProducts < ActiveRecord::Migration
         | 
| 2 | 
            +
              def self.up
         | 
| 3 | 
            +
                add_column :products, :avg_rating, :decimal, :default => 0.0, :null => false, :precision => 7, :scale => 5
         | 
| 4 | 
            +
                add_column :products, :reviews_count, :integer, :default => 0, :null => false
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                Product.reset_column_information
         | 
| 7 | 
            +
                Product.all.each do |p|
         | 
| 8 | 
            +
                  Product.update_counters p.id, :reviews_count => p.reviews.length
         | 
| 9 | 
            +
                  p.recalculate_rating
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              def self.down
         | 
| 14 | 
            +
                remove_column :products, :reviews_count
         | 
| 15 | 
            +
                remove_column :products, :avg_rating
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
    
        data/lib/spree_reviews.rb
    CHANGED
    
    | @@ -10,6 +10,7 @@ module SpreeReviews | |
| 10 10 | 
             
                  Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
         | 
| 11 11 | 
             
                    Rails.env.production? ? require(c) : load(c)
         | 
| 12 12 | 
             
                  end
         | 
| 13 | 
            +
                  ProductsHelper.send(:include, ReviewsHelper)
         | 
| 13 14 | 
             
                end
         | 
| 14 15 |  | 
| 15 16 | 
             
                config.to_prepare &method(:activate).to_proc
         | 
    
        data/lib/spree_reviews_hook.rb
    CHANGED
    
    | @@ -1,7 +1,14 @@ | |
| 1 1 | 
             
            class SpreeReviewsHooks < Spree::ThemeSupport::HookListener
         | 
| 2 2 | 
             
              insert_after :product_properties, 'shared/reviews'
         | 
| 3 3 | 
             
              insert_after :inside_head do
         | 
| 4 | 
            -
                %(<%= stylesheet_link_tag('reviews.css') %>)
         | 
| 4 | 
            +
                %( <%= stylesheet_link_tag('reviews.css') %> )
         | 
| 5 | 
            +
              end
         | 
| 6 | 
            +
              
         | 
| 7 | 
            +
              insert_after :footer_right do
         | 
| 8 | 
            +
                %(
         | 
| 9 | 
            +
                <%= javascript_include_tag("jquery.rating.js") %>
         | 
| 10 | 
            +
                <%= javascript_tag("$(document).ready(function(){$('.stars').rating({required:true});});") %>
         | 
| 11 | 
            +
                )
         | 
| 5 12 | 
             
              end
         | 
| 6 13 |  | 
| 7 14 | 
             
              insert_after :admin_product_sub_tabs do
         | 
| @@ -1,20 +1,23 @@ | |
| 1 1 | 
             
            #reviews div.header {
         | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 2 | 
            +
              font-size: 12pt;
         | 
| 3 | 
            +
              font-weight: bold;
         | 
| 4 | 
            +
              border-bottom: 1px #2222aa dashed;
         | 
| 5 | 
            +
              margin-top: 10px;
         | 
| 6 | 
            +
              margin-bottom: 10px;
         | 
| 7 7 | 
             
            }
         | 
| 8 | 
            +
             | 
| 8 9 | 
             
            #reviews div.review {
         | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 10 | 
            +
              border-bottom: 1px #2222aa dashed;
         | 
| 11 | 
            +
              margin-bottom: 10px;
         | 
| 11 12 | 
             
            }
         | 
| 13 | 
            +
             | 
| 12 14 | 
             
            #reviews div.review span.title {
         | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            +
              font-size: 11pt;
         | 
| 16 | 
            +
              font-weight: bold;
         | 
| 15 17 | 
             
            }
         | 
| 18 | 
            +
             | 
| 16 19 | 
             
            #reviews div.review span.attribution {
         | 
| 17 | 
            -
             | 
| 20 | 
            +
              font-size: 8pt;
         | 
| 18 21 | 
             
            }
         | 
| 19 22 |  | 
| 20 23 | 
             
            .lit {
         | 
| @@ -23,6 +26,7 @@ | |
| 23 26 | 
             
              margin-right: 1px;
         | 
| 24 27 | 
             
              padding-left: 1px;
         | 
| 25 28 | 
             
            }
         | 
| 29 | 
            +
             | 
| 26 30 | 
             
            .unlit {
         | 
| 27 31 | 
             
              background-color: #aaaaaa;
         | 
| 28 32 | 
             
              color: #000000;
         | 
| @@ -30,15 +34,63 @@ | |
| 30 34 | 
             
              padding-left: 1px;
         | 
| 31 35 | 
             
            }
         | 
| 32 36 |  | 
| 37 | 
            +
            .star-rating-control {
         | 
| 38 | 
            +
              display: inline-block;
         | 
| 39 | 
            +
              height: 15px;
         | 
| 40 | 
            +
            }
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            .review_hr {
         | 
| 43 | 
            +
              size: 1px;
         | 
| 44 | 
            +
              background: silver;
         | 
| 45 | 
            +
              border: none;
         | 
| 46 | 
            +
              margin: 1em 0;
         | 
| 47 | 
            +
            }
         | 
| 48 | 
            +
             | 
| 33 49 | 
             
            /* jQuery.Rating Plugin CSS - http://www.fyneworks.com/jquery/star-rating/ */
         | 
| 34 | 
            -
            div.rating-cancel,div.star-rating{ | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 50 | 
            +
            div.rating-cancel, div.star-rating {
         | 
| 51 | 
            +
              float: left;
         | 
| 52 | 
            +
              width: 17px;
         | 
| 53 | 
            +
              height: 15px;
         | 
| 54 | 
            +
              text-indent: -999em;
         | 
| 55 | 
            +
              cursor: pointer;
         | 
| 56 | 
            +
              display: block;
         | 
| 57 | 
            +
              background: transparent;
         | 
| 58 | 
            +
              overflow: hidden
         | 
| 59 | 
            +
            }
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            div.rating-cancel, div.rating-cancel a {
         | 
| 62 | 
            +
              background: transparent url('/images/delete.gif') no-repeat scroll 0 -16px;
         | 
| 63 | 
            +
            }
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            div.star-rating, div.star-rating a {
         | 
| 66 | 
            +
              background: url('/images/star.gif') no-repeat 0 0px
         | 
| 67 | 
            +
            }
         | 
| 68 | 
            +
             | 
| 69 | 
            +
            div.rating-cancel a, div.star-rating a {
         | 
| 70 | 
            +
              display: block;
         | 
| 71 | 
            +
              width: 16px;
         | 
| 72 | 
            +
              height: 100%;
         | 
| 73 | 
            +
              background-position: 0 0px;
         | 
| 74 | 
            +
              border: 0
         | 
| 75 | 
            +
            }
         | 
| 76 | 
            +
             | 
| 77 | 
            +
            div.star-rating-on a {
         | 
| 78 | 
            +
              background-position: 0 -16px !important
         | 
| 79 | 
            +
            }
         | 
| 80 | 
            +
             | 
| 81 | 
            +
            div.star-rating-hover a {
         | 
| 82 | 
            +
              background-position: 0 -32px
         | 
| 83 | 
            +
            }
         | 
| 84 | 
            +
             | 
| 40 85 | 
             
            /* Read Only CSS */
         | 
| 41 | 
            -
            div.star-rating-readonly a{ | 
| 86 | 
            +
            div.star-rating-readonly a {
         | 
| 87 | 
            +
              cursor: default !important
         | 
| 88 | 
            +
            }
         | 
| 89 | 
            +
             | 
| 42 90 | 
             
            /* Partial Star CSS */
         | 
| 43 | 
            -
            div.star-rating{ | 
| 91 | 
            +
            div.star-rating {
         | 
| 92 | 
            +
              background: transparent !important;
         | 
| 93 | 
            +
              overflow: hidden !important
         | 
| 94 | 
            +
            }
         | 
| 95 | 
            +
             | 
| 44 96 | 
             
            /* END jQuery.Rating Plugin CSS */
         | 
    
        data/spree_reviews.gemspec
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            Gem::Specification.new do |s|
         | 
| 2 2 | 
             
              s.platform    = Gem::Platform::RUBY
         | 
| 3 3 | 
             
              s.name        = 'spree_reviews'
         | 
| 4 | 
            -
              s.version     = '0. | 
| 4 | 
            +
              s.version     = '0.50.0'
         | 
| 5 5 | 
             
              s.summary     = 'Basic review and ratings facility for Spree'
         | 
| 6 6 | 
             
              #s.description = 'Add (optional) gem description here'
         | 
| 7 7 | 
             
              s.required_ruby_version = '>= 1.8.7'
         | 
| 8 8 |  | 
| 9 9 | 
             
              # s.author            = 'David Heinemeier Hansson'
         | 
| 10 10 | 
             
              # s.email             = 'david@loudthinking.com'
         | 
| 11 | 
            -
               | 
| 11 | 
            +
              s.homepage          = 'https://github.com/romul/spree-reviews/'
         | 
| 12 12 | 
             
              # s.rubyforge_project = 'actionmailer'
         | 
| 13 13 |  | 
| 14 14 | 
             
              s.files         = `git ls-files`.split("\n")
         | 
| @@ -16,7 +16,5 @@ Gem::Specification.new do |s| | |
| 16 16 | 
             
              s.require_path = 'lib'
         | 
| 17 17 | 
             
              s.requirements << 'none'
         | 
| 18 18 |  | 
| 19 | 
            -
              s. | 
| 20 | 
            -
             | 
| 21 | 
            -
              s.add_dependency('spree_core', '>= 0.30.1')
         | 
| 19 | 
            +
              s.add_dependency('spree_core', '>= 0.50.0')
         | 
| 22 20 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,12 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: spree_reviews
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            +
              hash: 215
         | 
| 4 5 | 
             
              prerelease: false
         | 
| 5 6 | 
             
              segments: 
         | 
| 6 7 | 
             
              - 0
         | 
| 7 | 
            -
              -  | 
| 8 | 
            +
              - 50
         | 
| 8 9 | 
             
              - 0
         | 
| 9 | 
            -
              version: 0. | 
| 10 | 
            +
              version: 0.50.0
         | 
| 10 11 | 
             
            platform: ruby
         | 
| 11 12 | 
             
            authors: []
         | 
| 12 13 |  | 
| @@ -14,21 +15,23 @@ autorequire: | |
| 14 15 | 
             
            bindir: bin
         | 
| 15 16 | 
             
            cert_chain: []
         | 
| 16 17 |  | 
| 17 | 
            -
            date: 2011- | 
| 18 | 
            +
            date: 2011-04-27 00:00:00 +04:00
         | 
| 18 19 | 
             
            default_executable: 
         | 
| 19 20 | 
             
            dependencies: 
         | 
| 20 21 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 21 22 | 
             
              name: spree_core
         | 
| 22 23 | 
             
              prerelease: false
         | 
| 23 24 | 
             
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 25 | 
            +
                none: false
         | 
| 24 26 | 
             
                requirements: 
         | 
| 25 27 | 
             
                - - ">="
         | 
| 26 28 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 29 | 
            +
                    hash: 215
         | 
| 27 30 | 
             
                    segments: 
         | 
| 28 31 | 
             
                    - 0
         | 
| 29 | 
            -
                    -  | 
| 30 | 
            -
                    -  | 
| 31 | 
            -
                    version: 0. | 
| 32 | 
            +
                    - 50
         | 
| 33 | 
            +
                    - 0
         | 
| 34 | 
            +
                    version: 0.50.0
         | 
| 32 35 | 
             
              type: :runtime
         | 
| 33 36 | 
             
              version_requirements: *id001
         | 
| 34 37 | 
             
            description: 
         | 
| @@ -53,8 +56,8 @@ files: | |
| 53 56 | 
             
            - app/helpers/reviews_helper.rb
         | 
| 54 57 | 
             
            - app/models/feedback_review.rb
         | 
| 55 58 | 
             
            - app/models/product_decorator.rb
         | 
| 56 | 
            -
            - app/models/rating.rb
         | 
| 57 59 | 
             
            - app/models/review.rb
         | 
| 60 | 
            +
            - app/models/review_sweeper.rb
         | 
| 58 61 | 
             
            - app/models/reviews_configuration.rb
         | 
| 59 62 | 
             
            - app/views/admin/feedback_reviews/index.html.erb
         | 
| 60 63 | 
             
            - app/views/admin/review_settings/edit.html.erb
         | 
| @@ -66,13 +69,8 @@ files: | |
| 66 69 | 
             
            - app/views/feedback_reviews/_summary.html.erb
         | 
| 67 70 | 
             
            - app/views/feedback_reviews/create.js.erb
         | 
| 68 71 | 
             
            - app/views/reviews/_fine_print.html.erb
         | 
| 72 | 
            +
            - app/views/reviews/_form.html.erb
         | 
| 69 73 | 
             
            - app/views/reviews/_stars.html.erb
         | 
| 70 | 
            -
            - app/views/reviews/_stars0.html.erb
         | 
| 71 | 
            -
            - app/views/reviews/_stars1.html.erb
         | 
| 72 | 
            -
            - app/views/reviews/_stars2.html.erb
         | 
| 73 | 
            -
            - app/views/reviews/_stars3.html.erb
         | 
| 74 | 
            -
            - app/views/reviews/_stars4.html.erb
         | 
| 75 | 
            -
            - app/views/reviews/_stars5.html.erb
         | 
| 76 74 | 
             
            - app/views/reviews/index.html.erb
         | 
| 77 75 | 
             
            - app/views/reviews/new.html.erb
         | 
| 78 76 | 
             
            - app/views/reviews/submissionguidelines.html.erb
         | 
| @@ -82,15 +80,16 @@ files: | |
| 82 80 | 
             
            - app/views/shared/_review_summary.html.erb
         | 
| 83 81 | 
             
            - app/views/shared/_reviews.html.erb
         | 
| 84 82 | 
             
            - app/views/shared/_shortrating.html.erb
         | 
| 83 | 
            +
            - config/initializers/constants.rb
         | 
| 85 84 | 
             
            - config/locales/de.yml
         | 
| 86 85 | 
             
            - config/locales/en-GB.yml
         | 
| 87 86 | 
             
            - config/locales/en.yml
         | 
| 88 87 | 
             
            - config/locales/fr-FR.yml
         | 
| 89 88 | 
             
            - config/locales/ru.yml
         | 
| 90 89 | 
             
            - config/routes.rb
         | 
| 91 | 
            -
            - db/migrate/20081020220700_create_ratings.rb
         | 
| 92 90 | 
             
            - db/migrate/20081020220724_create_reviews.rb
         | 
| 93 91 | 
             
            - db/migrate/20101222083309_create_feedback_reviews.rb
         | 
| 92 | 
            +
            - db/migrate/20110406083603_add_rating_to_products.rb
         | 
| 94 93 | 
             
            - db/sample/ratings.yml
         | 
| 95 94 | 
             
            - db/sample/reviews.yml
         | 
| 96 95 | 
             
            - lib/spree/reviews/config.rb
         | 
| @@ -103,14 +102,13 @@ files: | |
| 103 102 | 
             
            - public/stylesheets/reviews.css
         | 
| 104 103 | 
             
            - spec/controllers/reviews_controller_spec.rb
         | 
| 105 104 | 
             
            - spec/helpers/reviews_helper_spec.rb
         | 
| 106 | 
            -
            - spec/models/ratings_spec.rb
         | 
| 107 105 | 
             
            - spec/models/reviews_spec.rb
         | 
| 108 106 | 
             
            - spec/spec.opts
         | 
| 109 107 | 
             
            - spec/spec_helper.rb
         | 
| 110 108 | 
             
            - spec/views/reviews/submit_view_spec.rb
         | 
| 111 109 | 
             
            - spree_reviews.gemspec
         | 
| 112 110 | 
             
            has_rdoc: true
         | 
| 113 | 
            -
            homepage: 
         | 
| 111 | 
            +
            homepage: https://github.com/romul/spree-reviews/
         | 
| 114 112 | 
             
            licenses: []
         | 
| 115 113 |  | 
| 116 114 | 
             
            post_install_message: 
         | 
| @@ -119,25 +117,29 @@ rdoc_options: [] | |
| 119 117 | 
             
            require_paths: 
         | 
| 120 118 | 
             
            - lib
         | 
| 121 119 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement 
         | 
| 120 | 
            +
              none: false
         | 
| 122 121 | 
             
              requirements: 
         | 
| 123 122 | 
             
              - - ">="
         | 
| 124 123 | 
             
                - !ruby/object:Gem::Version 
         | 
| 124 | 
            +
                  hash: 57
         | 
| 125 125 | 
             
                  segments: 
         | 
| 126 126 | 
             
                  - 1
         | 
| 127 127 | 
             
                  - 8
         | 
| 128 128 | 
             
                  - 7
         | 
| 129 129 | 
             
                  version: 1.8.7
         | 
| 130 130 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 131 | 
            +
              none: false
         | 
| 131 132 | 
             
              requirements: 
         | 
| 132 133 | 
             
              - - ">="
         | 
| 133 134 | 
             
                - !ruby/object:Gem::Version 
         | 
| 135 | 
            +
                  hash: 3
         | 
| 134 136 | 
             
                  segments: 
         | 
| 135 137 | 
             
                  - 0
         | 
| 136 138 | 
             
                  version: "0"
         | 
| 137 139 | 
             
            requirements: 
         | 
| 138 140 | 
             
            - none
         | 
| 139 141 | 
             
            rubyforge_project: 
         | 
| 140 | 
            -
            rubygems_version: 1.3. | 
| 142 | 
            +
            rubygems_version: 1.3.7
         | 
| 141 143 | 
             
            signing_key: 
         | 
| 142 144 | 
             
            specification_version: 3
         | 
| 143 145 | 
             
            summary: Basic review and ratings facility for Spree
         | 
    
        data/app/models/rating.rb
    DELETED
    
    | @@ -1,20 +0,0 @@ | |
| 1 | 
            -
            class Rating < ActiveRecord::Base
         | 
| 2 | 
            -
              belongs_to :product
         | 
| 3 | 
            -
             | 
| 4 | 
            -
              NB_STARS=5
         | 
| 5 | 
            -
              def self.get_nb_stars
         | 
| 6 | 
            -
                NB_STARS
         | 
| 7 | 
            -
              end
         | 
| 8 | 
            -
             | 
| 9 | 
            -
              def add_rating(n)
         | 
| 10 | 
            -
                self.value = value * count + n
         | 
| 11 | 
            -
                self.count = count + 1
         | 
| 12 | 
            -
                self.value = value / count
         | 
| 13 | 
            -
                save
         | 
| 14 | 
            -
              end
         | 
| 15 | 
            -
              
         | 
| 16 | 
            -
              def get_stars
         | 
| 17 | 
            -
                (self.value + 0.5).floor
         | 
| 18 | 
            -
              end
         | 
| 19 | 
            -
              
         | 
| 20 | 
            -
            end
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            <span class="unlit"> ✮ </span><span class="unlit"> ✮ </span><span class="unlit"> ✮ </span><span class="unlit"> ✮ </span><span class="unlit"> ✮ </span>
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            <span class="lit"> ✮ </span><span class="unlit"> ✮ </span><span class="unlit"> ✮ </span><span class="unlit"> ✮ </span><span class="unlit"> ✮ </span>
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            <span class="lit"> ✮ </span><span class="lit"> ✮ </span><span class="unlit"> ✮ </span><span class="unlit"> ✮ </span><span class="unlit"> ✮ </span>
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            <span class="lit"> ✮ </span><span class="lit"> ✮ </span><span class="lit"> ✮ </span><span class="unlit"> ✮ </span><span class="unlit"> ✮ </span>
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            <span class="lit"> ✮ </span><span class="lit"> ✮ </span><span class="lit"> ✮ </span><span class="lit"> ✮ </span><span class="unlit"> ✮ </span>
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            <span class="lit"> ✮ </span><span class="lit"> ✮ </span><span class="lit"> ✮ </span><span class="lit"> ✮ </span><span class="lit"> ✮</span>
         |