X-Git-Url: https://git.mdrn.pl/edumed.git/blobdiff_plain/dfd1b7f527415baf99c181a057bfeb12a0976c75..6b3b8a3c3de4896fc99256fe0768797c9ec956d3:/stage2/forms.py diff --git a/stage2/forms.py b/stage2/forms.py index 92af3a0..ee25a03 100644 --- a/stage2/forms.py +++ b/stage2/forms.py @@ -3,10 +3,12 @@ from django import forms from django.conf import settings from django.template.defaultfilters import filesizeformat -from stage2.models import Attachment, Mark +from stage2.models import Attachment, Mark, FieldOptionSet, FieldOption class AttachmentForm(forms.ModelForm): + assignment_id = forms.CharField(widget=forms.HiddenInput) + class Meta: model = Attachment fields = ['file'] @@ -14,6 +16,7 @@ class AttachmentForm(forms.ModelForm): def __init__(self, assignment, file_no, label, extensions=None, *args, **kwargs): prefix = 'att%s-%s' % (assignment.id, file_no) super(AttachmentForm, self).__init__(*args, prefix=prefix, **kwargs) + self.fields['assignment_id'].initial = assignment.id self.fields['file'].label = label if extensions: self.fields['file'].widget.attrs = {'data-ext': '|'.join(extensions)} @@ -30,6 +33,60 @@ class AttachmentForm(forms.ModelForm): return file +class AssignmentFieldForm(forms.Form): + value = forms.CharField(required=False) + assignment_id = forms.CharField(widget=forms.HiddenInput) + + def __init__(self, label, field_no, options, answer, *args, **kwargs): + prefix = 'field%s-%s' % (answer.id, field_no) + super(AssignmentFieldForm, self).__init__(prefix=prefix, *args, **kwargs) + self.answer = answer + self.label = label + self.fields['value'].label = label + self.type = options['type'] + self.fields['assignment_id'].initial = answer.assignment.id + if self.type == 'options': + option_set = FieldOptionSet.objects.get(name=options['option_set']) + self.fields['value'].widget = forms.Select(choices=option_set.choices(answer)) + options = answer.fieldoption_set.all() + if options: + self.fields['value'].initial = options.get().id + else: + value = answer.field_values.get(label) + self.fields['value'].initial = value or '' + + def clean_value(self): + if self.type == 'options': + value = self.cleaned_data['value'] + if value: + option = FieldOption.objects.get(id=int(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 + return self.cleaned_data['value'] + + def save(self): + value = self.cleaned_data['value'] + if self.type == 'options': + option = value + 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() + else: + self.answer.field_values[self.label] = value + self.answer.save() + + class MarkForm(forms.ModelForm): class Meta: model = Mark