From df5b43006b7c268bcfc5944c915adfd8ba6ff733 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Wed, 16 Oct 2024 07:25:19 -0700 Subject: [PATCH] Specify JSONSchema for Submission Metadata in django settings Fixes https://github.com/2i2c-org/unnamed-thingity-thing/issues/103 and some --- comptest/comptest/settings.py | 14 +++++++-- comptest/web/admin.py | 3 -- comptest/web/forms.py | 10 +++---- .../0024_delete_submissionmetadata.py | 16 ++++++++++ .../0025_alter_submission_metadata.py | 19 ++++++++++++ comptest/web/models.py | 25 ++-------------- comptest/web/views/default.py | 19 +++++------- comptest/web/views/submissions.py | 30 +++++++------------ requirements.txt | 1 - 9 files changed, 72 insertions(+), 65 deletions(-) create mode 100644 comptest/web/migrations/0024_delete_submissionmetadata.py create mode 100644 comptest/web/migrations/0025_alter_submission_metadata.py diff --git a/comptest/comptest/settings.py b/comptest/comptest/settings.py index b42331c..0c715b4 100644 --- a/comptest/comptest/settings.py +++ b/comptest/comptest/settings.py @@ -49,8 +49,7 @@ "reversion", "django_jsonform", "crispy_forms", - "crispy_bootstrap5", - "solo", + "crispy_bootstrap5" ] MIDDLEWARE = [ @@ -245,6 +244,17 @@ SITE_PAGE_HEADER_IMAGE_URL = "" CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" CRISPY_TEMPLATE_PACK = "bootstrap5" +SITE_SUBMISSION_INSTRUCTIONS_MARKDOWN = "Some Text Heree" +SITE_SUBMISSION_FORM_SCHEMA = { + 'type': 'object', + 'properties': { + 'repo': { + 'type': 'string', + 'title': 'Repository', + 'helpText': 'Link to repository containing code and stuff' + } + } +} django_yamlconf.load() django_yamlconf.list_attrs() diff --git a/comptest/web/admin.py b/comptest/web/admin.py index 8a1d78c..4f30236 100644 --- a/comptest/web/admin.py +++ b/comptest/web/admin.py @@ -1,14 +1,12 @@ from allauth.account.decorators import secure_admin_login from django.contrib import admin from reversion.admin import VersionAdmin -from solo.admin import SingletonModelAdmin from .models import ( ContentFile, Evaluation, Page, Submission, - SubmissionMetadata, Version, ) @@ -24,6 +22,5 @@ class ContentFileAdmin(VersionAdmin): admin.site.register([Version, Evaluation, Submission]) -admin.site.register(SubmissionMetadata, SingletonModelAdmin) admin.site.login = secure_admin_login(admin.site.login) diff --git a/comptest/web/forms.py b/comptest/web/forms.py index d8979e4..f1ceade 100644 --- a/comptest/web/forms.py +++ b/comptest/web/forms.py @@ -2,13 +2,14 @@ from crispy_forms.layout import Submit from django import forms from django.urls import reverse - -from .models import SubmissionMetadata +from django.conf import settings +from django_jsonform.forms.fields import JSONFormField class SubmissionForm(forms.Form): """Form to create a new submission""" + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -19,10 +20,7 @@ def __init__(self, *args, **kwargs): self.fields["name"] = forms.CharField() self.fields["description"] = forms.CharField(required=False) - if SubmissionMetadata.objects.exists(): - metadata = SubmissionMetadata.objects.latest().items - for m in metadata: - self.fields[m] = forms.CharField() + self.fields["metadata"] = JSONFormField(schema=settings.SITE_SUBMISSION_FORM_SCHEMA) class UploadForm(forms.Form): diff --git a/comptest/web/migrations/0024_delete_submissionmetadata.py b/comptest/web/migrations/0024_delete_submissionmetadata.py new file mode 100644 index 0000000..1b1653b --- /dev/null +++ b/comptest/web/migrations/0024_delete_submissionmetadata.py @@ -0,0 +1,16 @@ +# Generated by Django 5.0.7 on 2024-10-16 14:22 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("web", "0023_submissionmetadata_instructions"), + ] + + operations = [ + migrations.DeleteModel( + name="SubmissionMetadata", + ), + ] diff --git a/comptest/web/migrations/0025_alter_submission_metadata.py b/comptest/web/migrations/0025_alter_submission_metadata.py new file mode 100644 index 0000000..5629e4e --- /dev/null +++ b/comptest/web/migrations/0025_alter_submission_metadata.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0.7 on 2024-10-16 19:18 + +import django_jsonform.models.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("web", "0024_delete_submissionmetadata"), + ] + + operations = [ + migrations.AlterField( + model_name="submission", + name="metadata", + field=django_jsonform.models.fields.JSONField(blank=True, null=True), + ), + ] diff --git a/comptest/web/models.py b/comptest/web/models.py index 13118e6..a1eb8a4 100644 --- a/comptest/web/models.py +++ b/comptest/web/models.py @@ -1,7 +1,7 @@ from django.contrib.auth.models import User from django.db import models, transaction from django_jsonform.models.fields import JSONField -from solo.models import SingletonModel +from django.conf import settings # Create your models here. @@ -32,7 +32,7 @@ class Submission(models.Model): default=None, related_name="projects", ) - metadata = models.JSONField(blank=True, null=True) + metadata = JSONField(blank=True, null=True, schema=settings.SITE_SUBMISSION_FORM_SCHEMA) class Version(models.Model): @@ -146,23 +146,4 @@ class ContentFile(models.Model): file = models.FileField(upload_to="content-files/%Y/%m/%d/") def __str__(self): - return self.title - - -class SubmissionMetadata(SingletonModel): - """ - Define metadata fields for submission. - """ - - ITEMS_SCHEMA = { - "type": "array", # a list which will contain the items - "items": {"type": "string"}, # items in the array are strings - } - - instructions = models.TextField() - items = JSONField(schema=ITEMS_SCHEMA) - date_created = models.DateTimeField(auto_now_add=True) - - class Meta: - get_latest_by = "date_created" - verbose_name = "Submission Metadata" + return self.title \ No newline at end of file diff --git a/comptest/web/views/default.py b/comptest/web/views/default.py index f14f210..3f184ae 100644 --- a/comptest/web/views/default.py +++ b/comptest/web/views/default.py @@ -10,7 +10,7 @@ from mdit_py_plugins.front_matter import front_matter_plugin from ..forms import UploadForm -from ..models import Evaluation, Submission, SubmissionMetadata, Version +from ..models import Evaluation, Submission, Version @login_required @@ -35,16 +35,13 @@ def upload(request: HttpRequest, id: int) -> HttpResponse: return redirect("submissions-detail", id) else: form = UploadForm(id=id) - if SubmissionMetadata.objects.exists(): - md = ( - MarkdownIt("commonmark", {"breaks": True, "html": True}) - .use(front_matter_plugin) - .use(footnote_plugin) - .enable("table") - ) - html_content = md.render(SubmissionMetadata.objects.latest().instructions) - else: - html_content = "" + md = ( + MarkdownIt("commonmark", {"breaks": True, "html": True}) + .use(front_matter_plugin) + .use(footnote_plugin) + .enable("table") + ) + html_content = md.render(settings.SITE_SUBMISSION_INSTRUCTIONS_MARKDOWN) return render( request, "upload.html", {"form": form, "id": id, "html_content": html_content} ) diff --git a/comptest/web/views/submissions.py b/comptest/web/views/submissions.py index 64a6c87..a86c5af 100644 --- a/comptest/web/views/submissions.py +++ b/comptest/web/views/submissions.py @@ -1,12 +1,13 @@ from django.contrib.auth.decorators import login_required from django.http import HttpRequest, HttpResponse, HttpResponseRedirect from django.shortcuts import render +from django.conf import settings from markdown_it import MarkdownIt from mdit_py_plugins.footnote import footnote_plugin from mdit_py_plugins.front_matter import front_matter_plugin from ..forms import SubmissionForm -from ..models import Evaluation, Submission, SubmissionMetadata +from ..models import Evaluation, Submission @login_required @@ -14,14 +15,13 @@ def create(request: HttpRequest) -> HttpResponse: """ Create a new submission. """ - if SubmissionMetadata.objects.exists(): - md = ( - MarkdownIt("commonmark", {"breaks": True, "html": True}) - .use(front_matter_plugin) - .use(footnote_plugin) - .enable("table") - ) - html_content = md.render(SubmissionMetadata.objects.latest().instructions) + md = ( + MarkdownIt("commonmark", {"breaks": True, "html": True}) + .use(front_matter_plugin) + .use(footnote_plugin) + .enable("table") + ) + html_content = md.render(settings.SITE_SUBMISSION_INSTRUCTIONS_MARKDOWN) if request.method == "POST": form = SubmissionForm(request.POST) @@ -30,8 +30,7 @@ def create(request: HttpRequest) -> HttpResponse: submission.user = request.user submission.name = form.cleaned_data["name"] submission.description = form.cleaned_data["description"] - if SubmissionMetadata.objects.exists(): - submission.metadata = _serialize_submission_metadata(form) + submission.metadata = form.cleaned_data["metadata"] submission.save() return HttpResponseRedirect("/submissions") else: @@ -76,12 +75,3 @@ def detail_evaluation(request: HttpRequest, id: int) -> HttpResponse: evaluation = Evaluation.objects.filter(version__user=request.user, id=id) return render(request, "submission/evaluation.html", {"evaluation": evaluation}) - -def _serialize_submission_metadata(inputForm): - """Serializes metadata from submission form into JSON""" - fields = SubmissionMetadata.objects.latest().items - values = [inputForm.cleaned_data[f] for f in fields] - - json_dict = {key: value for key, value in zip(fields, values)} - - return json_dict diff --git a/requirements.txt b/requirements.txt index e359c2b..8bb05a7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,6 @@ django-allauth[socialaccount] django-crispy-forms django-jsonform django-reversion -django-solo django-yamlconf fsspec markdown-it-py[plugins]