From c2527d0ee1892fe48d19ce411df634e4fd038d91 Mon Sep 17 00:00:00 2001 From: Carlos Vega <carlos.vega@uni.lu> Date: Fri, 9 Nov 2018 15:05:15 +0100 Subject: [PATCH] Issue #266 : roll back to Piotr version and add multilingual option in view (not in model) --- smash/web/forms/mail_template.py | 24 ++++++++ .../templates/mail_templates/add_edit.html | 60 ++++++++++++++++++- smash/web/urls.py | 10 ++-- smash/web/views/mails.py | 57 +++++++++--------- 4 files changed, 115 insertions(+), 36 deletions(-) create mode 100644 smash/web/forms/mail_template.py diff --git a/smash/web/forms/mail_template.py b/smash/web/forms/mail_template.py new file mode 100644 index 00000000..cc14f13c --- /dev/null +++ b/smash/web/forms/mail_template.py @@ -0,0 +1,24 @@ +from django import forms +from django.forms import ModelForm +from web.models import MailTemplate + +import logging +logger = logging.getLogger(__name__) + +class MailTemplateForm(ModelForm): + class Meta: + model = MailTemplate + fields = '__all__' + + def __init__(self, *args, **kwargs): + super(MailTemplateForm, self).__init__(*args, **kwargs) + + instance = getattr(self, 'instance', None) + + self.fields['Multilingual'] = forms.BooleanField(label='Multilingual', disabled=True, required=False, + help_text='Only for voucher context. Check this option if the voucher template is multilingual.', + widget=forms.CheckboxInput(attrs={'class': 'hidden_form_field', 'id': 'multilingual_checkbox'})) + + def clean(self): + cleaned_data = super(MailTemplateForm, self).clean() + return cleaned_data \ No newline at end of file diff --git a/smash/web/templates/mail_templates/add_edit.html b/smash/web/templates/mail_templates/add_edit.html index 4fbc9371..1c3fdf24 100644 --- a/smash/web/templates/mail_templates/add_edit.html +++ b/smash/web/templates/mail_templates/add_edit.html @@ -5,7 +5,11 @@ {% block styles %} {{ block.super }} <link rel="stylesheet" href="{% static 'AdminLTE/plugins/awesomplete/awesomplete.css' %}"/> - + <style type="text/css"> + .help_text{ + margin-left: 5px; + } + </style> {% endblock styles %} {% block ui_active_tab %}'subjects'{% endblock ui_active_tab %} @@ -34,6 +38,9 @@ <div class="form-group {% if field.errors %}has-error{% endif %}"> <label class="col-sm-4 col-lg-offset-1 col-lg-2 control-label"> {{ field.label }} + {% if field.help_text %} + <i class="fa fa-info-circle help_text" aria-hidden="true" data-toggle="tooltip" data-placement="top" title="{{field.help_text}}"></i> + {% endif %} </label> <div class="col-sm-8 col-lg-4"> @@ -72,5 +79,54 @@ {{ block.super }} <script src="{% static 'AdminLTE/plugins/awesomplete/awesomplete.min.js' %}"></script> - + <script type="text/javascript"> + + function should_be_checked(){ + var ischecked = $('#multilingual_checkbox').is(":checked"); + var hasnolang = $('#id_language').prop("selectedIndex") == 0; + var isvoucher = $('#id_context').find(":selected").text().toLowerCase() == 'voucher'; + + if(hasnolang && isvoucher && !ischecked){ //if has no language and is voucher, then is multilingual + $('#multilingual_checkbox').attr('checked', true); + $('#multilingual_checkbox').prop('checked', true); + + $('#multilingual_checkbox').attr('disabled', true); + } + } + + function on_context_or_language_change(){ + var hasnoleng = $('#id_language').prop("selectedIndex") == 0; + var isvoucher = $('#id_context').find(":selected").text().toLowerCase() == 'voucher'; + if(isvoucher && hasnoleng){ + $('#multilingual_checkbox').attr('disabled', true); + + $('#multilingual_checkbox').attr('checked', true); + $('#multilingual_checkbox').prop('checked', true); + }else if(isvoucher && !hasnoleng){ + $('#multilingual_checkbox').attr('disabled', false); + + $('#multilingual_checkbox').attr('checked', false); + $('#multilingual_checkbox').prop('checked', false); + }else{ + $('#multilingual_checkbox').attr('disabled', true); + + $('#multilingual_checkbox').attr('checked', false); + $('#multilingual_checkbox').prop('checked', false); + } + } + + function on_checkbox_change(){ + var ischecked = $('#multilingual_checkbox').is(":checked"); + if(ischecked){ //is because has no leng and is voucher + $('#id_language').prop("selectedIndex", 0); + $('#multilingual_checkbox').attr('disabled', true); + } + } + + $('#id_language').on('change', on_context_or_language_change); + $('#id_context').on('change', on_context_or_language_change); + $('#multilingual_checkbox').on('change', on_checkbox_change); + + $(document).ready(should_be_checked); + </script> {% endblock scripts %} \ No newline at end of file diff --git a/smash/web/urls.py b/smash/web/urls.py index 65d7d4e8..7fd886c2 100644 --- a/smash/web/urls.py +++ b/smash/web/urls.py @@ -158,11 +158,11 @@ urlpatterns = [ #################### url(r'^mail_templates$', views.mails.MailTemplatesListView.as_view(), name='web.views.mail_templates'), - url(r'^mail_templates/add$', views.mails.MailTemplatesCreateView.as_view(), name='web.views.mail_template_add'), - url(r'^mail_templates/(?P<pk>\d+)/delete$', views.mails.MailTemplatesDeleteView.as_view(), - name='web.views.mail_template_delete'), - url(r'^mail_templates/(?P<pk>\d+)/edit$', views.mails.MailTemplatesEditView.as_view(), - name='web.views.mail_template_edit'), + + url(r'^mail_templates/add$', views.mails.mail_template_add, name='web.views.mail_template_add'), + url(r'^mail_templates/(?P<pk>\d+)/edit$', views.mails.mail_template_edit, name='web.views.mail_template_edit'), + + url(r'^mail_templates/(?P<pk>\d+)/delete$', views.mails.MailTemplatesDeleteView.as_view(), name='web.views.mail_template_delete'), url(r'^mail_templates/(?P<mail_template_id>\d+)/generate/(?P<instance_id>\d+)$', views.mails.generate, name="web.views.mail_template_generate"), url(r'^mail_templates/print_vouchers$', views.mails.generate_for_vouchers, diff --git a/smash/web/views/mails.py b/smash/web/views/mails.py index 02fd7803..5cad460e 100644 --- a/smash/web/views/mails.py +++ b/smash/web/views/mails.py @@ -1,6 +1,4 @@ # coding=utf-8 -import logging -logger = logging.getLogger(__name__) import StringIO from wsgiref.util import FileWrapper @@ -19,6 +17,10 @@ from ..models import StudySubject, Visit, Appointment, MailTemplate, Voucher from ..models.constants import MAIL_TEMPLATE_CONTEXT_SUBJECT, MAIL_TEMPLATE_CONTEXT_VISIT, \ MAIL_TEMPLATE_CONTEXT_APPOINTMENT, MAIL_TEMPLATE_CONTEXT_VOUCHER +from ..forms.mail_template import MailTemplateForm +from . import wrap_response +from django.shortcuts import redirect, get_object_or_404 + MIMETYPE_DOCX = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' CONTEXT_TYPES_MAPPING = { @@ -44,14 +46,28 @@ class MailTemplatesListView(ListView, WrappedView): } return context - -class MailTemplatesCreateView(CreateView, WrappedView): - model = MailTemplate - template_name = "mail_templates/add.html" - fields = '__all__' - success_url = reverse_lazy('web.views.mail_templates') - success_message = "Template created" - +def mail_template_add(request): + if request.method == 'POST': + form = MailTemplateForm(request.POST, request.FILES) + if form.is_valid(): + form.save() + return redirect('web.views.mail_templates') + else: + form = MailTemplateForm() + + return wrap_response(request, 'mail_templates/add.html', {'form': form}) + +def mail_template_edit(request, pk): + template = get_object_or_404(MailTemplate, pk=pk) + if request.method == 'POST': + form = MailTemplateForm(request.POST, request.FILES, instance=template) + if form.is_valid(): + form.save() + return redirect('web.views.mail_templates') + else: + form = MailTemplateForm(instance=template) + + return wrap_response(request, 'mail_templates/edit.html', {'form': form, 'mail_template': template}) class MailTemplatesDeleteView(DeleteView, WrappedView): model = MailTemplate @@ -62,16 +78,6 @@ class MailTemplatesDeleteView(DeleteView, WrappedView): messages.success(request, "Template deleted") return super(MailTemplatesDeleteView, self).delete(request, *args, **kwargs) - -class MailTemplatesEditView(UpdateView, WrappedView): - model = MailTemplate - success_url = reverse_lazy('web.views.mail_templates') - fields = '__all__' - success_message = "Template edited" - template_name = "mail_templates/edit.html" - context_object_name = "mail_template" - - def generate(request, mail_template_id, instance_id): mail_template = get_object_or_404(MailTemplate, id=mail_template_id) instance = get_object_or_404(CONTEXT_TYPES_MAPPING[mail_template.context], id=instance_id) @@ -84,20 +90,13 @@ def generate(request, mail_template_id, instance_id): response['Content-Disposition'] = 'attachment; filename={}.docx'.format(mail_template.name) return response - def generate_for_vouchers(request): ids = request.GET.get('voucher_id', '').split(',') vouchers = [] - languages = [] for voucher_id in ids: if voucher_id.isdigit(): - voucher = Voucher.objects.get(pk=int(voucher_id)) - vouchers.append(voucher) - try: - languages.extend(voucher.study_subject.subject.languages.all()) - except: #if no languages or no subject or no study subject - continue - templates = MailTemplate.get_voucher_mail_templates(list(set(languages)))[0] + vouchers.append(Voucher.objects.get(pk=int(voucher_id))) + templates = MailTemplate.get_voucher_mail_templates([])[0] output_stream = StringIO.StringIO() -- GitLab