Add user content management views and templates for content review
This commit is contained in:
@@ -6877,3 +6877,87 @@ def supervisor_search(request):
|
||||
|
||||
return render(request, "generic/partials/supervisor_search_results.html", {"results": results, "row": row})
|
||||
|
||||
|
||||
@login_required
|
||||
@user_passes_test(lambda u: u.is_superuser or u.groups.filter(name__in=["content_moderator", "atlas_editor"]).exists())
|
||||
def user_content_list(request):
|
||||
"""
|
||||
Shows a list of all users with the ability to load the content they have created via htmx requests
|
||||
"""
|
||||
users = User.objects.annotate(
|
||||
content_count=Count("user_anatomy_exams", filter=Q(user_anatomy_exams__archive=False))
|
||||
+ Count("user_longs_exams", filter=Q(user_longs_exams__archive=False))
|
||||
+ Count("user_physics_exams", filter=Q(user_physics_exams__archive=False))
|
||||
+ Count("user_rapid_exams", filter=Q(user_rapid_exams__archive=False))
|
||||
+ Count("user_sba_exams", filter=Q(user_sba_exams__archive=False))
|
||||
+ Count("user_shorts_exams", filter=Q(user_shorts_exams__archive=False))
|
||||
).filter(content_count__gt=0)
|
||||
|
||||
return render(request, "generic/user_content_list.html", {"users": users})
|
||||
|
||||
|
||||
|
||||
@login_required
|
||||
@user_passes_test(lambda u: u.is_superuser or u.groups.filter(name__in=["content_moderator", "atlas_editor"]).exists())
|
||||
def user_content_review(request, user_id):
|
||||
"""
|
||||
HTMX partial to show content authored by a given user.
|
||||
Includes authored questions and authored exams for each app,
|
||||
plus atlas cases and case collections.
|
||||
"""
|
||||
user_obj = get_object_or_404(User, pk=user_id)
|
||||
|
||||
# Mapping of app -> (question_related_name, exam_author_related_name, display_label)
|
||||
APP_MAP = {
|
||||
"anatomy": ("anatomy_authored_questions", "anatomy_exam_author", "Anatomy"),
|
||||
"physics": ("physics_authored_questions", "physics_exam_author", "Physics"),
|
||||
"rapids": ("rapid_authored_questions", "rapid_exam_author", "Rapids"),
|
||||
"shorts": ("shorts_authored_questions", "shorts_exam_author", "Shorts"),
|
||||
"longs": ("long_authored_questions", "long_exam_author", "Longs"),
|
||||
"sbas": ("sbas_authored_questions", "sba_exam_author", "SBAs"),
|
||||
}
|
||||
|
||||
content = {}
|
||||
|
||||
for app_key, (q_rel, e_rel, label) in APP_MAP.items():
|
||||
questions = []
|
||||
exams = []
|
||||
try:
|
||||
questions = list(getattr(user_obj, q_rel).all().order_by("-pk")[:50])
|
||||
except Exception:
|
||||
questions = []
|
||||
|
||||
try:
|
||||
exams = list(getattr(user_obj, e_rel).all().filter(archive=False).order_by("-pk")[:50])
|
||||
except Exception:
|
||||
exams = []
|
||||
|
||||
content[app_key] = {
|
||||
"label": label,
|
||||
"questions": questions,
|
||||
"exams": exams,
|
||||
}
|
||||
|
||||
# Atlas authored content
|
||||
atlas_cases = []
|
||||
atlas_collections = []
|
||||
try:
|
||||
atlas_cases = list(user_obj.atlas_authored_cases.all().order_by("-pk")[:50])
|
||||
except Exception:
|
||||
atlas_cases = []
|
||||
try:
|
||||
atlas_collections = list(user_obj.casecollection_authored_cases.all().order_by("-pk")[:50])
|
||||
except Exception:
|
||||
atlas_collections = []
|
||||
|
||||
context = {
|
||||
"user_obj": user_obj,
|
||||
"content": content,
|
||||
"atlas_cases": atlas_cases,
|
||||
"atlas_collections": atlas_collections,
|
||||
}
|
||||
|
||||
# Render HTMX partial (or full page if not HTMX)
|
||||
template = "generic/partials/user_content_review.html"
|
||||
return render(request, template, context)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user