226 lines
7.5 KiB
Python
226 lines
7.5 KiB
Python
from django import forms
|
|
from rowers.models import Workout
|
|
from rowsandall_app.rows import validate_file_extension,must_be_csv
|
|
from django.contrib.auth.forms import UserCreationForm
|
|
from django.contrib.auth.models import User
|
|
from django.contrib.admin.widgets import AdminDateWidget
|
|
from django.forms.extras.widgets import SelectDateWidget
|
|
from django.utils import timezone,translation
|
|
|
|
import datetime
|
|
|
|
class LoginForm(forms.Form):
|
|
username = forms.CharField()
|
|
password = forms.CharField(widget=forms.PasswordInput())
|
|
|
|
class EmailForm(forms.Form):
|
|
firstname = forms.CharField(max_length=255)
|
|
lastname = forms.CharField(max_length=255)
|
|
email = forms.EmailField()
|
|
subject = forms.CharField(max_length=255)
|
|
botcheck = forms.CharField(max_length=5)
|
|
message = forms.CharField()
|
|
|
|
class CNsummaryForm(forms.Form):
|
|
file = forms.FileField(required=True,validators=[must_be_csv])
|
|
|
|
class SummaryStringForm(forms.Form):
|
|
intervalstring = forms.CharField(max_length=255,label='Workout Description')
|
|
|
|
class StrokeDataForm(forms.Form):
|
|
strokedata = forms.CharField(label='payload',
|
|
widget=forms.Textarea)
|
|
|
|
class DocumentsForm(forms.Form):
|
|
filetypechoices = (
|
|
('csv' , 'Painsled iOS CSV'),
|
|
('tcx' , 'TCX'),
|
|
('tcxnohr' , 'TCX No HR'),
|
|
('rp' , 'RowPro CSV'),
|
|
('speedcoach' , 'SpeedCoach GPS CSV'),
|
|
('speedcoach2' , 'SpeedCoach GPS 2 CSV'),
|
|
('ergdata' , 'ErgData CSV'),
|
|
('ergstick' , 'ErgStick CSV'),
|
|
('painsleddesktop' , 'Painsled Desktop CSV'),
|
|
('zip','Zipped file'),
|
|
)
|
|
title = forms.CharField(required=False)
|
|
file = forms.FileField(required=True,
|
|
validators=[validate_file_extension])
|
|
workouttype = forms.ChoiceField(required=True,
|
|
choices=Workout.workouttypes,
|
|
initial='rower')
|
|
# fileformat = forms.ChoiceField(required=True,
|
|
# choices=filetypechoices,
|
|
# initial='csv')
|
|
notes = forms.CharField(required=False,
|
|
widget=forms.Textarea)
|
|
|
|
class Meta:
|
|
fields = ['title','file','workouttype','fileformat']
|
|
|
|
|
|
|
|
class UploadOptionsForm(forms.Form):
|
|
plotchoices = (
|
|
('timeplot','Time Plot'),
|
|
('distanceplot','Distance Plot'),
|
|
('pieplot','Pie Chart'),
|
|
)
|
|
make_plot = forms.BooleanField(initial=False)
|
|
plottype = forms.ChoiceField(required=False,
|
|
choices=plotchoices,
|
|
initial='timeplot')
|
|
upload_to_C2 = forms.BooleanField(initial=False)
|
|
|
|
class Meta:
|
|
fields = ['make_plot','plottype','upload_toc2']
|
|
|
|
class PredictedPieceForm(forms.Form):
|
|
unitchoices = (
|
|
('t','minutes'),
|
|
('d','meters'),
|
|
)
|
|
pieceunit = forms.ChoiceField(required=True,choices=unitchoices,
|
|
initial='t',label='Unit')
|
|
value = forms.IntegerField(initial=10,label='Value')
|
|
|
|
class Meta:
|
|
fields = ['value','pieceunit']
|
|
|
|
class UpdateStreamForm(forms.Form):
|
|
unitchoices = (
|
|
('m','m/s'),
|
|
('f','foot/s'),
|
|
('k','knots'),
|
|
('p','pace difference (sec/500m)'),
|
|
)
|
|
dist1 = forms.FloatField(initial=0,label = 'Distance 1')
|
|
dist2 = forms.FloatField(initial=1000,label = 'Distance 2')
|
|
stream1 = forms.FloatField(initial=0,label = 'Stream velocity 1')
|
|
stream2 = forms.FloatField(initial=0,label = 'Stream velocity 2')
|
|
streamunit = forms.ChoiceField(required=True,
|
|
choices=unitchoices,
|
|
initial='m',
|
|
label='Unit')
|
|
|
|
class Meta:
|
|
fields = ['dist1','dist2','stream1', 'stream2','streamunit']
|
|
|
|
class UpdateWindForm(forms.Form):
|
|
unitchoices = (
|
|
('m','m/s'),
|
|
('k','knots'),
|
|
('b','beaufort'),
|
|
('kmh','km/h'),
|
|
('mph','miles/hour'),
|
|
)
|
|
dist1 = forms.FloatField(initial=0,label = 'Distance 1')
|
|
dist2 = forms.FloatField(initial=1000,label = 'Distance 2')
|
|
vwind1 = forms.FloatField(initial=0,required=False,label = 'Wind Speed 1')
|
|
vwind2 = forms.FloatField(initial=0,required=False,label = 'Wind Speed 2')
|
|
windunit = forms.ChoiceField(required=True,
|
|
choices=unitchoices,
|
|
initial='m',
|
|
label='Unit')
|
|
winddirection1 = forms.IntegerField(initial=0,required=False,
|
|
label = 'Wind Direction 1')
|
|
winddirection2 = forms.IntegerField(initial=0,required=False,
|
|
label = 'Wind Direction 2')
|
|
|
|
class Meta:
|
|
fields = ['dist1','dist2',
|
|
'vwind1','vwind2',
|
|
'windunit',
|
|
'winddirection1','winddirection2']
|
|
|
|
|
|
|
|
class DateRangeForm(forms.Form):
|
|
startdate = forms.DateField(initial=timezone.now()-datetime.timedelta(days=365),
|
|
widget=SelectDateWidget(years=range(1990,2050)),
|
|
label='Start Date')
|
|
enddate = forms.DateField(initial=timezone.now(),
|
|
widget=SelectDateWidget(years=range(1990,2050)),
|
|
label='End Date')
|
|
|
|
class Meta:
|
|
fields = ['startdate','enddate']
|
|
|
|
class DeltaDaysForm(forms.Form):
|
|
deltadays = forms.IntegerField(initial=0,required=False,label='')
|
|
|
|
class RegistrationForm(UserCreationForm):
|
|
"""
|
|
Form for registering a new user account.
|
|
Validates that the requested username is not already in use, and
|
|
requires the password to be entered twice to catch typos.
|
|
Subclasses should feel free to add any additional validation they
|
|
need, but should avoid defining a ``save()`` method -- the actual
|
|
saving of collected user data is delegated to the active
|
|
registration backend.
|
|
"""
|
|
required_css_class = 'required'
|
|
email = forms.EmailField(label="E-mail")
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ("username", "first_name", "last_name", "email", "password1", "password2")
|
|
|
|
class RegistrationFormTermsOfService(RegistrationForm):
|
|
"""
|
|
Subclass of ``RegistrationForm`` which adds a required checkbox
|
|
for agreeing to a site's Terms of Service.
|
|
"""
|
|
tos = forms.BooleanField(widget=forms.CheckboxInput,
|
|
label='I have read and agree to the Terms of Service',
|
|
error_messages={'required': "You must agree to the terms to register"})
|
|
|
|
|
|
class RegistrationFormUniqueEmail(RegistrationFormTermsOfService):
|
|
"""
|
|
Subclass of ``RegistrationFormTermsOfService`` which enforces uniqueness of
|
|
email addresses.
|
|
"""
|
|
def clean_email(self):
|
|
"""
|
|
Validate that the supplied email address is unique for the
|
|
site.
|
|
"""
|
|
if User.objects.filter(email__iexact=self.cleaned_data['email']):
|
|
raise forms.ValidationError("This email address is already in use. Please supply a different email address.")
|
|
return self.cleaned_data['email']
|
|
|
|
|
|
class MyTimeField(forms.TimeField):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(MyTimeField, self).__init__(*args, **kwargs)
|
|
supports_microseconds = True
|
|
|
|
class IntervalUpdateForm(forms.Form):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
typechoices = (
|
|
(1,'single time'),
|
|
(2,'single distance'),
|
|
(3,'rest (time based)'),
|
|
(3,'rest (distance based)'),
|
|
(4,'work (time based)'),
|
|
(5,'work (distance based)'),
|
|
)
|
|
aantal = int(kwargs.pop('aantal'))
|
|
super(IntervalUpdateForm, self).__init__(*args, **kwargs)
|
|
|
|
for i in range(aantal):
|
|
self.fields['intervalt_%s' % i] = forms.DurationField(label='Time '+str(i+1))
|
|
self.fields['intervald_%s' % i] = forms.IntegerField(label='Distance '+str(i+1))
|
|
self.fields['type_%s' % i] = forms.ChoiceField(choices=typechoices,
|
|
required=True,
|
|
initial=4,
|
|
label = 'Type '+str(i+1))
|
|
self.fields['intervalt_%s' % i].widget.attrs['style'] = 'width:76px; height: 16px;'
|
|
self.fields['intervald_%s' % i].widget.attrs['style'] = 'width:76px; height: 16px;'
|
|
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')
|