示例#1
0
    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
示例#2
0
 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)
示例#3
0
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 //--
示例#4
0
    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)
示例#5
0
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)