updates for stage 2
authorJan Szejko <janek37@gmail.com>
Fri, 21 Dec 2018 15:25:11 +0000 (16:25 +0100)
committerJan Szejko <janek37@gmail.com>
Fri, 21 Dec 2018 15:25:11 +0000 (16:25 +0100)
edumed/settings/custom.py
stage2/forms.py
stage2/static/js/checkfile.js
stage2/templates/stage2/participant.html
stage2/views.py

index 5e70fd9..5e98385 100644 (file)
@@ -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)
index 2ef10e5..7a68314 100644 (file)
@@ -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 ''
index 9d1ae97..19db762 100644 (file)
@@ -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) {
index e6761d2..3dbc4bf 100644 (file)
     <a href="{{ assignment.content_url }}"><strong>Zobacz treść zadania</strong></a>
     <form method="POST" action="" enctype="multipart/form-data">
       {% csrf_token %}
-      {% for form in assignment.field_forms %}
-        {{ form.assignment_id }}
-        <p><strong>{{ form.value.label }}:</strong></p>
-        {{ form.value.errors }}
-        <p>
-          {% if assignment.is_active %}{{ form.value }}{% else %}{{ form.value.value }}{% endif %}
-        </p>
-      {% endfor %}
       {% for form, attachment in assignment.attachment_forms %}
         {{ form.assignment_id }}
         <p><strong>{{ form.file.label }}:</strong></p>
           {% endif %}
         </p>
       {% endfor %}
+      {% for form in assignment.field_forms %}
+        {{ form.assignment_id }}
+        <p><strong>{{ form.value.label }}:</strong></p>
+        {{ form.value.errors }}
+        <p>
+          {% if assignment.is_active %}{{ form.value }}{% else %}{{ form.value.value }}{% endif %}
+        </p>
+      {% endfor %}
       {% if assignment.is_active %}<input type="submit" value="Wyślij"/>{% endif %}
     </form>
   {% endfor %}
index 3f24d38..3b05eb0 100644 (file)
@@ -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: