views.py 6.3 KB

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