ソースを参照

Change review summery email body..

Mohidul Islam 4 年 前
コミット
0105fd72ac
5 ファイル変更141 行追加141 行削除
  1. 66 132
      analytics/templates/weekly_report.html
  2. 39 0
      analytics/utils.py
  3. 36 7
      analytics/views.py
  4. 0 1
      facebook_app/admin.py
  5. 0 1
      review/admin.py

+ 66 - 132
analytics/templates/weekly_report.html

@@ -2,8 +2,11 @@
 <html>
   <head>
     <style>
+      body {
+        font-family: monospace, "Trebuchet MS", Arial, Helvetica, sans-serif;
+        color: #352823;
+      }
       .customers {
-        font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
         border-collapse: collapse;
         width: 100%;
       }
@@ -65,24 +68,51 @@
 			border-right: none;
 		}
 
+
+    .card {
+      width: 80%;
+      transition: 0.3s;
+      border-radius: 5px;
+      margin: 1rem;
+    }
+
+    .card:hover {
+      box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2);
+    }
+
+    .container {
+      box-shadow: 0 2px 4px 0 rgba(0,0,0,0.2);
+      padding: .5rem;
+      border-radius: 5px;
+    }
+    .in-cont {
+      padding: .5rem;
+      border: solid #c0c3bf 2px;
+      border-radius: 5px;
+    }
     </style>
   </head>
   <body>
     <div align="center" style="margin-top: 25px;">
+      <h2 style="text-align:center; margin-top: 50px"> Review Report of Google & Facebook at {{ location.care_name }}</h2>
       <img src="https://ercare24.com/wp-content/uploads/2016/07/signature-care-resized-e1462918690585.png" alt="Avatar" class="image" width=50% >
-      <h2 style="text-align:center; margin-top: 50px">Last Week Review Report</h2>
+        <h2 style="text-align:center; margin-top: 50px"> Review Summary ( {{ date.end | date:"M jS" }} - {{ date.start |  date:"M jS" }})</h2>
     </div>
+
     <div align="center">
-      <table class="customers">
+      <table class="customers" style="width: 60%">
       <tr>
-        <th style="width: 25%;">Platform</th>
+        <th style="width: 50%;">Platform</th>
         <th>Ratings</th>
       </tr>
 
       <!-- Google Reviews Summary -->
 
       <tr>
-        <td>Google</td>
+        <td style="padding: 1rem">
+          <span>Google</span> <br>
+          <span style="display: inline-block; margin-top:.5rem">Map Link: <a href="{{ location.review_site_url }}" target="_blank">Click here</a></span>
+        </td>
         <td>
           {% if google_ratings.count == 0 %}
           <span style="color: red; font-weight: bold;">No Ratings!</span>
@@ -96,53 +126,21 @@
           {% endfor %}
           {% endif %}
         </td>
-      </tr>      
-      <!-- Yelp Reviews Summary -->
-
-<!--      <tr>-->
-<!--        <td>Yelp</td>-->
-<!--          <td>-->
-<!--            {% if yelp_ratings.count == 0 %}-->
-<!--            <span style="color: red; font-weight: bold;">No Ratings!</span>-->
-<!--            {% else %}-->
-<!--            {% for r in yelp_ratings %}-->
-<!--              {% if r.rating < 3 %}-->
-<!--                <p style="color: red; font-weight: bold;">{{ r.rating }}* star: {{ r.total }}</p>-->
-<!--              {% else %}-->
-<!--                <p>{{ r.rating }}* star: {{ r.total }}</p>-->
-<!--              {% endif %}-->
-<!--            {% endfor %}-->
-<!--            {% endif %}-->
-<!--          </td>-->
-<!--      </tr>      -->
-
-<!--      <tr>-->
-<!--        <td>Yelp</td>-->
-<!--          <td>-->
-<!--            {% if yelp_ratings.count == 0 %}-->
-<!--            <span style="color: red; font-weight: bold;">No Ratings!</span>-->
-<!--            {% else %}-->
-<!--            {% for r in yelp_ratings %}-->
-<!--              {% if r.rating < 3 %}-->
-<!--                <p style="color: red; font-weight: bold;">{{ r.rating }}* star: {{ r.total }}</p>-->
-<!--              {% else %}-->
-<!--                <p>{{ r.rating }}* star: {{ r.total }}</p>-->
-<!--              {% endif %}-->
-<!--            {% endfor %}-->
-<!--            {% endif %}-->
-<!--          </td>-->
-<!--      </tr>      -->
-<!--       Facebook Reviews Summary-->
+      </tr>
 
+        <!--       Facebook Reviews Summary-->
       <tr>
-        <td>Facebook</td>
+        <td style="padding: 1rem">
+          <span>Facebook</span> <br>
+          <span style="display: inline-block; margin-top:.5rem">Page Link: <a href="https://facebook.com/{{ location.facebookpage.id }}" target="_blank">Click here</a></span>
+        </td>
         <td>
           {% if facebook_ratings %}
             {% for r in facebook_ratings %}
               {% if r.recommendation_type == True %}
-                <span style="color: green; font-weight: green;">Positive: {{ r.total }}</span> </br>
+                <p style="color: green; font-weight: green;">Positive: {{ r.total }}</p>
               {% else %}
-                <span style="color: red; font-weight: red;">Negative: {{ r.total }}</span> </br>
+                <p style="color: red; font-weight: red;">Negative: {{ r.total }}</p> </br>
               {% endif %}
             {% endfor %}
           {% else %}
@@ -152,94 +150,30 @@
       </tr>
     </table>
 
-    <h2 style="text-align:center; margin-top: 50px">All negative reviews that been posted this week.</h2>
-    <table class="customers">
-      <tr>
-        <th style="width: 25%;">Platform</th>
-        <th>Review</th>
-      </tr>
-      <!-- Google Bad reviews list -->
+      {% if google_pos_reviews %}
+        <h2 style="text-align:center; margin-top: 50px">All reviews that been posted this week.</h2>
+      {% endif %}
 
-      <tr>
-        <td>Google</td>
-        {% if google_bad_reviews.count > 0 %}
-        <td style="width: 100%; padding: 0px">
-          <table class="n-bordered" border="1px"  style="border-collapse: collapse;">
-            <tr style="background-color: rgb(179, 177, 177);">
-<!--              <td style="width: 20%;">Reviewer Name</td>-->
-<!--              <td style="width: 90%;">Comment</td>-->
-<!--              <td style="width: 10%;">Rating</td>-->
-            </tr>
-          {% for review in google_bad_reviews %}
-            <tr>
-<!--              <td>{{ review.reviewer_name }}</td>-->
-              {% if review.comment %}
-                <td style="width: 90%;">{{ review.comment }}</td>
-              {% else %}
-                <td>No comment only rating.</td>
-              {% endif %}
-              <td style="width: 10%;">{{ review.star_rating }}*</td>
-            </tr> 
-          {% endfor %}
-        </table>
-        </td>
-        {% else %}
-        <td>
-          <span style="color: green; font-weight: bold;">No negative reviews has been posted in Google!</span>
-        </td>
-        {% endif %} 
-      </tr>
-
-      <!--      Yelp bad reviews list-->
-
-<!--      <tr>-->
-<!--        <td>Yelp</td>-->
-<!--        {% if yelp_bad_reviews.count > 0 %}-->
-<!--        <td style="width: 100%; padding: 0px">-->
-<!--          <table class="n-bordered" border="1px"  style="border-collapse: collapse;">-->
-<!--&lt;!&ndash;            <tr style="background-color: rgb(179, 177, 177);">&ndash;&gt;-->
-<!--&lt;!&ndash;&lt;!&ndash;              <td style="width: 20%;">Reviewer Name</td>&ndash;&gt;&ndash;&gt;-->
-<!--&lt;!&ndash;              <td style="width: 90%;">Comment</td>&ndash;&gt;-->
-<!--&lt;!&ndash;              <td style="width: 10%;">Rating</td>&ndash;&gt;-->
-<!--&lt;!&ndash;            </tr>&ndash;&gt;-->
-<!--            {% for review in yelp_bad_reviews %}-->
-<!--              <tr>-->
-<!--&lt;!&ndash;                <td>{{ review.reviewer_name }}</td>&ndash;&gt;-->
-<!--                <td style="width: 90%;">{{ review.comment }}</td>-->
-<!--                <td style="width: 10%;">{{ review.rating }}*</td>-->
-<!--              </tr>-->
-<!--            {% endfor %}-->
-<!--          </table>-->
-<!--        </td>-->
-<!--        {% else %}-->
-<!--          <td>-->
-<!--            <span style="color: green; font-weight: bold;">No bad reviews has been posted in Yelp!</span>-->
-<!--          </td>-->
-<!--        {% endif %}-->
-<!--      </tr>-->
-
-<!--      Facebook Review-->
-
-      <tr>
-        <td>Facebook</td>
-        {% if facebook_bad_reviews.count > 0 %}
-        <td style="width: 100%; padding: 0px">
-          <table class="n-bordered" border="1px"  style="border-collapse: collapse;">
-            {% for review in facebook_bad_reviews %}
-              <tr>
-                <td style="width: 90%;">{{ review.review_text }}</td>
-                <td style="width: 10%;">Not Recommended</td>
-              </tr>
-            {% endfor %}
-          </table>
-        </td>
-        {% else %}
-          <td>
-            <span style="color: green; font-weight: bold;">No negative recommendation has been posted in Facebook!</span>
-          </td>
-        {% endif %}
-      </tr>
-    </table>
+      {% for review in google_pos_reviews %}
+        <div class="card">
+          {% if review.positive %}
+            <div class="container" style="background: #CDFFC2">
+          {% else %}
+            <div class="container" style="background: #FFC2C2">
+          {% endif %}
+          <div class="in-cont">
+          {% if review.platform == "Google" %}
+            <div style="text-align: left; padding: 0rem 1rem 0rem 1rem"><b style="font-size: 1rem;"> {{ review.reviewer_name }}</b><span> on {{ review.platform }}</span> <span style="float: right;"> {{ review.create_time }}</span></div>
+          {% else %}
+            <div style="text-align: left; padding: 0rem 1rem 0rem 1rem"><b style="font-size: 1rem;"> <a href="https://facebook.com/{{ review.reviewer_name }}" target="_blank">Click here...</a></b><span> on {{ review.platform }}</span> <span style="float: right;"> {{ review.create_time }}</span></div>
+          {% endif %}
+          <hr>
+          <div><p>{{ review.comment | safe }}</p></div>
+        </div>
+      </div>
+        </div>
+      {% endfor %}
+      </div>
     </div>
   </body>
 </html>

+ 39 - 0
analytics/utils.py

@@ -128,3 +128,42 @@ def get_review_count_by_month(location_id):
         'this': this_month
     }
     return response
+
+
+def get_list_of_reviews(google_reviews, facebook_reviews, max_pos_rev):
+    google_review_list = list(google_reviews.exclude(star_rating__range=(3, 4)).
+                              values('comment', 'star_rating', 'create_time', 'reviewer_name'))
+    facebook_review_list = list(facebook_reviews.
+                                values('id', 'recommendation_type', 'review_text', 'create_time'))
+    all_revs = []
+
+    for rev in google_review_list:
+        if not rev['comment']:
+            continue
+        # if rev['star_rating'] == 5 and len(rev['comment']) < 100:
+        #     continue
+        rev['create_time'] = str(rev['create_time']).split()[0]
+        rev['platform'] = 'Google'
+        if rev['star_rating'] < 3:
+            rev['positive'] = False
+        else:
+            rev['positive'] = True
+        all_revs.append(rev)
+
+    # Adding the facebook reviews
+    for rev in facebook_review_list:
+        if not rev['review_text']:
+            continue
+        rev['platform'] = 'Facebook'
+        rev['create_time'] = str(rev['create_time']).split()[0]
+        recommendation_type = rev.pop('recommendation_type')
+        comment = rev.pop('review_text')
+        reviewer = rev.pop('id')
+        if recommendation_type:
+            rev['positive'] = True
+        else:
+            rev['positive'] = False
+        rev['comment'] = comment
+        rev['reviewer_name'] = reviewer
+        all_revs.append(rev)
+    return all_revs

+ 36 - 7
analytics/views.py

@@ -1,13 +1,17 @@
+import re
+import json
+import requests as http_requests
+from django.conf import settings
+from django.utils import timezone
 from django.shortcuts import render
 from rest_framework.views import APIView
 from rest_framework.response import Response
 from django.views.generic import View
 from django.contrib.auth.mixins import LoginRequiredMixin
-
 from gauth.models import Location
 from name_extractor.models import Staff
-from yelp.analytics import get_yelp_weekly_summary
 from facebook_app.analytics import get_facebook_weekly_summary
+from .utils import get_list_of_reviews
 
 from .utils import (
     get_review_count_by_month,
@@ -16,6 +20,8 @@ from .utils import (
     weekly_reviews_summary
 )
 
+NER_MODEL_URL = getattr(settings, 'NER_SERVER_URI')
+
 
 class ChartDataByMonth(APIView):
     def get(self, request, *args, **kwargs):
@@ -49,17 +55,40 @@ def monthly_report(requests, location_id):
 
 
 def weekly_report(requests, location_id):
+    location = Location.objects.get(pk=location_id)
+    start_date = timezone.now()
+    end_date = start_date - timezone.timedelta(days=7)
     g_reviews, g_ratings = weekly_reviews_summary(location_id=location_id)
     f_reviews, f_ratings = get_facebook_weekly_summary(location_id=location_id)
 
-    g_bad_reviews = g_reviews.filter(star_rating__lte=2)
-    f_bad_reviews = f_reviews.filter(recommendation_type=False)
+    all_revs = get_list_of_reviews(g_reviews, f_reviews, 5)
 
-    context = {
+    payload = {
+        'reviews': all_revs,
+    }
+    headers = {'content-type': 'application/json'}
+    url = f'{NER_MODEL_URL}/displacy/google'
+    response = http_requests.post(url, data=json.dumps(payload), headers=headers)
+    google_pos_reviews = response.json()
 
+    all_reviews = []
+
+    for rev in google_pos_reviews:
+        rev['comment'] = re.sub(
+            r'>ORG</span>|>PERSON</span>|>GPE</span>|>PRODUCT</span>|>DATE</span>|>TIME</span>|>MONEY</span>',
+            '></span>',
+            rev['comment']
+        )
+        all_reviews.append(rev)
+
+    context = {
+        'location': location,
         'google_ratings': g_ratings,
-        'google_bad_reviews': g_bad_reviews,
         'facebook_ratings': f_ratings,
-        'facebook_bad_reviews': f_bad_reviews
+        'google_pos_reviews': all_reviews,
+        'date': {
+            'start': start_date,
+            'end': end_date
+        }
     }
     return render(requests, 'weekly_report.html', context)

+ 0 - 1
facebook_app/admin.py

@@ -10,7 +10,6 @@ class FacebookPageAdmin(admin.ModelAdmin):
 
 
 class FacebookReviewAdmin(admin.ModelAdmin):
-    fields = ('id', 'review_text', 'facebookreviewreply', 'recommendation_type', 'create_time',)
     list_display = ('id', 'review_text', 'page', 'recommendation_type', 'create_time',)
     list_filter = ['page', 'recommendation_type']
     ordering = ['-create_time']

+ 0 - 1
review/admin.py

@@ -4,7 +4,6 @@ from .models import Review, CustomReply, Reply
 
 class ReviewAdmin(admin.ModelAdmin):
     list_display = ('reviewer_name', 'star_rating', 'comment', 'location')
-    fields = ('review_id', 'location', 'reviewer_name', 'star_rating', 'comment', 'reply', 'update_time',)
 
     list_filter = ('location', 'star_rating',)
     ordering = ['-update_time']