Skip to content

Datenformat für Austausch zwischen Frontend und Backend vereinfachen #249

@tumidi

Description

@tumidi

Das aktuelle Austauschformat für Question Options ist denkbar umständlich:

type OptionsFormDataValue = str | int | float | bool | list[str] | list[OptionsFile] | RichTextEditor | None
type OptionsFormData = Mapping[str, OptionsFormDataValue]

Konkret sieht das etwa so aus:

{
  "general[input]": "a",
  "general[chk]": false,
  "general[radio]": "OPT_1",
  "general[my_select]": ["OPT_1"],
  "general[my_hidden]": "foo",
  "general[my_repetition][1][role]": "OPT_1",
  "general[my_repetition][1][name][first_name]": "",
  "general[my_repetition][1][name][last_name]": "",
  "general[has_name]": false,
  "general[name_group][first_name]": "",
  "general[name_group][last_name]": "",
  "general[foo][text]": "<p>Foo bar</p>",
  "general[foo][files]": []
}

Das führt zu allerlei zerbrechlichen Umformungen im Backend, sowie im Frontend, z.B. hier, da oder auch dort, gesprenkelt über den gesamten Code, ist aber ganz besonders nervig wenn nicht bloß primitive Typen gehandhabt werden müssen, wie z.B. bei den Repetitions, oder jetzt neu File Uploads. (Ja, genau genommen ist es auch gar nicht flach, da es Ausnahmen gibt, z.B. für select, wie oben zu sehen.)

Das ganze führt auch ständig zu subtilen Bugs, z.B. beim Initialisieren mit defaults oder beim Umformen. Im Code sind auch noch einige Bugs, die ich bisher nicht angehen wollte, weil die mit diesem Issue eh obsolet würden.

Diese Umformungen sind auch eigentlich komplett unnötig, vor allem wenn man bedenkt, dass das Backend die Daten nur für die Übertragung flach macht, und das Frontend sie wieder zurück umwandeln muss in eine genestete Struktur, beim Speichern dasselbe, nur in umgekehrter Reihenfolge. Ich denke, insgesamt würde es viele Stellen stark vereinfachen, den Code insgesamt schrumpfen, lesbarer machen und nebenbei einige Bugs beheben, die Datenstruktur einfach genestet zu lassen.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions