background_job.py 3.3 KB

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