diff --git a/longs/admin.py b/longs/admin.py index e340efa4..e95bba2f 100755 --- a/longs/admin.py +++ b/longs/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import Long, LongSeries, LongSeriesImage, Note, LongCreationDefault, Exam +from .models import Long, LongSeries, LongSeriesImage, Note, LongCreationDefault, Exam, CidUserAnswer import tagulous.admin @@ -20,6 +20,7 @@ admin.site.register(Note) admin.site.register(LongCreationDefault) admin.site.register(LongSeries) admin.site.register(LongSeriesImage) +admin.site.register(CidUserAnswer) class LongImageInline(admin.TabularInline): diff --git a/longs/models.py b/longs/models.py index 967356b2..ec9d35af 100644 --- a/longs/models.py +++ b/longs/models.py @@ -143,6 +143,14 @@ class Long(models.Model): ["http://penracourses.org.uk{}".format(i.url) for i in self.GetImages()] ) + def GetUnmarkedAnswerCount(self): + answers = self.cid_user_answers.all() + return len([ans for ans in answers if not ans.is_marked()]) + + def GetUnmarkedAnswers(self): + answers = self.cid_user_answers.all() + return [ans for ans in answers if not ans.is_marked()] + # def GetNonFeedbackQuestionImages(self): # return self.GetImages() @@ -408,7 +416,7 @@ class CidUserAnswer(models.Model): EIGHT = "8", _("8") score = models.CharField( - max_length=3, choices=ScoreOptions.choices, default=ScoreOptions.UNMARKED + max_length=3, choices=ScoreOptions.choices, default=ScoreOptions.UNMARKED, blank=True ) created = models.DateTimeField(auto_now_add=True) @@ -419,8 +427,8 @@ class CidUserAnswer(models.Model): exam = self.exam except (Exam.DoesNotExist, KeyError) as e: exam = "None" - return "{}/{}/{}: {}".format( - exam, self.cid, self.question.GetPrimaryAnswer(), self.answer + return "{}/{}/{} ({})".format( + exam, self.cid, self.created, self.updated ) def save(self, *args, **kwargs): @@ -428,13 +436,10 @@ class CidUserAnswer(models.Model): return super(CidUserAnswer, self).save(*args, **kwargs) def clean(self): - if self.answer: - self.answer = self.answer.strip() + for ans in (self.answer_observations, self.answer_interpretation, self.answer_principle_diagnosis, self.answer_differential_diagnosis, self.answer_management): + if ans: + ans = ans.strip() - s = self.answer.lower() - s = s.translate(str.maketrans("", "", string.punctuation)) - - self.answer_compare = s # def get_compare_string(self): # # strip here should be unneccasry (providing clean is now working) @@ -442,37 +447,11 @@ class CidUserAnswer(models.Model): # s = s.translate(str.maketrans('', '', string.punctuation)) # return s - def get_answer_score(self): - q = self.question - - # First step we check that the normal/abnormal states match - if q.normal != self.normal: - # If they don't match the answer is wrong (score is 0) - return 0 - # If both are normal full marks - elif q.normal and self.normal: - return 2 - - # Then compare answer strings (as per anatomy questions) - ans = self.answer_compare - if ( - q.answers.filter( - answer_compare__iexact=ans, status=Answer.MarkOptions.CORRECT - ).first() - is not None - ): - mark = 2 - elif ( - q.answers.filter( - answer_compare__iexact=ans, status=Answer.MarkOptions.HALF_MARK - ).first() - is not None - ): - mark = 1 - elif q.answers.filter( - answer_compare__iexact=ans, status=Answer.MarkOptions.INCORRECT - ).first(): - mark = 0 + def is_marked(self): + if self.score == "": + return False else: - mark = "unmarked" - return mark + return True + + def get_answer_score(self): + return self.score diff --git a/longs/templates/longs/mark_overview.html b/longs/templates/longs/mark_overview.html index 0ef838a0..3c27e55a 100644 --- a/longs/templates/longs/mark_overview.html +++ b/longs/templates/longs/mark_overview.html @@ -13,7 +13,7 @@ diff --git a/longs/views.py b/longs/views.py index 25797fa8..4f5b187a 100755 --- a/longs/views.py +++ b/longs/views.py @@ -618,33 +618,40 @@ def loadJsonAnswer(answer): ) posted_answer = answer["ans"] - - # Normal answers are just posted with the answer "Normal" - normal = False - if posted_answer == "Normal": - normal = True - posted_answer = "" - # We can ignore the first ab - elif answer["qidn"] == "1" and posted_answer == "Abnormal": - return False + + # Long cases seperate sections by qidn + qidn = answer["qidn"] + # If the user answer does not exist if not exiting_answers: - ans = CidUserAnswer(answer=posted_answer, normal=normal, cid=answer["cid"]) + ans = CidUserAnswer(cid=answer["cid"]) ans.question_id = answer["qid"] ans.exam_id = eid - ans.full_clean() - ans.save() + # If the answer already exists or we have started populating it else: # Update an existing answer # should never be more than one (famous last words) ans = exiting_answers[0] - ans.normal = normal - ans.answer = posted_answer - ans.full_clean() - ans.save() + + if qidn == "1": + ans.answer_observations = posted_answer + elif qidn == "2": + ans.answer_interpretation = posted_answer + elif qidn == "3": + ans.answer_principle_diagnosis = posted_answer + elif qidn == "4": + ans.answer_differential_diagnosis = posted_answer + elif qidn == "5": + ans.answer_management = posted_answer + + # Mark as unmarked + ans.score = ans.ScoreOptions.UNMARKED + + ans.full_clean() + ans.save() return True