# -*- coding: utf-8 -*-
+from decimal import Decimal
+
from django import forms
from django.conf import settings
from django.template.defaultfilters import filesizeformat
+from django.utils.safestring import mark_safe
from stage2.models import Attachment, Mark, FieldOptionSet, FieldOption
class AssignmentFieldForm(forms.Form):
- value = forms.CharField()
+ value = forms.CharField(required=False)
assignment_id = forms.CharField(widget=forms.HiddenInput)
def __init__(self, label, field_no, options, answer, *args, **kwargs):
def clean_value(self):
if self.type == 'options':
- option = FieldOption.objects.get(id=int(self.cleaned_data['value']))
- if option.answer != self.answer and option.answer is not None:
- raise forms.ValidationError(u'Ta opcja została już wybrana przez kogoś innego.')
- return option
+ value = self.cleaned_data['value']
+ if value:
+ try:
+ option = FieldOption.objects.get(id=int(value))
+ except (FieldOption.DoesNotExist, ValueError):
+ raise forms.ValidationError(u'Nieprawidłowa wartość.')
+ if option.answer != self.answer and option.answer is not None:
+ raise forms.ValidationError(u'Ta opcja została już wybrana przez kogoś innego.')
+ return option
return self.cleaned_data['value']
def save(self):
value = self.cleaned_data['value']
if self.type == 'options':
option = value
- if option.answer != self.answer:
- # not thread-safe :/
- assert not option.answer
+ if option:
+ if option.answer != self.answer:
+ # not thread-safe :/
+ assert not option.answer
+ for opt in self.answer.fieldoption_set.all():
+ opt.answer = None
+ opt.save()
+ option.answer = self.answer
+ option.save()
+ else:
for opt in self.answer.fieldoption_set.all():
opt.answer = None
opt.save()
- option.answer = self.answer
- option.save()
else:
self.answer.field_values[self.label] = value
self.answer.save()
class MarkForm(forms.ModelForm):
+ answer_id = forms.CharField(widget=forms.HiddenInput)
+
class Meta:
model = Mark
fields = ['points']
'points': forms.TextInput(attrs={'type': 'number', 'min': 0, 'step': '0.5'})
}
- def __init__(self, answer, *args, **kwargs):
+ def __init__(self, answer, criterion, *args, **kwargs):
super(MarkForm, self).__init__(*args, **kwargs)
- self.answer = answer
- self.fields['points'].widget.attrs['max'] = answer.assignment.max_points
-
- def clean_points(self):
- points = self.cleaned_data['points']
- if points > self.answer.assignment.max_points:
- raise forms.ValidationError('Too many points for this assignment')
- if points < 0:
- raise forms.ValidationError('Points cannot be negative')
- return points
+ self.fields['answer_id'].initial = answer.id
+ points_field = self.fields['points']
+ points_field.label = mark_safe(criterion.form_label())
+ points_field.help_text = '(max %s)' % criterion.max_points
+ points_field.min_value = Decimal(0)
+ points_field.max_value = Decimal(criterion.max_points)
+ points_field.widget.attrs['max'] = criterion.max_points