diff --git a/atlas/models.py b/atlas/models.py index b3c36e01..4489bb44 100644 --- a/atlas/models.py +++ b/atlas/models.py @@ -19,6 +19,7 @@ from django.utils.translation import ugettext_lazy as _ from django.utils.html import mark_safe from django.core.exceptions import ValidationError +from django.contrib.contenttypes.models import ContentType from sortedm2m.fields import SortedManyToManyField @@ -30,6 +31,7 @@ from anatomy.models import Modality from generic.models import ( CidUser, + CidUserExam, Examination, # Condition, ExamBase, @@ -627,6 +629,49 @@ class CaseCollection(models.Model): authors = [i for i in self.author.all()] return authors + def check_cid_user(self, cid, passcode, request=None): + if request is not None and request.user.is_superuser: + return True + + if self.valid_users.exists(): + + user = self.valid_users.filter(cid=cid).first() + + if not user or user.passcode != passcode: + return False + + return True + + def get_or_create_cid_user_exam(self, cid_user, start_time=None): + content_type = ContentType.objects.get_for_model(self) + c = CidUserExam.objects.filter( + content_type=content_type, object_id=self.pk, cid_user=cid_user + ).first() + if c: + return c + + if start_time is None: + start_time = timezone.now() + new = CidUserExam( + content_type=content_type, + object_id=self.pk, + cid_user=cid_user, + start_time=start_time, + ) + new.save() + return new + + def get_cid_user_exams(self, cid_user=None): + content_type = ContentType.objects.get_for_model(self) + if cid_user is None: + return CidUserExam.objects.filter( + content_type=content_type, + object_id=self.pk, + ) + else: + return CidUserExam.objects.filter( + content_type=content_type, object_id=self.pk, cid_user=cid_user + ) class CaseDetail(models.Model): case = models.ForeignKey(Case, on_delete=models.CASCADE) diff --git a/atlas/templates/atlas/collection_detail_view.html b/atlas/templates/atlas/collection_detail_view.html index d5d406c3..03e9ac7f 100644 --- a/atlas/templates/atlas/collection_detail_view.html +++ b/atlas/templates/atlas/collection_detail_view.html @@ -16,6 +16,10 @@ {% endif %} +{% if take %} +

TAKE

+{% endif %} + {% endfor %} diff --git a/atlas/urls.py b/atlas/urls.py index dd87a2e0..cc43053f 100755 --- a/atlas/urls.py +++ b/atlas/urls.py @@ -18,7 +18,9 @@ urlpatterns = [ path("collection//delete", views.CaseCollectionDelete.as_view(), name="collection_delete"), path("collection//update", views.CaseCollectionUpdate.as_view(), name="collection_update"), path("collection/", views.collection_detail_view, name="collection_detail_view"), + path("collection//take///", views.collection_case_view, name="collection_case_view"), + path("collection///take//", views.condition_detail, name="condition_detail"), diff --git a/atlas/views.py b/atlas/views.py index 6d242259..e0be4f48 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -1050,10 +1050,21 @@ def collection_detail_view(request, pk): request, "atlas/collection_detail_view.html", {"collection": collection} ) - -def collection_case_view(request, pk, case_number): +def collection_case_view_take(request, pk, case_number, cid, passcode): + return collection_case_view(pk, case_number, True, cid, passcode) collection = get_object_or_404(CaseCollection, pk=pk) + if not collection.check_cid_user(cid, passcode, request): + raise Http404("Error accessing exam") + +def collection_case_view(request, pk, case_number, take=False, cid=None, passcode=None): + collection = get_object_or_404(CaseCollection, pk=pk) + + if take: + if not collection.check_cid_user(cid, passcode, request): + raise Http404("Error accessing exam") + + cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related() case = cases[case_number]