X-Git-Url: https://scm.cri.ensmp.fr/git/Plinn.git/blobdiff_plain/174a626682442c7b8513117e91ba6b8e956b818d..de068d5b8a1fd46a70f75f4e20e581ee846f866d:/skins/photo_theme/folder_contents.py?ds=sidebyside diff --git a/skins/photo_theme/folder_contents.py b/skins/photo_theme/folder_contents.py new file mode 100755 index 0000000..e0bc4d8 --- /dev/null +++ b/skins/photo_theme/folder_contents.py @@ -0,0 +1,232 @@ +##parameters=b_start=0, key='', reverse=0, ids=(), items_copy='', items_cut='', items_delete='', items_new='', items_paste='', items_rename='', items_up='', items_down='', items_top='', items_bottom='', items_sort='', template='', macro='', ajax='' +## +from Products.Plinn.PloneMisc import Batch +from DateTime import DateTime +locale_date_fmt = context.locale_date_fmt() +from ZTUtils import make_query +from Products.CMFCore.utils import getToolByName +from Products.CMFDefault.permissions import AddPortalContent +from Products.CMFDefault.permissions import DeleteObjects +from Products.CMFDefault.permissions import ListFolderContents +from Products.CMFDefault.permissions import ManageProperties +from Products.CMFDefault.permissions import ViewManagementScreens +from Products.CMFDefault.permissions import ModifyPortalContent +from Products.CMFDefault.utils import html_marshal + +mtool = getToolByName(script, 'portal_membership') +checkPermission = mtool.checkPermission +utool = getToolByName(script, 'portal_url') +portal_url = utool() + + +form = context.REQUEST.form +default_target = 'object/folderContents' +default_kw = {'b_start': b_start, 'key': key, 'reverse': reverse, 'ajax' : ajax} +if items_copy : + if ajax : default_kw['syncFragments']=['rightCell'] + if context.validateItemIds(**form) and \ + context.folder_copy_control(**form) and \ + context.setRedirect(context, default_target, **default_kw): + return +elif items_cut : + if ajax : default_kw['syncFragments']=['rightCell'] + if context.validateItemIds(**form) and \ + context.folder_cut_control(**form) and \ + context.setRedirect(context, default_target, **default_kw): + return +elif items_delete and \ + context.validateItemIds(**form) and \ + context.folder_delete_control(**form) and \ + context.setRedirect(context, default_target, **default_kw): + return +elif items_new and \ + context.setRedirect(context, 'object/new', **default_kw): + return +elif items_paste : + if ajax : default_kw['syncFragments']=['rightCell'] + if context.folder_paste_control(**form) and \ + context.setRedirect(context, default_target, **default_kw): + return +elif items_rename and \ + context.validateItemIds(**form) and \ + context.setRedirect(context, 'object/rename_items', ids=ids, + **default_kw): + return +elif items_sort and \ + context.folder_sort_control(**form) and \ + context.setRedirect(context, default_target, b_start=b_start): + return +elif items_up and \ + context.validateItemIds(**form) and \ + context.folder_up_control(**form) and \ + context.setRedirect(context, default_target, **default_kw): + return +elif items_down and \ + context.validateItemIds(**form) and \ + context.folder_down_control(**form) and \ + context.setRedirect(context, default_target, **default_kw): + return +elif items_top and \ + context.validateItemIds(**form) and \ + context.folder_top_control(**form) and \ + context.setRedirect(context, default_target, **default_kw): + return +elif items_bottom and \ + context.validateItemIds(**form) and \ + context.folder_bottom_control(**form) and \ + context.setRedirect(context, default_target, **default_kw): + return + + +options = {} + +items_add_allowed = checkPermission(AddPortalContent, context) +upitems_list_allowed = checkPermission(ListFolderContents, context, 'aq_parent') +manage_props_allowed = checkPermission(ManageProperties, context) + +target = context.getActionInfo(default_target)['url'] + +if not key: + (key, reverse) = context.getDefaultSorting() + is_default = 1 +elif (key, reverse) == context.getDefaultSorting(): + is_default = 1 +else: + is_default = 0 + +columns = ( {'key': 'Lock', + 'title': '', + 'width': '16', + 'colspan': None} + , {'key': 'Type', + 'title': 'Type', + 'width': None, + 'colspan': '2'} + , {'key': 'id', + 'title': 'Name', + 'width': None, + 'colspan': None} + , {'key': 'modified', + 'title': 'Last Modified', + 'width': None, + 'colspan': None} + , {'key': 'position', + 'title': 'Position', + 'width': None, + 'colspan': None } + ) + +for column in columns: + images = [] + if key == column['key'] : + if not is_default and manage_props_allowed : + images.append( {'src' : getattr(context, 'set_default_sorting.gif').absolute_url(), + 'alt' : 'Set Sorting as Default', + 'id' : 'SetSortingAsDefault', + 'href': '%s?%s' % (target, make_query(items_sort=True, + key=key, + reverse= (key != 'position' and [reverse] or [False])[0] ) + ) + } + ) + + if key != 'position' : + if reverse : + toggleImg = getattr(context, 'arrowDown.gif') + alt = 'descending sort' + else : + toggleImg = getattr(context, 'arrowUp.gif') + alt = 'ascending sort' + query = make_query(key=column['key'], reverse = not reverse) + else : + toggleImg = getattr(context, 'arrowUp.gif') + alt = 'ascending sort' + query = make_query(key=column['key']) + images.append( {'src' : toggleImg.absolute_url(), 'alt' : alt} ) + else : + if key != 'position' : + query = make_query(key=column['key'], reverse = reverse) + else : + query = make_query(key=column['key']) + + column['url'] = '%s?%s' % (target, query) + column['images'] = images + +context.filterCookie() +folderfilter = context.REQUEST.get('folderfilter', '') +filter = context.decodeFolderFilter(folderfilter) +items = context.listCatalogedContents(contentFilter=filter) +sort_dir = reverse and 'desc' or 'asc' +sortFunc = key in ['Type'] and 'nocase' or 'cmp' +items = sequence.sort( items, ((key, sortFunc, sort_dir),) ) +batch_obj = Batch(items, context.default_batch_size, b_start, orphan=0, quantumleap=1) +items = [] +i = 1 +display_delete_button = True # TODO : à revoirs +for item in batch_obj: + item_icon = item.getIcon + item_id = item.getId + item_position = key == 'position' and str(b_start + i) or '...' + i += 1 + item_url = item.getURL() + #try : item_delete_allowed = context.objectIdCanBeDeleted(item_id) + #except : item_delete_allowed = checkPermission(DeleteObjects, context) # std zope perm + #if not display_delete_button : + # display_delete_button = item_delete_allowed + items.append( + {'lock' : False, + 'checkbox': True, + 'icon': item_icon and ( '%s/%s' % (portal_url, item_icon) ) or '', + 'id': item_id, + 'modified': item.modified.strftime(locale_date_fmt), + 'position': item_position, + 'title_or_id': item.Title or item_id, + 'type': item.Type or None, + 'url': item_url } ) + +options['batch'] = { 'listColumnInfos': tuple(columns), + 'listItemInfos': tuple(items), + 'sort_key' : key, + 'sort_dir' : sort_dir, + 'batch_obj': batch_obj } + +hidden_vars = [] +for name, value in html_marshal(**default_kw): + hidden_vars.append( {'name': name, 'value': value} ) + +# buttons +buttons = [] +if items_add_allowed and context.allowedContentTypes(): + buttons.append( {'name': 'items_new', 'value': 'New...'} ) + if items: + buttons.append( {'name': 'items_rename', 'value': 'Rename'} ) + +if checkPermission(ViewManagementScreens, context) and items: + buttons.append( {'name': 'items_cut', 'value': 'Cut'} ) + buttons.append( {'name': 'items_copy', 'value': 'Copy'} ) + +if items_add_allowed and context.cb_dataValid(): + buttons.append( {'name': 'items_paste', 'value': 'Paste'} ) + +if display_delete_button and items: + buttons.append( {'name': 'items_delete', 'value': 'Delete'} ) + +length = batch_obj.sequence_length +is_orderable = manage_props_allowed and (key == 'position') and length > 1 +is_sortable = manage_props_allowed and not is_default +options['form'] = { 'action': target, + 'listHiddenVarInfos': tuple(hidden_vars), + 'listButtonInfos': tuple(buttons), + 'is_orderable': is_orderable, + 'is_sortable': is_sortable } +if not ajax and is_orderable : + deltas = range( 1, min(5, length) ) + range(5, length, 5) + options['form']['listDeltas'] = tuple(deltas) + +if template and macro : + options['template'] = template + options['macro'] = macro + return context.use_macro(**options) +else : + return context.folder_contents_template(**options) +