From 5c2578a3ce141ac9349a9cc6b25562bdbc5d9feb Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 15 Jan 2024 22:46:41 +0000 Subject: [PATCH] Lots of improvemnets --- anatomy/forms.py | 8 +- anatomy/models.py | 12 ++ .../anatomy/anatomyquestion_form.html | 34 +-- .../anatomy/anatomyquestionanswer_form.html | 56 +++++ anatomy/templates/anatomy/exam_scores.html | 25 ++- .../templates/anatomy/question_detail.html | 199 ++++++++---------- .../anatomy/question_link_header.html | 28 +++ .../anatomy/question_user_answers.html | 1 + anatomy/urls.py | 5 + anatomy/views.py | 88 ++++++-- generic/models.py | 17 +- generic/urls.py | 54 +++-- generic/views.py | 29 +++ rad/static/css/anatomy.css | 8 + rapids/forms.py | 5 + rapids/templates/rapids/question_detail.html | 27 +-- .../rapids/question_link_header.html | 25 +++ rapids/templates/rapids/rapid_form.html | 6 +- .../rapids/rapidquestionanswer_form.html | 71 +++++++ rapids/urls.py | 5 + rapids/views.py | 39 +++- sbas/templates/sbas/question_form.html | 1 - 22 files changed, 527 insertions(+), 216 deletions(-) create mode 100644 anatomy/templates/anatomy/anatomyquestionanswer_form.html create mode 100644 anatomy/templates/anatomy/question_link_header.html create mode 100644 rapids/templates/rapids/question_link_header.html create mode 100755 rapids/templates/rapids/rapidquestionanswer_form.html diff --git a/anatomy/forms.py b/anatomy/forms.py index 17043398..4db06025 100644 --- a/anatomy/forms.py +++ b/anatomy/forms.py @@ -150,6 +150,7 @@ class AnatomyQuestionForm(ModelForm): "region", "modality", "structure", + "feedback", "examination", "body_part", "description", @@ -158,9 +159,14 @@ class AnatomyQuestionForm(ModelForm): widgets = { "structure": autocomplete.ModelSelect2(url="atlas:structure-autocomplete"), - "answer_help": TinyMCE(attrs={"cols": 80, "rows": 10}), + "answer_help": TinyMCE(attrs={"cols": 80, "rows": 5}), + "feedback": TinyMCE(attrs={"cols": 80, "rows": 5}), } +class AnatomyQuestionAnswerForm(ModelForm): + class Meta: + model = AnatomyQuestion + fields = [] AnswerFormSet = inlineformset_factory( AnatomyQuestion, diff --git a/anatomy/models.py b/anatomy/models.py index 4264f55a..f2348d7c 100644 --- a/anatomy/models.py +++ b/anatomy/models.py @@ -451,6 +451,18 @@ class Exam(ExamBase): return exam_json + def get_question_cid_user_answer(self, question_index, cid): + question = self.get_question_by_index(question_index) + answer = UserAnswer.objects.filter(question=question, cid=cid, exam=self) + + return answer + + def get_question_user_user_answer(self, question_index, user): + print(user) + question = self.get_question_by_index(question_index) + answer = UserAnswer.objects.filter(question=question, user=user.pk, exam=self) + + return answer @reversion.register class UserAnswer(UserAnswerBase): diff --git a/anatomy/templates/anatomy/anatomyquestion_form.html b/anatomy/templates/anatomy/anatomyquestion_form.html index 3a0a6681..0cea5e31 100644 --- a/anatomy/templates/anatomy/anatomyquestion_form.html +++ b/anatomy/templates/anatomy/anatomyquestion_form.html @@ -26,17 +26,10 @@ document.addEventListener('drop', function (e) { e.preventDefault(); }, false); - function add_input_form() { - var form_idx = $('#id_answers-TOTAL_FORMS').val(); - $('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_idx)); - $('#id_answers-TOTAL_FORMS').val(parseInt(form_idx) + 1); - } - $(document).ready(function () { $("#add_examination").appendTo($("label[for='id_examination']")); $("#add_body_part").appendTo($("label[for='id_body_part']")); - $("#add_structure").appendTo($("label[for='id_structure']")); dropContainer = document.getElementById("drop-container"); @@ -221,15 +214,18 @@ {{ form.media }} {% endblock %} {% block content %} -

Submit Question

+ +{% if object %} + {% include 'anatomy/question_link_header.html' %} +{% endif %} + +

{{object|yesno:"Update,Create"}} Question

{% csrf_token %} - {{ form.as_table }} @@ -237,24 +233,6 @@
Drop image here
-

Answers:

- -
- {% for form in answer_formset %} -
    - {{form.non_field_errors}} - {{form.errors}} - {{ form.as_ul }} -
- {% endfor %} -
- {{ answer_formset.management_form }} - - {% endblock %} \ No newline at end of file diff --git a/anatomy/templates/anatomy/anatomyquestionanswer_form.html b/anatomy/templates/anatomy/anatomyquestionanswer_form.html new file mode 100644 index 00000000..d404f612 --- /dev/null +++ b/anatomy/templates/anatomy/anatomyquestionanswer_form.html @@ -0,0 +1,56 @@ +{% extends "anatomy/base.html" %} + +{% load static %} + +{% block js %} + + + + +{{ form.media }} +{% endblock %} +{% block content %} + +{% if object %} + {% include 'anatomy/question_link_header.html' %} +{% endif %} +

Question Answers

+This page can be used to add and modify answers associated with a question. Answers in here will be used for automarking submitted answers so it is best not to remove. Updating an answer here will not automatically update a submitted answers (scores cache would need to be refreshed) + + {% csrf_token %} +

Answers:

+
+ {% for form in answer_formset %} +
    + {{form.non_field_errors}} + {{form.errors}} + {{ form.as_ul }} +
+ {% endfor %} +
+ {{ answer_formset.management_form }} + +

+ +

+ + +{% endblock %} \ No newline at end of file diff --git a/anatomy/templates/anatomy/exam_scores.html b/anatomy/templates/anatomy/exam_scores.html index ac78623e..2a7f751e 100644 --- a/anatomy/templates/anatomy/exam_scores.html +++ b/anatomy/templates/anatomy/exam_scores.html @@ -1,19 +1,24 @@ {% extends 'generic/exam_scores_base.html' %} {% block table_answers %} - {% for question in questions %} - - + {% for question in questions %} + + {% comment %} {% for cid in cids %} {% endfor %} {% endcomment %} - {% for cid in cids %} - {% with by_question|get_item:question|get_item:cid as ans_score %} - - {% endwith %} - {% endfor %} - + {% for cid in cids %} + {% with by_question|get_item:question|get_item:cid as ans_score %} + + {% endwith %} {% endfor %} + + {% endfor %} {% endblock table_answers %} diff --git a/anatomy/templates/anatomy/question_detail.html b/anatomy/templates/anatomy/question_detail.html index a3442c0e..8a024da3 100644 --- a/anatomy/templates/anatomy/question_detail.html +++ b/anatomy/templates/anatomy/question_detail.html @@ -1,45 +1,20 @@ {% extends 'anatomy/base.html' %} {% block content %} -{% load static %} + {% load static %} -
- Edit - Clone - Delete - - Add Note - - {% if request.user.is_superuser %} - Admin Edit - User answers - {% endif %} - {% if exam %} -
- - {% if previous > -1 %} - Previous question - {% endif %} - Viewing question as part of exam: {{exam.name}} [{{pos}}/{{exam_length}}] - {% if next %} - Next question - {% endif %} -
- {% endif %} -
- -
-
-
- Created: {{ question.created_date|date:"d/m/Y" }} -
-

{{ question.get_primary_answer }}

-

{{question.question_type}}

+ {% include 'anatomy/question_link_header.html' %} + +
+
+
+ Created: {{ question.created_date|date:"d/m/Y" }} +
+

{{ question.get_primary_answer }}

+

{{question.question_type}}

Answers: @@ -50,7 +25,7 @@
Question {{forloop.counter}} -
Question {{forloop.counter}} + {{ans_by_question|get_item:question|get_item:cid}}{{ans_score.0}}
{{ans_score.0}} +
+ {% endif %}> {{ answer }} @@ -59,67 +34,67 @@ {% endfor %}
-
- Answer help: {{ question.answer_help|safe }} -
-
- Answer suggest incorrect: {{ question.answer_suggest_incorrect }} -
-
- Description: {{ question.description }} -
-
- Exams: {% for exam in question.exams.all %} - {{ exam.name }} - {% endfor %} -
-
- Modality: {{ question.modality }} -
-
- Region: {{ question.region }} -
-
- Structure: {{ question.structure }} -
-
- Body Part: {{ question.body_part }} -
-
- Author: {% for author in question.author.all %} - {{ author }}, - {% endfor %} -
-
- Open access: {{ question.open_access }} -
- {% include 'question_notes.html' %} -
-
- - Annotation JSON (+/-): - +
+ Answer help: {{ question.answer_help|safe }} +
+
+ Answer suggest incorrect: {{ question.answer_suggest_incorrect }} +
+
+ Description: {{ question.description }} +
+
+ Exams: {% for exam in question.exams.all %} + {{ exam.name }} + {% endfor %} +
+
+ Modality: {{ question.modality }} +
+
+ Region: {{ question.region }} +
+
+ Structure: {{ question.structure }} +
+
+ Body Part: {{ question.body_part }} +
+
+ Author: {% for author in question.author.all %} + {{ author }}, + {% endfor %} +
+
+ Open access: {{ question.open_access }} +
+ {% include 'question_notes.html' %} +
+
+ + Annotation JSON (+/-): + - {% if question.image_annotations %} + {% if question.image_annotations %}
{{ question.image_annotations }}
- {% else %} - No saved annotations. - {% endif %} - -
+ {% else %} + No saved annotations. + {% endif %} + +
+
- - + } + {% endblock %} \ No newline at end of file diff --git a/anatomy/templates/anatomy/question_link_header.html b/anatomy/templates/anatomy/question_link_header.html new file mode 100644 index 00000000..3acacc48 --- /dev/null +++ b/anatomy/templates/anatomy/question_link_header.html @@ -0,0 +1,28 @@ + +
+ Edit + Clone + Delete + Edit Answers + + Add Note + + {% if request.user.is_superuser %} + Admin Edit + User answers + {% endif %} + {% if exam %} +
+ + {% if previous > -1 %} + Previous question + {% endif %} + Viewing question as part of exam: {{exam.name}} [{{pos}}/{{exam_length}}] + {% if next %} + Next question + {% endif %} +
+ {% endif %} +
\ No newline at end of file diff --git a/anatomy/templates/anatomy/question_user_answers.html b/anatomy/templates/anatomy/question_user_answers.html index 4a4acac1..38f87634 100644 --- a/anatomy/templates/anatomy/question_user_answers.html +++ b/anatomy/templates/anatomy/question_user_answers.html @@ -1,6 +1,7 @@ {% extends 'anatomy/base.html' %} {% block content %} +{% include 'anatomy/question_link_header.html' %}

{{question}}

{% if answer_compare %} diff --git a/anatomy/urls.py b/anatomy/urls.py index 20b0a758..be660773 100644 --- a/anatomy/urls.py +++ b/anatomy/urls.py @@ -28,6 +28,11 @@ urlpatterns = [ views.AnatomyQuestionUpdate.as_view(), name="anatomy_question_update", ), + path( + "question//update_answers", + views.AnatomyQuestionAnswerUpdate.as_view(), + name="question_answer_update", + ), path( "question//save_annotation", views.question_save_annotation, diff --git a/anatomy/views.py b/anatomy/views.py index 124c4452..c7125f00 100644 --- a/anatomy/views.py +++ b/anatomy/views.py @@ -28,6 +28,7 @@ from dal import autocomplete from .forms import ( AnatomyAnswerForm, + AnatomyQuestionAnswerForm, AnswerFormSet, AnswerUpdateFormSet, BodyPartForm, @@ -247,7 +248,7 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): elif not unmarked_exam_answers_only: mark_url = "anatomy:mark_all" - questions = exam.exam_questions.all() + questions = exam.exam_questions.all().prefetch_related("answers") n = sk @@ -358,6 +359,7 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): for suggest_incorrect in question.answer_suggest_incorrect: if suggest_incorrect in ans: answer_suggest_incorrect.append(ans) + break return render( request, @@ -554,6 +556,42 @@ class AnatomyQuestionCreate(AnatomyQuestionCreateBase): # return super().form_valid(form) +class AnatomyQuestionAnswerUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateView): + model = AnatomyQuestion + form_class = AnatomyQuestionAnswerForm + template_name = "anatomy/anatomyquestionanswer_form.html" + + def get_context_data(self, **kwargs): + context = super(AnatomyQuestionAnswerUpdate, self).get_context_data(**kwargs) + if self.request.POST: + context["answer_formset"] = AnswerUpdateFormSet( + self.request.POST, self.request.FILES, instance=self.object + ) + context["answer_formset"].full_clean() + else: + context["answer_formset"] = AnswerUpdateFormSet(instance=self.object) + context["question"] = context["object"] + return context + + def form_valid(self, form): + + self.object = form.save(commit=False) + self.object.save() + + #form.instance.author.add(self.request.user.id) + + context = self.get_context_data(form=form) + formset = context["answer_formset"] + # logger.debug(formset.is_valid()) + if formset.is_valid(): + response = super().form_valid(form) + formset.instance = self.object + formset.save() + + return response + else: + return super().form_invalid(form) + # class AnatomyQuestionUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, class AnatomyQuestionUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateView): model = AnatomyQuestion @@ -566,13 +604,14 @@ class AnatomyQuestionUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateV def get_context_data(self, **kwargs): context = super(AnatomyQuestionUpdate, self).get_context_data(**kwargs) - if self.request.POST: - context["answer_formset"] = AnswerUpdateFormSet( - self.request.POST, self.request.FILES, instance=self.object - ) - context["answer_formset"].full_clean() - else: - context["answer_formset"] = AnswerUpdateFormSet(instance=self.object) + #if self.request.POST: + # context["answer_formset"] = AnswerUpdateFormSet( + # self.request.POST, self.request.FILES, instance=self.object + # ) + # context["answer_formset"].full_clean() + #else: + # context["answer_formset"] = AnswerUpdateFormSet(instance=self.object) + context["question"] = context["object"] return context def form_valid(self, form): @@ -589,23 +628,24 @@ class AnatomyQuestionUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateV form.instance.author.add(self.request.user.id) context = self.get_context_data(form=form) - formset = context["answer_formset"] - # logger.debug(formset.is_valid()) - if formset.is_valid(): - response = super().form_valid(form) - formset.instance = self.object - formset.save() + #formset = context["answer_formset"] + return super().form_valid(form) + ## logger.debug(formset.is_valid()) + #if formset.is_valid(): + # response = super().form_valid(form) + # formset.instance = self.object + # formset.save() - # restore exam orders - #for exam in self.object.exams.all(): - # if exam in exam_orders and self.object in exam_orders[exam]: - # print(exam_orders[exam]) - # exam.exam_questions.set(exam_orders[exam]) - # exam.save() + # # restore exam orders + # #for exam in self.object.exams.all(): + # # if exam in exam_orders and self.object in exam_orders[exam]: + # # print(exam_orders[exam]) + # # exam.exam_questions.set(exam_orders[exam]) + # # exam.save() - return response - else: - return super().form_invalid(form) + # return response + #else: + # return super().form_invalid(form) class QuestionClone(AnatomyQuestionCreateBase): @@ -625,6 +665,8 @@ class QuestionClone(AnatomyQuestionCreateBase): # initial_data["exams"] = list(exams) + # TODO: clone answers? + return initial_data diff --git a/generic/models.py b/generic/models.py index b877df48..26411dda 100644 --- a/generic/models.py +++ b/generic/models.py @@ -181,6 +181,11 @@ class QuestionBase(models.Model): """If this makes sense in the question/answer context override""" return None + def get_author_objects(self): + """Returns a comma seperated text list of authors""" + authors = [i for i in self.author.all()] + return authors + class SeriesImageBase(models.Model): """ @@ -320,7 +325,7 @@ class SeriesBase(models.Model): return False def get_author_objects(self): - """Returns a comma seperated text list of authors""" + """Returns a list of authors""" if self.author: return self.author.all() else: @@ -703,6 +708,12 @@ class ExamCollectionGenericBase(models.Model): new.save() return new + def get_question_cid_user_answer(self, question_index, cid): + raise NotImplementedError + + def get_question_user_user_answer(self, question_index, user): + raise NotImplementedError + def get_cid_user_exams( self, cid_user: "CidUser" = None, user_user: User = None ) -> "CidUserExam": @@ -833,6 +844,10 @@ class ExamBase(ExamCollectionGenericBase): def get_question_index(self, question): return list(self.exam_questions.all()).index(question) + def get_question_by_index(self, index:int): + # There must be a better way to do this + return list(self.exam_questions.all())[index] + def get_cid_user_score(self, cid_user): c = "c/" + str(cid_user) if c in self.user_scores: diff --git a/generic/urls.py b/generic/urls.py index 47a758a1..d0b915f0 100755 --- a/generic/urls.py +++ b/generic/urls.py @@ -11,9 +11,19 @@ urlpatterns = [ # path('', views.question_list, name='question_list'), path("examination/", views.ExaminationView.as_view(), name="examination_view"), path("examination/", views.examination_detail, name="examination_detail"), - path("examination//delete", views.ExaminationDelete.as_view(), name="examination_delete"), - path("examination//update", views.ExaminationUpdate.as_view(), name="examination_update"), - path("examination//merge", views.examination_merge, name="examination_merge"), + path( + "examination//delete", + views.ExaminationDelete.as_view(), + name="examination_delete", + ), + path( + "examination//update", + views.ExaminationUpdate.as_view(), + name="examination_update", + ), + path( + "examination//merge", views.examination_merge, name="examination_merge" + ), path("examination/create/", views.create_examination, name="create_examination"), path( "examination/ajax/get_examination_id", @@ -60,7 +70,11 @@ urlpatterns = [ name="cid_group_detail", ), path("cids/group//email", views.group_email, name="group_email"), - path("cids/group//exams", views.CidGroupExamUpdate.as_view(), name="cid_group_exams"), + path( + "cids/group//exams", + views.CidGroupExamUpdate.as_view(), + name="cid_group_exams", + ), path( "cids/group//email_results", views.group_email_results, @@ -106,7 +120,11 @@ urlpatterns = [ views.user_group_view_detail, name="user_group_detail", ), - path("user/group//exams", views.UserGroupExamUpdate.as_view(), name="user_group_exams"), + path( + "user/group//exams", + views.UserGroupExamUpdate.as_view(), + name="user_group_exams", + ), path( "user/group//update", views.UserUserGroupUpdate.as_view(), @@ -191,6 +209,16 @@ def generic_exam_urls(generic_exam_view: GenericExamViews): generic_exam_view.exam_question_detail, name="exam_question_detail", ), + #path( + # "exam//question//answer/", + # generic_exam_view.exam_question_user_answer, + # name="exam_question_user_answer", + #), + path( + "exam//question//answer//", + generic_exam_view.exam_question_user_answer, + name="exam_question_user_answer", + ), path( "exam//user/", generic_exam_view.exam_user, @@ -333,26 +361,26 @@ def generic_exam_urls(generic_exam_view: GenericExamViews): generic_exam_view.exam_question_json_unbased_cid, name="exam_question_json_unbased_cid", ), - #path( + # path( # "exam/json//", # generic_exam_view.exam_question_json, # name="exam_question_json", - #), - #path( + # ), + # path( # "exam/json///unbased", # generic_exam_view.exam_question_json_unbased, # name="exam_question_json_unbased", - #), - #path( + # ), + # path( # "exam/json////", # generic_exam_view.exam_question_json_cid, # name="exam_question_json_cid", - #), - #path( + # ), + # path( # "exam/json/////unbased", # generic_exam_view.exam_question_json_unbased_cid, # name="exam_question_json_unbased_cid", - #), + # ), path( "exam/json//recreate", generic_exam_view.exam_json_recreate, diff --git a/generic/views.py b/generic/views.py index 1f5d3e0f..93efd295 100644 --- a/generic/views.py +++ b/generic/views.py @@ -1353,6 +1353,35 @@ class ExamViews(View, LoginRequiredMixin): {"filter": filter, "app_name": self.app_name}, ) + @method_decorator(login_required) + def exam_question_user_answer(self, request, pk: int, sk: int, c_or_u: str, user_or_cid: str): + exam: ExamBase = get_object_or_404(self.Exam, pk=pk) + + #question = exam.exam_questions.all()[sk] + + if c_or_u == "u": + user = get_object_or_404(User,pk=user_or_cid) + answer = exam.get_question_user_user_answer(sk, user) + elif c_or_u == "c": + #cid_user = CidUser.objects.filter(cid=user_or_cid) + answer =exam.get_question_cid_user_answer(sk, user_or_cid) + else: + raise Http404 + + print(answer) + return HttpResponse(answer) + + @method_decorator(login_required) + def exam_question_cid_user_answer(self, request, pk: int, sk: int, cid: str): + exam: ExamBase = get_object_or_404(self.Exam, pk=pk) + + #question = exam.exam_questions.all()[sk] + + cid_user = CidUser.objects.filter(cid=cid) + answer =exam.get_question_cid_user_answer(sk, cid_user) + + print(answer) + @method_decorator(login_required) def exam_question_detail(self, request, pk, sk): exam = get_object_or_404(self.Exam, pk=pk) diff --git a/rad/static/css/anatomy.css b/rad/static/css/anatomy.css index d5ec5891..83e93538 100644 --- a/rad/static/css/anatomy.css +++ b/rad/static/css/anatomy.css @@ -1109,4 +1109,12 @@ table .peninsula-trainee::before { .current-question { background-color: #52057b; color: grey; +} + +.show-on-hover { + opacity: 0%; +} + +.show-on-hover:hover { + opacity: 100%; } \ No newline at end of file diff --git a/rapids/forms.py b/rapids/forms.py index d7b1b5a1..4bb7fbae 100755 --- a/rapids/forms.py +++ b/rapids/forms.py @@ -64,6 +64,11 @@ class RapidCreationDefaultForm(ModelForm): exclude = ["author"] +class RapidQuestionAnswerForm(ModelForm): + class Meta: + model = Rapid + fields = [] + class RapidForm(ModelForm): # exams = ModelMultipleChoiceField(required=False, queryset=Exam.objects.all(),widget=FilteredSelectMultiple(verbose_name="Exams", is_stacked=False)) diff --git a/rapids/templates/rapids/question_detail.html b/rapids/templates/rapids/question_detail.html index 3cafaa27..1c30da0b 100755 --- a/rapids/templates/rapids/question_detail.html +++ b/rapids/templates/rapids/question_detail.html @@ -1,29 +1,6 @@ {% extends 'rapids/base.html' %} {% block content %} - -
- -Edit -Clone -Delete - Add Note -{% if request.user.is_superuser %} -Admin Edit -User answers -{% endif %} -{% if exam %} -
- -{% if previous > -1 %} -Previous question -{% endif %} -Viewing question as part of exam: {{exam.name}} [{{pos}}/{{exam_length}}] -{% if next %} -Next question -{% endif %} -
-{% endif %} -
-{% include 'rapids/question_display_block.html' %} + {% include "rapids/question_link_header.html" %} + {% include 'rapids/question_display_block.html' %} {% endblock %} \ No newline at end of file diff --git a/rapids/templates/rapids/question_link_header.html b/rapids/templates/rapids/question_link_header.html new file mode 100644 index 00000000..56eb1241 --- /dev/null +++ b/rapids/templates/rapids/question_link_header.html @@ -0,0 +1,25 @@ + +
+ + Edit + Clone + Delete + Edit Answers + Add Note + {% if request.user.is_superuser %} + Admin Edit + User answers + {% endif %} + {% if exam %} +
+ + {% if previous > -1 %} + Previous question + {% endif %} + Viewing question as part of exam: {{exam.name}} [{{pos}}/{{exam_length}}] + {% if next %} + Next question + {% endif %} +
+ {% endif %} +
\ No newline at end of file diff --git a/rapids/templates/rapids/rapid_form.html b/rapids/templates/rapids/rapid_form.html index c51d8447..78aedd9d 100755 --- a/rapids/templates/rapids/rapid_form.html +++ b/rapids/templates/rapids/rapid_form.html @@ -360,6 +360,11 @@ {{ form.media }} {% endblock %} {% block content %} + +{% if object %} + {% include "rapids/question_link_header.html" %} +{% endif %} +

Submit Rapid

Edit defaults

@@ -415,7 +420,6 @@ the feedback image box is checked they will not be displayed when taking the que {{ image_formset.management_form }} -