Add sync functionality for prerequisite users and enhance result display
This commit is contained in:
@@ -52,6 +52,15 @@
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
<button
|
||||
title="Sync users from all prerequisite collections into this collection"
|
||||
hx-post="{% url 'atlas:collection_sync_prerequisite_users' collection.pk %}"
|
||||
hx-swap="outerHTML"
|
||||
class="btn btn-sm btn-secondary"
|
||||
>Sync prerequisite users</button>
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
@@ -128,14 +137,6 @@
|
||||
<div id="user-list"></div>
|
||||
|
||||
</details>
|
||||
<p>
|
||||
<button
|
||||
title="Sync users from all prerequisite collections into this collection"
|
||||
hx-post="{% url 'atlas:collection_sync_prerequisite_users' collection.pk %}"
|
||||
hx-swap="outerHTML"
|
||||
class="btn btn-sm btn-secondary"
|
||||
>Sync prerequisite users</button>
|
||||
</p>
|
||||
{% endif %}
|
||||
{% include 'exam_overview_js.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
<div class="alert alert-success">
|
||||
<strong>Two-way sync complete</strong>
|
||||
<p>Total added: {{ total_added_cid }} CID(s), {{ total_added_user }} user(s), {{ total_added_cid_groups }} CID group(s), {{ total_added_user_groups }} user group(s).</p>
|
||||
<details>
|
||||
<summary>Per-collection changes ({{ per_collection_added|length }})</summary>
|
||||
<ul>
|
||||
{% for pk, added_cid, added_user, added_cid_groups, added_user_groups in per_collection_added %}
|
||||
<li>Collection {{ pk }}: +{{ added_cid }} CID(s), +{{ added_user }} user(s), +{{ added_cid_groups }} CID group(s), +{{ added_user_groups }} user group(s)</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</details>
|
||||
</div>
|
||||
+34
-3
@@ -3589,17 +3589,25 @@ def collection_sync_prerequisite_users(request, pk: int):
|
||||
# Compute the union of all cid users and user users across the set
|
||||
union_cid_users = set()
|
||||
union_user_users = set()
|
||||
union_cid_groups = set()
|
||||
union_user_groups = set()
|
||||
for col in collections:
|
||||
union_cid_users.update(list(col.valid_cid_users.all()))
|
||||
union_user_users.update(list(col.valid_user_users.all()))
|
||||
union_cid_groups.update(list(col.cid_user_groups.all()))
|
||||
union_user_groups.update(list(col.user_user_groups.all()))
|
||||
|
||||
# Apply the union to each collection and count additions
|
||||
total_added_cid = 0
|
||||
total_added_user = 0
|
||||
total_added_cid_groups = 0
|
||||
total_added_user_groups = 0
|
||||
per_collection_added = []
|
||||
for col in collections:
|
||||
added_cid = 0
|
||||
added_user = 0
|
||||
added_cid_groups = 0
|
||||
added_user_groups = 0
|
||||
for cid_user in union_cid_users:
|
||||
if not col.valid_cid_users.filter(pk=cid_user.pk).exists():
|
||||
col.valid_cid_users.add(cid_user)
|
||||
@@ -3608,16 +3616,39 @@ def collection_sync_prerequisite_users(request, pk: int):
|
||||
if not col.valid_user_users.filter(pk=user.pk).exists():
|
||||
col.valid_user_users.add(user)
|
||||
added_user += 1
|
||||
# Sync groups as well
|
||||
for gid in union_cid_groups:
|
||||
if not col.cid_user_groups.filter(pk=gid.pk).exists():
|
||||
col.cid_user_groups.add(gid)
|
||||
added_cid_groups += 1
|
||||
for ug in union_user_groups:
|
||||
if not col.user_user_groups.filter(pk=ug.pk).exists():
|
||||
col.user_user_groups.add(ug)
|
||||
added_user_groups += 1
|
||||
added_user += added_user_groups
|
||||
added_cid += added_cid_groups
|
||||
if added_cid or added_user:
|
||||
col.save()
|
||||
total_added_cid += added_cid
|
||||
total_added_user += added_user
|
||||
per_collection_added.append((col.pk, added_cid, added_user))
|
||||
total_added_cid_groups += added_cid_groups
|
||||
total_added_user_groups += added_user_groups
|
||||
per_collection_added.append((col.pk, added_cid, added_user, added_cid_groups, added_user_groups))
|
||||
|
||||
return HttpResponse(
|
||||
f"Two-way sync complete — total added: {total_added_cid} cid(s), {total_added_user} user(s)."
|
||||
html = render_to_string(
|
||||
"atlas/partials/sync_prereq_result.html",
|
||||
{
|
||||
"total_added_cid": total_added_cid,
|
||||
"total_added_user": total_added_user,
|
||||
"total_added_cid_groups": total_added_cid_groups,
|
||||
"total_added_user_groups": total_added_user_groups,
|
||||
"per_collection_added": per_collection_added,
|
||||
},
|
||||
request=request,
|
||||
)
|
||||
|
||||
return HttpResponse(html)
|
||||
|
||||
|
||||
def collection_reset_answers_user_list(request, exam_id: int):
|
||||
if request.htmx:
|
||||
|
||||
Reference in New Issue
Block a user