Fixes: 1) Correct line references in locale files for consistency; Extra: Improve formatting and alignment of string segments for clarity and maintainability;
43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
import json
|
|
from typing import Any
|
|
|
|
from django import forms
|
|
from django.forms.renderers import DjangoTemplates
|
|
|
|
|
|
class JSONTableWidget(forms.Widget):
|
|
template_name = "json_table_widget.html"
|
|
|
|
def format_value(self, value: str | dict[str, Any]):
|
|
if isinstance(value, dict):
|
|
return value
|
|
try:
|
|
if isinstance(value, str):
|
|
value = json.loads(value)
|
|
except json.JSONDecodeError:
|
|
value = {}
|
|
return value
|
|
|
|
def render(
|
|
self, name: str, value: str | dict[str, Any], attrs: dict | None = None, renderer: DjangoTemplates | None = None
|
|
):
|
|
value = self.format_value(value)
|
|
return super().render(name, value, attrs, renderer)
|
|
|
|
# noinspection PyUnresolvedReferences
|
|
def value_from_datadict(self, data: dict[str, Any], files: list, name: str):
|
|
json_data = {}
|
|
|
|
try:
|
|
keys = data.getlist(f"{name}_key")
|
|
values = data.getlist(f"{name}_value")
|
|
for key, value in zip(keys, values, strict=True):
|
|
if key.strip():
|
|
try:
|
|
json_data[key] = json.loads(value)
|
|
except (json.JSONDecodeError, ValueError):
|
|
json_data[key] = value
|
|
except TypeError:
|
|
pass
|
|
|
|
return None if not json_data else json.dumps(json_data)
|