add some basic checks when batch creating users
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
<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 'create_trainee' %}" title="Click to add a trainee to the platform, creating an account for them.">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>)
|
||||||
|
(<a href="{% url 'accounts_bulk_create' %}" title="Click to create multiple trainees at once.">Bulk create</a>)
|
||||||
|
|
||||||
<h2>
|
<h2>
|
||||||
{% if grade %}
|
{% if grade %}
|
||||||
|
|||||||
@@ -72,6 +72,9 @@ urlpatterns = [
|
|||||||
path(
|
path(
|
||||||
"accounts/bulk_create/", views.accounts_bulk_create, name="accounts_bulk_create"
|
"accounts/bulk_create/", views.accounts_bulk_create, name="accounts_bulk_create"
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"accounts/bulk_create/check", views.accounts_bulk_create_check, name="accounts_bulk_create_check"
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"accounts/create/", generic_views.create_user, name="create_user"
|
"accounts/create/", generic_views.create_user, name="create_user"
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -730,6 +730,35 @@ def accounts_check_users(request):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@user_is_cid_user_manager
|
||||||
|
def accounts_bulk_create_check(request):
|
||||||
|
if not request.method == "POST":
|
||||||
|
return HttpResponse("Invalid request")
|
||||||
|
|
||||||
|
user = json.loads(request.POST.get("user"))
|
||||||
|
|
||||||
|
if User.objects.filter(username=user["email"]).exists():
|
||||||
|
return HttpResponse(format_html("<span class='error'>{}</span>", "User already exists"))
|
||||||
|
|
||||||
|
if not UserGrades.objects.filter(name=user["grade"]):
|
||||||
|
return HttpResponse(format_html("<span class='error'>{}</span>", "Invalid grade"))
|
||||||
|
|
||||||
|
if "supervisor_email" in user:
|
||||||
|
supervisor = Supervisor.objects.filter(email=user["supervisor_email"])
|
||||||
|
|
||||||
|
if not supervisor:
|
||||||
|
return HttpResponse("Ok, supervisor will be created")
|
||||||
|
|
||||||
|
if supervisor.count() > 1:
|
||||||
|
return HttpResponse(format_html("<span class='error'>{}</span>", "More than one supervisor with that email"))
|
||||||
|
|
||||||
|
if supervisor.first().name != user["supervisor_name"]:
|
||||||
|
return HttpResponse(format_html("<span class='error'>{}</span>", "Supervisor name does not match"))
|
||||||
|
|
||||||
|
return HttpResponse("OK, supervisor exists")
|
||||||
|
|
||||||
|
return HttpResponse("OK")
|
||||||
|
|
||||||
|
|
||||||
@user_is_cid_user_manager
|
@user_is_cid_user_manager
|
||||||
def accounts_bulk_create(request):
|
def accounts_bulk_create(request):
|
||||||
@@ -781,6 +810,7 @@ def accounts_bulk_create(request):
|
|||||||
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 = True
|
||||||
|
# TODO: check supervisor details are correct
|
||||||
if "supervisor_email" in user and "supervisor_name" in user:
|
if "supervisor_email" in user and "supervisor_name" in user:
|
||||||
s, created = Supervisor.objects.get_or_create(
|
s, created = Supervisor.objects.get_or_create(
|
||||||
email=user["supervisor_email"],
|
email=user["supervisor_email"],
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<p>Please note users created this way bypass some of the validations so check details such as email addresses are correct</p>
|
<p>Please note users created this way bypass some of the validations so check details such as email addresses are correct</p>
|
||||||
<textarea id="csv" placeholder="Paste users content here" style="width: 300px; height: 100px;"></textarea><br/>
|
<textarea id="csv" placeholder="Paste users content here" style="width: 300px; height: 100px;"></textarea><br/>
|
||||||
<input type="button" value="Load Data" onclick="createTable()" >
|
<input type="button" value="Load Data" _="on click createTable()" >
|
||||||
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
@@ -101,7 +101,14 @@
|
|||||||
myTbody.appendChild(myRow);
|
myTbody.appendChild(myRow);
|
||||||
users.push(user)
|
users.push(user)
|
||||||
emails.push(user.email)
|
emails.push(user.email)
|
||||||
$("#users-list").append(`<li>Name: ${user.first_name} ${user.last_name}<br/>Email: ${user.email}<br/>Grade: ${user.grade}<br/>Supervisor: ${user.supervisor_name}<br/>Supervisor email: ${user.supervisor_email}</li>`)
|
$("#users-list").append(`<li>Name: ${user.first_name} ${user.last_name}<br/>Email: ${user.email}<br/>Grade: ${user.grade}<br/>Supervisor: ${user.supervisor_name}<br/>Supervisor email: ${user.supervisor_email}<br/><button
|
||||||
|
hx-post="{% url 'accounts_bulk_create_check' %}"
|
||||||
|
hx-trigger="load"
|
||||||
|
hx-target="next span"
|
||||||
|
name="user"
|
||||||
|
class="hide"
|
||||||
|
value='${JSON.stringify(user)}'
|
||||||
|
>CHECK</button><span class="check-status"></span></li>`)
|
||||||
}
|
}
|
||||||
myTable.appendChild(myTbody);
|
myTable.appendChild(myTbody);
|
||||||
|
|
||||||
@@ -112,6 +119,10 @@
|
|||||||
|
|
||||||
$("#users-list").append(`${users.length} users to create.`)
|
$("#users-list").append(`${users.length} users to create.`)
|
||||||
|
|
||||||
|
// Make sure the new hyperscript works
|
||||||
|
_hyperscript.processNode($("#users-list")[0]);
|
||||||
|
htmx.process($("#users-list")[0]);
|
||||||
|
|
||||||
$("#user-list-json").val(JSON.stringify(users));
|
$("#user-list-json").val(JSON.stringify(users));
|
||||||
$("#submit-users").show();
|
$("#submit-users").show();
|
||||||
|
|
||||||
@@ -143,5 +154,18 @@
|
|||||||
margin: 10px;
|
margin: 10px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.check-status {
|
||||||
|
color: blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
color:red;
|
||||||
|
}
|
||||||
|
|
||||||
|
#users-list li:has(.error) {
|
||||||
|
border: 1px solid red;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
Reference in New Issue
Block a user