Commit 50c09a62cb14169a240a1af708dae83e0c1ea519
Exists in
master
and in
3 other branches
Merge branch 'refactoring' of https://github.com/amadeusproject/amadeuslms into refactoring
Showing
7 changed files
with
71 additions
and
48 deletions
Show diff stats
.gitignore
amadeus/settings.py
| ... | ... | @@ -56,6 +56,7 @@ INSTALLED_APPS = [ |
| 56 | 56 | 'django_crontab', |
| 57 | 57 | 'django_cron', |
| 58 | 58 | 'channels', |
| 59 | + 'resubmit', # Utilizado para salvar arquivos na cache, para caso o formulario não seja preenchido corretamente o usuário não precise fazer o upload outra vez dos arquivos | |
| 59 | 60 | |
| 60 | 61 | 'amadeus', |
| 61 | 62 | 'users', |
| ... | ... | @@ -120,6 +121,17 @@ TEMPLATES = [ |
| 120 | 121 | }, |
| 121 | 122 | ] |
| 122 | 123 | |
| 124 | + | |
| 125 | +CACHES = { | |
| 126 | + 'default': { | |
| 127 | + 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', | |
| 128 | + }, | |
| 129 | + "resubmit": { | |
| 130 | + 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', | |
| 131 | + "LOCATION": os.path.join(BASE_DIR, 'data/cache/resubmit'), | |
| 132 | + }, | |
| 133 | +} | |
| 134 | + | |
| 123 | 135 | WSGI_APPLICATION = 'amadeus.wsgi.application' |
| 124 | 136 | |
| 125 | 137 | SESSION_SECURITY_WARN_AFTER = 1140 |
| ... | ... | @@ -357,11 +369,11 @@ SUMMERNOTE_CONFIG = { |
| 357 | 369 | # Set `upload_to` function for attachments. |
| 358 | 370 | #'attachment_upload_to': my_custom_upload_to_func(), |
| 359 | 371 | |
| 360 | - | |
| 372 | + | |
| 361 | 373 | |
| 362 | 374 | } |
| 363 | 375 | |
| 364 | 376 | try: |
| 365 | 377 | from .local_settings import * |
| 366 | 378 | except ImportError: |
| 367 | - pass | |
| 368 | 379 | \ No newline at end of file |
| 380 | + pass | ... | ... |
mural/forms.py
| ... | ... | @@ -4,6 +4,8 @@ from django.utils.translation import ugettext_lazy as _ |
| 4 | 4 | from django.utils.html import strip_tags |
| 5 | 5 | from django.db.models import Q |
| 6 | 6 | |
| 7 | +from resubmit.widgets import ResubmitFileWidget | |
| 8 | + | |
| 7 | 9 | from topics.models import Resource |
| 8 | 10 | |
| 9 | 11 | from .models import GeneralPost, CategoryPost, SubjectPost, Comment |
| ... | ... | @@ -14,7 +16,7 @@ class Validation(forms.ModelForm): |
| 14 | 16 | def clean_post(self): |
| 15 | 17 | post = self.cleaned_data.get('post', '') |
| 16 | 18 | cleaned_post = strip_tags(post) |
| 17 | - | |
| 19 | + | |
| 18 | 20 | if cleaned_post == '': |
| 19 | 21 | self._errors['post'] = [_('This field is required.')] |
| 20 | 22 | |
| ... | ... | @@ -34,13 +36,15 @@ class Validation(forms.ModelForm): |
| 34 | 36 | |
| 35 | 37 | return image |
| 36 | 38 | |
| 39 | + | |
| 37 | 40 | class GeneralPostForm(Validation): |
| 38 | 41 | class Meta: |
| 39 | 42 | model = GeneralPost |
| 40 | 43 | fields = ['action', 'post', 'image'] |
| 41 | 44 | widgets = { |
| 42 | 45 | 'action': forms.RadioSelect, |
| 43 | - 'post': forms.Textarea | |
| 46 | + 'post': forms.Textarea, | |
| 47 | + 'image': ResubmitFileWidget(attrs={'accept':'image/*'}), | |
| 44 | 48 | } |
| 45 | 49 | |
| 46 | 50 | class CategoryPostForm(Validation): |
| ... | ... | @@ -49,7 +53,8 @@ class CategoryPostForm(Validation): |
| 49 | 53 | fields = ['action', 'post', 'image'] |
| 50 | 54 | widgets = { |
| 51 | 55 | 'action': forms.RadioSelect, |
| 52 | - 'post': forms.Textarea | |
| 56 | + 'post': forms.Textarea, | |
| 57 | + 'image': ResubmitFileWidget(attrs={'accept':'image/*'}), | |
| 53 | 58 | } |
| 54 | 59 | |
| 55 | 60 | class SubjectPostForm(Validation): |
| ... | ... | @@ -60,7 +65,7 @@ class SubjectPostForm(Validation): |
| 60 | 65 | subject = kwargs['initial'].get('subject', None) |
| 61 | 66 | |
| 62 | 67 | if not kwargs['instance'] is None: |
| 63 | - subject = self.instance.space | |
| 68 | + subject = self.instance.space | |
| 64 | 69 | |
| 65 | 70 | if user.is_staff: |
| 66 | 71 | self.fields['resource'].choices = [(r.id, str(r)) for r in Resource.objects.filter(Q(topic__subject = subject))] |
| ... | ... | @@ -74,7 +79,8 @@ class SubjectPostForm(Validation): |
| 74 | 79 | fields = ['action', 'resource', 'post', 'image'] |
| 75 | 80 | widgets = { |
| 76 | 81 | 'action': forms.RadioSelect, |
| 77 | - 'post': forms.Textarea | |
| 82 | + 'post': forms.Textarea, | |
| 83 | + 'image': ResubmitFileWidget(attrs={'accept':'image/*'}), | |
| 78 | 84 | } |
| 79 | 85 | |
| 80 | 86 | class ResourcePostForm(Validation): |
| ... | ... | @@ -83,7 +89,8 @@ class ResourcePostForm(Validation): |
| 83 | 89 | fields = ['action', 'post', 'image'] |
| 84 | 90 | widgets = { |
| 85 | 91 | 'action': forms.RadioSelect, |
| 86 | - 'post': forms.Textarea | |
| 92 | + 'post': forms.Textarea, | |
| 93 | + 'image': ResubmitFileWidget(attrs={'accept':'image/*'}), | |
| 87 | 94 | } |
| 88 | 95 | |
| 89 | 96 | class CommentForm(forms.ModelForm): |
| ... | ... | @@ -92,7 +99,7 @@ class CommentForm(forms.ModelForm): |
| 92 | 99 | def clean_comment(self): |
| 93 | 100 | comment = self.cleaned_data.get('comment', '') |
| 94 | 101 | cleaned_comment = strip_tags(comment) |
| 95 | - | |
| 102 | + | |
| 96 | 103 | if cleaned_comment == '': |
| 97 | 104 | self._errors['comment'] = [_('This field is required.')] |
| 98 | 105 | |
| ... | ... | @@ -114,4 +121,7 @@ class CommentForm(forms.ModelForm): |
| 114 | 121 | |
| 115 | 122 | class Meta: |
| 116 | 123 | model = Comment |
| 117 | - fields = ['comment', 'image'] | |
| 118 | 124 | \ No newline at end of file |
| 125 | + fields = ['comment', 'image'] | |
| 126 | + widgets = { | |
| 127 | + 'image': ResubmitFileWidget(attrs={'accept':'image/*'}), | |
| 128 | + } | ... | ... |
mural/templates/mural/_form.html
| ... | ... | @@ -33,7 +33,7 @@ |
| 33 | 33 | {% render_field form.resource class='form-control' %} |
| 34 | 34 | |
| 35 | 35 | <span id="helpBlock" class="help-block">{{ form.resource.help_text }}</span> |
| 36 | - | |
| 36 | + | |
| 37 | 37 | {% if form.resource.errors %} |
| 38 | 38 | <div class="alert alert-danger alert-dismissible" role="alert"> |
| 39 | 39 | <button type="button" class="close" data-dismiss="alert" aria-label="Close"> |
| ... | ... | @@ -54,7 +54,7 @@ |
| 54 | 54 | {% render_field form.post class='form-control text_simple_wysiwyg' %} |
| 55 | 55 | |
| 56 | 56 | <span id="helpBlock" class="help-block">{{ form.post.help_text }}</span> |
| 57 | - | |
| 57 | + | |
| 58 | 58 | {% if form.post.errors %} |
| 59 | 59 | <div class="alert alert-danger alert-dismissible" role="alert"> |
| 60 | 60 | <button type="button" class="close" data-dismiss="alert" aria-label="Close"> |
| ... | ... | @@ -71,24 +71,15 @@ |
| 71 | 71 | |
| 72 | 72 | <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> |
| 73 | 73 | {% render_field form.image %} |
| 74 | - | |
| 75 | - <div class="input-group common-file-input"> | |
| 76 | - <input type="text" readonly="" class="form-control" placeholder="{% trans 'Choose your photo...' %}"> | |
| 77 | - <span class="input-group-btn input-group-sm"> | |
| 78 | - <button type="button" class="btn btn-fab btn-fab-mini"> | |
| 79 | - <i class="material-icons">attach_file</i> | |
| 80 | - </button> | |
| 81 | - </span> | |
| 82 | - </div> | |
| 83 | 74 | |
| 84 | 75 | <div class="filedrag"> |
| 85 | 76 | {% trans 'Click or drop the file here' %}<br /> |
| 86 | - | |
| 77 | + | |
| 87 | 78 | <small>{% trans 'The file could not exceed 5MB.' %}</small> |
| 88 | 79 | </div> |
| 89 | 80 | |
| 90 | 81 | <span id="helpBlock" class="help-block">{{ form.image.help_text }}</span> |
| 91 | - | |
| 82 | + | |
| 92 | 83 | {% if form.image.errors %} |
| 93 | 84 | <div class="alert alert-danger alert-dismissible" role="alert"> |
| 94 | 85 | <button type="button" class="close" data-dismiss="alert" aria-label="Close"> |
| ... | ... | @@ -137,7 +128,7 @@ |
| 137 | 128 | var small = $("#id_image"), |
| 138 | 129 | filedrag = $(".filedrag"), |
| 139 | 130 | common = $(".common-file-input"); |
| 140 | - | |
| 131 | + | |
| 141 | 132 | // file select |
| 142 | 133 | small.on("change", FileSelectHandler); |
| 143 | 134 | ... | ... |
pdf_file/forms.py
| ... | ... | @@ -3,6 +3,7 @@ from django.utils.translation import ugettext_lazy as _ |
| 3 | 3 | from django.utils.html import strip_tags |
| 4 | 4 | |
| 5 | 5 | from subjects.models import Tag |
| 6 | +from resubmit.widgets import ResubmitFileWidget | |
| 6 | 7 | |
| 7 | 8 | from .models import PDFFile |
| 8 | 9 | |
| ... | ... | @@ -17,7 +18,7 @@ class PDFFileForm(forms.ModelForm): |
| 17 | 18 | if self.instance.id: |
| 18 | 19 | self.subject = self.instance.topic.subject |
| 19 | 20 | self.initial['tags'] = ", ".join(self.instance.tags.all().values_list("name", flat = True)) |
| 20 | - | |
| 21 | + | |
| 21 | 22 | self.fields['students'].queryset = self.subject.students.all() |
| 22 | 23 | self.fields['groups'].queryset = self.subject.group_subject.all() |
| 23 | 24 | |
| ... | ... | @@ -32,11 +33,12 @@ class PDFFileForm(forms.ModelForm): |
| 32 | 33 | 'brief_description': forms.Textarea, |
| 33 | 34 | 'students': forms.SelectMultiple, |
| 34 | 35 | 'groups': forms.SelectMultiple, |
| 36 | + 'file': ResubmitFileWidget(attrs={'accept':'application/pdf, application/x-pdf, application/x-bzpdf, application/x-gzpdf'}), | |
| 35 | 37 | } |
| 36 | 38 | |
| 37 | 39 | def clean_name(self): |
| 38 | 40 | name = self.cleaned_data.get('name', '') |
| 39 | - | |
| 41 | + | |
| 40 | 42 | topics = self.subject.topic_subject.all() |
| 41 | 43 | |
| 42 | 44 | for topic in topics: |
| ... | ... | @@ -44,7 +46,7 @@ class PDFFileForm(forms.ModelForm): |
| 44 | 46 | same_name = topic.resource_topic.filter(name__unaccent__iexact = name).exclude(id = self.instance.id).count() |
| 45 | 47 | else: |
| 46 | 48 | same_name = topic.resource_topic.filter(name__unaccent__iexact = name).count() |
| 47 | - | |
| 49 | + | |
| 48 | 50 | if same_name > 0: |
| 49 | 51 | self._errors['name'] = [_('This subject already has a pdf file with this name')] |
| 50 | 52 | |
| ... | ... | @@ -54,14 +56,14 @@ class PDFFileForm(forms.ModelForm): |
| 54 | 56 | |
| 55 | 57 | def clean_file(self): |
| 56 | 58 | file = self.cleaned_data.get('file', False) |
| 57 | - | |
| 59 | + | |
| 58 | 60 | if file: |
| 59 | 61 | if hasattr(file, '_size'): |
| 60 | 62 | if file._size > self.MAX_UPLOAD_SIZE: |
| 61 | 63 | self._errors['file'] = [_("The file is too large. It should have less than 10MB.")] |
| 62 | 64 | |
| 63 | 65 | return ValueError |
| 64 | - | |
| 66 | + | |
| 65 | 67 | elif not self.instance.pk: |
| 66 | 68 | self._errors['file'] = [_('This field is required.')] |
| 67 | 69 | |
| ... | ... | @@ -82,7 +84,7 @@ class PDFFileForm(forms.ModelForm): |
| 82 | 84 | for prev in previous_tags: |
| 83 | 85 | if not prev.name in tags: |
| 84 | 86 | self.instance.tags.remove(prev) |
| 85 | - | |
| 87 | + | |
| 86 | 88 | for tag in tags: |
| 87 | 89 | tag = tag.strip() |
| 88 | 90 | |
| ... | ... | @@ -96,4 +98,4 @@ class PDFFileForm(forms.ModelForm): |
| 96 | 98 | if not new_tag in self.instance.tags.all(): |
| 97 | 99 | self.instance.tags.add(new_tag) |
| 98 | 100 | |
| 99 | - return self.instance | |
| 100 | 101 | \ No newline at end of file |
| 102 | + return self.instance | ... | ... |
requirements.txt
users/forms.py
| ... | ... | @@ -5,6 +5,9 @@ from rolepermissions.shortcuts import assign_role |
| 5 | 5 | from django.contrib.auth import update_session_auth_hash |
| 6 | 6 | from django.core.validators import validate_email |
| 7 | 7 | from django.core.exceptions import ValidationError |
| 8 | + | |
| 9 | +from resubmit.widgets import ResubmitFileWidget | |
| 10 | + | |
| 8 | 11 | from .models import User |
| 9 | 12 | |
| 10 | 13 | class Validation(forms.ModelForm): |
| ... | ... | @@ -19,7 +22,7 @@ class Validation(forms.ModelForm): |
| 19 | 22 | return email |
| 20 | 23 | except ValidationError: |
| 21 | 24 | self._errors['email'] = [_('You must insert an email address')] |
| 22 | - | |
| 25 | + | |
| 23 | 26 | return ValueError |
| 24 | 27 | |
| 25 | 28 | def clean_image(self): |
| ... | ... | @@ -37,13 +40,13 @@ class Validation(forms.ModelForm): |
| 37 | 40 | def clean_password2(self): |
| 38 | 41 | password = self.cleaned_data.get("new_password") |
| 39 | 42 | password2 = self.cleaned_data.get("password2") |
| 40 | - | |
| 43 | + | |
| 41 | 44 | if password and password2 and password != password2: |
| 42 | 45 | self._errors['password2'] = [_('The confirmation password is incorrect.')] |
| 43 | 46 | |
| 44 | 47 | return ValueError |
| 45 | - | |
| 46 | - return password2 | |
| 48 | + | |
| 49 | + return password2 | |
| 47 | 50 | |
| 48 | 51 | class RegisterUserForm(Validation): |
| 49 | 52 | new_password = forms.CharField(label=_('Password'), widget = forms.PasswordInput(render_value = True, attrs = {'placeholder': _('Password') + ' *'})) |
| ... | ... | @@ -53,11 +56,11 @@ class RegisterUserForm(Validation): |
| 53 | 56 | |
| 54 | 57 | def save(self, commit=True): |
| 55 | 58 | super(RegisterUserForm, self).save(commit=False) |
| 56 | - | |
| 59 | + | |
| 57 | 60 | self.instance.set_password(self.cleaned_data['new_password']) |
| 58 | 61 | |
| 59 | 62 | self.instance.save() |
| 60 | - | |
| 63 | + | |
| 61 | 64 | return self.instance |
| 62 | 65 | |
| 63 | 66 | class Meta: |
| ... | ... | @@ -68,6 +71,7 @@ class RegisterUserForm(Validation): |
| 68 | 71 | 'username': forms.TextInput(attrs = {'placeholder': _('Name') + ' *'}), |
| 69 | 72 | 'last_name': forms.TextInput(attrs = {'placeholder': _('Last Name') + ' *'}), |
| 70 | 73 | 'social_name': forms.TextInput(attrs = {'placeholder': _('Social Name')}), |
| 74 | + 'image': ResubmitFileWidget(attrs={'accept':'image/*'}), | |
| 71 | 75 | } |
| 72 | 76 | |
| 73 | 77 | class ProfileForm(Validation): |
| ... | ... | @@ -75,9 +79,9 @@ class ProfileForm(Validation): |
| 75 | 79 | |
| 76 | 80 | def save(self, commit=True): |
| 77 | 81 | super(ProfileForm, self).save(commit=False) |
| 78 | - | |
| 82 | + | |
| 79 | 83 | self.instance.save() |
| 80 | - | |
| 84 | + | |
| 81 | 85 | return self.instance |
| 82 | 86 | |
| 83 | 87 | class Meta: |
| ... | ... | @@ -86,7 +90,8 @@ class ProfileForm(Validation): |
| 86 | 90 | widgets = { |
| 87 | 91 | 'description': forms.Textarea, |
| 88 | 92 | 'username': forms.TextInput(attrs = {'readonly': 'readonly'}), |
| 89 | - 'last_name': forms.TextInput(attrs = {'readonly': 'readonly'}) | |
| 93 | + 'last_name': forms.TextInput(attrs = {'readonly': 'readonly'}), | |
| 94 | + 'image': ResubmitFileWidget(attrs={'accept':'image/*'}), | |
| 90 | 95 | } |
| 91 | 96 | |
| 92 | 97 | class UserForm(Validation): |
| ... | ... | @@ -98,19 +103,19 @@ class UserForm(Validation): |
| 98 | 103 | super(UserForm, self).__init__(*args, **kwargs) |
| 99 | 104 | |
| 100 | 105 | self.is_edit = is_update |
| 101 | - | |
| 106 | + | |
| 102 | 107 | new_password = forms.CharField(label = _('Password'), widget = forms.PasswordInput(render_value = True), required = False) |
| 103 | 108 | password2 = forms.CharField(label = _('Confirm Password'), widget = forms.PasswordInput(render_value = True), required = False) |
| 104 | 109 | |
| 105 | 110 | |
| 106 | 111 | def save(self, commit=True): |
| 107 | 112 | super(UserForm, self).save(commit=False) |
| 108 | - | |
| 113 | + | |
| 109 | 114 | if not self.is_edit or self.cleaned_data['new_password'] != '': |
| 110 | 115 | self.instance.set_password(self.cleaned_data['new_password']) |
| 111 | 116 | |
| 112 | 117 | self.instance.save() |
| 113 | - | |
| 118 | + | |
| 114 | 119 | return self.instance |
| 115 | 120 | |
| 116 | 121 | class Meta: |
| ... | ... | @@ -118,6 +123,7 @@ class UserForm(Validation): |
| 118 | 123 | fields = ['email', 'username', 'last_name', 'social_name', 'description', 'show_email', 'image', 'is_staff', 'is_active',] |
| 119 | 124 | widgets = { |
| 120 | 125 | 'description': forms.Textarea, |
| 126 | + 'image': ResubmitFileWidget(attrs={'accept':'image/*'}), | |
| 121 | 127 | } |
| 122 | 128 | |
| 123 | 129 | class ChangePassForm(Validation): |
| ... | ... | @@ -143,13 +149,13 @@ class ChangePassForm(Validation): |
| 143 | 149 | |
| 144 | 150 | def save(self, commit=True): |
| 145 | 151 | super(ChangePassForm, self).save(commit=False) |
| 146 | - | |
| 152 | + | |
| 147 | 153 | self.instance.set_password(self.cleaned_data['new_password']) |
| 148 | 154 | |
| 149 | 155 | update_session_auth_hash(self.request, self.instance) |
| 150 | 156 | |
| 151 | 157 | self.instance.save() |
| 152 | - | |
| 158 | + | |
| 153 | 159 | return self.instance |
| 154 | 160 | |
| 155 | 161 | class Meta: |
| ... | ... | @@ -173,7 +179,7 @@ class PassResetRequest(forms.Form): |
| 173 | 179 | return email |
| 174 | 180 | except ValidationError: |
| 175 | 181 | self._errors['email'] = [_('You must insert a valid email address')] |
| 176 | - | |
| 182 | + | |
| 177 | 183 | return ValueError |
| 178 | 184 | |
| 179 | 185 | class SetPasswordForm(Validation): |
| ... | ... | @@ -184,4 +190,4 @@ class SetPasswordForm(Validation): |
| 184 | 190 | |
| 185 | 191 | class Meta: |
| 186 | 192 | model = User |
| 187 | - fields = [] | |
| 188 | 193 | \ No newline at end of file |
| 194 | + fields = [] | ... | ... |