from django.shortcuts import render from django.shortcuts import redirect from django.views.generic import View from django.contrib import messages from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin from django.utils import timezone from nlu_job.nlu_utils import model_inference, analyze_model_inference, clean_text from .models import FacebookReview, FacebookReviewReply from .forms import ReplyForm from review.models import CustomReply from .review_utils import reply2facebook_review from nlu_job.nlu_utils import filter_with_last_ten_reviews class FacebookReviews(LoginRequiredMixin, PermissionRequiredMixin, View): permission_required = 'is_admin' def post(self, request, *args, **kwargs): form = ReplyForm(self.request.POST) if form.is_valid(): replied_text = form.cleaned_data.get('reply') review_id = self.request.POST['review_id'] print('review-id', review_id) status_code = reply2facebook_review( review_id=review_id, reply=replied_text ) if status_code == 201: FacebookReviewReply.objects.create( review_id=review_id, create_time=timezone.now(), replied_text=replied_text ) messages.success(request, f'Your reply has been posted!') elif status_code == 404: FacebookReviewReply.objects.create( review_id=review_id, create_time=timezone.now(), replied_text=replied_text ) messages.warning(request, f'User might delete this reply.!') else: messages.error(request, 'Something going wrong please notify the developers.') return redirect('facebook-reviews') def get(self, request, *args, **kwargs): now = timezone.now() form = ReplyForm() date = now - timezone.timedelta(days=7) reviews = FacebookReview.objects.filter( facebookreviewreply=None, create_time__gte=date ).order_by('create_time') page = request.GET.get('page', 1) paginator = Paginator(reviews, 10) try: reviews = paginator.page(page) except PageNotAnInteger: reviews = paginator.page(1) except EmptyPage: reviews = paginator.page(paginator.num_pages) context = {'reviews': reviews, 'form': form} return render(request, 'facebook-reviews.html', context=context) class FacebookReviewPrediction(LoginRequiredMixin, PermissionRequiredMixin, View): permission_required = 'is_admin' def get(self, request, id, *args, **kwargs): review = FacebookReview.objects.get(pk=id) review_text = clean_text(review.review_text) res = model_inference(review_text) intents = analyze_model_inference(res) replies = {} for intent in intents.keys(): r = CustomReply.objects.filter(reply_category=intent) filtered_replies = filter_with_last_ten_reviews(review.page.location_id, r) replies[intent] = filtered_replies now = timezone.now() form = ReplyForm() date = now - timezone.timedelta(days=7) reviews = FacebookReview.objects.filter( facebookreviewreply=None, create_time__gte=date ).order_by('create_time') page = request.GET.get('page', 1) paginator = Paginator(reviews, 10) try: reviews = paginator.page(page) except PageNotAnInteger: reviews = paginator.page(1) except EmptyPage: reviews = paginator.page(paginator.num_pages) context = { 'reviews': reviews, 'form': form, 'intents': intents, 'replies': replies, } return render(request, 'facebook-reviews.html', context=context)