background_job.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import random
  2. from time import sleep
  3. from django.utils import timezone
  4. from gauth.models import Location
  5. from .models import Review, CustomReply, Reply
  6. from nlu_job.nlu_utils import is_a_name
  7. from review.review_utils import reply_review
  8. from review.review_utils import populate_reviews, get_bad_reviews
  9. from analytics.send_email import send_email
  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 = "A bad review has been post."
  57. message = f"hi there is {total_reviews} bad review in {location.care_name} please response to reviewer ASAP"
  58. send_email(to_list=to, subject=subject, message=message)
  59. def background_task():
  60. populate_reviews()
  61. sleep(60 * random.randint(2, 5))
  62. reply_uncommented_reviews()