11import json
22import uuid
33
4+ from django .contrib .staticfiles .storage import staticfiles_storage
45from django .core .serializers .json import DjangoJSONEncoder
56from django .forms .widgets import TextInput
6- from django .templatetags .static import static
77from django .urls import reverse
88from django .utils .html import format_html
99
1010from finder .models .file import AbstractFileModel , FileModel
11+ from finder .models .folder import FolderModel
1112
1213
13- class FinderFileSelect (TextInput ):
14- template_name = 'finder/widgets/finder_file_select.html'
15- accept_mime_types = None
16-
14+ class FinderInodeSelect (TextInput ):
1715 class Media :
1816 css = {'all' : ['finder/css/finder-select.css' ]}
1917 js = [format_html (
2018 '<script type="module" src="{}"></script>' ,
21- static ('finder/js/finder-select.js' )
19+ staticfiles_storage . url ('finder/js/finder-select.js' )
2220 )]
2321
22+
23+ class FinderFileSelect (FinderInodeSelect ):
24+ template_name = 'finder/widgets/finder_file_select.html'
25+ accept_mime_types = None
26+
2427 def get_context (self , name , value , attrs ):
2528 attrs = attrs or {}
2629 css_classes = attrs .get ('class' , '' ).split ()
27- css_classes .append ('finder-file-field ' )
30+ css_classes .append ('finder-hidden-input ' )
2831 attrs ['class' ] = ' ' .join (css_classes )
2932 if isinstance (value , str ):
3033 # file reference has not been stored using a `finder.models.fields.FinderFileField`
@@ -38,15 +41,48 @@ def get_context(self, name, value, attrs):
3841 context .update (
3942 base_url = reverse ('finder-api:base-url' ),
4043 realm = self .realm .slug ,
41- style_url = static ('finder/css/finder-browser.css' ),
44+ style_url = staticfiles_storage . url ('finder/css/finder-browser.css' ),
4245 )
4346 if isinstance (self .accept_mime_types , (list , tuple )) and self .accept_mime_types :
4447 context ['mime_types' ] = ',' .join (self .accept_mime_types )
4548 return context
4649
4750 def format_value (self , value ):
48- if value == "" or value is None :
51+ if value == '' or value is None :
4952 return None
5053 if isinstance (value , AbstractFileModel ):
5154 return value .id
5255 return value
56+
57+
58+ class FinderFolderSelect (FinderInodeSelect ):
59+ template_name = 'finder/widgets/finder_folder_select.html'
60+
61+ def get_context (self , name , value , attrs ):
62+ attrs = attrs or {}
63+ css_classes = attrs .get ('class' , '' ).split ()
64+ css_classes .append ('finder-hidden-input' )
65+ attrs ['class' ] = ' ' .join (css_classes )
66+ if isinstance (value , str ):
67+ # file reference has not been stored using a `finder.models.fields.FinderFileField`
68+ try :
69+ value = FolderModel .objects .get (id = uuid .UUID (value ))
70+ except (ValueError , FolderModel .DoesNotExist ):
71+ pass
72+ if isinstance (value , FolderModel ):
73+ attrs ['data-selected_folder' ] = json .dumps (value .as_dict (self .realm ), cls = DjangoJSONEncoder )
74+ context = super ().get_context (name , value , attrs )
75+ context .update (
76+ base_url = reverse ('finder-api:base-url' ),
77+ realm = self .realm .slug ,
78+ style_url = staticfiles_storage .url ('finder/css/finder-browser.css' ),
79+ folder_icon_url = staticfiles_storage .url ('finder/icons/folder.svg' ),
80+ )
81+ return context
82+
83+ def format_value (self , value ):
84+ if value == '' or value is None :
85+ return None
86+ if isinstance (value , FolderModel ):
87+ return value .id
88+ return value
0 commit comments