Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • AlekSIS/libs/django-forms-as-jsonschema
1 result
Show changes
Commits on Source (3)
from django.forms import Form from django.forms import Form
from django_forms_as_jsonschema.schema import Schema from .jsonschema import JSONSchema
class JSONSchemaFormMixin: class JSONSchemaFormMixin:
def as_jsonschema(self: Form) -> str: def as_jsonschema(self: Form) -> dict:
schema = Schema() schema = JSONSchema()
for name, field in self.fields.items(): for name, field in self.fields.items():
schema.add_field(name, field) schema.add_field(name, field)
return schema.schema return schema.schema
import copy
import json
from django import forms from django import forms
class Schema: class JSONSchema:
SCHEMA = {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
}
def __init__(self): def __init__(self):
self.schema = copy.deepcopy(self.SCHEMA) self.schema = {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
}
# example_json = { # example_json = {
# "type": "object", # "type": "object",
...@@ -70,40 +66,38 @@ class Schema: ...@@ -70,40 +66,38 @@ class Schema:
# } # }
# } # }
def build(self):
return json.dumps(self.schema)
def add_field(self, name, field): def add_field(self, name, field):
type_ = "string" new_field = {
format_ = None "type": "string",
x_display = None "title": str(field.label),
enum = None "description": str(field.help_text),
}
# string, number, integer, boolean. # string, number, integer, boolean.
match type(field.widget): match type(field.widget):
case forms.TextInput: case forms.TextInput:
type_ = "string" new_field["type"] = "string"
case forms.NumberInput: case forms.NumberInput:
type_ = "number" new_field["type"] = "integer" if type(field) == forms.IntegerField else "number"
case forms.EmailInput: case forms.EmailInput:
type_ = "string" new_field["type"] = "string"
format_ = "email" new_field["format"] = "email"
case forms.URLInput: case forms.URLInput:
type_ = "string" new_field["type"] = "string"
format_ = "url" new_field["format"] = "url"
case forms.PasswordInput: case forms.PasswordInput:
type_ = "string" new_field["type"] = "string"
format_ = "password" new_field["format"] = "password"
x_display = "password" new_field["x-display"] = "password"
case forms.HiddenInput: case forms.HiddenInput:
type_ = "string" new_field["type"] = "string"
format_ = "hidden" new_field["format"] = "hidden"
case forms.MultipleHiddenInput: case forms.MultipleHiddenInput:
... ...
...@@ -115,26 +109,26 @@ class Schema: ...@@ -115,26 +109,26 @@ class Schema:
... ...
case forms.Textarea: case forms.Textarea:
x_display = "textarea" new_field["x-display"] = "textarea"
case forms.DateInput: case forms.DateInput:
type_ = "string" new_field["type"] = "string"
format_ = "date" new_field["format"] = "date"
case forms.DateTimeInput: case forms.DateTimeInput:
type_ = "string" new_field["type"] = "string"
format_ = "date-time" new_field["format"] = "date-time"
case forms.TimeInput: case forms.TimeInput:
type_ = "string" new_field["type"] = "string"
format_ = "time" new_field["format"] = "time"
case forms.CheckboxInput: case forms.CheckboxInput:
type_ = "boolean" new_field["type"] = "boolean"
case forms.Select: case forms.Select:
type_ = "string" new_field["type"] = "string"
enum = [] # Fixme: load data from widget.options(…) new_field["enum"] = [] # Fixme: load data from widget.options(…)
case forms.NullBooleanSelect: case forms.NullBooleanSelect:
... ...
...@@ -157,14 +151,4 @@ class Schema: ...@@ -157,14 +151,4 @@ class Schema:
case forms.SelectDateWidget: case forms.SelectDateWidget:
... ...
self.schema["properties"][name] = { self.schema["properties"][name] = new_field
"type": type_,
"title": str(field.label),
"description": str(field.help_text),
}
if x_display:
self.schema["properties"][name]["x-display"] = x_display
if format_:
self.schema["properties"][name]["format"] = format_
if enum:
self.schema["properties"][name]["enum"] = enum