poli_planning/polyclinic_scheduling/apps/schedule/views.py

108 lines
4.5 KiB
Python

from django.shortcuts import render, redirect
from django.views.generic.list import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.decorators import login_required
from django.forms.models import model_to_dict
from .models import Schedule
from .forms import ScheduleForm
import json
# Create your views here.
class ScheduleListView(LoginRequiredMixin,ListView):
"""
This view will give a list of all entered schedules. The list is filtered on the logged in employee.
Only the schedules owned by the logged in user are shown.
The results are shown with 10 items per page. A pager will be shown when there are more then 10 schedules
"""
model = Schedule
paginate_by = 10
def get_queryset(self):
return Schedule.objects.filter(employee=self.request.user.employee).order_by('-created_at')
@login_required
def new_or_update_schedule(request, schedule_id = None):
"""
This view will create or update an existing schedule. At the moment there is not a real update, but a clone functionality.
So every schedule that is updated will be stored as a new schedule.
Only schedules owned by the logged in user can be loaded here and can be cloned.
The data of the form is stored as a JSON object in a single database field for more flexibility.
Arguments:
request HttpRequest -- This is the HTTP request from the Django framework. This will hold the current logged in user info.
Keyword Arguments:
schedule_id Schedule -- This is the schedule to be edited. When none, a new schedule will be created (default: {None})
Returns:
A view with an empty form to create a new schedule or a prefilled form for cloning.
"""
template_name = 'schedule/schedule_new.html'
schedule = None
if schedule_id is not None:
try:
# Try loading an existing schedule. Make sure you only load a schedule that is owned by the logged in user!
schedule = Schedule.objects.get(pk = schedule_id, employee = request.user.employee)
except Schedule.DoesNotExist:
# Schedule does not exist, or you do not own the schedule you try to load. Stop playing around on the url bar ;)
pass
if request.method == 'POST':
# Load the form data
schedule_form = ScheduleForm(request.POST)
# Check if minimal input fields are correct
if schedule_form.is_valid():
# First time saving. Create a new, empty schedule
# Or when the existing schedule has NOT 'draft' status, which means we are cloning an existing schedule
if schedule is None or schedule.status != Schedule.ScheduleStatus.DRAFT:
schedule = Schedule()
# Set the schedule status based on the form pressed button. Either new or draft status
schedule.status = Schedule.ScheduleStatus.DRAFT if schedule_form.cleaned_data['status'] == 'draft' else Schedule.ScheduleStatus.NEW
try:
# Try loading the JSON data from the form
schedule.planning_source = json.loads(schedule_form.cleaned_data['json'])
except json.JSONDecodeError as ex:
# Something when wrong. The error is saved instead, and can be read out in the admin area
schedule.planning_source = json.loads(json.dumps({'error': str(ex)}))
schedule.status = Schedule.ScheduleStatus.INVALID
# Make sure that the logged in user that is creating the schedule does become the owner
schedule.employee = request.user.employee
# Store name of the schedule
schedule.name = schedule_form.cleaned_data['name']
# Store email address for the results
schedule.email = schedule_form.cleaned_data['email']
# Save the schedule to the database
schedule.save()
# Return to overview
return redirect('schedule:list')
else:
# We start with a new form. Either new of clone/edit
status = 'new'
json_form = ''
if schedule is not None:
# The schedule is an existing one. So we are in clone/edit mode. So load the current status and JSON data
status = schedule.status
json_form = json.dumps(schedule.planning_source)
# Create the from logic
schedule_form = ScheduleForm(initial={'json' : json_form, 'status' : status})
# Show the form in the browser
return render(request, template_name, {
'form' : schedule_form,
})