Anna Sidwell
79dffadd14
This involved turning the list of file IDs stored in the hidden text field into JSON.
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 JSONDecodeError:
|
|
return None
|