48 lines
1.3 KiB
Python
48 lines
1.3 KiB
Python
import json
|
|
|
|
from django import forms
|
|
|
|
|
|
class TaskNotesWidget(forms.Widget):
|
|
template_name = "tasks/task_notes_widget.html"
|
|
|
|
class Media:
|
|
js = ("tasks/task_notes.js",)
|
|
|
|
def value_from_datadict(self, data, files, name):
|
|
timestamps = data.getlist(f"{name}_timestamps")
|
|
contents = data.getlist(f"{name}_contents")
|
|
return {
|
|
"timestamps": timestamps,
|
|
"contents": contents,
|
|
}
|
|
|
|
def get_context(self, name, value, attrs):
|
|
context = super().get_context(name, value, attrs)
|
|
notes = {}
|
|
if value:
|
|
if isinstance(value, str):
|
|
try:
|
|
notes = json.loads(value)
|
|
except (json.JSONDecodeError, TypeError):
|
|
notes = {}
|
|
elif isinstance(value, dict):
|
|
notes = value
|
|
context["widget"]["notes"] = notes
|
|
return context
|
|
|
|
|
|
class TaskNotesField(forms.Field):
|
|
widget = TaskNotesWidget
|
|
|
|
def clean(self, value):
|
|
if not value:
|
|
return {}
|
|
result = {}
|
|
timestamps = value.get("timestamps", [])
|
|
contents = value.get("contents", [])
|
|
for i, ts in enumerate(timestamps):
|
|
if i < len(contents) and ts and contents[i].strip():
|
|
result[ts] = contents[i].strip()
|
|
return result if result else {}
|