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, fetch_batch_of_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: to = settings.ADMIN_MAINTAINER_EMAILS reviews = get_bad_reviews(location.location_id, hours=1) total_reviews = reviews.count() if total_reviews > 0: # Add location mainteiner email if it has an email to.append(location.recipient_email) if location.recipient_email else None subject = f"A negative Google review has been post in {location.care_name}." message = f'''
Hi there,
''' if total_reviews > 1: tt = f'{total_reviews} negative Google reviews have' else: tt = f'A negative Google review has ' message += tt + f'been posted in {location.care_name}.
' for r in reviews: link = f'Link: {r.location.review_site_url}
' name = f'Reviewer Name: {r.reviewer_name}
' rating = f'Rating: {str(r.star_rating)} star rating.
' comment = f'Comment: {r.comment if r.comment else "No comment"}
' message += name + rating + comment + link message += 'Regards,
Byte Trek Ltd.
' send_email(to_list=to, subject=subject, message=message) if location.recipient_email in to: to.remove(location.recipient_email) def background_task_every_hour(): fetch_batch_of_reviews() send_email_bad_reviews() sleep(60 * random.randint(2, 5)) reply_uncommented_reviews()