Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
15 changed files
with
629 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
from django.conf.urls.defaults import patterns, url | ||
from django.contrib.admin.views.decorators import staff_member_required | ||
|
||
from oscar.core.application import Application | ||
from oscar.apps.dashboard.nav import register, Node | ||
from oscar.apps.dashboard.reviews import views | ||
|
||
node = Node('Reviews', 'dashboard:reviews-list') | ||
register(node, 80) | ||
|
||
|
||
class ReviewsApplication(Application): | ||
name = None | ||
list_view = views.ReviewListView | ||
update_view = views.ReviewUpdateView | ||
delete_view = views.ReviewDeleteView | ||
|
||
def get_urls(self): | ||
urlpatterns = patterns('', | ||
url(r'^$', self.list_view.as_view(), name='reviews-list'), | ||
url(r'^(?P<pk>\d+)/$', self.update_view.as_view(), | ||
name='reviews-update' | ||
), | ||
url(r'^(?P<pk>\d+)/delete/$', self.delete_view.as_view(), | ||
name='reviews-delete' | ||
), | ||
) | ||
return self.post_process_urls(urlpatterns) | ||
|
||
def get_url_decorator(self, url_name): | ||
return staff_member_required | ||
|
||
|
||
application = ReviewsApplication() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
from django import forms | ||
from django.db.models import get_model | ||
|
||
ProductReview = get_model('reviews', 'productreview') | ||
|
||
|
||
class DashboardProductReviewForm(forms.ModelForm): | ||
class Meta: | ||
model = ProductReview | ||
fields = ('title', 'body', 'score', 'status') | ||
|
||
|
||
class ProductReviewSearchForm(forms.Form): | ||
NO_SELECTION = 4 | ||
STATUS_CHOICES = ( | ||
(NO_SELECTION, '------------'), | ||
) + ProductReview.STATUS_CHOICES | ||
keyword = forms.CharField(required=False) | ||
status = forms.ChoiceField(required=False, choices=STATUS_CHOICES) | ||
date_from = forms.DateTimeField(required=False) | ||
date_to = forms.DateTimeField(required=False, label='to') | ||
name = forms.CharField(required=False) |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
from datetime import datetime, timedelta | ||
|
||
from django.db.models import get_model | ||
from django.core.urlresolvers import reverse | ||
from django.contrib.auth.models import User | ||
|
||
from django_dynamic_fixture import get | ||
|
||
from oscar.test import ClientTestCase | ||
|
||
ProductReview = get_model('reviews', 'productreview') | ||
|
||
|
||
class ReviewsDashboardTests(ClientTestCase): | ||
is_staff = True | ||
|
||
def test_reviews_dashboard_is_accessible_to_staff(self): | ||
url = reverse('dashboard:reviews-list') | ||
response = self.client.get(url) | ||
self.assertIsOk(response) | ||
|
||
def test_bulk_editing_review_status(self): | ||
url = reverse('dashboard:reviews-list') | ||
|
||
user1 = get(User) | ||
user2 = get(User) | ||
|
||
get(ProductReview, user=user1, status=0) | ||
get(ProductReview, user=user2, status=0) | ||
get(ProductReview, user=user2, status=0) | ||
|
||
assert(ProductReview.objects.count() == 3) | ||
|
||
post_params = { | ||
'status': 1, | ||
'selected_review': [3, 2], | ||
'action': ['update_selected_review_status'], | ||
} | ||
self.client.post(url, post_params) | ||
|
||
self.assertEquals(ProductReview.objects.get(pk=1).status, 0) | ||
self.assertEquals(ProductReview.objects.get(pk=2).status, 1) | ||
self.assertEquals(ProductReview.objects.get(pk=3).status, 1) | ||
|
||
def test_filter_reviews_by_name(self): | ||
url = reverse('dashboard:reviews-list') | ||
|
||
user1 = get(User, first_name='Peter', last_name='Griffin') | ||
user2 = get(User, first_name='Lois', last_name='Griffin') | ||
|
||
get(ProductReview, user=user1, status=0) | ||
get(ProductReview, user=user2, status=0) | ||
get(ProductReview, user=user2, status=0) | ||
|
||
response = self.client.get(url, {'name': 'peter'}) | ||
|
||
self.assertEquals(len(response.context['review_list']), 1) | ||
self.assertEquals(response.context['review_list'][0].user, user1) | ||
|
||
response = self.client.get(url, {'name': 'lois griffin'}) | ||
|
||
self.assertEquals(len(response.context['review_list']), 2) | ||
for review in response.context['review_list']: | ||
self.assertEquals(review.user, user2) | ||
|
||
def test_filter_reviews_by_keyword(self): | ||
url = reverse('dashboard:reviews-list') | ||
|
||
user1 = get(User) | ||
user2 = get(User) | ||
|
||
review1 = get(ProductReview, user=user1, title='Sexy Review') | ||
review2 = get(ProductReview, user=user2, title='Anry Review', | ||
body='argh') | ||
get(ProductReview, user=user2, title='Lovely Thing') | ||
|
||
response = self.client.get(url, {'keyword': 'argh'}) | ||
self.assertItemsEqual(response.context['review_list'], [review2]) | ||
|
||
response = self.client.get(url, {'keyword': 'review'}) | ||
self.assertItemsEqual( | ||
response.context['review_list'], | ||
[review1, review2] | ||
) | ||
|
||
def test_filter_reviews_by_date(self): | ||
url = reverse('dashboard:reviews-list') | ||
|
||
user1 = get(User) | ||
user2 = get(User) | ||
|
||
now = datetime.now() | ||
review1 = get(ProductReview, user=user1) | ||
review1.date_created = now | ||
review1.save() | ||
review2 = get(ProductReview, user=user2) | ||
review2.date_created = now - timedelta(days=2) | ||
review2.save() | ||
review3 = get(ProductReview, user=user2) | ||
review3.date_created = now - timedelta(days=10) | ||
review3.save() | ||
|
||
response = self.client.get(url, {'date_from': now - timedelta(days=5)}) | ||
self.assertItemsEqual( | ||
response.context['review_list'], | ||
[review1, review2] | ||
) | ||
|
||
response = self.client.get(url, {'date_to': now - timedelta(days=5)}) | ||
self.assertItemsEqual(response.context['review_list'], [review3]) | ||
|
||
response = self.client.get(url, { | ||
'date_from': now - timedelta(days=12), | ||
'date_to': now - timedelta(days=9) | ||
}) | ||
self.assertItemsEqual(response.context['review_list'], [review3]) | ||
|
||
def test_filter_reviews_by_status(self): | ||
url = reverse('dashboard:reviews-list') | ||
|
||
user1 = get(User) | ||
user2 = get(User) | ||
|
||
review1 = get(ProductReview, user=user1, status=1) | ||
review2 = get(ProductReview, user=user2, status=0) | ||
review3 = get(ProductReview, user=user2, status=2) | ||
|
||
response = self.client.get(url, {'status': 0}) | ||
self.assertItemsEqual(response.context['review_list'], [review2]) | ||
|
||
response = self.client.get(url, {'status': 1}) | ||
self.assertItemsEqual(response.context['review_list'], [review1]) | ||
|
||
response = self.client.get(url, {'status': 2}) | ||
self.assertItemsEqual(response.context['review_list'], [review3]) | ||
|
||
response = self.client.get(url, {'status': 3}) | ||
self.assertItemsEqual( | ||
response.context['review_list'], | ||
[review1, review2, review3] | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
from oscar.core.loading import get_class, get_classes | ||
OrderReportGenerator = get_class('order.reports', 'OrderReportGenerator') | ||
ProductReportGenerator, UserReportGenerator = get_classes('analytics.reports', ['ProductReportGenerator', 'UserReportGenerator']) | ||
OpenBasketReportGenerator, SubmittedBasketReportGenerator = get_classes( | ||
'basket.reports', ['OpenBasketReportGenerator', 'SubmittedBasketReportGenerator']) | ||
OfferReportGenerator = get_class('offer.reports', 'OfferReportGenerator') | ||
VoucherReportGenerator = get_class('voucher.reports', 'VoucherReportGenerator') | ||
|
||
|
||
class GeneratorRepository(object): | ||
|
||
generators = [OrderReportGenerator, | ||
ProductReportGenerator, | ||
UserReportGenerator, | ||
OpenBasketReportGenerator, | ||
SubmittedBasketReportGenerator, | ||
VoucherReportGenerator, | ||
OfferReportGenerator] | ||
|
||
def get_report_generators(self): | ||
return self.generators | ||
|
||
def get_generator(self, code): | ||
for generator in self.generators: | ||
if generator.code == code: | ||
return generator | ||
return None | ||
|
||
|
Oops, something went wrong.