diff --git a/rowers/c2stuff.py b/rowers/c2stuff.py index e5646ac9..5f5979bc 100644 --- a/rowers/c2stuff.py +++ b/rowers/c2stuff.py @@ -7,7 +7,7 @@ from rowers.imports import * import datetime from requests import Request, Session -from rowers.types import otwtypes +from rowers.mytypes import otwtypes from iso8601 import ParseError from rowsandall_app.settings import ( diff --git a/rowers/dataprep.py b/rowers/dataprep.py index a23f3eda..70537eeb 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -74,7 +74,7 @@ queuelow = django_rq.get_queue('low') queuehigh = django_rq.get_queue('default') from rowsandall_app.settings import SITE_URL -from rowers.types import otwtypes +from rowers.mytypes import otwtypes from rowers.database import * diff --git a/rowers/decorators.py b/rowers/decorators.py new file mode 100644 index 00000000..3d356dd2 --- /dev/null +++ b/rowers/decorators.py @@ -0,0 +1,46 @@ +from django.contrib.auth.decorators import login_required,user_passes_test + +from django.http import HttpResponseRedirect +from django.core.exceptions import PermissionDenied +from django.utils.decorators import available_attrs +from django.contrib import messages + +try: + from functools import wraps +except ImportError: + from django.utils.functional import wraps + + +REDIRECT_FIELD_NAME = None + +default_message = "Please log in, in order to see the requested page." + +def user_passes_test(test_func, message=default_message,login_url=None,redirect_field_name=None): + """ + Decorator for views that checks that the user passes the given test, + setting a message in case of no success. The test should be a callable + that takes the user object and returns True if the user passes. + """ + def decorator(view_func): + @wraps(view_func, assigned=available_attrs(view_func)) + def _wrapped_view(request, *args, **kwargs): + if not test_func(request.user): + messages.error(request, message) + return HttpResponseRedirect(login_url) + return view_func(request, *args, **kwargs) + return _wrapped_view + return decorator + +def login_required_message(function=None, message=default_message): + """ + Decorator for views that checks that the user is logged in, redirecting + to the log-in page if necessary. + """ + actual_decorator = user_passes_test( + lambda u: u.is_authenticated(), + message=message, + ) + if function: + return actual_decorator(function) + return actual_decorator + diff --git a/rowers/forms.py b/rowers/forms.py index 834494fb..d9d6e39b 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -9,7 +9,7 @@ from django.forms.extras.widgets import SelectDateWidget from django.utils import timezone,translation from django.forms import ModelForm, Select import dataprep -import types +import mytypes import datetime from django.forms import formset_factory from utils import landingpages @@ -83,7 +83,7 @@ class DocumentsForm(forms.Form): choices=Workout.workouttypes) boattype = forms.ChoiceField(required=True, - choices=types.boattypes, + choices=mytypes.boattypes, label = "Boat Type") @@ -589,8 +589,8 @@ class IntervalUpdateForm(forms.Form): self.fields['type_%s' % i].widget.attrs['style'] = 'width:156px; height: 22px;' self.fields['intervald_%s' % i].widget = forms.TimeInput(format='%H:%M:%S.%f') -boattypes = types.boattypes -workouttypes = types.workouttypes +boattypes = mytypes.boattypes +workouttypes = mytypes.workouttypes ww = list(workouttypes) ww.append(tuple(('all','All'))) workouttypes = tuple(ww) @@ -616,7 +616,7 @@ class TrendFlexModalForm(forms.Form): initial='all') waterboattype = forms.MultipleChoiceField(choices=boattypes, label='Water Boat Type', - initial = types.waterboattype) + initial = mytypes.waterboattype) rankingonly = forms.BooleanField(initial=False, label='Only Ranking Pieces', required=False) @@ -631,14 +631,14 @@ class StatsOptionsForm(forms.Form): waterboattype = forms.MultipleChoiceField(choices=boattypes, label='Water Boat Type', widget=forms.CheckboxSelectMultiple(), - initial = types.waterboattype) + initial = mytypes.waterboattype) def __init__(self, *args, **kwargs): super(StatsOptionsForm, self).__init__(*args,**kwargs) - for type in types.checktypes: + for type in mytypes.checktypes: self.fields[type] = forms.BooleanField(initial=True,required=False) @@ -807,8 +807,8 @@ class WorkoutSessionSelectForm(forms.Form): class RaceResultFilterForm(forms.Form): - boatclasses = (type for type in types.workouttypes if type[0] in types.otwtypes) - boatclassinitial = [t for t in types.otwtypes] + boatclasses = (type for type in mytypes.workouttypes if type[0] in mytypes.otwtypes) + boatclassinitial = [t for t in mytypes.otwtypes] sexchoices = ( ('female','Female'), ('male','Male'), @@ -836,7 +836,7 @@ class RaceResultFilterForm(forms.Form): boattype = forms.MultipleChoiceField( choices=boattypes, label='Boat Type', - initial=types.waterboattype, + initial=mytypes.waterboattype, widget=forms.CheckboxSelectMultiple()) age_min = forms.IntegerField(label='Min Age',initial=16) diff --git a/rowers/imports.py b/rowers/imports.py index c1e150cc..70f765c0 100644 --- a/rowers/imports.py +++ b/rowers/imports.py @@ -38,7 +38,7 @@ from django.contrib.auth.decorators import login_required from rowingdata import rowingdata, make_cumvalues import pandas as pd from rowers.models import Rower,Workout,checkworkoutuser -from rowers import types +from rowers import mytypes from rowsandall_app.settings import ( C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET, STRAVA_CLIENT_ID, STRAVA_REDIRECT_URI, diff --git a/rowers/middleware.py b/rowers/middleware.py index 495ad436..9a44b7fe 100644 --- a/rowers/middleware.py +++ b/rowers/middleware.py @@ -5,7 +5,7 @@ from utils import myqueue import django_rq queue = django_rq.get_queue('default') from rowers.tasks import handle_updatefitnessmetric -from rowers.types import otwtypes +from rowers.mytypes import otwtypes def getrower(user): try: diff --git a/rowers/models.py b/rowers/models.py index ffdb668e..4d968e96 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -34,7 +34,7 @@ from rowers.rows import validate_file_extension from collections import OrderedDict from timezonefinder import TimezoneFinder -import types +import mytypes from matplotlib import path from rowsandall_app.settings import ( @@ -1990,13 +1990,13 @@ class PlannedSessionFormSmall(ModelForm): 'manager': forms.HiddenInput(), } -boattypes = types.boattypes +boattypes = mytypes.boattypes # Workout class Workout(models.Model): - workouttypes = types.workouttypes - workoutsources = types.workoutsources - privacychoices = types.privacychoices + workouttypes = mytypes.workouttypes + workoutsources = mytypes.workoutsources + privacychoices = mytypes.privacychoices user = models.ForeignKey(Rower) team = models.ManyToManyField(Team,blank=True) @@ -2121,7 +2121,7 @@ def auto_delete_strokedata_on_delete(sender, instance, **kwargs): # Virtual Race results (for keeping results when workouts are deleted) class VirtualRaceResult(models.Model): - boatclasses = (type for type in types.workouttypes if type[0] in types.otwtypes) + boatclasses = (type for type in mytypes.workouttypes if type[0] in mytypes.otwtypes) userid = models.IntegerField(default=0) teamname = models.CharField(max_length=80,verbose_name = 'Team Name', blank=True,null=True) diff --git a/rowers/types.py b/rowers/mytypes.py similarity index 100% rename from rowers/types.py rename to rowers/mytypes.py diff --git a/rowers/templates/.#menuscript.html b/rowers/templates/.#menuscript.html deleted file mode 100644 index 9a681b55..00000000 --- a/rowers/templates/.#menuscript.html +++ /dev/null @@ -1 +0,0 @@ -E408191@CZ27LT9RCGN72.14924:1540272798 \ No newline at end of file diff --git a/rowers/templates/analysis.html b/rowers/templates/analysis.html index 121e38ef..8fd8ef83 100644 --- a/rowers/templates/analysis.html +++ b/rowers/templates/analysis.html @@ -37,11 +37,7 @@