Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
visit.py 3.92 KiB
# coding=utf-8
import logging

from django.shortcuts import get_object_or_404, redirect

from notifications import waiting_for_appointment
from web.models.study_visit_list import VISIT_LIST_GENERIC, VISIT_LIST_MISSING_APPOINTMENTS, \
    VISIT_LIST_APPROACHING_WITHOUT_APPOINTMENTS, VISIT_LIST_APPROACHING_FOR_MAIL_CONTACT, VISIT_LIST_EXCEEDED_TIME, \
    VISIT_LIST_UNFINISHED, VISIT_LIST_CHOICES
from . import wrap_response
from ..forms import VisitDetailForm, VisitAddForm, SubjectDetailForm, StudySubjectDetailForm
from ..models import Visit, Appointment, StudySubject, MailTemplate

logger = logging.getLogger(__name__)


def show_visits(request, visit_list_type):
    context = {
        'visit_list_type': visit_list_type,
        'list_description': VISIT_LIST_CHOICES[visit_list_type]
    }
    return wrap_response(request, 'visits/index.html', context)


def visits(request):
    return show_visits(request, VISIT_LIST_GENERIC)


def visits_with_missing_appointments(request):
    return show_visits(request, VISIT_LIST_MISSING_APPOINTMENTS)


def approaching_visits_without_appointments(request):
    return show_visits(request, VISIT_LIST_APPROACHING_WITHOUT_APPOINTMENTS)


def approaching_visits_for_mail_contact(request):
    return show_visits(request, VISIT_LIST_APPROACHING_FOR_MAIL_CONTACT)


def exceeded_visits(request):
    return show_visits(request, VISIT_LIST_EXCEEDED_TIME)


def unfinished_visits(request):
    return show_visits(request, VISIT_LIST_UNFINISHED)


def visit_details(request, id):
    displayed_visit = get_object_or_404(Visit, id=id)
    if request.method == 'POST':
        visit_form = VisitDetailForm(request.POST, request.FILES, instance=displayed_visit)
        if visit_form.is_valid():
            visit_form.save()
    else:
        visit_form = VisitDetailForm(instance=displayed_visit)

    visit_finished = displayed_visit.is_finished
    visit_id = displayed_visit.id
    study_subject = displayed_visit.subject
    list_of_appointments = displayed_visit.appointment_set.all()

    can_finish = not waiting_for_appointment(displayed_visit)

    for appointment in list_of_appointments:
        if appointment.status == Appointment.APPOINTMENT_STATUS_SCHEDULED:
            can_finish = False

    study_subject_form = StudySubjectDetailForm(instance=study_subject)
    subject_form = SubjectDetailForm(instance=study_subject.subject)
    languages = []
    if study_subject.subject.default_written_communication_language:
        languages.append(study_subject.subject.default_written_communication_language)
    languages.extend(study_subject.subject.languages.all())

    return wrap_response(request, 'visits/details.html', {
        'default_visit_duration' : study_subject.study.default_visit_duration_in_months,
        'visit_form': visit_form,
        'study_subject_form': study_subject_form,
        'subject_form': subject_form,
        'loApp': list_of_appointments,
        'visFinished': visit_finished,
        'canFinish': can_finish,
        'vid': visit_id,
        'visit': displayed_visit,
        'mail_templates': MailTemplate.get_visit_mail_templates(languages)})


def visit_mark(request, id, as_what):
    visit = get_object_or_404(Visit, id=id)
    if as_what == 'finished':
        visit.mark_as_finished()

    return redirect('web.views.visit_details', id=id)


def visit_add(request, subject_id=-1):
    if request.method == 'POST':
        form = VisitAddForm(request.POST, request.FILES)
        args = {'form': form}
        if form.is_valid():
            visit = form.save()
            return redirect('web.views.visit_details', visit.id)
    else:
        subjects = StudySubject.objects.filter(id=subject_id)
        subject = None
        if len(subjects) > 0:
            subject = subjects[0]
        form = VisitAddForm(initial={'subject': subject})
        args = {'form': form, 'default_visit_duration': subject.study.default_visit_duration_in_months}

    return wrap_response(request, 'visits/add.html', args)