2020-12-27 17:49:54 +00:00
|
|
|
from django import template
|
|
|
|
from django.utils import timezone
|
|
|
|
|
|
|
|
from collections import Counter
|
|
|
|
|
|
|
|
register = template.Library()
|
|
|
|
|
|
|
|
@register.simple_tag(takes_context=True)
|
|
|
|
def total_moods(context):
|
|
|
|
return len(context["user"].status_set.all())
|
|
|
|
|
|
|
|
@register.simple_tag(takes_context=True)
|
|
|
|
def current_streak(context):
|
|
|
|
status_list = context["user"].status_set.all().order_by("-timestamp")
|
|
|
|
timestamp = None
|
|
|
|
counter = 0
|
|
|
|
|
|
|
|
for status in status_list:
|
|
|
|
if not timestamp:
|
|
|
|
if not (status.timestamp.date() == timezone.now().date() or status.timestamp.date() == (timezone.now() - timezone.timedelta(days=1)).date()):
|
|
|
|
return counter
|
|
|
|
timestamp = status.timestamp
|
|
|
|
counter += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
if status.timestamp.date() == timestamp.date():
|
|
|
|
continue
|
|
|
|
|
|
|
|
if status.timestamp.date() == timestamp.date() - timezone.timedelta(days=1):
|
|
|
|
timestamp = status.timestamp
|
|
|
|
counter += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
return counter
|
|
|
|
|
|
|
|
@register.simple_tag(takes_context=True)
|
|
|
|
def closest_mood(context, value):
|
|
|
|
mood_list = context["user"].mood_set.all()
|
|
|
|
|
|
|
|
found = None
|
|
|
|
|
|
|
|
for mood in mood_list:
|
|
|
|
if (not found) or (abs(mood.value - value) < abs(found.value - value)):
|
|
|
|
found = mood
|
|
|
|
|
|
|
|
return found
|
|
|
|
|
|
|
|
@register.simple_tag(takes_context=True)
|
|
|
|
def average_mood(context, start, end=None):
|
|
|
|
status_list = context["user"].status_set.filter(timestamp__gte=start.date(), timestamp__lte=(end.date() if end else start.date()))
|
|
|
|
moods = list()
|
|
|
|
|
|
|
|
for status in status_list:
|
|
|
|
moods.append(status.mood.value)
|
|
|
|
|
2020-12-30 11:07:40 +00:00
|
|
|
try:
|
|
|
|
average = sum(moods) / len(moods)
|
|
|
|
except ZeroDivisionError:
|
|
|
|
average = None
|
2020-12-27 17:49:54 +00:00
|
|
|
|
|
|
|
return average
|
|
|
|
|
|
|
|
@register.simple_tag(takes_context=True)
|
|
|
|
def average_mood_weekly(context):
|
|
|
|
now = timezone.now()
|
|
|
|
start = now - timezone.timedelta(days=7)
|
|
|
|
|
|
|
|
return average_mood(context, start, now)
|
|
|
|
|
|
|
|
@register.simple_tag(takes_context=True)
|
|
|
|
def most_common_activity(context, start, end=None):
|
|
|
|
status_list = context["user"].status_set.filter(timestamp__gte=start.date(), timestamp__lte=(end.date() if end else start.date()))
|
|
|
|
activities = list()
|
|
|
|
|
|
|
|
for status in status_list:
|
|
|
|
for activity in status.statusactivity_set.all():
|
|
|
|
activities.append(activity.activity)
|
|
|
|
|
|
|
|
most_common = Counter(activities).most_common(1)[0]
|
|
|
|
|
|
|
|
return most_common[0], most_common[1]
|
|
|
|
|
|
|
|
@register.simple_tag(takes_context=True)
|
|
|
|
def most_common_activity_weekly(context):
|
|
|
|
now = timezone.now()
|
|
|
|
start = now - timezone.timedelta(days=7)
|
|
|
|
|
|
|
|
return most_common_activity(context, start, now)
|