improve json editing

This commit is contained in:
Ross
2024-06-10 09:59:43 +01:00
parent bdde50effc
commit 9026ee5390
10 changed files with 155 additions and 9 deletions
+23 -1
View File
@@ -17,6 +17,7 @@ from django.forms import (
from django.forms import inlineformset_factory
from django.shortcuts import get_object_or_404
from django_jsonforms.forms import JSONSchemaField
from django_svelte_jsoneditor.widgets import SvelteJSONEditorWidget
from atlas.models import (
@@ -517,6 +518,21 @@ SeriesImageFormSet = inlineformset_factory(
max_num=2000,
)
class JsonAnswerForm(Form):
json_answer = JSONSchemaField(
schema = "schema/report.json",
#options = 'schema/options.json'
options = {}
)
class Meta:
fields = ["json_answer"]
def __init__(self, *args, case_detail, **kwargs):
super(JsonAnswerForm, self).__init__(*args, **kwargs)
if case_detail.question_schema is not None:
self.fields["json_answer"] = JSONSchemaField(schema=case_detail.question_schema, options={})
class BaseReportAnswerForm(ModelForm):
json_answer = JSONSchemaField(
schema = "schema/report.json",
@@ -721,6 +737,12 @@ class AnswerJSONForm(Form):
)
class CaseDetailForm(ModelForm):
class Meta:
model = CaseDetail
fields = ["sort_order", "question_schema"]#, "user"]
fields = ["sort_order", "question_schema", "question_answers"]#, "user"]
widgets = {
"question_schema": SvelteJSONEditorWidget(),
"question_answers": SvelteJSONEditorWidget(),
}
@@ -0,0 +1,18 @@
# Generated by Django 5.0.2 on 2024-05-20 09:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('atlas', '0052_alter_casecollection_end_date_and_more'),
]
operations = [
migrations.AddField(
model_name='casedetail',
name='question_answers',
field=models.JSONField(blank=True, null=True),
),
]
+1
View File
@@ -961,6 +961,7 @@ class CaseDetail(models.Model):
collection = models.ForeignKey(CaseCollection, on_delete=models.CASCADE)
question_schema = models.JSONField(null=True, blank=True)
question_answers = models.JSONField(null=True, blank=True)
sort_order = models.IntegerField(default=1000)
@@ -1,12 +1,36 @@
{% extends 'atlas/exams.html' %}
{% block content %}
<h2>{{case_detail.collection.name}} / {{case_detail.case.pk}}</h2>
<p>See https://django-jsonform.readthedocs.io/en/latest/guide/inputs.html for formatting</p>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
<button type="submit" value="save" name="submit">Submit</button>
</form>
<h2>Blank form</h2>
<form>
{{ blank_form}}
</form>
<h2>Correct answers</h2>
<form method="POST" class="post-form">
{% csrf_token %}
{{example_form}}
<button type="submit" value="answer" name="submit">Save Correct Answers</button>
</form>
{% endblock %}
{% block js %}
{% comment %} {{ example_form.media }} {% endcomment %}
<script src="https://cdn.jsdelivr.net/npm/@json-editor/json-editor@latest/dist/jsoneditor.min.js"></script>
<script src="/static/django_jsonforms/jsoneditor_init.js"></script>
{% endblock %}
@@ -0,0 +1,12 @@
{% extends 'atlas/base.html' %}
{% block content %}
<h2>Case: {{ case.title }}</h2>
{{ case_detail.question_schema }}
{{ case.question_answers }}
{% endblock %}
+2 -2
View File
@@ -3,8 +3,8 @@
{% block content %}
<h2>Atlas</h2>
<a href="{% url 'atlas:user_collections' %}">Available collections</a><br/>
<a href="{% url 'atlas:user_collections' %}">Colletion to view / take</a><br/>
View my <a href='{% url "atlas:case_view" %}?author={{request.user.id}}'>cases</a>.<br/>
<a href="{% url 'atlas:user_uploads' %}">My uploads</a>
<a href="{% url 'atlas:user_uploads' %}">Uploads awaiting import</a>
{% endblock %}
+5
View File
@@ -176,6 +176,11 @@ urlpatterns = [
views.collection_case_view_take_user,
name="collection_case_view_take_user",
),
path(
"collection/<int:pk>/<int:case_number>/take/answers",
views.collection_case_view_take_user_answers,
name="collection_case_view_take_user_answers",
),
path(
"collection/<int:pk>/json_edit",
views.GenericExamViews.exam_json_edit,
+66 -3
View File
@@ -47,6 +47,7 @@ from .forms import (
ConditionAutocompleteForm,
ConditionForm,
FindingForm,
JsonAnswerForm,
ResourceForm,
SelfReviewForm,
SeriesAuthorForm,
@@ -1566,18 +1567,51 @@ def collection_take_start(request, pk):
def collection_case_details(request, exam_id, case_id):
case_detail = CaseDetail.objects.get(case=case_id, collection=exam_id)
if request.method == 'POST':
if request.method == 'POST' and request.POST.get('submit') == 'answer':
#answers = request.POST
case_detail.question_answers = json.loads(request.POST.get("json_answer"))
case_detail.save()
example_form = JsonAnswerForm(request.POST, case_detail=case_detail)
else:
post_data = None
if case_detail.question_schema is not None and case_detail.question_answers is not None:
question_keys = set(case_detail.question_schema["properties"].keys())
answer_keys = set(case_detail.question_answers.keys())
answers = {}
for key, value in case_detail.question_answers.items():
if key in question_keys:
answers[key] = value
diff = question_keys - answer_keys
for key in diff:
answers[key] = ""
post_data = request.POST.copy()
post_data["json_answer"]= json.dumps(answers)
example_form = JsonAnswerForm(post_data, case_detail=case_detail)
if request.method == 'POST' and request.POST.get('submit') == 'save':
form = CaseDetailForm(request.POST, instance=case_detail)
if form.is_valid():
form.save()
# Add any additional logic or redirection here
else:
form = CaseDetailForm(instance=case_detail)
blank_form = JsonAnswerForm(case_detail=case_detail)
return render(
request, "atlas/collection_case_detail.html", {"case_detail": case_detail,
"form": form}
"form": form, "example_form": example_form,
"blank_form": blank_form}
)
@user_is_collection_author_or_atlas_editor
@@ -1790,6 +1824,35 @@ def collection_take_overview(
},
)
def collection_case_view_take_user_answers(request, pk: int, case_number: int):
return collection_case_view_take_answers(request, pk, case_number)
def collection_case_view_take_answers(
request, pk: int, case_number: int, cid=None, passcode=None
):
"""
"""
collection = get_object_or_404(CaseCollection, pk=pk)
collection.check_user_can_take(cid, passcode, request.user)
case, case_count = collection.get_case_by_index(case_number, case_count=True)
cid_user_exam = collection.get_or_create_cid_user_exam(
cid=cid, user_user=request.user
)
case_detail = CaseDetail.objects.get(case=case, collection=collection)
return render(
request,
"atlas/collection_case_view_take_answers.html",
{
"collection": collection,
"case": case,
"case_detail": case_detail,
},
)
def collection_case_view_take_user(request, pk: int, case_number: int):
return collection_case_view_take(request, pk, case_number)
+1 -1
View File
@@ -80,7 +80,7 @@ INSTALLED_APPS = [
"autocomplete",
'markdownify.apps.MarkdownifyConfig',
'django_jsonforms',
'django_svelte_jsoneditor'
]
MIDDLEWARE = [
+2 -1
View File
@@ -47,4 +47,5 @@ django-sortedm2m # remove once migrations squashed
loguru
pylibjpeg
pylibjpeg-libjpeg
django-jsonforms
django-jsonforms
django_svelte_jsoneditor