diff --git a/anatomy/urls.py b/anatomy/urls.py index 8e2b08ea..806c9ef9 100644 --- a/anatomy/urls.py +++ b/anatomy/urls.py @@ -53,6 +53,7 @@ urlpatterns = [ "exam///mark/review", views.mark_review, name="mark_review" ), path("exam//markers", views.ExamMarkersUpdate.as_view(), name="exam_markers"), + path("exam//groups", views.ExamGroupsUpdate.as_view(), name="exam_groups_edit"), path("exam//authors", views.ExamAuthorUpdate.as_view(), name="exam_authors"), path("exam/create", views.ExamCreate.as_view(), name="exam_create"), path("exam//clone", views.ExamClone.as_view(), name="exam_clone"), diff --git a/atlas/forms.py b/atlas/forms.py index 8b78798f..ca256912 100755 --- a/atlas/forms.py +++ b/atlas/forms.py @@ -57,7 +57,7 @@ from autocomplete import widgets as htmx_widgets import logging -from generic.forms import ExamAuthorFormMixin +from generic.forms import ExamAuthorFormMixin, ExamGroupsFormMixin from crispy_forms.helper import FormHelper @@ -749,6 +749,9 @@ class SeriesAuthorForm(ExamAuthorFormMixin): class Meta(ExamAuthorFormMixin.Meta): model = Series +class ExamGroupsForm(ExamGroupsFormMixin): + class Meta(ExamGroupsFormMixin.Meta): + model = CaseCollection class AnswerJSONForm(Form): diff --git a/atlas/models.py b/atlas/models.py index 042bc416..f20a08cf 100644 --- a/atlas/models.py +++ b/atlas/models.py @@ -1188,6 +1188,14 @@ class SelfReview(models.Model): review_date = models.DateTimeField(auto_now_add=True) review_update_date = models.DateTimeField(auto_now=True) + def __str__(self) -> str: + date = self.review_date + + if self.review_update_date is not None: + date = self.review_update_date + + return f"Self review: {date:%Y-%m-%d} / {self.user_exam.exam} - {self.case}" + def get_absolute_url(self): return self.user_exam.exam.get_case_take_url(self.case) diff --git a/atlas/templates/atlas/collection_case_view_take.html b/atlas/templates/atlas/collection_case_view_take.html index 093c1597..13fb577f 100644 --- a/atlas/templates/atlas/collection_case_view_take.html +++ b/atlas/templates/atlas/collection_case_view_take.html @@ -67,20 +67,20 @@ Images {% for series, prior, relation in series_to_load %} - + Series {{ forloop.counter }}: {{series.get_block}} {% if prior %} -
Prior: {{relation}} +
Prior: {{relation}} {% endif %} - +
{% endfor %} @@ -168,10 +168,10 @@ -
- {% if collection.self_review %} + {% if collection.self_review %} +

- +

{% if self_review %}

Self Feedback

@@ -181,12 +181,12 @@ {% endfor %} {% endif %} - {% else %} -

Answer score: {{answer.score}}

- Answer feedback: {{answer.feedback|safe}} -
- {% endif %} -
+
+ {% else %} +

Answer score: {{answer.score}}

+ Answer feedback: {{answer.feedback|safe}} +
+ {% endif %}
View questions {{form.json.errors}} @@ -340,7 +340,7 @@ {% for series, prior, relation in series_to_load %} {{ forloop.counter0 }}: ["{{ series.get_image_url_array_not_json }}"], {% endfor %} - + } $(document).ready(function () { diff --git a/atlas/templates/atlas/view.html b/atlas/templates/atlas/view.html index 1db110bb..505ef1df 100755 --- a/atlas/templates/atlas/view.html +++ b/atlas/templates/atlas/view.html @@ -7,7 +7,11 @@ {% block content %}
- Create new
+ Create a new collection / Collections to view / take + + + +

My Collections

Filter

@@ -18,7 +22,7 @@
- View my cases. + View my cases.
{% render_table table %} diff --git a/atlas/urls.py b/atlas/urls.py index 535fb325..34fe22a8 100755 --- a/atlas/urls.py +++ b/atlas/urls.py @@ -111,6 +111,7 @@ urlpatterns = [ views.GenericExamViews.exam_users_edit, name="exam_users_edit", ), + path("exam//groups", views.ExamGroupsUpdate.as_view(), name="exam_groups_edit"), path( "collection//case//details", views.collection_case_details, diff --git a/atlas/views.py b/atlas/views.py index 334b210f..3cfe7893 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -47,6 +47,7 @@ from .forms import ( CidReportAnswerMarkForm, ConditionAutocompleteForm, ConditionForm, + ExamGroupsForm, FindingForm, JsonAnswerForm, PriorCaseForm, @@ -144,6 +145,7 @@ from django.forms.models import model_to_dict from generic.views import ( AuthorRequiredMixin, ExamCloneMixin, + ExamGroupsUpdateBase, ExamViews, SeriesImagesZipViewBase, ) @@ -2713,6 +2715,15 @@ class CaseCollectionAuthorUpdate(RevisionMixin, AuthorRequiredMixin, UpdateView) context["collection"] = context["object"] return context +class ExamGroupsUpdate(ExamGroupsUpdateBase): + model = CaseCollection + form_class = ExamGroupsForm + + def get_context_data(self, **kwargs): + context = super(ExamGroupsUpdate, self).get_context_data(**kwargs) + context["exam"] = context["object"] + return context + class CaseAuthorUpdate(RevisionMixin, AuthorRequiredMixin, UpdateView): model = Case @@ -2816,8 +2827,12 @@ def collection_reset_answers(request, exam_id: int): case_details = collection.casedetail_set.all().prefetch_related() # Delete all answers - cid_answers = case_details.cidreportanswer_set.all() - user_answers = case_details.userreportanswer_set.all() + for case in case_details: + cid_answers = case.cidreportanswer_set.all() + + cid_answers.delete() + user_answers = case.userreportanswer_set.all() + user_answers.delete() # User statuses @@ -2825,6 +2840,7 @@ def collection_reset_answers(request, exam_id: int): # CidUserExams collection.cid_users.all().delete() + return HttpResponse("Success") else: diff --git a/generic/models.py b/generic/models.py index 2420ad2e..81d747cf 100644 --- a/generic/models.py +++ b/generic/models.py @@ -789,7 +789,7 @@ class ExamOrCollectionGenericBase(models.Model, AuthorMixin): raise NotImplementedError def get_cid_user_exams( - self, cid_user: Optional["CidUser"] = None, user_user: User = None + self, cid_user: Optional["CidUser"] = None, user_user: User | None = None ) -> "CidUserExam": content_type = ContentType.objects.get_for_model(self) if cid_user is None and user_user is None: diff --git a/physics/urls.py b/physics/urls.py index a6c79385..87f5b4db 100644 --- a/physics/urls.py +++ b/physics/urls.py @@ -34,6 +34,7 @@ urlpatterns.extend( name="exam_take_overview_user", ), path("exam//markers", views.ExamMarkersUpdate.as_view(), name="exam_markers"), + path("exam//groups", views.ExamGroupsUpdate.as_view(), name="exam_groups_edit"), path( "exam//authors", views.ExamAuthorUpdate.as_view(), diff --git a/rapids/urls.py b/rapids/urls.py index fa14723b..add233b4 100755 --- a/rapids/urls.py +++ b/rapids/urls.py @@ -51,6 +51,7 @@ urlpatterns = [ "exam///mark/review", views.mark_review, name="mark_review" ), path("exam//markers", views.ExamMarkersUpdate.as_view(), name="exam_markers"), + path("exam//groups", views.ExamGroupsUpdate.as_view(), name="exam_groups_edit"), path("exam//authors", views.ExamAuthorUpdate.as_view(), name="exam_authors"), path("exam/create", views.ExamCreate.as_view(), name="exam_create"), path("exam//clone", views.ExamClone.as_view(), name="exam_clone"), diff --git a/sbas/urls.py b/sbas/urls.py index 50f86cb2..8c5e8d56 100644 --- a/sbas/urls.py +++ b/sbas/urls.py @@ -50,6 +50,7 @@ urlpatterns = [ ), path("exam//markers", views.ExamMarkersUpdate.as_view(), name="exam_markers"), + path("exam//groups", views.ExamGroupsUpdate.as_view(), name="exam_groups_edit"), path( "exam//authors", views.ExamAuthorUpdate.as_view(), name="exam_authors" ),