views.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. from django.http import Http404
  2. from django.shortcuts import render, redirect
  3. from django.utils.decorators import method_decorator
  4. from django.contrib.auth.decorators import login_required
  5. from django.views.generic import View
  6. from django.contrib import messages
  7. from .forms import UserRegisterForm, StaffRegistrationForm, StaffSheetDateForm
  8. from .models import UserAccount
  9. from gauth.models import Location
  10. from review.models import Review
  11. from facebook_app.models import FacebookReview
  12. from yelp.models import YelpReview
  13. from name_extractor.models import Staff
  14. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  15. from name_extractor.utils import extract_names_from_reviews, make_all_staffs_point_zero
  16. from django.contrib.auth.mixins import LoginRequiredMixin
  17. from .utils import (
  18. get_google_review_report,
  19. get_facebook_report,
  20. get_yelp_review_report,
  21. get_this_month_analytics,
  22. get_review_count_by_month,
  23. date_str2datetime
  24. )
  25. from rest_framework.views import APIView
  26. from rest_framework.response import Response
  27. class RegistrationView(View):
  28. def get(self, request, *args, **kwargs):
  29. form = UserRegisterForm()
  30. return render(request, 'signup.html', {'form': form})
  31. def post(self, request, *args, **kwargs):
  32. form = UserRegisterForm(request.POST)
  33. if form.is_valid():
  34. email = form.cleaned_data.get('email')
  35. location = Location.objects.filter(recipient_email=email).first()
  36. if location:
  37. user = form.save()
  38. UserAccount.objects.create(user=user, location=location)
  39. messages.success(request, f'Your account has been created! You are now able to log in')
  40. return redirect('login')
  41. else:
  42. messages.warning(request, f'Sorry, We don\'t have any location with this email!')
  43. return render(request, 'signup.html', {'form': form})
  44. @method_decorator([login_required], name='dispatch')
  45. class LoginRedirectURL(View):
  46. def dispatch(self, request, *args, **kwargs):
  47. if not request.user.is_authenticated:
  48. return redirect('login')
  49. elif request.user.is_staff:
  50. return redirect('un-replied-review')
  51. else:
  52. return redirect('location-analytics')
  53. class LocationAnalytics(LoginRequiredMixin, View):
  54. def get(self, request, *args, **kwargs):
  55. # print(dir(request.user))
  56. user_location_id = request.user.useraccount.location_id
  57. google_report = get_google_review_report(user_location_id)
  58. facebook_report = get_facebook_report(user_location_id)
  59. yelp_report = get_yelp_review_report(user_location_id)
  60. context = {
  61. 'google_pos': google_report.get('positive'),
  62. 'google_pos_gr': google_report.get('positive_growth'),
  63. 'google_neg': google_report.get('negative'),
  64. 'google_neg_gr': google_report.get('negative_growth'),
  65. 'google_total': google_report.get('total'),
  66. 'google_total_growth': google_report.get('total_growth'),
  67. 'yelp_pos': yelp_report.get('positive'),
  68. 'yelp_pos_gr': yelp_report.get('positive_growth'),
  69. 'yelp_neg': yelp_report.get('negative'),
  70. 'yelp_neg_gr': yelp_report.get('negative_growth'),
  71. 'yelp_total': yelp_report.get('total'),
  72. 'yelp_total_growth': yelp_report.get('total_growth'),
  73. 'facebook_pos': facebook_report.get('positive'),
  74. 'facebook_pos_gr': facebook_report.get('positive_growth'),
  75. 'facebook_neg': facebook_report.get('negative'),
  76. 'facebook_neg_gr': facebook_report.get('negative_growth'),
  77. 'facebook_total': facebook_report.get('total'),
  78. 'facebook_total_growth': facebook_report.get('total_growth'),
  79. }
  80. return render(request, 'user-dashboard.html', context=context)
  81. class ChartDataThisMonth(APIView):
  82. def get(self, request, *args, **kwargs):
  83. location_id = request.GET['location_id']
  84. res = get_this_month_analytics(location_id)
  85. return Response(res)
  86. class ChartDataAllPlatform(APIView):
  87. def get(self, request, *args, **kwargs):
  88. location_id = request.GET['location_id']
  89. g_res = get_review_count_by_month(location_id, 'google')
  90. f_res = get_review_count_by_month(location_id, 'facebook')
  91. y_res = get_review_count_by_month(location_id, 'yelp')
  92. res = {
  93. 'google': g_res,
  94. 'facebook': f_res,
  95. 'yelp': y_res
  96. }
  97. return Response(res)
  98. class ReviewListLocationWise(View):
  99. def get(self, request, platform, *args, **kwargs):
  100. location_id = request.user.useraccount.location_id
  101. if platform == 'google':
  102. reviews = Review.objects.filter(location_id=location_id).order_by('-update_time')
  103. elif platform == 'facebook':
  104. reviews = FacebookReview.objects.filter(page__location_id=location_id).order_by('-create_time')
  105. elif platform == 'yelp':
  106. reviews = YelpReview.objects.filter(location__location_id=location_id).order_by('-date_posted')
  107. else:
  108. raise Http404()
  109. page = request.GET.get('page', 1)
  110. paginator = Paginator(reviews, 50)
  111. try:
  112. reviews = paginator.page(page)
  113. except PageNotAnInteger:
  114. reviews = paginator.page(1)
  115. except EmptyPage:
  116. reviews = paginator.page(paginator.num_pages)
  117. context = {'reviews': reviews, 'platform': platform}
  118. return render(request, 'review-list.html', context=context)
  119. class ReviewAnalyticsGraph(View):
  120. def get(self, requests, *args, **kwargs):
  121. return render(requests, 'location-wise-reviews.html')
  122. class StaffLeaderBoard(View):
  123. def get(self, request, *args, **kwargs):
  124. staffs = Staff.objects.filter(location=request.user.useraccount.location).order_by('-total_units')
  125. form = StaffRegistrationForm()
  126. date_form = StaffSheetDateForm()
  127. context = {
  128. 'staffs': staffs,
  129. 'date_form': date_form,
  130. 'form': form
  131. }
  132. return render(request, 'staff_list.html', context)
  133. def post(self, request, *args, **kwargs):
  134. form = StaffRegistrationForm(request.POST)
  135. if form.is_valid():
  136. name = form.cleaned_data.get('name')
  137. department = form.cleaned_data.get('department')
  138. nick_names = form.cleaned_data.get('nick_names')
  139. location_id = request.user.useraccount.location_id
  140. staff = Staff.objects.create(
  141. name=name,
  142. location_id=location_id,
  143. department=department,
  144. nick_names=nick_names
  145. )
  146. messages.success(request, f'A new staff {staff} has been created!')
  147. return redirect('location-analytics')
  148. class SyncStaffLeaderBoard(View):
  149. def post(self, request, *args, **kwargs):
  150. start_date = date_str2datetime(request.POST.get('start_date'))
  151. end_date = date_str2datetime(request.POST.get('end_date'))
  152. location_id = request.user.useraccount.location_id
  153. extract_names_from_reviews(
  154. start_date=start_date,
  155. end_date=end_date,
  156. location_id=location_id
  157. )
  158. return redirect('staff-leaderboard')