From: Jan Szejko Date: Fri, 21 Dec 2018 15:25:11 +0000 (+0100) Subject: updates for stage 2 X-Git-Url: https://git.mdrn.pl/edumed.git/commitdiff_plain/0c7e19187742930434db14b44579d9d22effc361 updates for stage 2 --- diff --git a/edumed/settings/custom.py b/edumed/settings/custom.py index 5e70fd9..5e98385 100644 --- a/edumed/settings/custom.py +++ b/edumed/settings/custom.py @@ -2,7 +2,5 @@ CONTACT_FORMS_MODULE = 'edumed.contact_forms' -MAX_UPLOAD_SIZE = 20 * 1024 * 1024 - OLIMPIADA_START = (2018, 11, 20, 10) OLIMPIADA_END = (2018, 11, 20, 11) diff --git a/stage2/forms.py b/stage2/forms.py index 2ef10e5..7a68314 100644 --- a/stage2/forms.py +++ b/stage2/forms.py @@ -2,7 +2,7 @@ from decimal import Decimal from django import forms -from django.conf import settings +from django.core import validators from django.template.defaultfilters import filesizeformat from django.utils.safestring import mark_safe @@ -16,23 +16,27 @@ class AttachmentForm(forms.ModelForm): model = Attachment fields = ['file'] - def __init__(self, assignment, file_no, label, extensions=None, *args, **kwargs): + def __init__(self, assignment, file_no, label, options, *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 + extensions = options.get('ext') + max_mb = options.get('max', 20) + self.max_upload_size = max_mb * 1024 * 1024 + self.fields['file'].widget.attrs['data-max'] = max_mb + self.fields['file'].label = label + u' (maks. %s MB)' % max_mb if extensions: - self.fields['file'].widget.attrs = {'data-ext': '|'.join(extensions)} + self.fields['file'].widget.attrs['data-ext'] = '|'.join(extensions) self.extensions = extensions def clean_file(self): file = self.cleaned_data['file'] - if file.size > settings.MAX_UPLOAD_SIZE: + if file.size > self.max_upload_size: raise forms.ValidationError( - 'Please keep filesize under %s. Current filesize: %s' % ( - filesizeformat(settings.MAX_UPLOAD_SIZE), filesizeformat(file.size))) + u'Prosimy o wysłanie pliku o rozmiarze najwyżej %s. Aktualny rozmiar pliku: %s' % ( + filesizeformat(self.max_upload_size), filesizeformat(file.size))) if self.extensions and ('.' not in file.name or file.name.rsplit('.', 1)[1].lower() not in self.extensions): - raise forms.ValidationError('Incorrect extension, should be one of: %s' % ', '.join(self.extensions)) + raise forms.ValidationError(u'Niepoprawne rozszerzenie, powinno być jedno z: %s' % ', '.join(self.extensions)) return file @@ -48,12 +52,18 @@ class AssignmentFieldForm(forms.Form): self.fields['value'].label = label self.type = options['type'] self.fields['assignment_id'].initial = answer.assignment.id + max_length = options.get('max_length') + if max_length: + self.fields['value'].validators.append(validators.MaxLengthValidator(int(max_length))) + self.fields['value'].label += u' (maks. %s znaków)' % max_length + if options.get('widget') == 'area': + self.fields['value'].widget = forms.Textarea(attrs={'cols': 80, 'rows': 25}) 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 + value_options = answer.fieldoption_set.all() + if value_options: + self.fields['value'].initial = value_options.get().id else: value = answer.field_values.get(label) self.fields['value'].initial = value or '' diff --git a/stage2/static/js/checkfile.js b/stage2/static/js/checkfile.js index 9d1ae97..19db762 100644 --- a/stage2/static/js/checkfile.js +++ b/stage2/static/js/checkfile.js @@ -19,9 +19,10 @@ $(function() { ok = false; } } + var max_size = this.getAttribute('data-max') || 20; var size = this.files[0].size; - if (size > 20 * 1024 * 1024) { - alert('Rozmiar pliku nie może przekraczać 20 MB!'); + if (size > max_size * 1024 * 1024) { + alert('Rozmiar pliku nie może przekraczać ' + max_size + ' MB!'); ok = false; } if (!ok) { diff --git a/stage2/templates/stage2/participant.html b/stage2/templates/stage2/participant.html index e6761d2..3dbc4bf 100644 --- a/stage2/templates/stage2/participant.html +++ b/stage2/templates/stage2/participant.html @@ -14,14 +14,6 @@ Zobacz treść zadania
{% csrf_token %} - {% for form in assignment.field_forms %} - {{ form.assignment_id }} -

{{ form.value.label }}:

- {{ form.value.errors }} -

- {% if assignment.is_active %}{{ form.value }}{% else %}{{ form.value.value }}{% endif %} -

- {% endfor %} {% for form, attachment in assignment.attachment_forms %} {{ form.assignment_id }}

{{ form.file.label }}:

@@ -35,6 +27,14 @@ {% endif %}

{% endfor %} + {% for form in assignment.field_forms %} + {{ form.assignment_id }} +

{{ form.value.label }}:

+ {{ form.value.errors }} +

+ {% if assignment.is_active %}{{ form.value }}{% else %}{{ form.value.value }}{% endif %} +

+ {% endfor %} {% if assignment.is_active %}{% endif %}
{% endfor %} diff --git a/stage2/views.py b/stage2/views.py index 3f24d38..3b05eb0 100644 --- a/stage2/views.py +++ b/stage2/views.py @@ -23,15 +23,16 @@ def all_assignments(participant, sent_forms): assignment.answer, created = Answer.objects.get_or_create(participant=participant, assignment=assignment) if assignment == sent_assignment: assignment.field_forms = field_forms - assignment.attachment_forms = attachment_forms else: assignment.field_forms = [ AssignmentFieldForm(label=label, field_no=i, options=options, answer=assignment.answer) for i, (label, options) in enumerate(assignment.field_descriptions, 1)] - assignment.attachment_forms = [ - (AttachmentForm(assignment=assignment, file_no=i, label=label, extensions=ext), - assignment.answer.attachment_set.filter(file_no=i).first() if assignment.answer else None) - for i, (label, ext) in enumerate(assignment.file_descriptions, 1)] + # in theory, if assignment == sent_assignment, it should be copied like field_forms, + # but somehow it doesn't work as expected + assignment.attachment_forms = [ + (AttachmentForm(assignment=assignment, file_no=i, label=label, options=options), + assignment.answer.attachment_set.filter(file_no=i).first() if assignment.answer else None) + for i, (label, options) in enumerate(assignment.file_descriptions, 1)] return assignments @@ -54,7 +55,11 @@ def participant_view(request, participant_id, key): return HttpResponseForbidden('Not Allowed') attachments_valid, attachment_forms = get_attachment_forms(assignment, participant, request) fields_valid, field_forms = get_field_forms(assignment, participant, request) - if attachments_valid and fields_valid: + # tutaj w zasadzie powinno być też sprawdzenie attachments_valid, ale to powoduje, + # że jeśli jakiś plik nie został wysłany, to traktujemy to jako błąd, a tego nie chcemy. + # trzeba by znaleźć sensowny sposób odrózniania błędnego pliku od braku pliku. + # na szczęście pliki walidujemy też javascriptem, więc jakoś ujdzie + if fields_valid: return HttpResponseRedirect(reverse('stage2_participant', args=(participant_id, key))) else: sent_forms = (assignment, field_forms, attachment_forms) @@ -71,12 +76,12 @@ def participant_view(request, participant_id, key): def get_attachment_forms(assignment, participant, request): all_valid = True attachment_forms = [] - for i, (label, ext) in enumerate(assignment.file_descriptions, 1): + for i, (label, options) in enumerate(assignment.file_descriptions, 1): answer, created = Answer.objects.get_or_create(participant=participant, assignment=assignment) attachment, created = Attachment.objects.get_or_create(answer=answer, file_no=i) form = AttachmentForm( data=request.POST, files=request.FILES, - assignment=assignment, file_no=i, label=label, instance=attachment, extensions=ext) + assignment=assignment, file_no=i, label=label, instance=attachment, options=options) if form.is_valid(): form.save() else: