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?ds=inline
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
{% 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: