from django.http import Http404 from django.shortcuts import render, redirect 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 name_extractor.utils import extract_names_from_reviews from django.contrib.auth.mixins import LoginRequiredMixin from .utils import ( get_google_review_report, get_facebook_report, get_yelp_review_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}) class LocationAnalytics(LoginRequiredMixin, View): def get(self, request, *args, **kwargs): # print(dir(request.user)) 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) yelp_report = get_yelp_review_report(user_location_id) context = { 'google_pos': google_report.get('positive'), 'google_pos_gr': google_report.get('positive_growth'), 'google_neg': google_report.get('negative'), 'google_neg_gr': google_report.get('negative_growth'), 'google_total': google_report.get('total'), 'google_total_growth': google_report.get('total_growth'), 'yelp_pos': yelp_report.get('positive'), 'yelp_pos_gr': yelp_report.get('positive_growth'), 'yelp_neg': yelp_report.get('negative'), 'yelp_neg_gr': yelp_report.get('negative_growth'), 'yelp_total': yelp_report.get('total'), 'yelp_total_growth': yelp_report.get('total_growth'), 'facebook_pos': facebook_report.get('positive'), 'facebook_pos_gr': facebook_report.get('positive_growth'), 'facebook_neg': facebook_report.get('negative'), 'facebook_neg_gr': facebook_report.get('negative_growth'), 'facebook_total': facebook_report.get('total'), 'facebook_total_growth': facebook_report.get('total_growth'), } 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'] 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.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.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 ExportStaffLeaderBoard(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')