Explorar el Código

Added date range review summary generator

Mohidul Islam hace 2 años
padre
commit
f12f1fd659
Se han modificado 3 ficheros con 286 adiciones y 2 borrados
  1. 211 0
      analytics/templates/report_by_date_range.html
  2. 3 1
      analytics/urls.py
  3. 72 1
      analytics/views.py

+ 211 - 0
analytics/templates/report_by_date_range.html

@@ -0,0 +1,211 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      body {
+        font-family: monospace, "Trebuchet MS", Arial, Helvetica, sans-serif;
+        color: #352823;
+      }
+      .customers {
+        border-collapse: collapse;
+        width: 100%;
+      }
+
+      .customers td, .customers th {
+        border: 1px solid rgb(41, 39, 39);
+        padding: 8px;
+        text-align: center;
+      }
+
+      .customers tr:nth-child(even){background-color: #f2f2f2;}
+
+      .customers tr:hover {background-color: #ddd;}
+
+      .customers th {
+        padding-top: 12px;
+        padding-bottom: 12px;
+        text-align: left;
+        background-color: #4e5253;
+        color: rgb(255, 255, 255);
+        text-align: center;
+      }
+
+      table{
+        table-layout: fixed;
+      }
+      p {
+        margin: 5px
+      }
+
+
+
+		.bordered, .n-bordered{
+			border: 1px solid black;
+			border-collapse: collapse;
+		}
+
+		.n-bordered{
+			border: none;
+		}
+
+		.bordered td, .n-bordered td{
+			border: 1px solid black;
+		}
+
+		.n-bordered tr:first-child td{
+			border-top: none;
+		}
+
+		.n-bordered tr:last-child td{
+			border-bottom: none;
+		}
+
+		.n-bordered tr td:first-child{
+			border-left: none;
+		}
+
+		.n-bordered tr td:last-child{
+			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>
+
+      <form>
+        <label for="birthday">Start Date:</label>
+        <input type="date" id="start_date" name="start_date">
+        <label for="birthday">End Date:</label>
+        <input type="date" id="end_date" name="end_date">
+        <input type="submit">
+      </form>
+
+      <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"> Review Summary ( {{ date.start | date:"M jS" }} - {{ date.end |  date:"M jS" }})</h2>
+    </div>
+
+    <div align="center">
+      <table class="customers" style="width: 60%">
+      <tr>
+        <th style="width: 50%;">Platform</th>
+        <th>Ratings</th>
+      </tr>
+
+      <!-- Google Reviews Summary -->
+
+      <tr>
+        <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>
+          {% else %}
+          {% for r in google_ratings %}
+            {% if r.star_rating < 3 %}
+              <p style="color: red; font-weight: bold;">{{ r.star_rating }}* star: {{ r.total }}</p>
+            {% else %}
+              <p>{{ r.star_rating }}* star: {{ r.total }}</p>
+            {% endif %}
+          {% endfor %}
+          {% endif %}
+        </td>
+      </tr>
+
+        <!--       Facebook Reviews Summary-->
+      <tr>
+        <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 %}
+                <p style="color: green; font-weight: green;">Positive: {{ r.total }}</p>
+              {% else %}
+                <p style="color: red; font-weight: red;">Negative: {{ r.total }}</p> </br>
+              {% endif %}
+            {% endfor %}
+          {% else %}
+            <span style="color: red; font-weight: bold;">No Ratings!</span>
+          {% endif %}
+        </td>
+      </tr>
+
+        <!--       Yelp Reviews Summary-->
+      <tr>
+        <td style="padding: 1rem">
+          <span>Yelp</span> <br>
+          <span style="display: inline-block; margin-top:.5rem">Page Link: <a href="{{ location.yelplocation.url }}" target="_blank">Click here</a></span>
+        </td>
+        <td>
+          {% if yelp_ratings %}
+            {% for r in yelp_ratings %}
+              {% if r.rating > 3 %}
+                <p style="color: green; font-weight: green;">Positive: {{ r.total }}</p>
+              {% else %}
+                <p style="color: red; font-weight: red;">Negative: {{ r.total }}</p> </br>
+              {% endif %}
+            {% endfor %}
+          {% else %}
+            <span style="color: red; font-weight: bold;">No Ratings!</span>
+          {% endif %}
+        </td>
+      </tr>
+    </table>
+
+      {% if google_pos_reviews %}
+        <h2 style="text-align:center; margin-top: 50px">All reviews that been posted this week.</h2>
+      {% endif %}
+
+      {% 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>
+          {% elif review.platform == "Facebook" %}
+            <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>
+          {% else %}
+            <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>
+          {% endif %}
+          <hr>
+          <div><p>{{ review.comment | safe }}</p></div>
+        </div>
+      </div>
+        </div>
+      {% endfor %}
+      </div>
+    </div>
+  </body>
+</html>

+ 3 - 1
analytics/urls.py

@@ -4,7 +4,8 @@ from .views import (
     AnalyticsData,
     monthly_report,
     weekly_report,
-    weeklyreportlist
+    weeklyreportlist,
+    report_by_date_range
 )
 
 urlpatterns = [
@@ -13,4 +14,5 @@ urlpatterns = [
     path('monthly-report/<location_id>', monthly_report),
     path('weekly-report/<location_id>', weekly_report),
     path('weekly-reports', weeklyreportlist),
+    path('date-range-report/<location_id>', report_by_date_range),
 ]

+ 72 - 1
analytics/views.py

@@ -1,5 +1,7 @@
 import re
 import json
+from datetime import datetime
+from django.utils.timezone import make_aware
 import requests as http_requests
 from django.conf import settings
 from django.utils import timezone
@@ -14,6 +16,11 @@ from facebook_app.analytics import get_facebook_weekly_summary
 from yelp.analytics import get_yelp_weekly_summary
 from .utils import get_list_of_reviews
 
+from review.models import Review
+from facebook_app.models import FacebookReview
+from yelp.models import YelpReview
+from django.db.models import Count
+
 from .utils import (
     get_review_count_by_month,
     get_review_count_by_week,
@@ -99,4 +106,68 @@ def weekly_report(requests, location_id):
 
 def weeklyreportlist(request):
     locations = Location.objects.all()
-    return render(request, 'weekly_report_list.html', {'locs': locations})
+    return render(request, 'weekly_report_list.html', {'locs': locations})
+
+
+
+
+
+def report_by_date_range(requests, location_id):
+    location = Location.objects.get(pk=location_id)
+    start_date = requests.GET['start_date']
+    end_date = requests.GET['end_date']
+    if start_date:
+        start_date = make_aware(datetime.strptime(start_date, "%Y-%m-%d"))
+    else:
+        start_date = timezone.now()
+    if end_date:
+        end_date = make_aware(datetime.strptime(end_date, "%Y-%m-%d"))
+    else:
+        end_date = start_date - timezone.timedelta(days=7)
+    g_reviews = Review.objects.filter(
+        create_time__range=(start_date, end_date),
+        location_id=location_id
+    )
+    g_ratings = g_reviews.values('star_rating')\
+        .annotate(total=Count('star_rating'))\
+        .order_by('-star_rating')
+    
+    f_reviews = FacebookReview.objects.filter(page__location_id=location_id, create_time__range=(start_date, end_date))
+    f_ratings = f_reviews.values('recommendation_type')\
+        .annotate(total=Count('recommendation_type'))\
+        .order_by('-recommendation_type')
+    y_reviews = YelpReview.objects.filter(location__location_id=location_id, date_posted__range=(start_date, end_date))
+    y_rating = y_reviews.values('rating').annotate(total=Count('rating')).order_by('-rating')
+    
+    all_revs = get_list_of_reviews(g_reviews, f_reviews, y_reviews)
+
+    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,
+        'facebook_ratings': f_ratings,
+        'yelp_ratings': y_rating,
+        'google_pos_reviews': all_reviews,
+        'date': {
+            'start': start_date,
+            'end': end_date
+        }
+    }
+    return render(requests, 'report_by_date_range.html', context)