from django.http import Http404 from django.shortcuts import render, redirect from django.utils.decorators import method_decorator from django.contrib.auth.decorators import login_required from django.views.generic import View from django.contrib import messages from .forms import UserRegisterForm, StaffRegistrationForm, StaffSheetDateForm from .models import UserAccount from gauth.models import Location from review.models import Review from facebook_app.models import FacebookReview from yelp.models import YelpReview from name_extractor.models import Staff from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.shortcuts import get_object_or_404 from rest_framework import status from name_extractor.utils import extract_names_from_reviews, make_all_staffs_point_zero from django.contrib.auth.mixins import LoginRequiredMixin from .utils import ( get_google_review_report, get_facebook_report, get_this_month_analytics, get_review_count_by_month, date_str2datetime ) from rest_framework.views import APIView from rest_framework.response import Response class RegistrationView(View): def get(self, request, *args, **kwargs): form = UserRegisterForm() return render(request, 'signup.html', {'form': form}) def post(self, request, *args, **kwargs): form = UserRegisterForm(request.POST) if form.is_valid(): email = form.cleaned_data.get('email') location = Location.objects.filter(recipient_email=email).first() if location: user = form.save() UserAccount.objects.create(user=user, location=location) messages.success(request, f'Your account has been created! You are now able to log in') return redirect('login') else: messages.warning(request, f'Sorry, We don\'t have any location with this email!') return render(request, 'signup.html', {'form': form}) @method_decorator([login_required], name='dispatch') class LoginRedirectURL(View): def dispatch(self, request, *args, **kwargs): if not request.user.is_authenticated: return redirect('login') elif request.user.is_superuser: return redirect('un-replied-review') elif request.user.is_staff: return redirect('location-list') else: return redirect('location-analytics') class LocationAnalytics(LoginRequiredMixin, View): def get(self, request, *args, **kwargs): user_location_id = request.user.useraccount.location_id google_report = get_google_review_report(user_location_id) facebook_report = get_facebook_report(user_location_id) context = { 'google_this_month': google_report.get('this_month'), 'google_last_month': google_report.get('last_month'), 'facebook_this_month': facebook_report.get('this_month'), 'facebook_last_month': facebook_report.get('last_month'), } return render(request, 'user-dashboard.html', context=context) class ChartDataThisMonth(APIView): def get(self, request, *args, **kwargs): location_id = request.GET['location_id'] res = get_this_month_analytics(location_id) return Response(res) class ChartDataAllPlatform(APIView): def get(self, request, *args, **kwargs): location_id = request.GET['location_id'] if not location_id: return Response({'error': 'No location Found'}, status=status.HTTP_400_BAD_REQUEST) g_res = get_review_count_by_month(location_id, 'google') f_res = get_review_count_by_month(location_id, 'facebook') y_res = get_review_count_by_month(location_id, 'yelp') res = { 'google': g_res, 'facebook': f_res, 'yelp': y_res } return Response(res) class ReviewListLocationWise(View): def get(self, request, platform, *args, **kwargs): location_id = request.user.useraccount.location_id if platform == 'google': reviews = Review.objects.filter(location_id=location_id).order_by('-update_time') elif platform == 'facebook': reviews = FacebookReview.objects.filter(page__location_id=location_id).order_by('-create_time') elif platform == 'yelp': reviews = YelpReview.objects.filter(location__location_id=location_id).order_by('-date_posted') else: raise Http404() page = request.GET.get('page', 1) paginator = Paginator(reviews, 50) try: reviews = paginator.page(page) except PageNotAnInteger: reviews = paginator.page(1) except EmptyPage: reviews = paginator.page(paginator.num_pages) context = {'reviews': reviews, 'platform': platform} return render(request, 'review-list-man.html', context=context) class ReviewAnalyticsGraph(View): def get(self, requests, *args, **kwargs): return render(requests, 'location-wise-reviews.html') class StaffLeaderBoard(View): def get(self, request, *args, **kwargs): staffs = Staff.objects.filter(location=request.user.useraccount.location).order_by('-total_units') form = StaffRegistrationForm() date_form = StaffSheetDateForm() context = { 'staffs': staffs, 'date_form': date_form, 'form': form } return render(request, 'staff_list_man.html', context) def post(self, request, *args, **kwargs): form = StaffRegistrationForm(request.POST) if form.is_valid(): name = form.cleaned_data.get('name') department = form.cleaned_data.get('department') nick_names = form.cleaned_data.get('nick_names') location_id = request.user.useraccount.location_id staff = Staff.objects.create( name=name, location_id=location_id, department=department, nick_names=nick_names ) messages.success(request, f'A new staff {staff} has been created!') return redirect('location-analytics') class SyncStaffLeaderBoard(View): def post(self, request, *args, **kwargs): start_date = date_str2datetime(request.POST.get('start_date')) end_date = date_str2datetime(request.POST.get('end_date')) location_id = request.user.useraccount.location_id extract_names_from_reviews( start_date=start_date, end_date=end_date, location_id=location_id ) return redirect('staff-leaderboard') class StaffDelete(View): def get(self, request, staff_id, *args, **kwargs): staff = get_object_or_404(Staff, id=staff_id) staff.delete() return redirect('staff-leaderboard')