Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
views.py 10.04 KiB
from __future__ import unicode_literals
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect, render
from django.http import HttpResponse
from django.template import loader
from django.views import generic
from .models import *
from .forms import *
from .auth import * # Own wrapper for django logging in/out
from django.forms import modelformset_factory
from django.shortcuts import render
from django.db.models import Q
import collections
import datetime

# See https://docs.djangoproject.com/en/1.10/topics/http/views/#customizing-error-views
# They should work ONLY in production! (DEBUG=False)
handler404 = 'web.views.e404_page_not_found'
handler500 = 'web.views.e500_error'
handler403 = 'web.views.e403_permission_denied'
handler400 = 'web.views.e400_bad_request'


def index(request):
	if request.user.is_authenticated():
		return redirect(appointments)
	return redirect(login)


def e404_page_not_found(request):
	return render(request, "errors/404.html", context)

def e500_error(request):
	return render(request, "errors/500.html", context)

def e403_permission_denied(request):
	return render(request, "errors/403.html", context)

def e400_bad_request(request):
	return render(request, "errors/400.html", context)


def login(request):
	context = {
		'state' : 'initial'
	}
	if request.GET and request.GET.get('error'):
		context['state'] = request.GET.get('error')

	if request.method == "POST" and request.POST:
		state, message = do_login(request)
		if state == True:
			return redirect(appointments)
		else:
			return redirect('/login?error=' + message)

	return render(request, "login.html", context)


"""
Saturates response with information about logged user
"""
@login_required
def wrap_response(request, template, params):
	person, role = Worker.get_details(request.user)

	final_params = params.copy()
	final_params.update({
		'person' : person,
		'role': role
	})

	return render(request, template, final_params)


def logout(request):
	state, message = do_logout(request)
	return redirect('/login?error=' + message)



def visits(request):
	visit_list = Visit.objects.order_by('-datetime_begin')
	context = {
		'visit_list': visit_list
	}

	return wrap_response(request, 'visits/index.html', context)


def visit_details(request, id):
	displayedVisit = Visit.objects.get(id=id)
	visFinished = displayedVisit.is_finished
	vid = displayedVisit.id
	displayedSubject = displayedVisit.subject
	listOfAppointments = displayedVisit.appointment_set.all()
	vform = VisitDetailForm(instance=displayedVisit)
	sform = SubjectDetailForm(instance=displayedSubject)

	return wrap_response(request, 'visits/details.html', {'vform': vform, 'sform': sform, 'loApp': listOfAppointments, 'visFinished': visFinished, 'vid': vid})


def visit_add(request):
	if request.method == 'POST':
		form = VisitAddForm(request.POST, request.FILES)
		if form.is_valid():
			form.save()
			return redirect(visits)
	else:
		form = VisitAddForm()

	return wrap_response(request, 'visits/add.html', {'form': form})


def subjects(request):
	subjects_list = Subject.objects.order_by('-last_name')
	context = {
		'subjects_list': subjects_list
	}

	return wrap_response(request, 'subjects/index.html', context)

def subject_add(request):
	if request.method == 'POST':
		form = SubjectAddForm(request.POST, request.FILES)
		if form.is_valid():
			screening_number = form.cleaned_data['screening_number']
			if screening_number == '':
				screening_number = get_new_screening_number()
			form.save()
			return redirect(subjects)
	else:
		form = SubjectAddForm()

	return wrap_response(request, 'subjects/add.html', {'form': form})


def subject_details(request, id):
	form = SubjectDetailForm(instance=Subject.objects.get(id=id))
	sid = id

	return wrap_response(request, 'subjects/details.html', {'form': form, 'sid': sid})


def subject_edit(request, id):
	if request.method == 'POST':
		form = SubjectEditForm(request.POST, request.FILES, instance=Subject.objects.get(id=id))
		if form.is_valid():
			form.save()
			return redirect(subjects)
	else:
		form = SubjectEditForm(instance=Subject.objects.get(id=id))
	return wrap_response(request, 'subjects/edit.html', {'form': form, 'id':id})


def subject_delete(request, id):
    if request.method == 'POST':
		Subject.objects.get(id=id).delete()
		return redirect(subjects)
    else:
		form = SubjectEditForm(instance=Subject.objects.get(id=id))
    return wrap_response(request, 'subjects/delete.html', {'form': form})


def subject_mark(request, id, as_what):
	who = Subject.objects.get(id=id)
	if as_what == 'dead':
		who.mark_as_dead()
	elif as_what == 'rejected':
		who.mark_as_rejected()
	return redirect(subject_edit, id=id)

def subject_visit_details(request, id):

	locsubject = Subject.objects.get(id=id)
	visits = locsubject.visit_set.all()
	endlist = []
	for vis in visits:
		assign = vis.appointment_set.all()
		print assign
		finished = vis.is_finished
		visid = vis.id
		visform = VisitDetailForm(instance=vis)
		endlist.append((visform,assign,finished,visid))

	#print len(endlist)
	#print endlist[0]
	return wrap_response(request, 'subjects/visitdetails.html', {'display': endlist})

def doctors(request):
	doctors_list = Worker.objects.order_by('-last_name')
	context = {
		'doctors_list': doctors_list
	}

	return wrap_response(request, "doctors/index.html", context)


def doctor_add(request):
	if request.method == 'POST':
		form = WorkerAddForm(request.POST, request.FILES)
		if form.is_valid():
			form.save()
			return redirect(doctors)
	else:
		form = WorkerAddForm()

	return wrap_response(request, 'doctors/add.html', {'form': form})



def doctor_edit(request, doctor_id):
	if request.method == 'POST':
		form = WorkerEditForm(request.POST, request.FILES, instance=Worker.objects.get(id=doctor_id))
		if form.is_valid():
			form.save()
			return redirect(doctors)
	else:
		form = WorkerEditForm(instance=Worker.objects.get(id=doctor_id))
	return wrap_response(request, 'doctors/edit.html', {'form': form})


def doctor_details(request, doctor_id):
	form = WorkerDetailForm(instance=Worker.objects.get(id=doctor_id))

	return wrap_response(request, 'doctors/details.html', {'form': form})


def doctor_availability(request, doctor_id):
	avall = Avaibility.objects.filter(person=doctor_id)

	avmon = avall.filter(day_number=1)
	avtue = avall.filter(day_number=2)
	avwed = avall.filter(day_number=3)
	avthu = avall.filter(day_number=4)
	avfri = avall.filter(day_number=5)
	avsat = avall.filter(day_number=6)
	avsun = avall.filter(day_number=7)

	context = {
		'avmon': avmon,
		'avtue': avtue,
		'avwed': avwed,
		'avthu': avthu,
		'avfri': avfri,
		'avsat': avsat,
		'avsun': avsun,
		'id': doctor_id
	}

	return wrap_response(request, "doctors/availability_index.html", context)


def doctor_availability_delete(request, doctor_id, availability_id):
	availibility = Avaibility.objects.filter(id=availability_id)
	if len(availibility) > 0:
		availibility.delete()
	return redirect(doctoravail, id=doctor_id)


def equipment_def(request):
	equipment_list = Item.objects.order_by('-name')
	context = {
		'equipment_list': equipment_list
	}

	return wrap_response(request, "eqdef/index.html", context)


def equipment_and_rooms(request):
	return wrap_response(request, "equipment_and_rooms/index.html", {})


def mail_templates(request):
	return wrap_response(request, "mail_templates/index.html", {})


"""
#An initial draft of a function that was supposed to suggest date, room and worker for an appointment
def suggest_details(Appointment appoint):

	avaibleWorkers = Worker.objects.get()
	if appoint.appointment_type__required_worker == 'DOCTOR':
		avaibleWorkers.filter(role='DOCTOR')
	elif appoint.appointment_type__required_worker == 'NURSE':
		avaibleWorkers.filter(role__in=['DOCTOR','NURSE'])
	elif appoint.appointment_type__required_worker == 'PSYCHOLOGIST':
		avaibleWorkers.filter(role__in=['DOCTOR','PSYCHOLOGIST'])

	avaibleRooms = Room.objects.get
	requireditems = appoint.appointment_type.required_equipment.filter(is_fixed=True)
	reduce(operator.and_, (Q(equipment__contains=requireditems) for x in avaibleRooms))

"""


def appointments(request):
	futureDate = datetime.datetime.now()+datetime.timedelta(days=93)
	planning_list = Appointment.objects.filter(datetime_when__isnull=True, visit__datetime_begin__lt = futureDate)
	approaching_list = Appointment.objects.filter(datetime_when__gt = datetime.datetime.now())


	for plan in planning_list:
		plan.datetime_when = plan.visit.datetime_begin

	context = {
		'planning_list': planning_list,
		'approaching_list': approaching_list
	}

	return wrap_response(request, "appointments/index.html",context)

def appointment_details(request, id):
	form = AppointmentDetailForm(instance=Appointment.objects.get(id=id))
	return wrap_response(request, 'appointments/details.html', {'form': form})


def appointment_add(request, id):
	if request.method == 'POST':
		form = AppointmentAddForm(request.POST, request.FILES)
		form.fields['visit'].widget = forms.HiddenInput()
		if form.is_valid():
			form.save()
			return redirect(visit_details, id=id)
	else:
		form = AppointmentAddForm(initial={'visit': id})
		form.fields['visit'].widget = forms.HiddenInput()

	return wrap_response(request, 'appointments/add.html', {'form': form, 'visitID': id})

def appointment_edit(request, id):
	if request.method == 'POST':
		form = AppointmentEditForm(request.POST, request.FILES, instance=Appointment.objects.get(id=id))
		if form.is_valid():
			form.save()

			data = form.cleaned_data
			vis = data['visit']
			visit = Visit.objects.get(id=vis.id)
			visit.end_if_appointments_were_finished()

			return redirect(appointments)
	else:
		form = AppointmentEditForm(instance=Appointment.objects.get(id=id))
	return wrap_response(request, 'appointments/edit.html', {'form': form})


def appointment_edit_datetime(request, id):
	if request.method == 'POST':
		form = AppointmentEditForm(request.POST, request.FILES, instance=Appointment.objects.get(id=id))
		if form.is_valid():
			form.save()
			return redirect(appointments)
	else:
		obj = Appointment.objects.get(id=id)
		obj.datetime_when = obj.visit.datetime_begin
		form = AppointmentEditForm(instance=obj)
	return wrap_response(request, 'appointments/edit.html', {'form': form})