def recordSet_Sort(self, REQUEST=None): request = self.REQUEST metaObj = self.getMetaobj(self.meta_id) res = request['res'] if 'sort_id' in [x['id'] for x in metaObj['attrs']]: l = [(x.get('sort_id', 1), x) for x in res] # Sort (FK). for metaObjAttr in metaObj['attrs'][1:]: if metaObjAttr.get('type', '') in self.getMetaobjIds(): d = {} # FK-id for primary-sort. [ self.operator_setitem(d, x.get(metaObjAttr['id']), x.get(metaObjAttr['id'])) for x in res ] for fkContainer in self.getParentNode().getChildNodes( request, metaObjAttr['type']): fkMetaObj = self.getMetaobj(fkContainer.meta_id) fkMetaObjAttrIdRecordSet = fkMetaObj['attrs'][0]['id'] fkMetaObjRecordSet = fkContainer.attr( fkMetaObjAttrIdRecordSet) fkMetaObjIdId = self.getMetaobjAttrIdentifierId( fkContainer.meta_id) # FK-sort_id for primary-sort. [ self.operator_setitem(d, x.get(fkMetaObjIdId), x.get('sort_id')) for x in fkMetaObjRecordSet ] # Add primary-sort. l = [((d.get(x[1].get(metaObjAttr['id'])), x[0]), x[1]) for x in l] break l.sort() res = [x[1] for x in l] else: qorder = request.get('qorder', '') qorderdir = 'asc' if qorder == '': skiptypes = ['file', 'image'] + self.getMetaobjManager( ).valid_xtypes + self.getMetaobjIds() for attr in metaObj['attrs'][1:]: if attr.get('type', '') not in skiptypes and \ attr.get('name', '') != '' and \ attr.get('custom', '') != '': qorder = attr['id'] if attr.get('type', '') in ['date', 'datetime', 'time']: qorderdir = 'desc' break if qorder: qorderdir = request.get('qorderdir', qorderdir) res = standard.sort_list(res, qorder, qorderdir) request.set('qorder', qorder) request.set('qorderdir', qorderdir) request.set('res', res) return res
def sort_list(self, l, qorder=None, qorderdir='asc', ignorecase=1): warn(self, 'sort_list', 'Products.zms.standard.sort_list') return standard.sort_list(l, qorder, qorderdir, ignorecase)
prepare = options.get('prepare', True) qorder = request.get('qorder', '') qorderdir = request.get('qorderdir', '') if not qorder: qorderdefault = zmscontext.attr('record_order_default') if qorderdefault.find(':') >= 0: qorder = qorderdefault[:qorderdefault.find(':')] qorderdir = qorderdefault[qorderdefault.find(':') + 1:] qorder = standard.get_session_value(zmscontext, 'qorder%s' % zmscontext.id, qorder) qorderdir = standard.get_session_value(zmscontext, 'qorderdir%s' % zmscontext.id, qorderdir) if records and qorder and qorderdir: if prepare: records = [{qorder: x.attr(qorder), 'ob': x} for x in records] [ standard.operator_setitem(x, qorder, 'None') for x in records if x.get(qorder) is None ] records = standard.sort_list(records, qorder, qorderdir) if prepare: records = [x['ob'] for x in records] request.set('qorder', qorder) request.set('qorderdir', qorderdir) return records # --// /sortChildNodes //--
def manage_changeRecordSet(self, lang, btn, action, REQUEST, RESPONSE): """ ZMSCustom.manage_changeRecordSet """ message = '' messagekey = 'manage_tabs_message' target = REQUEST.get('target', 'manage_main') params = {'lang': lang} t0 = time.time() if action or btn and btn not in ['BTN_CANCEL', 'BTN_BACK']: try: ##### Object State ##### self.setObjStateModified(REQUEST) metaObj = self.getMetaobj(self.meta_id) metaObjAttrIds = self.getMetaobjAttrIds(self.meta_id) res_abs = self.recordSet_Init(REQUEST) if action == 'insert': row = {} row['_created_uid'] = REQUEST[ 'AUTHENTICATED_USER'].getUserName() row['_created_dt'] = standard.getDateTime(time.time()) row['_change_uid'] = REQUEST[ 'AUTHENTICATED_USER'].getUserName() row['_change_dt'] = standard.getDateTime(time.time()) for metaObjAttr in metaObj['attrs'][1:]: objAttr = self.getObjAttr(metaObjAttr['id']) objAttrName = self.getObjAttrName(objAttr, lang) if metaObjAttr['type'] in self.metaobj_manager.valid_types or \ metaObjAttr['type'] not in self.metaobj_manager.valid_xtypes+self.metaobj_manager.valid_zopetypes: value = self.formatObjAttrValue( objAttr, REQUEST.get(objAttrName), lang) try: del value['aq_parent'] except: pass if metaObjAttr['id'] == 'sort_id' and value is None: value = len(res_abs) row[metaObjAttr['id']] = value res_abs.append(row) params['qindex'] = len(res_abs) - 1 message = self.getZMILangStr( 'MSG_INSERTED') % self.getZMILangStr('ATTR_RECORD') elif action == 'update': row = res_abs[REQUEST['qindex']] row['_change_uid'] = REQUEST[ 'AUTHENTICATED_USER'].getUserName() row['_change_dt'] = standard.getDateTime(time.time()) for metaObjAttr in metaObj['attrs'][1:]: objAttr = self.getObjAttr(metaObjAttr['id']) objAttrName = self.getObjAttrName(objAttr, lang) if metaObjAttr['type'] in self.metaobj_manager.valid_types or \ metaObjAttr['type'] not in self.metaobj_manager.valid_xtypes+self.metaobj_manager.valid_zopetypes: set, value = True, self.formatObjAttrValue( objAttr, REQUEST.get(objAttrName), lang) try: del value['aq_parent'] except: pass if value is None and metaObjAttr['id'] == 'sort_id': value = len(res_abs) if value is None and metaObjAttr['type'] in [ 'file', 'image' ] and int(REQUEST.get('del_%s' % objAttrName, 0)) == 0: set = False if set: row[metaObjAttr['id']] = value res_abs[REQUEST['qindex']] = row params['qindex'] = REQUEST['qindex'] message = self.getZMILangStr('MSG_CHANGED') elif action == 'delete': rows = [ res_abs[int(x)] for x in REQUEST.get('qindices', []) ] for row in rows: del res_abs[res_abs.index(row)] message = self.getZMILangStr('MSG_DELETED') % len(rows) elif action == 'duplicate': rows = [ copy.deepcopy(res_abs[int(x)]) for x in REQUEST.get('qindices', []) ] _change_uid = REQUEST['AUTHENTICATED_USER'].getUserName() _change_dt = standard.getDateTime(time.time()) identifiers = [ x for x in metaObj['attrs'][1:] if x['type'] == 'identifier' ] for row in rows: row['_change_uid'] = _change_uid row['_change_dt'] = _change_dt for identifier in identifiers: row[identifier['id']] = self.getNewId() res_abs += rows message = self.getZMILangStr('MSG_INSERTED') % ( '%i %s' % (len(rows), self.getZMILangStr('ATTR_RECORDS'))) elif action == 'move': for row in res_abs: row['sort_id'] = row.get('sort_id', 1) * 10 pos = REQUEST['pos'] newpos = REQUEST['newpos'] row = res_abs[REQUEST['qindex']] row['sort_id'] = row['sort_id'] + (newpos - pos) * 15 params['qindex'] = REQUEST['qindex'] + (newpos - pos) message = self.getZMILangStr('MSG_MOVEDOBJTOPOS') % ( '%s %i' % (self.getZMILangStr('ATTR_RECORD'), pos), newpos) # Normalize sort-ids. if 'sort_id' in metaObjAttrIds: res_abs = standard.sort_list(res_abs, 'sort_id') for i in range(len(res_abs)): row = res_abs[i] row['sort_id'] = i + 1 self.setObjProperty(metaObj['attrs'][0]['id'], res_abs, lang) ##### VersionManager #### self.onChangeObj(REQUEST) except: message = standard.writeError(self, "[manage_changeProperties]") messagekey = 'manage_tabs_error_message' message += ' (in ' + str(int( (time.time() - t0) * 100.0) / 100.0) + ' secs.)' # Return with message. params[messagekey] = message target = self.url_append_params(target, params) return REQUEST.RESPONSE.redirect(target)
def manage_collect_zope_artifacts(self, request=None): rtn = [] request = self.REQUEST RESPONSE = request.RESPONSE btn = request.form.get('btn') came_from = request.get('came_from', request['HTTP_REFERER']) if came_from.find('?') > 0: came_from = came_from[:came_from.find('?')] zope_objects = self.metaobj_manager.valid_zopetypes include_paths = [] exclude_paths = [] for metaobjId in self.getMetaobjIds(): for metaobjAttrId in self.getMetaobjAttrIds(metaobjId, types=zope_objects): exclude_paths.append(metaobjAttrId) def traverse(node, execute): rtn = [] meta_type = node.meta_type if node.meta_type in ['Folder']: for childNode in node.objectValues(): rtn.extend(traverse(childNode, execute)) elif meta_type in zope_objects: path = '/'.join(node.getPhysicalPath( ))[len('/'.join(self.getHome().getPhysicalPath())) + 1:] if path not in exclude_paths: i = {} i['path'] = path i['node'] = node i['status'] = [] if execute and path in request.get('ids', []): id = request['meta_id'] oldId = None newId = path newName = path newType = node.meta_type newCustom = zopeutil.readData(node) if type(newCustom) is not str: newCustom = str(newCustom) self.metaobj_manager.setMetaobjAttr(id=id, oldId=oldId, newId=newId, newName=newName, newType=newType, newCustom=newCustom) i['status'].append(newId) rtn.append(i) return rtn execute = request.get('btn') == 'Collect' t = traverse(self.getHome(), execute) rtn.append('<!DOCTYPE html>') rtn.append('<html>') rtn.append(self.zmi_html_head(self, request)) rtn.append('<body class="%s">' % (' '.join(['zmi', request['lang'], self.meta_id]))) rtn.append( self.zmi_body_header(self, request, options=[{ 'action': '#', 'label': 'Collect Artifacts' }])) rtn.append('<div id="zmi-tab">') rtn.append(self.zmi_breadcrumbs(self, request)) rtn.append( '<form class="form-horizontal pt-0" method="post" enctype="multipart/form-data">' ) rtn.append('<input type="hidden" name="lang" value="%s"/>' % request['lang']) rtn.append('<input type="hidden" name="came_from" value="%s"/>' % came_from) rtn.append( '<p class="zmi_help alert alert-info rounded-0"><b>Transfer Zope Artifacts to a ZMS Content-Object Library:</b> Please make sure, that the ZMS Content-Object Library you want to place the Zope objects is existing in the select list. If not, please change to the <a target="_blank" href="../content/metaobj_manager/manage_main">ZMS Content Object Menu</a> first, add a new one and refresh this page. After selecting the ZMS Lib as a target then select one more items from the Zope artifact list below. To start the transfer, please click the button <i>Collect</i>.</p>' ) # --- Cancel. # --------------------------------- if btn == self.getZMILangStr('BTN_CANCEL'): request.response.redirect( self.url_append_params(came_from, {'lang': request['lang']})) # --- Form. # --------------------------------- rtn.append('<div class="row m-2 my-4 flex-nowrap" >') rtn.append('<div class="col-md-3 col-sm-4 pr-0">') rtn.append( '<select class="form-control my-2" id="meta_id" name="meta_id">') rtn.append('<option value="">--- Content-Object Library... ---</option>') for metaobjId in standard.sort_list(self.getMetaobjIds()): metaobj = self.getMetaobj(metaobjId) if metaobj['type'] in ['ZMSLibrary']: rtn.append('<option value="%s"%s>%s</option>' % (metaobjId, [ '', ' selected="selected"' ][request.get('meta_id') == metaobjId], metaobjId)) rtn.append('</select>') rtn.append('</div>') rtn.append('<div class="col-md-9 col-sm-8 ">') rtn.append( '<button type="submit" name="btn" class="btn btn-primary m-2" value="Collect"><i class="fas fa-briefcase mr-2"></i> %s</button>' % ('Collect')) rtn.append( '<button type="submit" name="btn" class="btn btn-secondary m-2" value="BTN_REFRESH"><i class="fas fa-sync mr-2"></i> %s</button>' % (self.getZMILangStr('BTN_REFRESH'))) rtn.append( '<button type="submit" name="btn" class="btn btn-secondary m-2" value="BTN_CANCEL">%s</button>' % (self.getZMILangStr('BTN_CANCEL'))) rtn.append('</div><!-- .col-9 -->') rtn.append('</div><!-- .row -->') rtn.append('<table class="table table-bordered table-striped">') rtn.append('<thead>') rtn.append('<tr>') rtn.append('''<th class="text-center"> <span class="btn btn-secondary" title="%s/%s" onclick="zmiToggleSelectionButtonClick(this)"><i class="fas fa-check-square"></i></span> </th>''' % (self.getZMILangStr('BTN_SLCTALL'), self.getZMILangStr('BTN_SLCTNONE'))) rtn.append('<th class="w-100">Objekt</th>') rtn.append('<th>Status</th>') rtn.append('</tr>') rtn.append('</thead>') rtn.append('<tbody>') rtn.append('\n'.join([ '<tr><td class="text-center"><input type="checkbox" name="ids:list" value="%s" checked="checked"/></td><td><a href="%s/manage_main" target="_blank"><span title="%s"><i class="%s"></i></span> %s</a></td><td>%s</td></tr>' % ( x['path'], x['path'], x['node'].meta_type, x['node'].zmi_icon, x['path'], '<br>'.join(x['status']), ) for x in t ])) rtn.append('</tbody>') rtn.append('</table><!-- .table -->') # --------------------------------- rtn.append('</form><!-- .form-horizontal -->') rtn.append('</div><!-- #zmi-tab -->') rtn.append(self.zmi_body_footer(self, request)) rtn.append("""<script>$(function() { $(".table tr").each(function() { var $tr = $(this); if ($(".state.bg-success,.arrow-left",$tr).length > 0) { $("input:checkbox",$tr).remove(); $tr.addClass("bg-danger"); } }); var can_commit = $(".table tr input:checkbox:visible").length > 0; if (!can_commit) { $("#Commit-message,#toggle-checkboxes,button[value='Commit']").hide(); } });</script>""") rtn.append('</body>') rtn.append('</html>') return '\n'.join(rtn)