123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- from django.utils import timezone
- from django.db.models import Count
- from review.models import Review
- from facebook_app.models import FacebookReview
- from yelp.models import YelpReview
- now = timezone.now()
- beginning_of_month = now.replace(day=1, hour=0, minute=0, second=0)
- beginning_of_last_month = now - timezone.timedelta(days=now.day+31)
- def get_google_review_report(location_id):
- pos = Review.objects.filter(
- location_id=location_id,
- create_time__range=(beginning_of_month, now),
- star_rating__gte=3
- ).count()
- neg = Review.objects.filter(
- location_id=location_id,
- create_time__range=(beginning_of_month, now),
- star_rating__lte=2
- ).count()
- pos_last_month = Review.objects.filter(
- location_id=location_id,
- create_time__range=(beginning_of_last_month, beginning_of_month),
- star_rating__gte=3
- ).count()
- neg_last_month = Review.objects.filter(
- location_id=location_id,
- create_time__range=(beginning_of_last_month, beginning_of_month),
- star_rating__lte=2
- ).count()
- pos_growth = 'inf' if pos_last_month == 0 else round(((((pos / now.day) * 30) - pos_last_month) / pos_last_month) * 100, 2)
- neg_growth = 'inf' if neg_last_month == 0 else round(((((neg / now.day) * 30) - neg_last_month) / neg_last_month) * 100, 2)
- total = pos + neg
- last_month_total = pos_last_month + neg_last_month
- total_growth = 'inf' if last_month_total == 0 else round(((((total / now.day) * 30) - last_month_total) / last_month_total) * 100, 2)
- return {
- 'positive': pos,
- 'positive_growth': pos_growth,
- 'negative': neg,
- 'negative_growth': neg_growth,
- 'total': total,
- 'total_growth': total_growth
- }
- def get_facebook_report(location_id):
- pos = FacebookReview.objects.filter(
- page__location_id=location_id,
- create_time__range=(beginning_of_month, now),
- recommendation_type=True
- ).count()
- neg = FacebookReview.objects.filter(
- page__location_id=location_id,
- create_time__range=(beginning_of_month, now),
- recommendation_type=False
- ).count()
- pos_last_month = FacebookReview.objects.filter(
- page__location_id=location_id,
- create_time__range=(beginning_of_last_month, beginning_of_month),
- recommendation_type=True
- ).count()
- neg_last_month = FacebookReview.objects.filter(
- page__location_id=location_id,
- create_time__range=(beginning_of_last_month, beginning_of_month),
- recommendation_type=False
- ).count()
- pos_growth = 'inf' if pos_last_month == 0 else round(((((pos / now.day) * 30) - pos_last_month) / pos_last_month) * 100, 2)
- neg_growth = 'inf' if neg_last_month == 0 else round(((((neg / now.day) * 30) - neg_last_month) / neg_last_month) * 100, 2)
- total = pos + neg
- last_month_total = pos_last_month + neg_last_month
- total_growth = 'inf' if last_month_total == 0 else round(((((total / now.day) * 30) - last_month_total) / last_month_total) * 100, 2)
- return {
- 'positive': pos,
- 'positive_growth': pos_growth,
- 'negative': neg,
- 'negative_growth': neg_growth,
- 'total': total,
- 'total_growth': total_growth
- }
- def get_yelp_review_report(location_id):
- pos = YelpReview.objects.filter(
- location__location_id=location_id,
- date_posted__range=(beginning_of_month, now),
- rating__gte=3
- ).count()
- neg = YelpReview.objects.filter(
- location__location_id=location_id,
- date_posted__range=(beginning_of_month, now),
- rating__lte=2
- ).count()
- pos_last_month = YelpReview.objects.filter(
- location__location_id=location_id,
- date_posted__range=(beginning_of_last_month, beginning_of_month),
- rating__gte=3
- ).count()
- neg_last_month = YelpReview.objects.filter(
- location__location_id=location_id,
- date_posted__range=(beginning_of_last_month, beginning_of_month),
- rating__lte=2
- ).count()
- pos_growth = 'inf' if pos_last_month == 0 else round(((((pos / now.day) * 30) - pos_last_month) / pos_last_month) * 100, 2)
- neg_growth = 'inf' if neg_last_month == 0 else round(((((neg / now.day) * 30) - neg_last_month) / neg_last_month) * 100, 2)
- total = pos + neg
- last_month_total = pos_last_month + neg_last_month
- total_growth = 'inf' if last_month_total == 0 else round(((((total / now.day) * 30) - last_month_total) / last_month_total) * 100, 2)
- return {
- 'positive': pos,
- 'positive_growth': pos_growth,
- 'negative': neg,
- 'negative_growth': neg_growth,
- 'total': total,
- 'total_growth': total_growth
- }
- def get_this_month_analytics(location_id):
- google_qs = Review.objects.filter(
- create_time__range=(beginning_of_month, now),
- location_id=location_id
- )\
- .values('create_time__day')\
- .annotate(total=Count('create_time__day'))
- google_qs_dict = {q['create_time__day']: q['total'] for q in google_qs}
- yelp_qs = YelpReview.objects.filter(
- location__location_id=location_id,
- date_posted__range=(beginning_of_month, now),
- )\
- .values('date_posted__day')\
- .annotate(total=Count('date_posted__day'))
- yelp_qs_dict = {q['date_posted__day']: q['total'] for q in yelp_qs}
- facebook_qs = FacebookReview.objects.filter(
- page__location_id=location_id,
- create_time__range=(beginning_of_month, now),
- )\
- .values('create_time__day')\
- .annotate(total=Count('create_time__day'))
- facebook_qs_dict = {q['create_time__day']: q['total'] for q in facebook_qs}
- label = []
- facebook = []
- yelp = []
- google = []
- for day in range(1, now.day+1):
- label.append(day)
- facebook.append(facebook_qs_dict.get(day, 0))
- yelp.append(yelp_qs_dict.get(day, 0))
- google.append(google_qs_dict.get(day, 0))
- return {
- 'label': label,
- 'google': google,
- 'facebook': facebook,
- 'yelp': yelp
- }
|