background_job.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import random
  2. from time import sleep
  3. from django.utils import timezone
  4. from gauth.models import Location, LocationManager
  5. from analytics.background_job import send_email
  6. from .models import Review, CustomReply, Reply
  7. from nlu_job.nlu_utils import is_a_name
  8. from review.review_utils import reply_review
  9. from review.review_utils import get_bad_reviews, fetch_batch_of_reviews
  10. from nameparser import HumanName
  11. def un_replied_reviews_with_no_comment():
  12. now = timezone.now()
  13. date = now - timezone.timedelta(days=30)
  14. reviews = Review.objects.filter(comment=None, reply=None, star_rating=5, update_time__gte=date)\
  15. .order_by('update_time')
  16. return reviews
  17. def make_parsable_name(name):
  18. name = HumanName(name)
  19. if name.first == '':
  20. if name.title:
  21. parsable_name = ' ' + name.title + ' ' + name.last
  22. else:
  23. parsable_name = ' ' + name.last
  24. else:
  25. parsable_name = ' ' + name.first.capitalize()
  26. return parsable_name
  27. def generate_reply(review):
  28. replies = CustomReply.objects.filter(reply_category='no_comment')
  29. reply = random.choice(replies)
  30. name = review.reviewer_name
  31. if is_a_name(name):
  32. parsable_name = make_parsable_name(name)
  33. else:
  34. parsable_name = ''
  35. replied_text = reply.reply %parsable_name
  36. return replied_text
  37. def reply_uncommented_reviews():
  38. reviews = un_replied_reviews_with_no_comment()
  39. # TODO: reply reviews in background
  40. for review in reviews:
  41. replied_text = generate_reply(review)
  42. response = reply_review(review=review, replied_text=replied_text)
  43. if response.status_code == 200:
  44. review_reply = Reply(replied_text=replied_text, create_time=timezone.now())
  45. review_reply.save()
  46. review.reply = review_reply
  47. review.save()
  48. sleep(60*random.randint(2, 5))
  49. def send_email_bad_reviews():
  50. locations = Location.objects.all()
  51. for location in locations:
  52. reviews = get_bad_reviews(location.location_id, hours=1)
  53. total_reviews = reviews.count()
  54. if total_reviews > 0:
  55. to = list(LocationManager.objects.filter(location_id=location.location_id).values_list('email', flat=True))
  56. subject = f"A negative Google review has been post in {location.care_name}."
  57. message = '<p>Hi there, </p><p>'
  58. if total_reviews > 1:
  59. tt = f'{total_reviews} negative Google reviews have'
  60. else:
  61. tt = 'A negative Google review has '
  62. message += tt + f'been posted in {location.care_name}.</p>'
  63. for r in reviews:
  64. link = f'<p>Link: {r.location.review_site_url}</p>'
  65. name = f'<p><b>Reviewer Name:</b> {r.reviewer_name}</p>'
  66. rating = f'<p style="color: red"><b>Rating:</b> {str(r.star_rating)} star rating.</p>'
  67. comment = f'<p><b>Comment: </b>{r.comment if r.comment else "No comment"}</p>'
  68. message += name + rating + comment + link
  69. message += '<p>Regards,</p><p>SignatureCare Review Team.</p>'
  70. send_email(subject=subject, message_body=message, to_list=to)
  71. def background_task_every_hour():
  72. fetch_batch_of_reviews()
  73. send_email_bad_reviews()
  74. sleep(60 * random.randint(2, 5))
  75. reply_uncommented_reviews()