diff --git a/anatomy/migrations/0066_remove_exam_stats_graph.py b/anatomy/migrations/0066_remove_exam_stats_graph.py new file mode 100644 index 00000000..9fc27cd8 --- /dev/null +++ b/anatomy/migrations/0066_remove_exam_stats_graph.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.13 on 2022-06-30 20:45 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('anatomy', '0065_exam_exam_results_emailed'), + ] + + operations = [ + migrations.RemoveField( + model_name='exam', + name='stats_graph', + ), + ] diff --git a/atlas/views.py b/atlas/views.py index 291055c5..9c77545f 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -1538,7 +1538,7 @@ def collection_scores_cid(request, pk): collection.stats_min = min(user_scores_list) collection.stats_max = max(user_scores_list) - collection.stats_graph = fig_html + #collection.stats_graph = fig_html collection.user_scores = user_scores diff --git a/generic/models.py b/generic/models.py index 6b58d2ac..97faa531 100644 --- a/generic/models.py +++ b/generic/models.py @@ -138,7 +138,7 @@ class ExamBase(models.Model): stats_max_possible = models.FloatField(default=0) - stats_graph = models.TextField(default=0) + #stats_graph = models.TextField(default=0) user_scores = models.JSONField(default=dict) diff --git a/generic/templates/generic/exam_report_email_status.html b/generic/templates/generic/exam_report_email_status.html new file mode 100644 index 00000000..aab2c940 --- /dev/null +++ b/generic/templates/generic/exam_report_email_status.html @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/generic/templates/generic/exam_scores_base.html b/generic/templates/generic/exam_scores_base.html index 13e60698..57d07dcb 100644 --- a/generic/templates/generic/exam_scores_base.html +++ b/generic/templates/generic/exam_scores_base.html @@ -92,8 +92,11 @@ User results emailed: {{exam.exam_results_emailed|default:"Never"}}
- +

Note: currently only works with registered users

+
@@ -135,9 +138,9 @@ evt.preventDefault(); }) - $("#email-results-check-button").click((evt) => { - window.location = "{% url exam.app_name|add:':exam_report_email_status' exam_id=exam.pk %}"; - }) + //$("#email-results-check-button").click((evt) => { + // window.location = "{% url exam.app_name|add:':exam_report_email_status' exam_id=exam.pk %}"; + //}) }) diff --git a/generic/views.py b/generic/views.py index 26b9d458..6dd4383f 100644 --- a/generic/views.py +++ b/generic/views.py @@ -588,8 +588,17 @@ class ExamViews(View, LoginRequiredMixin): for u in users: user = User.objects.get(pk=u) user_exam = exam.get_or_create_cid_user_exam(user_user=user) - status[user.username] = user_exam.results_emailed_status + status[user] = json.loads(user_exam.results_emailed_status) + return render( + request, + "generic/exam_report_email_status.html", + { + "exam": exam, + "status": status, + "app_name": self.app_name, + }, + ) return JsonResponse(status) @method_decorator(login_required) @@ -597,7 +606,7 @@ class ExamViews(View, LoginRequiredMixin): return self.exam_report_email(request, exam_id, unsent_only=True) @method_decorator(login_required) - def exam_report_email(self, request, exam_id, unsent_only=False): + def exam_report_email(self, request, exam_id, unsent_only=False, users=None): exam = get_object_or_404(self.Exam.objects.prefetch_related("author"), pk=exam_id) if request.user not in exam.author.all(): @@ -616,7 +625,8 @@ class ExamViews(View, LoginRequiredMixin): # We only need to send emails to those who have scores # (who should be in exam.user_scores) - users = [i[2:] for i in exam.user_scores if i.startswith("u/")] + if users is None: + users = [i[2:] for i in exam.user_scores if i.startswith("u/")] time = timezone.now() @@ -631,11 +641,11 @@ class ExamViews(View, LoginRequiredMixin): if additional_email: - email_results[user.username] = exam.email_user_results(user, additional_emails=[additional_email]) + email_results[user.pk] = exam.email_user_results(user, additional_emails=[additional_email]) else: - email_results[user.username] = exam.email_user_results(user) - email_results[user.username].append(f" {time}") - user_exam.results_emailed_status = json.dumps(email_results[user.username]) + email_results[user.pk] = exam.email_user_results(user) + email_results[user.pk].append(f"{time}") + user_exam.results_emailed_status = json.dumps(email_results[user.pk]) user_exam.save() @@ -646,20 +656,21 @@ class ExamViews(View, LoginRequiredMixin): @method_decorator(login_required) def exam_user_report_email(self, request, exam_id, user_id): + return self.exam_report_email(request, exam_id, users=[user_id]) # print(Exam.objects.all()) # exams = Exam.objects.all() # print("test", Exam.objects.all().get(id=pk)) - exam = get_object_or_404(self.Exam.objects.prefetch_related("author"), pk=exam_id) + #exam = get_object_or_404(self.Exam.objects.prefetch_related("author"), pk=exam_id) - u = get_object_or_404(User, pk=user_id) + #u = get_object_or_404(User, pk=user_id) - if request.user not in exam.author.all(): - if not self.check_user_access(request.user, exam_id): - raise PermissionDenied + #if request.user not in exam.author.all(): + # if not self.check_user_access(request.user, exam_id): + # raise PermissionDenied - res = exam.email_user_results(u) + #res = exam.email_user_results(u) - return HttpResponse(res) + #return HttpResponse(res) @method_decorator(login_required) def exam_user_report(self, request, exam_id, user_id): @@ -1654,7 +1665,7 @@ class ExamViews(View, LoginRequiredMixin): exam.stats_min = min(user_scores_list) exam.stats_max = max(user_scores_list) - exam.stats_graph = fig_html + #exam.stats_graph = fig_html user_data = {} for u in cids: diff --git a/longs/migrations/0064_remove_exam_stats_graph.py b/longs/migrations/0064_remove_exam_stats_graph.py new file mode 100644 index 00000000..a8e66f94 --- /dev/null +++ b/longs/migrations/0064_remove_exam_stats_graph.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.13 on 2022-06-30 20:45 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('longs', '0063_exam_exam_results_emailed'), + ] + + operations = [ + migrations.RemoveField( + model_name='exam', + name='stats_graph', + ), + ] diff --git a/physics/migrations/0026_remove_exam_stats_graph.py b/physics/migrations/0026_remove_exam_stats_graph.py new file mode 100644 index 00000000..2fcf499e --- /dev/null +++ b/physics/migrations/0026_remove_exam_stats_graph.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.13 on 2022-06-30 20:45 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('physics', '0025_exam_exam_results_emailed'), + ] + + operations = [ + migrations.RemoveField( + model_name='exam', + name='stats_graph', + ), + ] diff --git a/rad/settings.py b/rad/settings.py index aaec8123..c0c5a270 100644 --- a/rad/settings.py +++ b/rad/settings.py @@ -71,6 +71,7 @@ INSTALLED_APPS = [ "rest_framework", "tinymce", "django_unused_media", + "django_htmx", ] MIDDLEWARE = [ @@ -84,6 +85,8 @@ MIDDLEWARE = [ "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", "reversion.middleware.RevisionMiddleware", + "django_htmx.middleware.HtmxMiddleware", + ] ROOT_URLCONF = "rad.urls" diff --git a/rapids/migrations/0061_remove_exam_stats_graph.py b/rapids/migrations/0061_remove_exam_stats_graph.py new file mode 100644 index 00000000..736f6d4d --- /dev/null +++ b/rapids/migrations/0061_remove_exam_stats_graph.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.13 on 2022-06-30 20:45 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('rapids', '0060_exam_exam_results_emailed'), + ] + + operations = [ + migrations.RemoveField( + model_name='exam', + name='stats_graph', + ), + ] diff --git a/requirements.txt b/requirements.txt index 46fdc8fc..89ff796a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,4 +28,5 @@ django_unused_media pytest-django gunicorn rich -bs4 \ No newline at end of file +bs4 +django-htmx \ No newline at end of file diff --git a/sbas/migrations/0016_remove_exam_stats_graph.py b/sbas/migrations/0016_remove_exam_stats_graph.py new file mode 100644 index 00000000..8b34617a --- /dev/null +++ b/sbas/migrations/0016_remove_exam_stats_graph.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.13 on 2022-06-30 20:45 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sbas', '0015_exam_exam_results_emailed'), + ] + + operations = [ + migrations.RemoveField( + model_name='exam', + name='stats_graph', + ), + ] diff --git a/templates/base.html b/templates/base.html index 9c24e7f7..f0e78a93 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,5 +1,6 @@ {% load static %} +{% load django_htmx %} @@ -24,6 +25,9 @@ + + + {% django_htmx_script %}