You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

views.py 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import datetime
  2. from django.views import generic
  3. from django.db.models import get_model, Q
  4. from django.utils.translation import ugettext_lazy as _
  5. from django.core.urlresolvers import reverse
  6. from django.http import HttpResponseRedirect
  7. from oscar.views.generic import BulkEditMixin
  8. from oscar.apps.dashboard.reviews import forms
  9. from oscar.core.utils import format_datetime
  10. ProductReview = get_model('reviews', 'productreview')
  11. class ReviewListView(BulkEditMixin, generic.ListView):
  12. model = ProductReview
  13. template_name = 'dashboard/reviews/review_list.html'
  14. context_object_name = 'review_list'
  15. form_class = forms.ProductReviewSearchForm
  16. review_form_class = forms.DashboardProductReviewForm
  17. paginate_by = 25
  18. current_view = 'dashboard:reviews-list'
  19. actions = ('update_selected_review_status',)
  20. checkbox_object_name = 'review'
  21. desc_template = _("%(main_filter)s %(date_filter)s %(status_filter)s"
  22. "%(kw_filter)s %(name_filter)s")
  23. def get(self, request, *args, **kwargs):
  24. response = super(self.__class__, self).get(request, **kwargs)
  25. self.form = self.form_class()
  26. return response
  27. def get_date_from_to_queryset(self, date_from, date_to, queryset=None):
  28. """
  29. Get a ``QuerySet`` of ``ProductReview`` items that match the time
  30. frame specified by *date_from* and *date_to*. Both parameters are
  31. expected to be in ``datetime`` format with *date_from* < *date_to*.
  32. If *queryset* is specified, it will be filtered according to the
  33. given dates. Otherwise, a new queryset for all ``ProductReview``
  34. items is created.
  35. """
  36. if not queryset:
  37. self.model.objects.all()
  38. if date_from and date_to:
  39. # Add 24 hours to make search inclusive
  40. date_to = date_to + datetime.timedelta(days=1)
  41. queryset = queryset.filter(
  42. date_created__gte=date_from
  43. ).filter(
  44. date_created__lt=date_to
  45. )
  46. self.desc_ctx['date_filter'] = _(" created between %(start_date)s and %(end_date)s") % {
  47. 'start_date': format_datetime(date_from),
  48. 'end_date': format_datetime(date_to)
  49. }
  50. elif date_from:
  51. queryset = queryset.filter(date_created__gte=date_from)
  52. self.desc_ctx['date_filter'] = _(" created after %s") % format_datetime(date_from)
  53. elif date_to:
  54. # Add 24 hours to make search inclusive
  55. date_to = date_to + datetime.timedelta(days=1)
  56. queryset = queryset.filter(date_created__lt=date_to)
  57. self.desc_ctx['date_filter'] = _(" created before %s") % format_datetime(date_to)
  58. return queryset
  59. def get_queryset(self):
  60. queryset = self.model.objects.all()
  61. self.desc_ctx = {
  62. 'main_filter': _('All reviews'),
  63. 'date_filter': '',
  64. 'status_filter': '',
  65. 'kw_filter': '',
  66. 'name_filter': '',
  67. }
  68. self.form = self.form_class(self.request.GET)
  69. if not self.form.is_valid():
  70. return queryset
  71. data = self.form.cleaned_data
  72. # checking for empty string rather then True is required
  73. # as zero is a valid value for 'status' but would be
  74. # evaluated to False
  75. if data['status'] != '':
  76. queryset = queryset.filter(status=data['status']).distinct()
  77. display_status = self.form.get_friendly_status()
  78. self.desc_ctx['status_filter'] = _(" with status matching '%s'") % display_status
  79. if data['keyword']:
  80. queryset = queryset.filter(
  81. Q(title__icontains=data['keyword']) |
  82. Q(body__icontains=data['keyword'])
  83. ).distinct()
  84. self.desc_ctx['kw_filter'] = _(" with keyword matching '%s'") % data['keyword']
  85. queryset = self.get_date_from_to_queryset(data['date_from'],
  86. data['date_to'], queryset)
  87. if data['name']:
  88. # If the value is two words, then assume they are first name and
  89. # last name
  90. parts = data['name'].split()
  91. if len(parts) >= 2:
  92. queryset = queryset.filter(
  93. user__first_name__istartswith=parts[0],
  94. user__last_name__istartswith=parts[1]
  95. ).distinct()
  96. else:
  97. queryset = queryset.filter(
  98. Q(user__first_name__istartswith=parts[0]) |
  99. Q(user__last_name__istartswith=parts[-1])
  100. ).distinct()
  101. self.desc_ctx['name_filter'] = _(" with customer name matching '%s'") % data['name']
  102. return queryset
  103. def get_context_data(self, **kwargs):
  104. context = super(self.__class__, self).get_context_data(**kwargs)
  105. context['review_form'] = self.review_form_class()
  106. context['form'] = self.form
  107. context['description'] = self.desc_template % self.desc_ctx
  108. return context
  109. def update_selected_review_status(self, request, reviews):
  110. """
  111. Update the status of the selected *reviews* with the new
  112. status in the *request* POST data. Redirects back to the
  113. list view of reviews.
  114. """
  115. new_status = int(request.POST.get('status'))
  116. for review in reviews:
  117. review.status = new_status
  118. review.save()
  119. return HttpResponseRedirect(reverse('dashboard:reviews-list'))
  120. class ReviewUpdateView(generic.UpdateView):
  121. model = ProductReview
  122. template_name = 'dashboard/reviews/review_update.html'
  123. form_class = forms.DashboardProductReviewForm
  124. context_object_name = 'review'
  125. def get_success_url(self):
  126. return reverse('dashboard:reviews-list')
  127. class ReviewDeleteView(generic.DeleteView):
  128. model = ProductReview
  129. template_name = 'dashboard/reviews/review_delete.html'
  130. context_object_name = 'review'
  131. def get_success_url(self):
  132. return reverse('dashboard:reviews-list')