diff --git a/django_forms_as_jsonschema/jsonschema.py b/django_forms_as_jsonschema/jsonschema.py index 2aa468f5b38304c8f79fb947f6f9562e739e9b0a..d24fd3cefc3cdb100b9a3e8a4152cffd0a6e1c47 100644 --- a/django_forms_as_jsonschema/jsonschema.py +++ b/django_forms_as_jsonschema/jsonschema.py @@ -76,89 +76,92 @@ class JSONSchema: # string, number, integer, boolean. - match type(field.widget): - case forms.TextInput: + if type(field.widget) == forms.TextInput: + new_field["type"] = "string" + + elif type(field.widget) == forms.NumberInput: + new_field["type"] = "integer" if type(field) == forms.IntegerField else "number" + + elif type(field.widget) == forms.EmailInput: + new_field["type"] = "string" + new_field["format"] = "email" + + elif type(field.widget) == forms.URLInput: + new_field["type"] = "string" + new_field["format"] = "url" + + elif type(field.widget) == forms.PasswordInput: + new_field["type"] = "string" + new_field["format"] = "password" + new_field["x-display"] = "password" + + elif type(field.widget) == forms.HiddenInput: + new_field["type"] = "string" + new_field["format"] = "hidden" + + elif type(field.widget) == forms.MultipleHiddenInput: + ... + + elif type(field.widget) in [forms.FileInput, forms.ClearableFileInput]: + new_field |= { + "type": "string", + "contentMediaType": "image/*" if type(field) == forms.ImageField else "*", + "writeOnly": True + } + + # Fixme: differentiate between clearable and non-clearable + # elif type(field.widget) == forms.ClearableFileInput: + # ... + + elif type(field.widget) == forms.Textarea: + new_field["x-display"] = "textarea" + + elif type(field.widget) == forms.DateInput: + new_field["type"] = "string" + new_field["format"] = "date" + + elif type(field.widget) == forms.DateTimeInput: + new_field["type"] = "string" + new_field["format"] = "date-time" + + elif type(field.widget) == forms.TimeInput: + new_field["type"] = "string" + new_field["format"] = "time" + + elif type(field.widget) == forms.CheckboxInput: + new_field["type"] = "boolean" + + elif type(field.widget) in [forms.Select, forms.SelectMultiple, forms.RadioSelect, forms.CheckboxSelectMultiple, + forms.NullBooleanSelect]: + one_of = [] + for const, title in field.widget.choices: + one_of.append(dict(const=str(const), title=str(title))) + + if field.widget.allow_multiple_selected: + new_field["type"] = "array" + new_field["items"] = { + "type": "string", + "oneOf": one_of + } + else: new_field["type"] = "string" + new_field["oneOf"] = one_of - case forms.NumberInput: - new_field["type"] = "integer" if type(field) == forms.IntegerField else "number" + if type(field.widget) == forms.RadioSelect: + new_field["x-display"] = "radio" + elif type(field.widget) == forms.CheckboxSelectMultiple: + new_field["x-display"] = "checkbox" - case forms.EmailInput: - new_field["type"] = "string" - new_field["format"] = "email" - - case forms.URLInput: - new_field["type"] = "string" - new_field["format"] = "url" - - case forms.PasswordInput: - new_field["type"] = "string" - new_field["format"] = "password" - new_field["x-display"] = "password" - - case forms.HiddenInput: - new_field["type"] = "string" - new_field["format"] = "hidden" + elif type(field.widget) == forms.SplitDateTimeWidget: + ... - case forms.MultipleHiddenInput: - ... + elif type(field.widget) == forms.SplitHiddenDateTimeWidget: + ... - case forms.FileInput | forms.ClearableFileInput: - new_field |= { - "type": "string", - "contentMediaType": "image/*" if type(field) == forms.ImageField else "*", - "writeOnly": True - } + elif type(field.widget) == forms.SelectDateWidget: + ... - # Fixme: differentiate between clearable and non-clearable - # case forms.ClearableFileInput: - # ... - - case forms.Textarea: - new_field["x-display"] = "textarea" - - case forms.DateInput: - new_field["type"] = "string" - new_field["format"] = "date" - - case forms.DateTimeInput: - new_field["type"] = "string" - new_field["format"] = "date-time" - - case forms.TimeInput: - new_field["type"] = "string" - new_field["format"] = "time" - - case forms.CheckboxInput: - new_field["type"] = "boolean" - - case forms.Select | forms.SelectMultiple | forms.RadioSelect | forms.CheckboxSelectMultiple, forms.NullBooleanSelect: - one_of = [] - for const, title in field.widget.choices: - one_of.append(dict(const=str(const), title=str(title))) - - if field.widget.allow_multiple_selected: - new_field["type"] = "array" - new_field["items"] = { - "type": "string", - "oneOf": one_of - } - else: - new_field["type"] = "string" - new_field["oneOf"] = one_of - - if type(field.widget) == forms.RadioSelect: - new_field["x-display"] = "radio" - elif type(field.widget) == forms.CheckboxSelectMultiple: - new_field["x-display"] = "checkbox" - - case forms.SplitDateTimeWidget: - ... - - case forms.SplitHiddenDateTimeWidget: - ... - - case forms.SelectDateWidget: - ... + else: + print(field, type(field), type(field.widget)) self.schema["properties"][name] = new_field diff --git a/pyproject.toml b/pyproject.toml index 50bae850f7cf37cd36afe2ec43ee60561190a202..5e2501c6d9952b4679549b8e47f8ebb859ff4ca7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ description = "" authors = ["Julian Leucker <leuckerj@gmail.com>"] [tool.poetry.dependencies] -python = "^3.10" +python = "^3.9" Django = "^4.1" [tool.poetry.dev-dependencies]