improve trainee creation
This commit is contained in:
+17
-5
@@ -68,6 +68,8 @@ from django.forms.utils import from_current_timezone, to_current_timezone
|
|||||||
from crispy_forms.helper import FormHelper
|
from crispy_forms.helper import FormHelper
|
||||||
from crispy_forms.layout import Submit
|
from crispy_forms.layout import Submit
|
||||||
|
|
||||||
|
from dal import autocomplete
|
||||||
|
|
||||||
|
|
||||||
class SplitDateTimeFieldDefaultTime(SplitDateTimeField):
|
class SplitDateTimeFieldDefaultTime(SplitDateTimeField):
|
||||||
def compress(self, data_list):
|
def compress(self, data_list):
|
||||||
@@ -672,13 +674,23 @@ class UserUserForm(Form):
|
|||||||
first_name = CharField(max_length=255, required=True)
|
first_name = CharField(max_length=255, required=True)
|
||||||
last_name = CharField(max_length=255, required=True)
|
last_name = CharField(max_length=255, required=True)
|
||||||
grade = ModelChoiceField(UserGrades.objects.all(), required=False)
|
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 = 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
|
) # Needs to be a user/object ref
|
||||||
#
|
|
||||||
# class Meta:
|
#class Meta:
|
||||||
#
|
# widgets = {
|
||||||
# fields = ("username", "first_name", "last_name")
|
# "supervisor" : autocomplete.ModelSelect2(url='generic:supervisor-autocomplete')
|
||||||
|
# }
|
||||||
|
|
||||||
|
|
||||||
class SupervisorForm(ModelForm):
|
class SupervisorForm(ModelForm):
|
||||||
|
|||||||
+30
@@ -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 %}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
{% for i in "123456"|make_list %}
|
{% for i in "123456"|make_list %}
|
||||||
<a href='{% url "trainees_grade" "ST"|add:i %}'>ST{{i}}</a>{% if not forloop.last %}, {% endif %}
|
<a href='{% url "trainees_grade" "ST"|add:i %}'>ST{{i}}</a>{% if not forloop.last %}, {% endif %}
|
||||||
{% endfor %}
|
{% 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>
|
<h2>
|
||||||
{% if grade %}
|
{% if grade %}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{% extends "generic/base.html" %}
|
{% extends "generic/base.html" %}
|
||||||
<!-- {% load static from static %} -->
|
<!-- {% load static from static %} -->
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
|
||||||
{% block css %}
|
{% block css %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -13,8 +14,8 @@
|
|||||||
<!-- {{ form.media }} -->
|
<!-- {{ form.media }} -->
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h2>Edit User / {{ciduser.cid}}</h2>
|
<h2>Create User</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).
|
Use this form to create a user. Create a trainee <a href="{% url 'create_trainee' %}">here</a>.
|
||||||
{% if errors %}
|
{% if errors %}
|
||||||
<div class="alert alert-info" role="alert">{{errors}}</a></div>
|
<div class="alert alert-info" role="alert">{{errors}}</a></div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -22,7 +23,7 @@ Use this form to create a user. Only existing supervisors can be added (<a href=
|
|||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
{{ form.as_table }}
|
{{ form|crispy }}
|
||||||
</table>
|
</table>
|
||||||
<input type="submit" class="submit-button" value="Submit" name="submit">
|
<input type="submit" class="submit-button" value="Submit" name="submit">
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
+8
-1
@@ -1,6 +1,6 @@
|
|||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
|
|
||||||
from generic.models import Examination
|
from generic.models import Examination, Supervisor
|
||||||
from . import views
|
from . import views
|
||||||
from generic.views import ExamViews as GenericExamViews, GenericViewBase
|
from generic.views import ExamViews as GenericExamViews, GenericViewBase
|
||||||
|
|
||||||
@@ -42,6 +42,13 @@ urlpatterns = [
|
|||||||
),
|
),
|
||||||
name="examination-autocomplete",
|
name="examination-autocomplete",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"supervisor-autocomplete",
|
||||||
|
views.SupervisorAutocomplete.as_view(
|
||||||
|
model=Supervisor
|
||||||
|
),
|
||||||
|
name="supervisor-autocomplete",
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"cids/manage/<int:pk>/update", views.CidUserUpdate.as_view(), name="update_cid"
|
"cids/manage/<int:pk>/update", views.CidUserUpdate.as_view(), name="update_cid"
|
||||||
),
|
),
|
||||||
|
|||||||
+42
-9
@@ -53,7 +53,7 @@ from generic.mixins import CheckCanEditMixin, SuperuserRequiredMixin
|
|||||||
|
|
||||||
import zipfile
|
import zipfile
|
||||||
from django.core.files.base import ContentFile
|
from django.core.files.base import ContentFile
|
||||||
|
from django.db.models import Q
|
||||||
|
|
||||||
from .forms import (
|
from .forms import (
|
||||||
CidGroupExamForm,
|
CidGroupExamForm,
|
||||||
@@ -65,6 +65,7 @@ from .forms import (
|
|||||||
CidUserGroupForm,
|
CidUserGroupForm,
|
||||||
ExaminationMergeForm,
|
ExaminationMergeForm,
|
||||||
SupervisorForm,
|
SupervisorForm,
|
||||||
|
TraineeForm,
|
||||||
UserGroupExamForm,
|
UserGroupExamForm,
|
||||||
CidGroupExamForm,
|
CidGroupExamForm,
|
||||||
UserUserForm,
|
UserUserForm,
|
||||||
@@ -2608,6 +2609,23 @@ class ExaminationAutocomplete(autocomplete.Select2QuerySetView):
|
|||||||
return Examination.objects.none()
|
return Examination.objects.none()
|
||||||
|
|
||||||
return qs
|
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):
|
class CidUserExamView(CidManagerRequiredMixin, SingleTableMixin, FilterView):
|
||||||
@@ -3364,12 +3382,24 @@ def trainees(request, grade: None|str=None):
|
|||||||
|
|
||||||
return render(request, "generic/trainees.html", context)
|
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 this is a POST request we need to process the form data
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
# create a form instance and populate it with data from the request:
|
# 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:
|
# check whether it's valid:
|
||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
try:
|
try:
|
||||||
user_dict = {
|
user_dict = {
|
||||||
@@ -3385,19 +3415,19 @@ def create_user(request, context=None):
|
|||||||
errors = f"Unable to create account: {error}"
|
errors = f"Unable to create account: {error}"
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"generic/user_creation_form.html",
|
form_template,
|
||||||
{"form": form, "errors": errors},
|
{"form": form, "errors": errors},
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
user_profile = UserProfile.objects.get(user=new_user)
|
user_profile = UserProfile.objects.get(user=new_user)
|
||||||
user_profile.peninsula_trainee = True
|
user_profile.peninsula_trainee = trainee
|
||||||
|
|
||||||
if request.POST["grade"]:
|
if request.POST["grade"]:
|
||||||
grade = UserGrades.objects.get(pk=request.POST["grade"])
|
grade = UserGrades.objects.get(pk=request.POST["grade"])
|
||||||
user_profile.grade = 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"])
|
supervisor = Supervisor.objects.get(pk=request.POST["supervisor"])
|
||||||
user_profile.supervisor = supervisor
|
user_profile.supervisor = supervisor
|
||||||
|
|
||||||
@@ -3407,7 +3437,7 @@ def create_user(request, context=None):
|
|||||||
errors = f"Unable to create account profile {error}"
|
errors = f"Unable to create account profile {error}"
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"generic/user_creation_form.html",
|
form_template,
|
||||||
{"form": form, "errors": errors},
|
{"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
|
# if a GET (or any other method) we'll create a blank form
|
||||||
else:
|
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):
|
class SupervisorDetail(CidManagerRequiredMixin, DetailView):
|
||||||
|
|||||||
@@ -75,6 +75,9 @@ urlpatterns = [
|
|||||||
path(
|
path(
|
||||||
"accounts/create/", generic_views.create_user, name="create_user"
|
"accounts/create/", generic_views.create_user, name="create_user"
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"accounts/trainees/create/", generic_views.create_trainee, name="create_trainee"
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"accounts/trainees/", generic_views.trainees, name="trainees"
|
"accounts/trainees/", generic_views.trainees, name="trainees"
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user