/
form.py
61 lines (41 loc) · 1.51 KB
/
form.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import json
from django import forms
from djedi.plugins.base import DjediPlugin
def deprefix(s):
# Remove prefix (anything including and before __)
return s.rpartition("__")[-1]
def get_custom_render_widget(cls):
class CustomRenderWidget(cls):
def render(self, *args, **kwargs):
name = kwargs.pop("name", None)
if not name:
name = args[0]
args = args[1:]
name = deprefix(name)
return super().render("data[%s]" % name, *args, **kwargs)
return CustomRenderWidget
class BaseEditorForm(forms.Form):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in list(self.fields.keys()):
self.fields[field].widget.__class__ = get_custom_render_widget(
self.fields[field].widget.__class__
)
class FormsBasePlugin(DjediPlugin):
ext = None
@property
def forms(self):
return {}
def get_editor_context(self, request, **context):
if not request.is_ajax():
context.update({"forms": {tab: form() for tab, form in self.forms.items()}})
return context
def save(self, data, dumps=True):
data = self.collect_forms_data(data)
return json.dumps(data) if dumps else data
def collect_forms_data(self, data):
return {
deprefix(field): data.get(deprefix(field))
for tab, form in self.forms.items()
for field in form.base_fields.keys()
}