background_job.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import random
  2. from time import sleep
  3. from django.utils import timezone
  4. from gauth.models import Location
  5. from analytics.send_email 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 populate_reviews, get_bad_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=6)
  53. total_reviews = reviews.count()
  54. if total_reviews > 0:
  55. to = [location.recipient_email if location.recipient_email else 'bt@bytetrek.com.bd']
  56. subject = f"A bad review has been post in {location.care_name}."
  57. message =f'''
  58. <img src="https://ercare24.com/wp-content/uploads/2016/07/signature-care-resized-e1462918690585.png" alt="Avatar" class="image" width=20% >
  59. <h1>Bad Review has been posted.</h1>
  60. <p>Hi there, </p>
  61. <p>There is {total_reviews} bad reviews has been posted in {location.care_name}.
  62. Please, response them ASAP.</p>
  63. <h4>Follow those Links to respond: </h4>
  64. '''
  65. for r in reviews:
  66. link = r.location.review_site_url + '?reviewId='+r.review_id
  67. text = str(r.star_rating) + ' star review'
  68. message += f'<a href="{link}">{text}</a><br>'
  69. message += '<p>Regards,</p><p>Byte Trek Limited</p>'
  70. send_email(to_list=to, subject=subject, message=message)
  71. def background_task_6_hours_interval():
  72. populate_reviews()
  73. send_email_bad_reviews()
  74. sleep(60 * random.randint(2, 5))
  75. reply_uncommented_reviews()