import random
from time import sleep
from django.utils import timezone
from gauth.models import Location
from django.conf import settings
from analytics.send_email import send_email
from .models import Review, CustomReply, Reply
from nlu_job.nlu_utils import is_a_name
from review.review_utils import reply_review
from review.review_utils import populate_reviews, get_bad_reviews
from nameparser import HumanName
def un_replied_reviews_with_no_comment():
now = timezone.now()
date = now - timezone.timedelta(days=30)
reviews = Review.objects.filter(comment=None, reply=None, star_rating=5, update_time__gte=date)\
.order_by('update_time')
return reviews
def make_parsable_name(name):
name = HumanName(name)
if name.first == '':
if name.title:
parsable_name = ' ' + name.title + ' ' + name.last
else:
parsable_name = ' ' + name.last
else:
parsable_name = ' ' + name.first.capitalize()
return parsable_name
def generate_reply(review):
replies = CustomReply.objects.filter(reply_category='no_comment')
reply = random.choice(replies)
name = review.reviewer_name
if is_a_name(name):
parsable_name = make_parsable_name(name)
else:
parsable_name = ''
replied_text = reply.reply %parsable_name
return replied_text
def reply_uncommented_reviews():
reviews = un_replied_reviews_with_no_comment()
# TODO: reply reviews in background
for review in reviews:
replied_text = generate_reply(review)
response = reply_review(review=review, replied_text=replied_text)
if response.status_code == 200:
review_reply = Reply(replied_text=replied_text, create_time=timezone.now())
review_reply.save()
review.reply = review_reply
review.save()
sleep(60*random.randint(2, 5))
def send_email_bad_reviews():
locations = Location.objects.all()
for location in locations:
reviews = get_bad_reviews(location.location_id, hours=6)
total_reviews = reviews.count()
if total_reviews > 0:
to = settings.ADMIN_MAINTEINER_EMAILS
# Add location mainteiner email if it has an email
to.append(location.recipient_email) if location.recipient_email else None
subject = f"A bad review has been post in {location.care_name}."
message =f'''
Hi there,
There is {total_reviews} bad reviews has been posted in {location.care_name}. Please, response them ASAP.
Regards,
Byte Trek Limited
' send_email(to_list=to, subject=subject, message=message) def background_task_6_hours_interval(): populate_reviews() send_email_bad_reviews() sleep(60 * random.randint(2, 5)) reply_uncommented_reviews()