ソースを参照

Added review filter for manager page

Mohidul Islam 4 年 前
コミット
7da4fccd74
3 ファイル変更164 行追加42 行削除
  1. 14 25
      manager/templates/review-list-man.html
  2. 43 9
      manager/views.py
  3. 107 8
      user/forms.py

+ 14 - 25
manager/templates/review-list-man.html

@@ -1,34 +1,23 @@
 {% extends 'manager-base.html' %}
 {% load static %}
+{% load crispy_forms_tags %}
 
 {% block filter %}
-  <div class="btn-toolbar mb-2 mb-md-0">
-    <div class="btn-group mr-2">
-      {% if platform == 'google' %}
-        <a class="btn btn-outline-secondary" href="{% url 'location-wise-review-list-man' platform='google' location_id=location.pk %}">All Reviews</a>
-      {% elif platform == 'facebook' %}
-        <a class="btn btn-outline-secondary" href="{% url 'location-wise-review-list-man' platform='facebook' location_id=location.pk %}">All Reviews</a>
-      {% endif %}
-    </div>
-    <div class="dropdown show">
-      <a class="btn btn-outline-secondary dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-        Filter Review
-      </a>
-      {% if platform == 'google' %}
-      <div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
-        <a class="dropdown-item" href="{% url 'location-wise-review-list-man' platform='google' location_id=location.pk %}?rating=1">1 star rating</a>
-        <a class="dropdown-item" href="{% url 'location-wise-review-list-man' platform='google' location_id=location.pk %}?rating=2">2 star rating</a>
-        <a class="dropdown-item" href="{% url 'location-wise-review-list-man' platform='google' location_id=location.pk %}?rating=3">3 star rating</a>
-        <a class="dropdown-item" href="{% url 'location-wise-review-list-man' platform='google' location_id=location.pk %}?rating=4">4 star rating</a>
-        <a class="dropdown-item" href="{% url 'location-wise-review-list-man' platform='google' location_id=location.pk %}?rating=5">5 star rating</a>
+  {{ form.media }}
+  <div class="row">
+    <form method="post" class="form-row align-items-center">
+        {% csrf_token %}
+      <div class="col-auto">
+        {{ form.start_date }}
       </div>
-      {% elif platform == 'facebook' %}
-      <div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
-        <a class="dropdown-item" href="{% url 'location-wise-review-list-man' platform='facebook' location_id=location.pk %}?rating=True">Recommended</a>
-        <a class="dropdown-item" href="{% url 'location-wise-review-list-man' platform='facebook' location_id=location.pk %}?rating=False">Not Recommended</a>
+      <div class="col-auto">
+        {{ form.end_date }}
       </div>
-      {% endif %}
-    </div>
+      <div class="col-auto">
+        {{ form.star_ratings }}
+      </div>
+      <input type="submit" name="Submit" class="btn btn-primary">
+    </form>
   </div>
 {% endblock %}
 

+ 43 - 9
manager/views.py

@@ -4,10 +4,9 @@ from django.http import Http404
 from django.shortcuts import render, redirect
 from django.views.generic import View
 from django.contrib import messages
-from user.forms import StaffRegistrationForm, StaffSheetDateForm
+from user.forms import StaffRegistrationForm, StaffSheetDateForm, GoogleReviewsFilter, FacebookReviewsFilter
 from review.models import Review
 from facebook_app.models import FacebookReview
-from yelp.models import YelpReview
 from name_extractor.models import Staff
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 from django.shortcuts import get_object_or_404
@@ -22,7 +21,6 @@ from user.utils import (
 )
 from .forms import ImportStaffSpreadSheet
 
-
 LOC_SYN = {
     'cypress-1960': 'cypress',
     'collegestation': 'college station'
@@ -102,16 +100,52 @@ class LocationAnalytics(LoginRequiredMixin, View):
 
 class ReviewListLocationWise(View):
     def get(self, request, platform, location_id,  *args, **kwargs):
-        rating = request.GET.get('rating')
         location = Location.objects.get(pk=location_id)
         if platform == 'google':
+            form = GoogleReviewsFilter()
+            reviews = Review.objects.filter(location_id=location_id).order_by('-update_time')
+        elif platform == 'facebook':
+            form = FacebookReviewsFilter()
+            reviews = FacebookReview.objects.filter(page__location_id=location_id).order_by('-create_time')
+        else:
+            raise Http404()
+
+        page = request.GET.get('page', 1)
+        paginator = Paginator(reviews, 50)
+        try:
+            reviews = paginator.page(page)
+        except PageNotAnInteger:
+            reviews = paginator.page(1)
+        except EmptyPage:
+            reviews = paginator.page(paginator.num_pages)
+        context = {'reviews': reviews, 'platform': platform, 'location': location, 'form': form}
+        return render(request, 'review-list-man.html', context=context)
+
+    def post(self, request, platform, location_id,  *args, **kwargs):
+        location = Location.objects.get(pk=location_id)
+        if platform == 'google':
+            form = GoogleReviewsFilter(data=request.POST)
+            start_date = date_str2datetime(request.POST.get('start_date'))
+            end_date = date_str2datetime(request.POST.get('end_date'))
+            star_rating = int(request.POST.get('star_ratings'))
             reviews = Review.objects.filter(location_id=location_id).order_by('-update_time')
-            if rating:
-                reviews = reviews.filter(star_rating=rating)
+            if start_date and end_date:
+                if star_rating > 5:
+                    reviews = reviews.filter(create_time__range=(start_date, end_date))
+                else:
+                    reviews = reviews.filter(create_time__range=(start_date, end_date), star_rating=star_rating)
         elif platform == 'facebook':
+            form = FacebookReviewsFilter(request.POST)
+            start_date = date_str2datetime(request.POST.get('start_date'))
+            end_date = date_str2datetime(request.POST.get('end_date'))
+            star_rating = int(request.POST.get('star_ratings'))
+
             reviews = FacebookReview.objects.filter(page__location_id=location_id).order_by('-create_time')
-            if rating:
-                reviews = reviews.filter(recommendation_type=rating)
+            if start_date and end_date:
+                if star_rating > 5:
+                    reviews = reviews.filter(create_time__range=(start_date, end_date))
+                else:
+                    reviews = reviews.filter(create_time__range=(start_date, end_date), recommendation_type=bool(star_rating))
         else:
             raise Http404()
 
@@ -123,7 +157,7 @@ class ReviewListLocationWise(View):
             reviews = paginator.page(1)
         except EmptyPage:
             reviews = paginator.page(paginator.num_pages)
-        context = {'reviews': reviews, 'platform': platform, 'location': location}
+        context = {'reviews': reviews, 'platform': platform, 'location': location, 'form': form}
         return render(request, 'review-list-man.html', context=context)
 
 

+ 107 - 8
user/forms.py

@@ -6,9 +6,21 @@ from django.contrib.auth.forms import UserCreationForm
 
 from tempus_dominus.widgets import DatePicker
 
-NOW = timezone.now()
-TODAY = NOW.date().strftime('%Y-%m-%d')
-ONE_MONTH_BEFORE = (NOW - timezone.timedelta(days=30)).replace(day=NOW.day).date().strftime('%Y-%m-%d')
+
+GOOGLE_CHOICE = [
+    (1, '1* rating'),
+    (2, '2* rating'),
+    (3, '3* rating'),
+    (4, '4* rating'),
+    (5, '5* rating'),
+    (6, 'All Reviews'),
+]
+
+FACEBOOK_CHOICE = [
+    (1, 'Recommended'),
+    (0, 'Not Recommended'),
+    (6, 'All Reviews')
+]
 
 
 class UserRegisterForm(UserCreationForm):
@@ -27,31 +39,118 @@ class StaffRegistrationForm(forms.ModelForm):
 
 
 class StaffSheetDateForm(forms.Form):
+    now = timezone.now()
+    today = now.date().strftime('%Y-%m-%d')
+    last_month = (now - timezone.timedelta(days=30)).replace(day=now.day).date().strftime('%Y-%m-%d')
+
     start_date = forms.DateField(
         required=True,
         widget=DatePicker(
             options={
                 'minDate': '2012-01-01',
-                'maxDate': TODAY,
+                'maxDate': today,
             },
             attrs={
                 'append': 'fa fa-calendar',
                 'icon_toggle': True,
             }
         ),
-        initial=ONE_MONTH_BEFORE,
+        initial=last_month,
     )
     end_date = forms.DateField(
         required=True,
         widget=DatePicker(
             options={
                 'minDate': '2012-01-01',
-                'maxDate': TODAY,
+                'maxDate': today,
             },
             attrs={
                 'append': 'fa fa-calendar',
                 'icon_toggle': True,
             }
         ),
-        initial=TODAY,
-    )
+        initial=today,
+    )
+
+
+class GoogleReviewsFilter(forms.Form):
+    now = timezone.now()
+    today = now.date().strftime('%Y-%m-%d')
+    last_month = (now - timezone.timedelta(days=30)).replace(day=now.day).date().strftime('%Y-%m-%d')
+    start_date = forms.DateField(
+        required=True,
+        widget=DatePicker(
+            options={
+                'minDate': '2012-01-01',
+                'maxDate': today,
+            },
+            attrs={
+                'append': 'fa fa-calendar',
+                'icon_toggle': True,
+            }
+        ),
+        initial=last_month,
+    )
+    end_date = forms.DateField(
+        required=True,
+        widget=DatePicker(
+            options={
+                'minDate': '2012-01-01',
+                'maxDate': today,
+            },
+            attrs={
+                'append': 'fa fa-calendar',
+                'icon_toggle': True,
+            }
+        ),
+        initial=today,
+    )
+
+    star_ratings = forms.MultipleChoiceField(
+        required=False,
+        choices=GOOGLE_CHOICE,
+        widget=forms.Select(attrs={'class': 'custom-select'}),
+        initial=(6, 'All reviews')
+    )
+
+
+class FacebookReviewsFilter(forms.Form):
+    now = timezone.now()
+    today = now.date().strftime('%Y-%m-%d')
+    last_month = (now - timezone.timedelta(days=30)).replace(day=now.day).date().strftime('%Y-%m-%d')
+    start_date = forms.DateField(
+        required=True,
+        widget=DatePicker(
+            options={
+                'minDate': '2012-01-01',
+                'maxDate': today,
+            },
+            attrs={
+                'append': 'fa fa-calendar',
+                'icon_toggle': True,
+            }
+        ),
+        initial=last_month,
+    )
+    end_date = forms.DateField(
+        required=True,
+        widget=DatePicker(
+            options={
+                'minDate': '2012-01-01',
+                'maxDate': today,
+            },
+            attrs={
+                'append': 'fa fa-calendar',
+                'icon_toggle': True,
+            }
+        ),
+        initial=today,
+    )
+
+    star_ratings = forms.MultipleChoiceField(
+        required=False,
+        choices=FACEBOOK_CHOICE,
+        widget=forms.Select(attrs={'class': 'custom-select'}),
+        initial=(6, 'All Reviews')
+
+    )