56 lines
1.4 KiB
Python
56 lines
1.4 KiB
Python
import json
|
|
|
|
from django.forms import widgets
|
|
|
|
from apps.files.models import File
|
|
|
|
|
|
class CommaSeparatedTextInput(widgets.HiddenInput):
|
|
def format_value(self, value):
|
|
try:
|
|
value = ",".join(value)
|
|
except TypeError:
|
|
value = ""
|
|
return super().format_value(value)
|
|
|
|
def value_from_datadict(self, data, files, name):
|
|
value = super().value_from_datadict(data, files, name)
|
|
|
|
if value == "":
|
|
return None
|
|
|
|
try:
|
|
return value.split(",")
|
|
except AttributeError:
|
|
return None
|
|
|
|
|
|
def idToDict(id):
|
|
file = File.objects.get(pk=id)
|
|
return dict(id=id, name=file.name())
|
|
|
|
|
|
# For clarity:
|
|
# the canonical format is a list of integers (IDs of files)
|
|
# the input/display format is a string containing a JSON list of {id=x, name=y} objects
|
|
class JSONFileListWidget(widgets.HiddenInput):
|
|
def format_value(self, value):
|
|
try:
|
|
value = [idToDict(id) for id in value]
|
|
value = json.dumps(value)
|
|
except TypeError:
|
|
value = ""
|
|
return super().format_value(value)
|
|
|
|
def value_from_datadict(self, data, files, name):
|
|
value = super().value_from_datadict(data, files, name)
|
|
|
|
if value == "":
|
|
return None
|
|
|
|
try:
|
|
filelist = json.loads(value)
|
|
return [file["id"] for file in filelist]
|
|
except json.JSONDecodeError:
|
|
return None
|