analytics.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. from django.utils import timezone
  2. from django.db import connection
  3. from gauth.models import Location
  4. def get_weeks(_year, _week):
  5. if _week > 9:
  6. return [[w, _year] for w in range(_week, _week-10, -1)]
  7. else:
  8. this_year = [[w, _year] for w in range(_week, -1, -1)]
  9. this_year.extend([[_year-1, w] for w in range(52, 52-(10-len(this_year)), -1)])
  10. return this_year
  11. def weekly_positive_review_count():
  12. sql = f'''
  13. select
  14. week(create_time) as week,
  15. year(create_time) as year,
  16. location_id,
  17. count(*) as rev_count
  18. from review_review
  19. where
  20. create_time >= (curdate() - interval 10 week) and
  21. star_rating > 3
  22. group by week(create_time), location_id
  23. ORDER BY week DESC;
  24. '''
  25. now = timezone.now()
  26. location_dict = dict(Location.objects.values_list('location_id', 'care_name'))
  27. with connection.cursor() as cursor:
  28. cursor.execute(sql)
  29. rows = cursor.fetchall()
  30. row_dict = {(row[0], row[1], row[2]): row[3] for row in rows}
  31. # Get all week names for graph label
  32. res = list()
  33. for w in get_weeks(now.year, now.isocalendar()[1]):
  34. weeks_res = []
  35. for loc in location_dict.keys():
  36. weeks_res.append(row_dict.get(tuple(w+[loc]), 0))
  37. # res[w[0]] = weeks_res
  38. res.append(weeks_res)
  39. return res, location_dict.values()
  40. def weekly_negative_review_count():
  41. sql = f'''
  42. select
  43. week(create_time) as week,
  44. year(create_time) as year,
  45. location_id,
  46. count(*) as rev_count
  47. from review_review
  48. where
  49. create_time >= (curdate() - interval 10 week) and
  50. star_rating <= 3
  51. group by week(create_time), location_id
  52. ORDER BY week DESC;
  53. '''
  54. now = timezone.now()
  55. location_dict = dict(Location.objects.values_list('location_id', 'care_name'))
  56. with connection.cursor() as cursor:
  57. cursor.execute(sql)
  58. rows = cursor.fetchall()
  59. row_dict = {(row[0], row[1], row[2]): row[3] for row in rows}
  60. # Get all week names for graph label
  61. res = list()
  62. for w in get_weeks(now.year, now.isocalendar()[1]):
  63. weeks_res = []
  64. for loc in location_dict.keys():
  65. weeks_res.append(row_dict.get(tuple(w+[loc]), 0))
  66. # res[w[0]] = weeks_res
  67. res.append(weeks_res)
  68. return res
  69. def weekly_facebook_positive_review_count():
  70. sql = f'''
  71. select
  72. week(create_time) as week,
  73. year(create_time) as year,
  74. page_id,
  75. count(*) as rev_count
  76. from facebook_app_facebookreview
  77. where
  78. create_time >= (curdate() - interval 10 week) and
  79. recommendation_type = true
  80. group by week(create_time), page_id
  81. ORDER BY week DESC;
  82. '''
  83. now = timezone.now()
  84. location_dict = dict(Location.objects.values_list('location_id', 'care_name'))
  85. with connection.cursor() as cursor:
  86. cursor.execute(sql)
  87. rows = cursor.fetchall()
  88. row_dict = {(row[0], row[1], row[2]): row[3] for row in rows}
  89. # Get all week names for graph label
  90. res = list()
  91. for w in get_weeks(now.year, now.isocalendar()[1]):
  92. weeks_res = []
  93. for loc in location_dict.keys():
  94. weeks_res.append(row_dict.get(tuple(w+[loc]), 0))
  95. # res[w[0]] = weeks_res
  96. res.append(weeks_res)
  97. return res, location_dict.values()
  98. def weekly_negative_review_count():
  99. sql = f'''
  100. select
  101. week(create_time) as week,
  102. year(create_time) as year,
  103. location_id,
  104. count(*) as rev_count
  105. from review_review
  106. where
  107. create_time >= (curdate() - interval 10 week) and
  108. star_rating <= 3
  109. group by week(create_time), location_id
  110. ORDER BY week DESC;
  111. '''
  112. now = timezone.now()
  113. location_dict = dict(Location.objects.values_list('location_id', 'care_name'))
  114. with connection.cursor() as cursor:
  115. cursor.execute(sql)
  116. rows = cursor.fetchall()
  117. row_dict = {(row[0], row[1], row[2]): row[3] for row in rows}
  118. # Get all week names for graph label
  119. res = list()
  120. for w in get_weeks(now.year, now.isocalendar()[1]):
  121. weeks_res = []
  122. for loc in location_dict.keys():
  123. weeks_res.append(row_dict.get(tuple(w+[loc]), 0))
  124. # res[w[0]] = weeks_res
  125. res.append(weeks_res)
  126. return res