Skip to content

Commit

Permalink
Specify JSONSchema for Submission Metadata in django settings
Browse files Browse the repository at this point in the history
Fixes 2i2c-org#103
and some
  • Loading branch information
yuvipanda committed Oct 17, 2024
1 parent afa49db commit df5b430
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 65 deletions.
14 changes: 12 additions & 2 deletions comptest/comptest/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,7 @@
"reversion",
"django_jsonform",
"crispy_forms",
"crispy_bootstrap5",
"solo",
"crispy_bootstrap5"
]

MIDDLEWARE = [
Expand Down Expand Up @@ -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()
3 changes: 0 additions & 3 deletions comptest/web/admin.py
Original file line number Diff line number Diff line change
@@ -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,
)

Expand All @@ -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)
10 changes: 4 additions & 6 deletions comptest/web/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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):
Expand Down
16 changes: 16 additions & 0 deletions comptest/web/migrations/0024_delete_submissionmetadata.py
Original file line number Diff line number Diff line change
@@ -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",
),
]
19 changes: 19 additions & 0 deletions comptest/web/migrations/0025_alter_submission_metadata.py
Original file line number Diff line number Diff line change
@@ -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),
),
]
25 changes: 3 additions & 22 deletions comptest/web/models.py
Original file line number Diff line number Diff line change
@@ -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.

Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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
19 changes: 8 additions & 11 deletions comptest/web/views/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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}
)
Expand Down
30 changes: 10 additions & 20 deletions comptest/web/views/submissions.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
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
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)
Expand All @@ -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:
Expand Down Expand Up @@ -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
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ django-allauth[socialaccount]
django-crispy-forms
django-jsonform
django-reversion
django-solo
django-yamlconf
fsspec
markdown-it-py[plugins]

0 comments on commit df5b430

Please sign in to comment.