views.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import re
  2. import json
  3. from datetime import datetime
  4. from django.utils.timezone import make_aware
  5. import requests as http_requests
  6. from django.conf import settings
  7. from django.utils import timezone
  8. from django.shortcuts import render
  9. from rest_framework.views import APIView
  10. from rest_framework.response import Response
  11. from django.views.generic import View
  12. from django.contrib.auth.mixins import LoginRequiredMixin
  13. from gauth.models import Location
  14. from name_extractor.models import Staff
  15. from facebook_app.analytics import get_facebook_weekly_summary
  16. from yelp.analytics import get_yelp_weekly_summary
  17. from .utils import get_list_of_reviews
  18. from review.models import Review
  19. from facebook_app.models import FacebookReview
  20. from yelp.models import YelpReview
  21. from django.db.models import Count
  22. from .utils import (
  23. get_review_count_by_month,
  24. get_review_count_by_week,
  25. last_month_reviews,
  26. weekly_reviews_summary
  27. )
  28. NER_MODEL_URL = getattr(settings, 'NER_SERVER_URI')
  29. class ChartDataByMonth(APIView):
  30. def get(self, request, *args, **kwargs):
  31. location_id = request.GET['location_id']
  32. time_interval = request.GET['time_interval']
  33. if time_interval == 'month':
  34. res = get_review_count_by_month(location_id)
  35. else:
  36. res = get_review_count_by_week(location_id)
  37. return Response(res)
  38. class AnalyticsData(LoginRequiredMixin, View):
  39. def get(self, request, *args, **kwargs):
  40. locations = Location.objects.all()
  41. return render(request, 'charts.html', {'location_list': locations})
  42. def monthly_report(requests, location_id):
  43. last_month_data = last_month_reviews(location_id=location_id)
  44. staffs = Staff.objects.filter(location_id=location_id).\
  45. exclude(name_mentioned=0).order_by('-total_units')
  46. context = {
  47. 'this_month': last_month_data,
  48. 'staffs': staffs
  49. }
  50. return render(requests, 'last_month_report.html', context)
  51. def weekly_report(requests, location_id):
  52. location = Location.objects.get(pk=location_id)
  53. start_date = timezone.now()
  54. end_date = start_date - timezone.timedelta(days=7)
  55. g_reviews, g_ratings = weekly_reviews_summary(location_id=location_id)
  56. f_reviews, f_ratings = get_facebook_weekly_summary(location_id=location_id)
  57. y_reviews, y_rating = get_yelp_weekly_summary(location_id=location_id)
  58. all_revs = get_list_of_reviews(g_reviews, f_reviews, y_reviews)
  59. payload = {
  60. 'reviews': all_revs,
  61. }
  62. headers = {'content-type': 'application/json'}
  63. url = f'{NER_MODEL_URL}/displacy/google'
  64. response = http_requests.post(url, data=json.dumps(payload), headers=headers)
  65. google_pos_reviews = response.json()
  66. all_reviews = []
  67. for rev in google_pos_reviews:
  68. rev['comment'] = re.sub(
  69. r'>ORG</span>|>PERSON</span>|>GPE</span>|>PRODUCT</span>|>DATE</span>|>TIME</span>|>MONEY</span>',
  70. '></span>',
  71. rev['comment']
  72. )
  73. all_reviews.append(rev)
  74. context = {
  75. 'location': location,
  76. 'google_ratings': g_ratings,
  77. 'facebook_ratings': f_ratings,
  78. 'yelp_ratings': y_rating,
  79. 'google_pos_reviews': all_reviews,
  80. 'date': {
  81. 'start': start_date,
  82. 'end': end_date
  83. }
  84. }
  85. return render(requests, 'weekly_report.html', context)
  86. def weeklyreportlist(request):
  87. locations = Location.objects.all()
  88. return render(request, 'weekly_report_list.html', {'locs': locations})
  89. def report_by_date_range(requests, location_id):
  90. location = Location.objects.get(pk=location_id)
  91. start_date = requests.GET['start_date']
  92. end_date = requests.GET['end_date']
  93. if start_date:
  94. start_date = make_aware(datetime.strptime(start_date, "%Y-%m-%d"))
  95. else:
  96. start_date = timezone.now()
  97. if end_date:
  98. end_date = make_aware(datetime.strptime(end_date, "%Y-%m-%d"))
  99. else:
  100. end_date = start_date - timezone.timedelta(days=7)
  101. g_reviews = Review.objects.filter(
  102. create_time__range=(start_date, end_date),
  103. location_id=location_id
  104. )
  105. g_ratings = g_reviews.values('star_rating')\
  106. .annotate(total=Count('star_rating'))\
  107. .order_by('-star_rating')
  108. f_reviews = FacebookReview.objects.filter(page__location_id=location_id, create_time__range=(start_date, end_date))
  109. f_ratings = f_reviews.values('recommendation_type')\
  110. .annotate(total=Count('recommendation_type'))\
  111. .order_by('-recommendation_type')
  112. y_reviews = YelpReview.objects.filter(location__location_id=location_id, date_posted__range=(start_date, end_date))
  113. y_rating = y_reviews.values('rating').annotate(total=Count('rating')).order_by('-rating')
  114. all_revs = get_list_of_reviews(g_reviews, f_reviews, y_reviews)
  115. payload = {
  116. 'reviews': all_revs,
  117. }
  118. headers = {'content-type': 'application/json'}
  119. url = f'{NER_MODEL_URL}/displacy/google'
  120. response = http_requests.post(url, data=json.dumps(payload), headers=headers)
  121. google_pos_reviews = response.json()
  122. all_reviews = []
  123. for rev in google_pos_reviews:
  124. rev['comment'] = re.sub(
  125. r'>ORG</span>|>PERSON</span>|>GPE</span>|>PRODUCT</span>|>DATE</span>|>TIME</span>|>MONEY</span>',
  126. '></span>',
  127. rev['comment']
  128. )
  129. all_reviews.append(rev)
  130. context = {
  131. 'location': location,
  132. 'google_ratings': g_ratings,
  133. 'facebook_ratings': f_ratings,
  134. 'yelp_ratings': y_rating,
  135. 'google_pos_reviews': all_reviews,
  136. 'date': {
  137. 'start': start_date,
  138. 'end': end_date
  139. }
  140. }
  141. return render(requests, 'report_by_date_range.html', context)