Browse Source

Reworked the anonymous reviewing functionality

master
David Winterbottom 14 years ago
parent
commit
3c7849fe1f

+ 0
- 1
examples/vanilla/settings.py View File

@@ -200,7 +200,6 @@ INSTALLED_APPS = (
200 200
     'oscar.apps.product',
201 201
     'oscar.apps.basket',
202 202
     'oscar.apps.payment',
203
-    'oscar.apps.payment.datacash',
204 203
     'oscar.apps.offer',
205 204
     'oscar.apps.address',
206 205
     'oscar.apps.partner',

+ 6
- 0
oscar/apps/product/reviews/abstract_models.py View File

@@ -93,6 +93,12 @@ class AbstractProductReview(models.Model):
93 93
         self.total_votes += 1
94 94
         self.delta_votes += vote.delta
95 95
         self.save()
96
+        
97
+    def get_reviewer_name(self):
98
+        if self.user:
99
+            return self.user.username
100
+        else:
101
+            return self.name
96 102
 
97 103
 
98 104
 class AbstractVote(models.Model):

+ 13
- 13
oscar/apps/product/reviews/forms.py View File

@@ -1,23 +1,23 @@
1 1
 from django.forms import BaseForm, ModelForm, CharField, EmailField
2 2
 
3
-from oscar.apps.product.reviews.models import ProductReview
3
+from oscar.core.loading import import_module
4
+import_module('product.reviews.models', ['ProductReview'], locals())
4 5
 
5 6
 
6
-class ProductReviewForm(ModelForm):
7
+class SignedInUserProductReviewForm(ModelForm):
7 8
     
8 9
     class Meta:
9 10
         model = ProductReview
10 11
         fields = ('title', 'score', 'body')
11
-
12
-    def __init__(self, *args, **kwargs):
13
-        super(ProductReviewForm, self).__init__(*args, **kwargs)
12
+        
13
+        
14
+class AnonymousUserProductReviewForm(ModelForm):
15
+    
16
+    name = CharField(required=True)
17
+    email = EmailField(required=True)
18
+    
19
+    class Meta:
20
+        model = ProductReview
21
+        fields = ('title', 'score', 'body', 'name', 'email', 'homepage')
14 22
 
15 23
 
16
-def make_review_form(user, values=None):
17
-    form = ProductReviewForm()
18
-    fields = form.fields
19
-    if not user.is_authenticated():
20
-        fields['name'] = CharField(max_length=100)
21
-        fields['email'] = EmailField()
22
-        fields['url'] = CharField(max_length=100, required=False)
23
-    return type('ProductReviewForm', (BaseForm,), {'base_fields': fields})

+ 8
- 19
oscar/apps/product/reviews/views.py View File

@@ -9,30 +9,14 @@ from django.template.response import TemplateResponse
9 9
 from django.db.models import Avg
10 10
 from django.core.exceptions import ObjectDoesNotExist
11 11
 from django.contrib import messages
12
-from django.forms import ModelForm, CharField, EmailField
12
+from django.forms import ModelForm, CharField, EmailField, BaseForm, URLField
13 13
 
14 14
 from oscar.view.generic import PostActionMixin
15 15
 from oscar.core.loading import import_module
16 16
 import_module('product.models', ['Item', 'ItemClass'], locals())
17 17
 import_module('basket.forms', ['FormFactory'], locals())
18 18
 import_module('product.reviews.models', ['ProductReview', 'Vote'], locals())
19
-
20
-
21
-class ProductReviewForm(ModelForm):
22
-    
23
-    class Meta:
24
-        model = ProductReview
25
-        fields = ('title', 'score', 'body')
26
-
27
-
28
-def make_review_form(user, values=None):
29
-    form = ProductReviewForm()
30
-    fields = form.fields
31
-    if not user.is_authenticated():
32
-        fields['name'] = CharField(max_length=100)
33
-        fields['email'] = EmailField()
34
-        fields['url'] = CharField(max_length=100, required=False)
35
-    return type('ProductReviewForm', (BaseForm,), {'base_fields': fields})
19
+import_module('product.reviews.forms', ['SignedInUserProductReviewForm', 'AnonymousUserProductReviewForm'], locals())
36 20
 
37 21
 
38 22
 class CreateProductReviewView(CreateView):
@@ -59,7 +43,9 @@ class CreateProductReviewView(CreateView):
59 43
         return get_object_or_404(Item, pk=self.kwargs['item_id'])
60 44
     
61 45
     def get_form_class(self):
62
-        return ProductReviewForm
46
+        if not self.request.user.is_authenticated():
47
+            return AnonymousUserProductReviewForm
48
+        return SignedInUserProductReviewForm
63 49
     
64 50
     def get_form_kwargs(self):
65 51
         kwargs = super(CreateProductReviewView, self).get_form_kwargs()
@@ -68,6 +54,9 @@ class CreateProductReviewView(CreateView):
68 54
             review.user = self.request.user
69 55
         kwargs['instance'] = review
70 56
         return kwargs
57
+    
58
+    def get_success_url(self):
59
+        return self.object.product.get_absolute_url()
71 60
 
72 61
 
73 62
 class ProductReviewDetailView(DetailView, PostActionMixin):

+ 0
- 4
oscar/apps/product/views.py View File

@@ -69,7 +69,6 @@ class ItemDetailView(DetailView):
69 69
         context = super(ItemDetailView, self).get_context_data(**kwargs)
70 70
         context['basket_form'] = self.get_add_to_basket_form()
71 71
         context['reviews'] = self.get_reviews()
72
-        context['avg_score'] = self.get_avg_review_score()
73 72
         return context
74 73
     
75 74
     def get_add_to_basket_form(self):
@@ -79,9 +78,6 @@ class ItemDetailView(DetailView):
79 78
     def get_reviews(self):
80 79
         return ProductReview.approved.filter(product=self.get_object())
81 80
     
82
-    def get_avg_review_score(self):
83
-        return ProductReview.approved.aggregate(Avg('score'))['score__avg']
84
-
85 81
     
86 82
 class ItemClassListView(ListView):
87 83
     u"""View products filtered by item-class."""

+ 44
- 35
oscar/templates/oscar/product/detail.html View File

@@ -50,12 +50,16 @@
50 50
     {% for attribute in item.attributes.all %}
51 51
     <tr>
52 52
         <th>{{ attribute.type.name }}</th>
53
-        <th>{{ attribute.value }}</th>
53
+        <td>{{ attribute.value }}</td>
54 54
     </tr>
55 55
     {% endfor %}
56 56
     <tr>
57
-        <td><a href="{% url oscar-product-review-add item.item_class.slug item.slug item.id %}">Add a review</a></td>
58
-        <td><a href="{% url oscar-product-reviews item.item_class.slug item.slug item.id %}">See all reviews</a></td>
57
+        <th>Num reviews</th>
58
+        <td>{{ reviews.count }}</td>
59
+    </tr>
60
+    <tr>
61
+        <td></td>
62
+        <td></td>
59 63
     </tr>
60 64
     
61 65
 </table>
@@ -68,6 +72,43 @@
68 72
 </form>
69 73
 {% endif %}
70 74
 
75
+{% block product_review %}
76
+
77
+    {% if reviews %}
78
+    	<h3>Reviews of {{ item.title }}</h3>
79
+        <p>Read customer reviews on this product. If you have read this book, why not post your own
80
+           review?</p>
81
+        <p><a href="{% url oscar-product-review-add item.item_class.slug item.slug item.id %}">Add a review</a></p>
82
+        <div>
83
+            {% for review in reviews|slice:":3" %}
84
+                <div class="review">
85
+                    <h4>{{ review.title }}</h4>
86
+                    <h5>Reviewed by {{ review.get_reviewer_name }}</h5>
87
+                    <p>{{ review.date_created }}<p>
88
+                    <p>{{ review.body|linebreaks }}</p>
89
+                    {% if user.is_authenticated %}
90
+                        <form action="{{ review.get_absolute_url }}" method="post">
91
+                            {% csrf_token %}               
92
+                            <input type="hidden" name="action" value="vote_up"/>
93
+                            <input type="submit" value="I agree" /> 
94
+                        </form>
95
+                        <form  action="{{ review.get_absolute_url }}" method="post">
96
+                            {% csrf_token %}                
97
+                            <input type="hidden" name="action" value="vote_down"/>
98
+                            <input type="submit" value="I disagree" /> 
99
+                        </form>
100
+                    {% endif %}
101
+                    {% if review.has_votes %}
102
+                        <p>{{ review.num_up_votes }} customers agreed.</p>
103
+                    {% endif %}
104
+                </div>
105
+            {% endfor %}
106
+            <p><a href="{% url oscar-product-reviews item.item_class.slug item.slug item.id %}">See all reviews</a>.</p>
107
+        </div>
108
+    {% endif %}
109
+
110
+{% endblock product_review %}
111
+
71 112
 {% if item.related_items.count %}
72 113
 <div class="products">
73 114
     <h4>Related items</h4>
@@ -90,38 +131,6 @@
90 131
 </div>
91 132
 {% endif %}
92 133
 
93
-{% block product_review %}
94
-
95
-    {% if reviews %}
96
-    	<h3> Product Reviews </h3>
97
-    	<h4> Average score: {{ avg_score|floatformat:1  }} / 5.0 </h4>
98
-    	{% for review in reviews|slice:":5" %}		
99
-    		<h4> {{ forloop.counter}}. {{ review.title }} by {{ review.user.username }} </h4>
100
-    		<p> Score: {{ review.score|floatformat:1 }} / 5.0</p>
101
-    		<p> Comments: {{ review.body|truncatewords:50 }}</p>		
102
-    		<p> Date created: {{ review.date_created }}</p>
103
-    		<a href="{{ review.get_absolute_url }}">View full review</a>			
104
-            {% if review.has_votes %}
105
-            	<h5> {{ review.num_up_votes }} out of {{ review.total_votes }} customers found this review useful.</h5>
106
-            {% endif %}
107
-            {% if user.is_authenticated %}
108
-        		<h4>Was this review helpful to you?</h4>
109
-        		<form action="{{ review.get_absolute_url }}" method="post">
110
-        			{% csrf_token %}               
111
-                    <input type="hidden" name="action" value="vote_up"/>
112
-                    <input type="submit" value="Yes" /> 
113
-                </form>
114
-        		<form  action="{{ review.get_absolute_url }}" method="post">
115
-        			{% csrf_token %}                
116
-                    <input type="hidden" name="action" value="vote_down"/>
117
-                    <input type="submit" value="No" /> 
118
-                </form>
119
-    	    {% endif %}			
120
-    	{% endfor %}
121
-    {% endif %}
122
-
123
-{% endblock product_review %}
124
-
125 134
 {% recently_viewed_products %}
126 135
 
127 136
 {% endblock content %}

+ 2
- 1
oscar/templates/oscar/reviews/add_review.html View File

@@ -6,7 +6,8 @@
6 6
     <form method="post" action="{% url oscar-product-review-add item.item_class.slug item.slug item.id %}">
7 7
         {% csrf_token %}
8 8
         {{ form.as_p }}
9
-        <input type="submit" value="Submit" /> 
9
+        <input type="submit" value="Submit" /> or 
10
+        <a href="{{ item.get_absolute_url }}">Cancel</a>
10 11
     </form>
11 12
 
12 13
 {% endblock %}

Loading…
Cancel
Save