Private
Public Access
1
0
Files
rowsandall/rowers/middleware.py
Sander Roosendaal 83e14c1785 some stuff
2019-08-28 21:12:23 +02:00

156 lines
4.9 KiB
Python

from django.utils import timezone
from rowers.models import Workout, PowerTimeFitnessMetric, Rower, PaidPlan
import datetime
from rowers.utils import myqueue
import django_rq
queue = django_rq.get_queue('default')
queuelow = django_rq.get_queue('low')
from rowers.tasks import handle_updatefitnessmetric,handle_sendemail_expired
from rowers.mytypes import otwtypes
from django.contrib import messages
from django.http import HttpResponse
def getrower(user):
try:
r = Rower.objects.get(user=user)
except Rower.DoesNotExist:
r = Rower(user=user)
r.save()
return r
def do_update(user,mode='rower',days=42):
r = getrower(user)
startdate = timezone.now()-datetime.timedelta(days=days)
# test if not something already done
now_date = timezone.now().strftime('%Y-%m-%d')
ms = PowerTimeFitnessMetric.objects.filter(
user=user,
workoutmode=mode).order_by("-date")
if len(ms) == 0:
max_workout_id = 0
last_update_date = '1972-01-01'
else:
max_workout_id = max([m.last_workout for m in ms])
last_update_date = ms[0].date.strftime('%Y-%m-%d')
#last_update_date = max([m.date.strftime('%Y-%m-%d') for m in ms])
if mode == 'rower':
workouts = Workout.objects.filter(
user=r,
workouttype__in=['rower','dynamic','slides'],
startdatetime__gte=startdate)
else:
workouts = Workout.objects.filter(
user=r,
workouttype__in=otwtypes,
startdatetime__gte=startdate)
theids = [int(w.id) for w in workouts]
try:
max_id = max(theids)
except ValueError:
max_id = 0
if last_update_date < now_date and max_workout_id < max_id:
job = myqueue(queuelow,
handle_updatefitnessmetric,
user.id,mode,theids,
)
return 1
class PowerTimeFitnessMetricMiddleWare(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# Code to be executed before the view is called
if request.user.is_authenticated:
result = do_update(request.user,mode='rower')
result = do_update(request.user,mode='water')
response = self.get_response(request)
return response
from django.shortcuts import redirect
allowed_paths = [
'/rowers/me/delete',
'/',
'/logout',
'/logout/',
'/rowers/me/gdpr-optin/',
'/rowers/me/gdpr-optin-confirm/',
'/rowers/me/gdpr-optin',
'/rowers/me/gdpr-optin-confirm'
'/rowers/exportallworkouts/',
'/rowers/exportallworkouts',
]
class GDPRMiddleWare(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.user.is_authenticated and request.path not in allowed_paths:
r = getrower(request.user)
nexturl = request.path
if 'optin' in nexturl:
nexturl = '/rowers/list-workouts'
if not r.gdproptin:
return redirect(
'/rowers/me/gdpr-optin/?next=%s' % nexturl
)
response = self.get_response(request)
return response
class RowerPlanMiddleWare(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.user.is_authenticated and request.user.rower.rowerplan not in ['basic','freecoach']:
if request.user.rower.paymenttype == 'single':
if request.user.rower.planexpires < timezone.now().date():
messg = 'Your paid plan has expired. We have reset you to a free basic plan.'
messages.error(request,messg)
r = getrower(request.user)
r.rowerplan = 'basic'
r.paymenttype = 'single'
basicplans = PaidPlan.objects.filter(shortname='basic',price=0,
paymentprocessor='braintree')
r.paidplan = basicplans[0]
r.save()
# remove from Free Coach groups
for group in r.coachinggroups.all():
coach = rower.objects.get(mycoachgroup=group)
if coach.rowerplan == 'freecoach':
r.coachinggroups.remove(group)
# send email
job = myqueue(queue,
handle_sendemail_expired,
r.user.email,
r.user.first_name,
r.user.last_name,
str(r.planexpires))
response = self.get_response(request)
return response