views.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import openpyxl
  2. from gauth.models import Location, LocationManager
  3. from django.http import Http404
  4. from django.shortcuts import render, redirect
  5. from django.views.generic import View
  6. from django.contrib import messages
  7. from user.forms import StaffRegistrationForm, StaffSheetDateForm, GoogleReviewsFilter, FacebookReviewsFilter
  8. from review.models import Review
  9. from facebook_app.models import FacebookReview
  10. from name_extractor.models import Staff
  11. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  12. from django.shortcuts import get_object_or_404
  13. from name_extractor.utils import extract_names_from_reviews, make_all_staffs_point_zero
  14. from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
  15. from user.utils import (
  16. get_google_review_report,
  17. get_facebook_report,
  18. date_str2datetime
  19. )
  20. from .forms import ImportStaffSpreadSheet
  21. LOC_SYN = {
  22. 'cypress-1960': 'cypress',
  23. 'collegestation': 'college station'
  24. }
  25. class LocationListView(View, PermissionRequiredMixin):
  26. permission_required = 'is_staff'
  27. def post(self, request, *args, **kwargs):
  28. form = ImportStaffSpreadSheet(request.POST, request.FILES)
  29. if form.is_valid():
  30. staff_file = form.cleaned_data.get('staff_file')
  31. wb = openpyxl.load_workbook(staff_file)
  32. worksheet = wb.worksheets[0]
  33. rows = worksheet.values
  34. col_names = next(rows)
  35. try:
  36. name_idx, loc_idx, dept_idx = col_names.index('Name'), col_names.index('Location'), col_names.index('Job Title')
  37. except ValueError:
  38. messages.warning(request, "Columns in missing. Check columns ['Name', 'Location', 'Job Title'] again.")
  39. return redirect('location-list')
  40. # Clear all previously registered staffs
  41. staffs = Staff.objects.all()
  42. staffs.delete()
  43. for row in rows:
  44. try:
  45. name, loc, dept = row[name_idx], row[loc_idx], row[dept_idx]
  46. except IndexError:
  47. pass
  48. if loc.lower() in ['alllocations', '#n/a']:
  49. continue
  50. if loc.lower() in LOC_SYN.keys():
  51. loc = LOC_SYN[loc.lower()]
  52. location = Location.objects.filter(care_name__icontains=loc).first()
  53. if location:
  54. Staff.objects.create(
  55. name=name,
  56. location=location,
  57. department=dept
  58. )
  59. messages.success(request, 'Staff file upload successfully.')
  60. return redirect('location-list')
  61. def get(self, request, *args, **kwargs):
  62. locations = Location.objects.all()
  63. form = ImportStaffSpreadSheet()
  64. context = {
  65. 'all_locations': locations,
  66. 'file_upload_form': form
  67. }
  68. return render(request, 'locations.html', context=context)
  69. class LocationAnalytics(LoginRequiredMixin, View):
  70. def get(self, request, location_id, *args, **kwargs):
  71. location = Location.objects.get(pk=location_id)
  72. google_report = get_google_review_report(location_id)
  73. facebook_report = get_facebook_report(location_id)
  74. context = {
  75. 'location': location,
  76. 'google_this_month_pos': google_report.get('this_month_pos'),
  77. 'google_last_month_pos': google_report.get('last_month_pos'),
  78. 'facebook_this_month_pos': facebook_report.get('this_month_pos'),
  79. 'facebook_last_month_pos': facebook_report.get('last_month_pos'),
  80. 'google_this_month_neg': google_report.get('this_month_neg'),
  81. 'google_last_month_neg': google_report.get('last_month_neg'),
  82. 'facebook_this_month_neg': facebook_report.get('this_month_neg'),
  83. 'facebook_last_month_neg': facebook_report.get('last_month_neg')
  84. }
  85. return render(request, 'manager-dashboard.html', context=context)
  86. class ReviewListLocationWise(View):
  87. def get(self, request, platform, location_id, *args, **kwargs):
  88. location = Location.objects.get(pk=location_id)
  89. if platform == 'google':
  90. form = GoogleReviewsFilter()
  91. reviews = Review.objects.filter(location_id=location_id).order_by('-update_time')
  92. elif platform == 'facebook':
  93. form = FacebookReviewsFilter()
  94. reviews = FacebookReview.objects.filter(page__location_id=location_id).order_by('-create_time')
  95. else:
  96. raise Http404()
  97. page = request.GET.get('page', 1)
  98. paginator = Paginator(reviews, 50)
  99. try:
  100. reviews = paginator.page(page)
  101. except PageNotAnInteger:
  102. reviews = paginator.page(1)
  103. except EmptyPage:
  104. reviews = paginator.page(paginator.num_pages)
  105. context = {'reviews': reviews, 'platform': platform, 'location': location, 'form': form}
  106. return render(request, 'review-list-man.html', context=context)
  107. def post(self, request, platform, location_id, *args, **kwargs):
  108. location = Location.objects.get(pk=location_id)
  109. if platform == 'google':
  110. form = GoogleReviewsFilter(data=request.POST)
  111. start_date = date_str2datetime(request.POST.get('start_date'))
  112. end_date = date_str2datetime(request.POST.get('end_date'))
  113. star_rating = int(request.POST.get('star_ratings'))
  114. reviews = Review.objects.filter(location_id=location_id).order_by('-update_time')
  115. if start_date and end_date:
  116. if star_rating > 5:
  117. reviews = reviews.filter(create_time__range=(start_date, end_date))
  118. else:
  119. reviews = reviews.filter(create_time__range=(start_date, end_date), star_rating=star_rating)
  120. elif platform == 'facebook':
  121. form = FacebookReviewsFilter(request.POST)
  122. start_date = date_str2datetime(request.POST.get('start_date'))
  123. end_date = date_str2datetime(request.POST.get('end_date'))
  124. star_rating = int(request.POST.get('star_ratings'))
  125. reviews = FacebookReview.objects.filter(page__location_id=location_id).order_by('-create_time')
  126. if start_date and end_date:
  127. if star_rating > 5:
  128. reviews = reviews.filter(create_time__range=(start_date, end_date))
  129. else:
  130. reviews = reviews.filter(create_time__range=(start_date, end_date), recommendation_type=bool(star_rating))
  131. else:
  132. raise Http404()
  133. page = request.GET.get('page', 1)
  134. paginator = Paginator(reviews, 50)
  135. try:
  136. reviews = paginator.page(page)
  137. except PageNotAnInteger:
  138. reviews = paginator.page(1)
  139. except EmptyPage:
  140. reviews = paginator.page(paginator.num_pages)
  141. context = {'reviews': reviews, 'platform': platform, 'location': location, 'form': form}
  142. return render(request, 'review-list-man.html', context=context)
  143. class ReviewAnalyticsGraph(View):
  144. def get(self, request, location_id, *args, **kwargs):
  145. location = Location.objects.get(pk=location_id)
  146. return render(request, 'location-wise-reviews-man.html', context={'location': location})
  147. class StaffLeaderBoard(View):
  148. def get(self, request, location_id, *args, **kwargs):
  149. location = Location.objects.get(pk=location_id)
  150. staffs = Staff.objects.filter(location=location).order_by('-total_units')
  151. form = StaffRegistrationForm()
  152. date_form = StaffSheetDateForm()
  153. context = {
  154. 'location': location,
  155. 'staffs': staffs,
  156. 'date_form': date_form,
  157. 'form': form
  158. }
  159. return render(request, 'staff_list_man.html', context)
  160. def post(self, request, location_id, *args, **kwargs):
  161. form = StaffRegistrationForm(request.POST)
  162. if form.is_valid():
  163. name = form.cleaned_data.get('name')
  164. department = form.cleaned_data.get('department')
  165. nick_names = form.cleaned_data.get('nick_names')
  166. staff = Staff.objects.create(
  167. name=name,
  168. location_id=location_id,
  169. department=department,
  170. nick_names=nick_names
  171. )
  172. messages.success(request, f'A new staff {staff} has been created!')
  173. return redirect('staff-leaderboard-man', location_id=location_id)
  174. class SyncStaffLeaderBoard(View):
  175. def post(self, request, location_id, *args, **kwargs):
  176. start_date = date_str2datetime(request.POST.get('start_date'))
  177. end_date = date_str2datetime(request.POST.get('end_date'))
  178. extract_names_from_reviews(
  179. start_date=start_date,
  180. end_date=end_date,
  181. location_id=location_id
  182. )
  183. return redirect('staff-leaderboard-man', location_id=location_id)
  184. class StaffDelete(View):
  185. def get(self, request, staff_id, *args, **kwargs):
  186. staff = get_object_or_404(Staff, id=staff_id)
  187. staff.delete()
  188. return redirect('staff-leaderboard-man', location_id=staff.location_id)