Skip to content
Snippets Groups Projects
Commit be760fa3 authored by Valentin Groues's avatar Valentin Groues :eyes:
Browse files

mail generation - #20

parent 6cbf0e47
No related branches found
No related tags found
1 merge request!45Resolve "Automatic post mail creation"
Pipeline #
import datetime
import locale
import tempfile
import os
from django.test import TestCase
from functions import get_resource_path
from web.docx_helper import process_file
class TestDocxProcessor(TestCase):
def test_process_file(self):
template_path = get_resource_path('template.docx')
locale.setlocale(locale.LC_TIME, "fr_FR")
output_path = tempfile.mktemp()
changes = {
"##SIR##": "Mr",
"##NAME##": "Jan",
"##SURNAME##": "Weglarz",
"##ADDRESS1##": "Piotrowo 23",
"##ADDRESS2##": "61-234, Poznan",
"##COUNTRY##": "POLAND",
"##CONTENT##": "1",
"##DATE##": datetime.datetime.now().date().strftime("%A %-d %B %Y"),
}
process_file(template_path, output_path, changes)
self.assertTrue(os.path.isfile(output_path))
os.remove(output_path)
......@@ -68,7 +68,8 @@ urlpatterns = [
# CONTACTS #
####################
url(r'^subjects/(?P<subject_id>\d+)/contacts/add$', views.contact_attempt.contact_add, name='web.views.contact_add'),
url(r'^subjects/(?P<subject_id>\d+)/contacts/add$', views.contact_attempt.contact_add,
name='web.views.contact_add'),
####################
# DOCTORS #
......@@ -100,7 +101,26 @@ urlpatterns = [
# MAIL #
####################
url(r'^mail_templates$', views.mails.mail_templates, name='web.views.mail_templates'),
url(r'^mail_templates_old$', views.mails.mail_templates, name='web.views.mail_templates_old'),
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/(?P<mail_template_id>\d+)/generate/(?P<instance_id>\d+)$', views.mails.generate,
name="web.views.mail_template_generate"),
####################
# LANGUAGES #
####################
url(r'^languages$', views.language.LanguageListView.as_view(), name='web.views.languages'),
url(r'^languages/add$', views.language.LanguageCreateView.as_view(), name='web.views.language_add'),
url(r'^languages/(?P<pk>\d+)/delete$', views.language.LanguageDeleteView.as_view(),
name='web.views.language_delete'),
url(r'^languages/(?P<pk>\d+)/edit$', views.language.LanguageEditView.as_view(),
name='web.views.language_edit'),
####################
# STATISTICS #
......
......@@ -2,6 +2,7 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect, render
from django.views.generic.base import ContextMixin
from notifications import get_notifications
from ..models import Worker
......@@ -36,18 +37,26 @@ def e400_bad_request(request, context=None):
@login_required
def wrap_response(request, template, params):
person, role = Worker.get_details(request.user)
final_params = extend_context(params, request)
return render(request, template, final_params)
notifications = get_notifications(request.user)
def extend_context(params, request):
person, role = Worker.get_details(request.user)
notifications = get_notifications(request.user)
final_params = params.copy()
final_params.update({
'person': person,
'role': role,
'notifications': notifications
})
return final_params
return render(request, template, final_params)
class WrappedView(ContextMixin):
def get_context_data(self, **kwargs):
context = super(WrappedView, self).get_context_data(**kwargs)
return extend_context(context, self.request)
import auth
......@@ -62,3 +71,4 @@ import statistics
import export
import contact_attempt
import configuration_item
import language
# coding=utf-8
from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect
from . import wrap_response
from ..forms import AppointmentDetailForm, AppointmentAddForm, AppointmentEditForm, SubjectEditForm
from ..models import Appointment, Subject
from ..models import Appointment, Subject, MailTemplate
APPOINTMENT_LIST_GENERIC = "GENERIC"
APPOINTMENT_LIST_UNFINISHED = "UNFINISHED"
......@@ -81,6 +82,9 @@ def appointment_edit(request, id):
subject.information_sent = True
subject.save()
messages.success(request, "Modifications saved")
if '_continue' in request.POST:
return redirect('web.views.appointment_edit', id=the_appointment.id)
if (the_appointment.status != Appointment.APPOINTMENT_STATUS_SCHEDULED) and (
the_appointment.visit is not None):
return redirect('web.views.visit_details', id=the_appointment.visit.id)
......@@ -91,9 +95,16 @@ def appointment_edit(request, id):
if the_appointment.visit is not None:
subject_form = SubjectEditForm(instance=the_appointment.visit.subject, prefix="subject")
languages = []
if the_appointment.visit is not None:
subject = the_appointment.visit.subject
if subject.default_written_communication_language:
languages.append(subject.default_written_communication_language)
languages.extend(subject.languages.all())
return wrap_response(request, 'appointments/edit.html', {
'form': appointment_form,
'subject_form': subject_form,
'id': id,
'appointment': the_appointment
'appointment': the_appointment,
'mail_templates': MailTemplate.get_appointment_mail_templates(languages)
})
# coding=utf-8
from django.contrib import messages
from django.urls import reverse_lazy
from django.views.generic import CreateView
from django.views.generic import DeleteView
from django.views.generic import ListView
from django.views.generic import UpdateView
from . import WrappedView
from ..models import Language
class LanguageListView(ListView, WrappedView):
model = Language
context_object_name = "languages"
template_name = 'languages/list.html'
class LanguageCreateView(CreateView, WrappedView):
model = Language
template_name = "languages/add.html"
fields = '__all__'
success_url = reverse_lazy('web.views.languages')
success_message = "Template created"
class LanguageDeleteView(DeleteView, WrappedView):
model = Language
success_url = reverse_lazy('web.views.languages')
template_name = 'languages/confirm_delete.html'
def delete(self, request, *args, **kwargs):
messages.success(request, "Template deleted")
return super(LanguageDeleteView, self).delete(request, *args, **kwargs)
class LanguageEditView(UpdateView, WrappedView):
model = Language
success_url = reverse_lazy('web.views.languages')
fields = '__all__'
success_message = "Template edited"
template_name = "languages/edit.html"
context_object_name = "language"
def generate(request, mail_template_id, instance_id):
return None
# coding=utf-8
from . import wrap_response
import StringIO
from wsgiref.util import FileWrapper
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.urls import reverse_lazy
from django.views.generic import CreateView
from django.views.generic import DeleteView
from django.views.generic import ListView
from django.views.generic import UpdateView
from . import wrap_response, WrappedView
from ..models import Subject, Visit, Appointment, MailTemplate
from ..models.constants import MAIL_TEMPLATE_CONTEXT_SUBJECT, MAIL_TEMPLATE_CONTEXT_VISIT, \
MAIL_TEMPLATE_CONTEXT_APPOINTMENT
MIMETYPE_DOCX = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
CONTEXT_TYPES_MAPPING = {
MAIL_TEMPLATE_CONTEXT_SUBJECT: Subject,
MAIL_TEMPLATE_CONTEXT_VISIT: Visit,
MAIL_TEMPLATE_CONTEXT_APPOINTMENT: Appointment
}
def mail_templates(request):
return wrap_response(request, "mail_templates/index.html", {})
class MailTemplatesListView(ListView, WrappedView):
model = MailTemplate
context_object_name = "mail_templates"
template_name = 'mail_templates/list.html'
def get_context_data(self, **kwargs):
context = super(MailTemplatesListView, self).get_context_data()
context['explanations'] = {"generic": MailTemplate.MAILS_TEMPLATE_GENERIC_TAGS,
"subject": MailTemplate.MAILS_TEMPLATE_SUBJECT_TAGS,
"visit": MailTemplate.MAILS_TEMPLATE_VISIT_TAGS,
"appointment": MailTemplate.MAILS_TEMPLATE_APPOINTMENT_TAGS,
}
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"
class MailTemplatesDeleteView(DeleteView, WrappedView):
model = MailTemplate
success_url = reverse_lazy('web.views.mail_templates')
template_name = 'mail_templates/confirm_delete.html'
def delete(self, request, *args, **kwargs):
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"
@login_required
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)
stream = StringIO.StringIO()
stream = mail_template.apply(instance, request.user, stream)
file_size = stream.tell()
stream.seek(0)
response = HttpResponse(FileWrapper(stream), content_type=MIMETYPE_DOCX)
response['Content-Length'] = file_size
response['Content-Disposition'] = 'attachment; filename={}.docx'.format(mail_template.name)
return response
......@@ -2,15 +2,15 @@
from django.contrib import messages
from django.shortcuts import redirect, get_object_or_404
from notifications import get_subjects_with_no_visit, get_subjects_with_reminder
from . import wrap_response
from ..forms import SubjectAddForm, SubjectEditForm, VisitDetailForm, get_prefix_screening_number
from ..models import Subject, Worker
from ..models import Subject, Worker, MailTemplate
SUBJECT_LIST_GENERIC = "GENERIC"
SUBJECT_LIST_NO_VISIT = "NO_VISIT"
SUBJECT_LIST_REQUIRE_CONTACT = "REQUIRE_CONTACT"
def subjects(request):
context = {
'list_type': SUBJECT_LIST_GENERIC,
......@@ -61,14 +61,23 @@ def subject_edit(request, id):
the_subject.mark_as_dead()
if form.cleaned_data['resigned'] and not was_resigned:
the_subject.mark_as_resigned()
messages.success(request, "Modifications saved")
if '_continue' in request.POST:
return redirect('web.views.subject_edit', id=the_subject.id)
return redirect('web.views.subjects')
else:
form = SubjectEditForm(instance=the_subject, was_dead=was_dead, was_resigned=was_resigned)
languages = []
if the_subject.default_written_communication_language:
languages.append(the_subject.default_written_communication_language)
languages.extend(the_subject.languages.all())
return wrap_response(request, 'subjects/edit.html', {
'form': form,
'subject': the_subject,
'contact_attempts': contact_attempts
'contact_attempts': contact_attempts,
'mail_templates': MailTemplate.get_subject_mail_templates(languages)
})
......
......@@ -6,7 +6,7 @@ from notifications import get_active_visits_with_missing_appointments, get_unfin
waiting_for_appointment
from . import wrap_response
from ..forms import VisitDetailForm, SubjectDetailForm, VisitAddForm
from ..models import Visit, Appointment, Subject
from ..models import Visit, Appointment, Subject, MailTemplate
def visits(request):
......@@ -61,6 +61,10 @@ def visit_details(request, id):
can_finish = False
subject_form = SubjectDetailForm(instance=displayed_subject)
languages = []
if displayed_subject.default_written_communication_language:
languages.append(displayed_subject.default_written_communication_language)
languages.extend(displayed_subject.languages.all())
return wrap_response(request, 'visits/details.html', {
'vform': visit_form,
......@@ -69,7 +73,8 @@ def visit_details(request, id):
'visFinished': visit_finished,
'canFinish': can_finish,
'vid': visit_id,
'visit': displayed_visit})
'visit': displayed_visit,
'mail_templates': MailTemplate.get_visit_mail_templates(languages)})
def visit_mark(request, id, as_what):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment