improve trainee creation

This commit is contained in:
Ross
2024-09-02 14:14:57 +01:00
parent a024d7fca7
commit 80412dcbe0
7 changed files with 105 additions and 19 deletions
+17 -5
View File
@@ -68,6 +68,8 @@ from django.forms.utils import from_current_timezone, to_current_timezone
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit
from dal import autocomplete
class SplitDateTimeFieldDefaultTime(SplitDateTimeField):
def compress(self, data_list):
@@ -672,13 +674,23 @@ class UserUserForm(Form):
first_name = CharField(max_length=255, required=True)
last_name = CharField(max_length=255, required=True)
grade = ModelChoiceField(UserGrades.objects.all(), required=False)
class TraineeForm(Form):
username = EmailField(
required=True,
help_text="Username / email should be the same. Ideally this should be an nhs email.",
)
first_name = CharField(max_length=255, required=True)
last_name = CharField(max_length=255, required=True)
grade = ModelChoiceField(UserGrades.objects.all(), required=False)
supervisor = ModelChoiceField(
Supervisor.objects.all(), required=False
Supervisor.objects.all(), required=False, widget=autocomplete.ModelSelect2(url='generic:supervisor-autocomplete')
) # Needs to be a user/object ref
#
# class Meta:
#
# fields = ("username", "first_name", "last_name")
#class Meta:
# widgets = {
# "supervisor" : autocomplete.ModelSelect2(url='generic:supervisor-autocomplete')
# }
class SupervisorForm(ModelForm):
+30
View File
@@ -0,0 +1,30 @@
{% extends "generic/base.html" %}
<!-- {% load static from static %} -->
{% load crispy_forms_tags %}
{% block css %}
{% endblock %}
{% block js %}
<!--<script type="text/javascript" src="/admin/jsi18n/"></script>-->
{{form.media}}
<script type="text/javascript">
</script>
<!-- {{ form.media }} -->
{% endblock %}
{% block content %}
<h2>Create Trainee</h2>
Use this form to create a user. Only existing supervisors can be added (<a href="{% url 'generic:supervisor_create' %}">create them first</a> and refresh this page or add them later if they do not exist).
{% if errors %}
<div class="alert alert-info" role="alert">{{errors}}</a></div>
{% endif %}
<form action="" method="post" enctype="multipart/form-data" id="condition-form">
{% csrf_token %}
<table>
{{ form|crispy }}
</table>
<input type="submit" class="submit-button" value="Submit" name="submit">
</form>
{% endblock %}
+1 -1
View File
@@ -9,7 +9,7 @@
{% for i in "123456"|make_list %}
<a href='{% url "trainees_grade" "ST"|add:i %}'>ST{{i}}</a>{% if not forloop.last %}, {% endif %}
{% endfor %}
<a href="{% url 'account_create' %}">Add trainee</a>
(<a href="{% url 'create_trainee' %}" title="Click to add a trainee to the platform, creating an account for them.">Add trainee</a>)
<h2>
{% if grade %}
@@ -1,5 +1,6 @@
{% extends "generic/base.html" %}
<!-- {% load static from static %} -->
{% load crispy_forms_tags %}
{% block css %}
{% endblock %}
@@ -13,8 +14,8 @@
<!-- {{ form.media }} -->
{% endblock %}
{% block content %}
<h2>Edit User / {{ciduser.cid}}</h2>
Use this form to create a user. Only existing supervisors can be added (<a href="{% url 'generic:supervisor_create' %}">create them first</a> and refresh this page or add them later if they do not exist).
<h2>Create User</h2>
Use this form to create a user. Create a trainee <a href="{% url 'create_trainee' %}">here</a>.
{% if errors %}
<div class="alert alert-info" role="alert">{{errors}}</a></div>
{% endif %}
@@ -22,7 +23,7 @@ Use this form to create a user. Only existing supervisors can be added (<a href=
{% csrf_token %}
<table>
{{ form.as_table }}
{{ form|crispy }}
</table>
<input type="submit" class="submit-button" value="Submit" name="submit">
</form>
+8 -1
View File
@@ -1,6 +1,6 @@
from django.urls import path, include
from generic.models import Examination
from generic.models import Examination, Supervisor
from . import views
from generic.views import ExamViews as GenericExamViews, GenericViewBase
@@ -42,6 +42,13 @@ urlpatterns = [
),
name="examination-autocomplete",
),
path(
"supervisor-autocomplete",
views.SupervisorAutocomplete.as_view(
model=Supervisor
),
name="supervisor-autocomplete",
),
path(
"cids/manage/<int:pk>/update", views.CidUserUpdate.as_view(), name="update_cid"
),
+42 -9
View File
@@ -53,7 +53,7 @@ from generic.mixins import CheckCanEditMixin, SuperuserRequiredMixin
import zipfile
from django.core.files.base import ContentFile
from django.db.models import Q
from .forms import (
CidGroupExamForm,
@@ -65,6 +65,7 @@ from .forms import (
CidUserGroupForm,
ExaminationMergeForm,
SupervisorForm,
TraineeForm,
UserGroupExamForm,
CidGroupExamForm,
UserUserForm,
@@ -2608,6 +2609,23 @@ class ExaminationAutocomplete(autocomplete.Select2QuerySetView):
return Examination.objects.none()
return qs
class SupervisorAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
# TODO: we should probably filter this to only
# allow access by trainees / other suprevisors
if not self.request.user.is_authenticated:
return Supervisor.objects.none()
qs = Supervisor.objects.all()
if self.q:
# This raises a fielderror which breaks creating a new item if not caught
try:
qs = qs.filter(Q(email__icontains=self.q) | Q(name__icontains=self.q))
except FieldError:
return Supervisor.objects.none()
return qs
class CidUserExamView(CidManagerRequiredMixin, SingleTableMixin, FilterView):
@@ -3364,12 +3382,24 @@ def trainees(request, grade: None|str=None):
return render(request, "generic/trainees.html", context)
def create_user(request, context=None):
def create_trainee(request, context=None):
return create_user(request, context, trainee=True)
@user_is_cid_user_manager
def create_user(request, context=None, trainee: bool=False):
if trainee:
form_template = "generic/trainee_creation_form.html"
else:
form_template = "generic/user_creation_form.html"
# if this is a POST request we need to process the form data
if request.method == "POST":
# create a form instance and populate it with data from the request:
form = UserUserForm(request.POST)
if trainee:
form = TraineeForm(request.POST)
else:
form = UserUserForm(request.POST)
# check whether it's valid:
if form.is_valid():
try:
user_dict = {
@@ -3385,19 +3415,19 @@ def create_user(request, context=None):
errors = f"Unable to create account: {error}"
return render(
request,
"generic/user_creation_form.html",
form_template,
{"form": form, "errors": errors},
)
try:
user_profile = UserProfile.objects.get(user=new_user)
user_profile.peninsula_trainee = True
user_profile.peninsula_trainee = trainee
if request.POST["grade"]:
grade = UserGrades.objects.get(pk=request.POST["grade"])
user_profile.grade = grade
if request.POST["supervisor"]:
if "supervisor" in request.POST and request.POST["supervisor"]:
supervisor = Supervisor.objects.get(pk=request.POST["supervisor"])
user_profile.supervisor = supervisor
@@ -3407,7 +3437,7 @@ def create_user(request, context=None):
errors = f"Unable to create account profile {error}"
return render(
request,
"generic/user_creation_form.html",
form_template,
{"form": form, "errors": errors},
)
@@ -3416,9 +3446,12 @@ def create_user(request, context=None):
# if a GET (or any other method) we'll create a blank form
else:
form = UserUserForm()
if trainee:
form = TraineeForm()
else:
form = UserUserForm()
return render(request, "generic/user_creation_form.html", {"form": form})
return render(request, form_template, {"form": form})
class SupervisorDetail(CidManagerRequiredMixin, DetailView):
+3
View File
@@ -75,6 +75,9 @@ urlpatterns = [
path(
"accounts/create/", generic_views.create_user, name="create_user"
),
path(
"accounts/trainees/create/", generic_views.create_trainee, name="create_trainee"
),
path(
"accounts/trainees/", generic_views.trainees, name="trainees"
),