Browse Source

Remove app report page because it is not need anymore

Mohidul Islam 4 năm trước cách đây
mục cha
commit
338b8261a3

+ 0 - 2
dashboard/templates/base.html

@@ -1,5 +1,4 @@
 {% load static %}
-<!DOCTYPE html>
 <html>
 <head>
     <!-- Required meta tags -->
@@ -29,7 +28,6 @@
             <!-- Navbar Right Side -->
             <div class="navbar-nav">
                 <a class="nav-item nav-link" href="{% url 'analytics' %}">Analytics</a>
-                <a class="nav-item nav-link" href="{% url 'review-report' %}">App Report</a>
                 <a class="nav-item nav-link" href="{% url 'leader-board' 12345 %}">Leaderboard</a>
             </div>
           </div>

+ 0 - 30
dashboard/templates/report.html

@@ -1,30 +0,0 @@
-{% extends 'base.html' %}
-{% block report %}
-  <h2 align="center" class="mt-2 mb-4">App Report</h2>
-    <table class="table">
-      <thead class="thead-dark" style="text-align: center">
-        <tr>
-          <th scope="col">Location Name</th>
-          <th scope="col">Average Rating</th>
-          <th scope="col">Total Review (Google API)</th>
-          <th scope="col">Total Review (on DB)</th>
-          <th scope="col">Status</th>
-        </tr>
-      </thead>
-      <tbody style="text-align: center">
-      {% for loc in location_report %}
-        <tr>
-          <th scope="row">{{ loc.care_name }}</th>
-          <td>{{ loc.average_rating }}</td>
-          <td>{{ loc.total_review }}</td>
-          <td>{{ loc.total_review_DB }}</td>
-          {% if loc.total_review <= loc.total_review_DB %}
-            <td><i class="fa fa-check-square-o" style="font-size:36px;color:green"></i></td>
-          {% else %}
-            <td><a href="{% url 'sync-location' loc.location_id %}"><i class="fa fa-refresh" style="font-size:36px;color:#fc9003"></i></span></a></td>
-          {% endif %}
-        </tr>
-      {% endfor %}
-      </tbody>
-    </table>
-{% endblock %}

+ 1 - 3
dashboard/urls.py

@@ -1,10 +1,8 @@
 from django.urls import path
-from .views import ReviewListByLocationView, UnRepliedReviewList, ReviewListView, ReportView, sync_location
+from .views import ReviewListByLocationView, UnRepliedReviewList, ReviewListView
 
 urlpatterns = [
     path('', UnRepliedReviewList.as_view(), name='un-replied-review'),
     path('list/', ReviewListView.as_view(), name='review-list'),
     path('list/<location_id>/', ReviewListByLocationView.as_view(), name='review-list-by-location'),
-    path('report/', ReportView.as_view(), name='review-report'),
-    path('report/sync/<location_id>', sync_location, name='sync-location'),
 ]

+ 1 - 14
dashboard/views.py

@@ -6,12 +6,11 @@ from django.shortcuts import get_object_or_404
 from review.models import Review, Reply
 from review.forms import ReplyForm
 from gauth.models import Location
-from review.review_utils import sync_all_review, reply_review
+from review.review_utils import reply_review
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 from django.contrib.auth.mixins import LoginRequiredMixin
 
 
-
 class ReviewListByLocationView(LoginRequiredMixin, View):
 
     def get(self, request, location_id, *args, **kwargs):
@@ -105,15 +104,3 @@ class UnRepliedReviewList(LoginRequiredMixin, View):
             reviews = paginator.page(paginator.num_pages)
         context = {'reviews': reviews, 'form': form}
         return render(request, 'dashboard.html', context=context)
-
-
-class ReportView(LoginRequiredMixin, View):
-
-    def get(self, request, *args, **kwargs):
-        locations = Location.objects.all()
-        return render(request, 'report.html', {'location_report': locations})
-
-
-def sync_location(request, location_id):
-    sync_all_review(location_id)
-    return redirect('review-report')

+ 5 - 0
facebook_app/forms.py

@@ -0,0 +1,5 @@
+from django import forms
+
+
+class ReplyForm(forms.Form):
+    reply = forms.CharField(max_length=2000, widget=forms.Textarea(attrs={'rows': 4}))

+ 2 - 0
facebook_app/models.py

@@ -22,3 +22,5 @@ class FacebookReview(models.Model):
 
     def __str__(self):
         return self.review_text
+
+

+ 57 - 0
facebook_app/templates/facebook-reviews.html

@@ -0,0 +1,57 @@
+{% extends 'base.html' %}
+{% load crispy_forms_tags %}
+
+{% block content %}
+{% for review in reviews %}
+
+<article class="media content-section">
+    <div class="media-body">
+        <div class="article-metadata">
+            <small class="text-muted">{{ review.create_time|date:"F d, Y" }}</small>
+            <small class="text-muted"> at <b>{{ review.page }}</b></small>
+            {% if review.recommendation_type %}
+                <span style="color: green; float: right">Recommended</span>
+            {% else %}
+                <span style="color: red; float: right">Not Recommended</span>
+            {% endif %}
+        </div>
+        {% if review.review_text %}
+          <p class="article-content">{{ review.review_text }}</p>
+        {% endif %}
+        <form method="post" class="form" action="{% url 'un-replied-review' %}">
+            {% csrf_token %}
+                {{ form|crispy }}
+            <input type="hidden" value="{{ review.review_id }}" name="review_id">
+            <input class="btn btn-primary ml-2" style="float: right" type="submit", value="Submit"/>
+            {% if review.review_text%}
+                <a href="{% url 'predict' review.id %}" class="btn btn-info">Analyze</a>
+            {% endif %}
+        </form>
+        </div>
+
+</article>
+{% endfor %}
+    <div align="center">
+        {% if reviews.has_other_pages %}
+
+          {% if reviews.has_previous %}
+            <a class="btn btn-outline-info mb-4" href="?page=1">First</a>
+            <a class="btn btn-outline-info mb-4" href="?page={{ reviews.previous_page_number }}">Previous</a>
+          {% endif %}
+
+          {% for num in reviews.paginator.page_range %}
+            {% if reviews.number == num %}
+              <a class="btn btn-info mb-4" href="?page={{ num }}">{{ num }}</a>
+            {% elif num > reviews.number|add:'-3' and num < reviews.number|add:'3' %}
+              <a class="btn btn-outline-info mb-4" href="?page={{ num }}">{{ num }}</a>
+            {% endif %}
+          {% endfor %}
+
+          {% if reviews.has_next %}
+            <a class="btn btn-outline-info mb-4" href="?page={{ reviews.next_page_number }}">Next</a>
+            <a class="btn btn-outline-info mb-4" href="?page={{ reviews.paginator.num_pages }}">Last</a>
+          {% endif %}
+
+        {% endif %}
+    </div>
+{% endblock %}

+ 6 - 0
facebook_app/urls.py

@@ -0,0 +1,6 @@
+from django.urls import path
+from .views import FacebookReviews
+
+urlpatterns = [
+    path('', FacebookReviews.as_view(), name='facebook-reviews'),
+]

+ 39 - 1
facebook_app/views.py

@@ -1,3 +1,41 @@
 from django.shortcuts import render
+from django.shortcuts import redirect
+from django.views.generic import View
+from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.utils import timezone
 
-# Create your views here.
+from .models import FacebookReview
+from .forms import ReplyForm
+
+
+class FacebookReviews(LoginRequiredMixin, View):
+
+    def post(self, request, *args, **kwargs):
+        form = ReplyForm(self.request.POST)
+        if form.is_valid():
+            replied_text = form.cleaned_data.get('reply')
+        review_id = self.request.POST['review_id']
+        # TODO: Reply this review using selenium...
+
+        return redirect('un-replied-review')
+
+    def get(self, request, *args, **kwargs):
+        now = timezone.now()
+        form = ReplyForm()
+        date = now - timezone.timedelta(days=30)
+        # reviews = FacebookReview.objects.filter(reply=None, create_time__gte=date)\
+        #     .order_by('create_time')
+        reviews = FacebookReview.objects.filter(create_time__gte=date)\
+            .order_by('create_time')
+
+        page = request.GET.get('page', 1)
+        paginator = Paginator(reviews, 10)
+        try:
+            reviews = paginator.page(page)
+        except PageNotAnInteger:
+            reviews = paginator.page(1)
+        except EmptyPage:
+            reviews = paginator.page(paginator.num_pages)
+        context = {'reviews': reviews, 'form': form}
+        return render(request, 'facebook-reviews.html', context=context)

+ 2 - 1
gauth/admin.py

@@ -5,11 +5,12 @@ from django.contrib.auth.models import Group
 
 class UserModelAdmin(admin.ModelAdmin):
     list_display = ['user', 'access_token', 'expiry', 'refresh_token', 'gmb_account_id']
+    readonly_fields = ['access_token', 'refresh_token', 'gmb_account_id']
 
 
 class LocationsAdmin(admin.ModelAdmin):
     list_display = ['location_id', 'care_name', 'location_name', 'website_url',
-                    'review_site_url', 'average_rating', 'total_review', 'recipient_email']
+                    'review_site_url', 'recipient_email']
 
 
 admin.site.register(Location, LocationsAdmin)

+ 25 - 0
gauth/migrations/0013_auto_20200727_0612.py

@@ -0,0 +1,25 @@
+# Generated by Django 3.0.4 on 2020-07-27 06:12
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('gauth', '0012_auto_20200512_1212'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='location',
+            name='average_rating',
+        ),
+        migrations.RemoveField(
+            model_name='location',
+            name='total_review',
+        ),
+        migrations.RemoveField(
+            model_name='location',
+            name='total_review_DB',
+        ),
+    ]

+ 0 - 3
gauth/models.py

@@ -18,9 +18,6 @@ class Location(models.Model):
     care_name = models.CharField(max_length=50, null=True, blank=True)
     location_name = models.CharField(max_length=120)
     website_url = models.URLField()
-    average_rating = models.FloatField(null=True, blank=True)
-    total_review = models.IntegerField(null=True, blank=True)
-    total_review_DB = models.IntegerField(null=True, blank=True)
     review_site_url = models.URLField(null=True, blank=True)
     recipient_email = models.URLField(null=True, blank=True)
     owner = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

+ 0 - 16
review/review_utils.py

@@ -107,18 +107,6 @@ def sync_all_review(loc_id):
         next_page_token = data.get('nextPageToken')
         if next_page_token is None:
             break
-    average_rating = data.get('averageRating')
-    total_reviews = data.get('totalReviewCount')
-    total_reviews_db = Review.objects.filter(location_id=loc_id).count()
-    update_location_data(loc_id, average_rating, total_reviews, total_reviews_db)
-
-
-def update_location_data(loc_id, average_rating, total_reviews, total_reviews_db):
-    loc = Location.objects.get(pk=loc_id)
-    loc.average_rating = average_rating
-    loc.total_review = total_reviews
-    loc.total_review_DB = total_reviews_db
-    loc.save()
 
 
 def fetch_last_20_reviews(loc_id, page_size=20):
@@ -127,12 +115,8 @@ def fetch_last_20_reviews(loc_id, page_size=20):
     res = get(url, headers=headers)
     data = res.json()
     reviews = data.get('reviews')
-    average_rating = data.get('averageRating')
-    total_reviews = data.get('totalReviewCount')
     if len(reviews) > 0:
         insert_review_into_database(reviews, loc_id)
-    total_reviews_db = Review.objects.filter(location_id=loc_id).count()
-    update_location_data(loc_id, average_rating, total_reviews, total_reviews_db)
 
 
 def store_batch_of_reviews(reviews):

+ 1 - 0
review_automation/urls.py

@@ -13,6 +13,7 @@ urlpatterns = [
     path('dashboard/', include('dashboard.urls')),
     path('analytics/', include('analytics.urls')),
     path('leaderboard/', include('name_extractor.urls')),
+    path('facebook/', include('facebook_app.urls')),
 ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
 
 

+ 1 - 1
yelp/utils.py

@@ -36,4 +36,4 @@ def store_into_database(reviews, location):
                 location=location
         )
         if created:
-            print('A new object has been created!')
+            print(f'A new review object has been created for {location}!')