ソースを参照

Added facebook negative review instant mail

Mohidul Islam 4 年 前
コミット
61114fb84c

+ 2 - 2
analytics/templates/weekly_report.html

@@ -5,7 +5,7 @@
       .customers {
         font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
         border-collapse: collapse;
-        width: 90%;
+        width: 100%;
       }
 
       .customers td, .customers th {
@@ -135,7 +135,7 @@
       </tr>
     </table>
 
-    <h2 style="text-align:center; margin-top: 50px">All bad reviews that been posted this week.</h2>
+    <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>

+ 40 - 0
facebook_app/analytics.py

@@ -1,6 +1,9 @@
+from django.conf import settings
 from django.db.models import Count
 from django.utils import timezone
 from .models import FacebookReview
+from gauth.models import Location
+from analytics.send_email import send_email
 
 
 def get_facebook_weekly_summary(location_id):
@@ -10,3 +13,40 @@ def get_facebook_weekly_summary(location_id):
         .annotate(total=Count('recommendation_type'))\
         .order_by('-recommendation_type')
     return reviews, rating
+
+
+def send_email_bad_reviews():
+    locations = Location.objects.all()
+    for location in locations:
+        to = settings.ADMIN_MAINTEINER_EMAILS
+        # date = timezone.now() - timezone.timedelta(hours=12)
+        date = timezone.now() - timezone.timedelta(days=20)
+        reviews = FacebookReview.objects.filter(
+            page__location_id=location.location_id,
+            create_time__gte=date,
+            recommendation_type=False
+        )
+        total_reviews = reviews.count()
+        if total_reviews > 0:
+            # Add location maintainer email if it has an email
+            to.append(location.recipient_email) if location.recipient_email else None
+
+            subject = f"A negative Facebook review has been post in {location.care_name}."
+            message = f'''
+            <p>Hi there, </p>
+            <p>'''
+            if total_reviews > 1:
+                tt = f'{total_reviews} negative Facebook reviews have'
+            else:
+                tt = f'A negative Facebook review has '
+            message += tt + f'been posted in {location.care_name}.</p>'
+            for r in reviews:
+                link = f'<p>Link: https://facebook.com/{r.id}</p>'
+                comment = f'<p><b>Comment: </b>{r.review_text if r.review_text else "No comment"}</p>'
+                message += comment + link
+            message += '<p>Regards,</p><p>Byte Trek Ltd.</p>'
+
+            send_email(to_list=to, subject=subject, message=message)
+            if location.recipient_email in to:
+                to.remove(location.recipient_email)
+

+ 7 - 0
facebook_app/background_job.py

@@ -0,0 +1,7 @@
+from .analytics import send_email_bad_reviews
+from .review_utils import populate_facebook_reviews
+
+
+def schedule_task():
+    populate_facebook_reviews()
+    send_email_bad_reviews()

+ 5 - 12
facebook_app/review_utils.py

@@ -12,9 +12,9 @@ BASE_URL = 'https://graph.facebook.com'
 RECOMMENDATION_STR2NUM = {'negative': False, 'positive': True}
 
 
-def get_page_reviews(page_id):
+def get_page_reviews(page_id, n_reviews):
     token = FacebookPage.objects.get(id=page_id).token
-    url = f'{BASE_URL}/{page_id}/ratings?fields=open_graph_story&limit=25&access_token={token}'
+    url = f'{BASE_URL}/{page_id}/ratings?fields=open_graph_story&limit={n_reviews}&access_token={token}'
     response = requests.get(url).json()
 
     # ratings has one field ['data'] which contain all reviews
@@ -56,8 +56,8 @@ def store_review_reply(review_id, page_id):
                 )
 
 
-def store_reviews_into_db(page_id):
-    reviews = get_page_reviews(page_id=page_id)
+def store_reviews_into_db(page_id, n_reviews=25):
+    reviews = get_page_reviews(page_id=page_id, n_reviews=n_reviews)
     for review in reviews:
         graph_story = review.get('open_graph_story')
         '''
@@ -69,13 +69,6 @@ def store_reviews_into_db(page_id):
         start_time = graph_story.get('start_time')
         recommendation_type = RECOMMENDATION_STR2NUM[graph_story.get('data')['recommendation_type']]
 
-        # review, created = FacebookReview.objects.update_or_create(
-        #     id=review_id,
-        #     recommendation_type=recommendation_type,
-        #     review_text=message,
-        #     create_time=start_time,
-        #     page_id=page_id
-        # )
         try:
             review = FacebookReview.objects.get(id=review_id)
             review.recommendation_type = recommendation_type
@@ -101,7 +94,7 @@ def store_reviews_into_db(page_id):
 def populate_facebook_reviews():
     page_ids = FacebookPage.objects.values('id')
     for page_id in page_ids:
-        store_reviews_into_db(page_id=page_id.get('id'))
+        store_reviews_into_db(page_id=page_id.get('id'), n_reviews=15)
 
 
 def reply2facebook_review(review_id, reply, like=False, love=False):