def getViewHTML(self, maskitem, nodes, flags, language=None, template_from_caller=None, mask=None, use_label=True): if flags & VIEW_DATA_ONLY: ret = [] for item in maskitem.getChildren().sort_by_orderpos(): f = getMetadataType(item.get("type")) ret.append(f.getViewHTML(item, nodes, flags, language=language)) return ret else: if use_label: snippets = [ '<div class="mask_row hgroup hgroup-%s"><div class="mask_label">%s: </div><div class="mask_value">' % (maskitem.id, maskitem.getLabel()) ] else: snippets = [ '<div class="mask_row hgroup hgroup-%s"><div class="mask_value">' % (maskitem.id) ] raw_values = [' '] sep = '' has_raw_value = False # skip group display if no item has raw_value items = maskitem.getChildren().sort_by_orderpos() for i, item in enumerate(items): f = getMetadataType(item.get("type")) raw_value = f.getViewHTML(item, nodes, flags | VIEW_SUB_ELEMENT, language=language) if raw_value.strip(): raw_values.append(raw_value) if not raw_value == ' ': has_raw_value = True if sep: snippets.append(sep) sep = item.get('separator', ' ') snippets.append('<span class="hgroup_item">%s</span>' % raw_value) else: sep = '' # no separator before or after empty sub element unit = maskitem.get('unit').strip() if not has_raw_value: snippets = [] # no value when all sub elements are empty elif raw_values and unit: snippets.append( ' <span class="hgroup_unit field_unit hgroup-%s">%s</span></div></div>' % (maskitem.id, unit)) elif raw_values: snippets.append('</div></div>') ret = ''.join(snippets) return ret
def getMetaEditor(self, item, req): """ editor mask for hgroup-field definition """ fieldlist = getAllMetaFields() if len(item.getParents()) == 0: pid = req.params.get("pid", "") else: pid = item.getParents()[0].id if ustr(req.params.get("edit")) == ustr("None"): item = Maskitem(name="", type="maskitem") item.set("type", "hgroup") details = "" i = 0 for field in item.getChildren().sort_by_orderpos(): f = getMetadataType(field.get("type")) details += f.getMetaHTML(item, i, False, fieldlist=fieldlist) i += 1 if req.params.get("sel_id", "") != "": i = 0 for id in req.params.get("sel_id")[:-1].split(";"): f = getMetadataType(q(Node).get(id).get("type")) details += f.getMetaHTML( item, i, False, itemlist=req.params.get("sel_id")[:-1].split(";"), ptype="hgroup", fieldlist=fieldlist, language=lang(req)) i += 1 fields = [] metadatatype = req.params.get("metadatatype") if req.params.get("op", "") == "new": pidnode = q(Node).get(req.params.get("pid")) if pidnode.get("type") in ("vgroup", "hgroup"): for field in pidnode.all_children: if field.getType().getName( ) == "maskitem" and field.id != pidnode.id: fields.append(field) else: for m in metadatatype.getMasks(): if ustr(m.id) == ustr(req.params.get("pid")): for field in m.getChildren(): fields.append(field) fields.sort(lambda x, y: cmp(x.getOrderPos(), y.getOrderPos())) v = {} v["pid"] = pid v["item"] = item v["op"] = req.params.get("op", "") v["details"] = details v["fields"] = fields v["selid"] = req.params.get("sel_id", "") return req.getTAL("schema/mask/hgroup.html", v, macro="metaeditor")
def getMetaEditor(self, item, req): """ editor mask for vgroup-field definition """ fieldlist = getAllMetaFields() if len(item.getParents()) == 0: pid = req.params.get("pid", "") else: pid = item.getParents()[0].id if str(req.params.get("edit")) == str("None"): item = Maskitem(name="", type="maskitem") item.set("type", "vgroup") details = "" i = 0 for field in item.getChildren().sort_by_orderpos(): f = getMetadataType(field.get("type")) details += f.getMetaHTML(item, i, False, fieldlist=fieldlist, language=lang(req)) i += 1 if req.params.get("sel_id", "") != "": i = 0 for id in req.params.get("sel_id")[:-1].split(";"): f = getMetadataType(getNode(id).get("type")) try: details += f.getMetaHTML(item, i, False, itemlist=req.params.get("sel_id") [:-1].split(";"), ptype="vgroup", fieldlist=fieldlist) except TypeError: pass i += 1 fields = [] metadatatype = req.params.get("metadatatype") if req.params.get("op", "") == "new": pidnode = getNode(req.params.get("pid")) if pidnode.get("type") in ("vgroup", "hgroup"): for field in pidnode.getAllChildren(): if field.getType().getName() == "maskitem" and field.id != pidnode.id: fields.append(field) else: for m in metadatatype.getMasks(): if str(m.id) == str(req.params.get("pid")): for field in m.getChildren(): fields.append(field) fields.sort(lambda x, y: cmp(x.getOrderPos(), y.getOrderPos())) v = {} v["pid"] = pid v["item"] = item v["op"] = req.params.get("op", "") v["details"] = details v["fields"] = fields v["selid"] = req.params.get("sel_id", "") return req.getTAL("schema/mask/vgroup.html", v, macro="metaeditor")
def set_default_metadata(self, field, node): """ create/set metadata of a document if the value is not set to a default value the default value is normally an empty string except the fieldtype has an attribute "formatValues" (fieldtypes: list, mlist, dlist) an defines an option list. In this case the first listelement is used as default value :param field: field of mask defining metadata :param node: document :return: None """ element = field.getField() elementtype = element.get("type") key = element.getName() val = node.get_special(key) if val == "" and field.getDefault() != "": val = field.getDefault() if val == "": t = getMetadataType(elementtype) if hasattr(t, "formatValues"): context = Context(element, value=val, width=field.getWidth(), name=field.getName(), lock=0, language=None) valuelist = t.formatValues(context) if valuelist[0][0] in ('option', 'optionselected'): node.set(key, valuelist[0][2]) else: node.set(key, "") return None
def handle_json_request(req): s = [] if req.args.get("cmd") == "get_list_smi": searchmaskitem_id = req.params.get("searchmaskitem_id") f = None g = None if searchmaskitem_id and searchmaskitem_id != "full": f = q(Node).get(searchmaskitem_id).getFirstField() if not f: # All Metadata f = g = getMetadataType("text") container_id = req.args.get("container_id") container = q(Container).get(container_id) if container_id else None if container is None or not container.has_read_access(): container = get_collections_node() s = [ f.getSearchHTML( Context(g, value=req.args.get("query_field_value"), width=174, name="query" + str(req.args.get("fieldno")), language=lang(req), container=container, user=current_user, ip=req.ip)) ] req.write( req.params.get("jsoncallback") + "(%s)" % json.dumps(s, indent=4))
def handle_json_request(req): s = [] if req.args.get("cmd") == "get_list_smi": searchmaskitem_id = req.params.get("searchmaskitem_id") f = None g = None if searchmaskitem_id and searchmaskitem_id != "full": f = q(Node).get(searchmaskitem_id).getFirstField() if not f: # All Metadata f = g = getMetadataType("text") container_id = req.args.get("container_id") container = q(Container).get(container_id) if container_id else None if container is None or not container.has_read_access(): container = get_collections_node() s = [ f.getSearchHTML( Context( g, value=req.args.get("query_field_value"), width=174, name="query" + str(req.args.get("fieldno")), language=lang(req), container=container, user=current_user, ip=req.ip))] req.write(req.params.get("jsoncallback") + "(%s)" % json.dumps(s, indent=4))
def handle_json_request(req): s = [] if req.params.get("cmd") == "get_list_smi": searchmaskitem_id = req.params.get("searchmaskitem_id") f = None g = None if searchmaskitem_id and searchmaskitem_id != "full": f = tree.getNode(searchmaskitem_id).getFirstField() if not f: # All Metadata f = g = getMetadataType("text") s = [ f.getSearchHTML( Context(g, value=req.params.get("query_field_value"), width=174, name="query" + str(req.params.get("fieldno")), language=lang(req), collection=tree.getNode( req.params.get("collection_id")), user=users.getUserFromRequest(req), ip=req.ip)) ] req.write( req.params.get("jsoncallback") + "(%s)" % json.dumps(s, indent=4)) return
def getMetaHTML(self, parent, index, sub=False, language=None, fieldlist={}): item = parent.getChildren().sort_by_orderpos()[index] ret = '' i = 0 if not sub: ret += '<div id="{}" class="row metaeditor" onmouseover="pick(this)" onmouseout="unpick(this)" onclick="select(this)">'.format( item.id) ret += '<fieldset>' if item.getLabel() != "": ret += u'<legend>{}</legend>'.format(item.getLabel()) ret += '<div id="editor_content">' for field in item.getChildren().sort_by_orderpos(): f = getMetadataType(field.get("type")) ret += u'<div id="hitem">{}</div>'.format( f.getMetaHTML(item, i, True, language=language, fieldlist=fieldlist)) i += 1 if len(item.getChildren()) == 0: ret += '<span i18n:translate="mask_editor_no_fields">- keine Felder definiert -</span>' ret += '</fieldset>' if not sub: ret += '<div align="right" id="' + unicode(item.id) + \ '_sub" style="display:none; clear:both"><small style="color:silver">(' + (item.get("type")) + ')</small>' if index > 0: ret += '<input type="image" src="/img/uparrow.png" name="up_' + \ unicode(item.id) + '" i18n:attributes="title mask_edit_up_title"/>' else: ret += ' ' if index < len(parent.getChildren()) - 1: ret += '<input type="image" src="/img/downarrow.png" name="down_' + \ unicode(item.id) + '" i18n:attributes="title mask_edit_down_title"/>' else: ret += ' ' ret += ' <input type="image" src="/img/edit.png" name="edit_' + unicode( item.id ) + '" i18n:attributes="title mask_edit_edit_row"/> <input type="image" src="/img/delete.png" name="delete_' + unicode( item.id ) + '" i18n:attributes="title mask_edit_delete_row" onClick="return questionDel()"/></div>' ret += '</div>' return ret
def getViewHTML(self, field, nodes, flags, language=None, template_from_caller=None, mask=None, use_label=True): if flags & VIEW_DATA_ONLY: ret = [] for item in field.getChildren().sort_by_orderpos(): f = getMetadataType(item.get("type")) ret.append(f.getViewHTML(item, nodes, flags, language=language)) return ret else: # standard view ret = '<div class="mask_row"><fieldset>\n' if use_label: ret += '<legend>' + field.getLabel() + '</legend>' for item in field.getChildren().sort_by_orderpos(): f = getMetadataType(item.get("type")) ret += '<div class="mask_row">' + f.getViewHTML(item, nodes, flags) + '</div>\n' ret += '</fieldset></div>\n' return ret
def getViewHTML(self, field, nodes, flags, language=None, template_from_caller=None, mask=None, use_label=True): if flags & VIEW_DATA_ONLY: ret = [] for item in field.getChildren().sort_by_orderpos(): f = getMetadataType(item.get("type")) ret.append(f.getViewHTML(item, nodes, flags, language=language)) return ret else: if use_label: snippets = ['<div class="mask_row hgroup hgroup-%s"><div class="mask_label">%s: </div><div class="mask_value">' % (field.id, field.getLabel())] else: snippets = ['<div class="mask_row hgroup hgroup-%s"><div class="mask_value">' % (field.id)] raw_values = [' '] sep = '' has_raw_value = False # skip group display if no item has raw_value items = field.getChildren().sort_by_orderpos() len_items = len(items) for i, item in enumerate(items): f = getMetadataType(item.get("type")) raw_value = f.getViewHTML(item, nodes, flags | VIEW_SUB_ELEMENT, language=language) if raw_value.strip(): raw_values.append(raw_value) if not raw_value == ' ': has_raw_value = True if sep: snippets.append(sep) sep = item.get('separator', ' ') snippets.append('<span class="hgroup_item">%s</span>' % raw_value) else: sep = '' # no separator before or after empty sub element unit = field.get('unit').strip() if not has_raw_value: snippets = [] # no value when all sub elements are empty elif raw_values and unit: snippets.append(' <span class="hgroup_unit field_unit hgroup-%s">%s</span></div></div>' % (field.id, unit)) elif raw_values: snippets.append('</div></div>') ret = ''.join(snippets) return ret
def getFormHTML(self, field, nodes, req): ret = '<fieldset>' if field.getLabel() != "": ret += '<legend>' + field.getLabel() + '</legend>' for item in field.getChildren().sort_by_orderpos(): if item.get("type") in ("hgroup", "vgroup", "field", "label"): f = getMetadataType(item.get("type")) ret += f.getFormHTML(item, nodes, req) else: print "...wrong field..." ret += '</fieldset>' return ret
def getViewHTML(self, maskitem, nodes, flags, language=None, template_from_caller=None, mask=None): # XXX: this method claims to support multiple nodes. Unfortunately, this is not true at all... first_node = nodes[0] metafield = maskitem.metafield fieldtype = metafield.get("type") metatype = getMetadataType(fieldtype) if flags & VIEW_DATA_EXPORT: return metatype.getFormattedValue(metafield, maskitem, mask, first_node, language, html=0) value = metatype.getFormattedValue(metafield, maskitem, mask, first_node, language)[1] if not flags & VIEW_DATA_ONLY: if maskitem.getFormat() != "": value = maskitem.getFormat().replace("<value>", value) else: value = formatLongText(value, metafield) else: value = ensure_unicode(value) value = value.strip() if flags & VIEW_HIDE_EMPTY and not flags & VIEW_DATA_ONLY and not value: # hide empty elements return u'' unit = maskitem.getUnit() if value and unit: value += " " + unit if flags & VIEW_DATA_ONLY: # return a valuelist return [metafield.name, value, metafield.getLabel(), fieldtype] if flags & VIEW_SUB_ELEMENT: # metafield in hgroup # only using value omitting label, delimiter like ' ' may be inserted in hgroup.getViewHTML return value maskitem_label = maskitem.getLabel() if maskitem_label: label = maskitem_label + u":" else: label = u' ' # render HTML ret = u'<div class="mask_row field-{}"><div>'.format(metafield.name) ret += u'<div class="mask_label">{}</div>\n<div class="mask_value">{} </div>\n'.format(label, value) ret += u'</div></div>' return ret
def getFormHTML(self, field, nodes, req): cls = "editorrow" for item in field.getChildren().sort_by_orderpos(): if item.getField().id in req.params.get("errorlist", []): cls = "editorerror" break ret = '<div class="' + cls + '">' ret += '<div class="mask_label">' + field.getLabel() + '</div>' for item in field.getChildren().sort_by_orderpos(): f = getMetadataType(item.get("type")) ret += f.getFormHTML(item, nodes, req, True) return ret + '</div>'
def getSearchField(self, i, width=174): try: f = None if self.names[i] and self.names[i] != "full": f = tree.getNode(self.names[i]).getFirstField() g = None if f is None: # All Metadata # quick&dirty f = g = getMetadataType("text") return f.getSearchHTML(Context(g, value=self.values[i], width=width, name="query" + str(i), language=lang(self.req), collection=self.collection, user=users.getUserFromRequest(self.req), ip=self.req.ip)) except: # workaround for unknown error logException("error during getSearchField(i)") return ""
def getMetaHTML(self, parent, index, sub=False, language=None, fieldlist={}): item = parent.getChildren().sort_by_orderpos()[index] ret = '' i = 0 if not sub: ret += '<div id="{}" class="row metaeditor" onmouseover="pick(this)" onmouseout="unpick(this)" onclick="select(this)">'.format(item.id) ret += '<fieldset>' if item.getLabel() != "": ret += '<legend>{}</legend>'.format(item.getLabel()) ret += '<div id="editor_content">' for field in item.getChildren().sort_by_orderpos(): f = getMetadataType(field.get("type")) ret += '<div id="hitem">{}</div>'.format(f.getMetaHTML(item, i, True, language=language, fieldlist=fieldlist)) i += 1 if len(item.getChildren()) == 0: ret += '<span i18n:translate="mask_editor_no_fields">- keine Felder definiert -</span>' ret += '</fieldset>' if not sub: ret += '<div align="right" id="' + item.id + \ '_sub" style="display:none; clear:both"><small style="color:silver">(' + (item.get("type")) + ')</small>' if index > 0: ret += '<input type="image" src="/img/uparrow.png" name="up_' + \ str(item.id) + '" i18n:attributes="title mask_edit_up_title"/>' else: ret += ' ' if index < len(parent.getChildren()) - 1: ret += '<input type="image" src="/img/downarrow.png" name="down_' + \ str(item.id) + '" i18n:attributes="title mask_edit_down_title"/>' else: ret += ' ' ret += ' <input type="image" src="/img/edit.png" name="edit_' + str( item.id) + '" i18n:attributes="title mask_edit_edit_row"/> <input type="image" src="/img/delete.png" name="delete_' + str( item.id) + '" i18n:attributes="title mask_edit_delete_row" onClick="return questionDel()"/></div>' ret += '</div>' return ret
def getSearchField(self, pos, width=174): try: searchmaskitem_id = self.searchmaskitem_ids[pos] searchmaskitem = self.searchmask.children.filter_by(id=searchmaskitem_id).scalar() if searchmaskitem_id else None field = searchmaskitem.children.first() if searchmaskitem else None g = None if field is None: # All Metadata # quick&dirty field = getMetadataType("text") return field.getSearchHTML(Context( field, value=self.values[pos], width=width, name="query" + unicode(pos), language=self.lang, container=self.container, user=current_user, ip=self.ip)) except: # workaround for unknown error logg.exception("exception in getSearchField, return empty string") return ""
def getSearchField(self, pos, width=174): try: searchmaskitem_id = self.searchmaskitem_ids[pos] searchmaskitem = self.searchmask.children.filter_by( id=searchmaskitem_id).scalar() if searchmaskitem_id else None field = searchmaskitem.children.first() if searchmaskitem else None g = None if field is None: # All Metadata # quick&dirty field = getMetadataType("text") return field.getSearchHTML( Context(field, value=self.values[pos], width=width, name="query" + unicode(pos), language=self.lang, container=self.container, user=current_user, ip=self.ip)) except: # workaround for unknown error logg.exception("exception in getSearchField, return empty string") return ""
def popup_metatype(req): mtype = getMetadataType(req.path.split("/")[-1]) if mtype and hasattr(mtype, "getPopup"): mtype.getPopup(req) else: logg.error("error, no popup method found")
def getViewHTML(self, maskitem, nodes, flags, language=None, template_from_caller=None, mask=None): # XXX: this method claims to support multiple nodes. Unfortunately, this is not true at all... first_node = nodes[0] metafield = maskitem.metafield fieldtype = metafield.get("type") metatype = getMetadataType(fieldtype) if flags & VIEW_DATA_EXPORT: return metatype.getFormattedValue(metafield, maskitem, mask, first_node, language, html=0) value = metatype.getFormattedValue(metafield, maskitem, mask, first_node, language)[1] if not flags & VIEW_DATA_ONLY: if maskitem.getFormat() != "": value = maskitem.getFormat().replace("<value>", value) else: value = formatLongText(value, metafield) value = value.strip() if flags & VIEW_HIDE_EMPTY and not flags & VIEW_DATA_ONLY and not value: # hide empty elements return u'' unit = maskitem.getUnit() if value and unit: value += " " + unit if flags & VIEW_DATA_ONLY: # return a valuelist return [metafield.name, value, metafield.getLabel(), fieldtype] if flags & VIEW_SUB_ELEMENT: # metafield in hgroup # only using value omitting label, delimiter like ' ' may be inserted in hgroup.getViewHTML return value maskitem_label = maskitem.getLabel() if maskitem_label: label = maskitem_label + u":" else: label = u' ' # render HTML ret = u'<div class="mask_row field-{}"><div>'.format(metafield.name) ret += u'<div class="mask_label">{}</div>\n<div class="mask_value">{} </div>\n'.format( label, value) ret += u'</div></div>' return ret
def getViewHTML(self, field, nodes, flags, language=None, template_from_caller=None, mask=None): element = field.getField() if not element: return [] fieldtype = element.get("type") t = getMetadataType(element.get("type")) unit = '' if field.getUnit() != "": unit = ' ' + field.getUnit() if flags & VIEW_DATA_ONLY: if fieldtype in ['text']: value = u(t.getFormatedValue(element, nodes[0], language, template_from_caller=template_from_caller, mask=mask)[1]) else: value = u(t.getFormatedValue(element, nodes[0], language)[1]) else: if field.getFormat() != "": if fieldtype in ['text']: value = t.getFormatedValue(element, nodes[0], language, template_from_caller=template_from_caller, mask=mask)[1] else: value = t.getFormatedValue(element, nodes[0], language)[1] value = field.getFormat().replace("<value>", value) else: if fieldtype in ['text']: if template_from_caller and template_from_caller[0]: # checking template on test nodes: show full length fieldvalue = nodes[0].get(element.name) if fieldvalue.strip(): # field is filled for this node value = str(t.getFormatedValue(element, nodes[0], language, template_from_caller=fieldvalue, mask=mask)[1]) else: # use default value = str( t.getFormatedValue(element, nodes[0], language, template_from_caller=template_from_caller, mask=mask)[1]) else: # cut long values value = str( formatLongText( t.getFormatedValue( element, nodes[0], language, template_from_caller=template_from_caller, mask=mask)[1], element)) elif fieldtype in ['upload']: # passing mask necessary for fieldtype='upload' value = str(formatLongText(t.getFormatedValue(element, nodes[0], language, mask=mask)[1], element)) else: value = str(formatLongText(t.getFormatedValue(element, nodes[0], language)[1], element)) if len(value.strip()) > 0: value += str(unit) label = ' ' if field.getLabel() != "": label = field.getLabel() + ': ' if flags & VIEW_DATA_ONLY: # return a valuelist return [element.getName(), value, element.getLabel(), element.get("type")] elif flags & VIEW_SUB_ELEMENT: # element in hgroup # only using value omitting label, delimiter like ' ' may be inserted in hgroup.getViewHTML return value elif flags & VIEW_HIDE_EMPTY and value.strip() == "": # hide empty elements return '' elif flags & VIEW_DATA_EXPORT: if fieldtype in ['text']: return str(t.getFormatedValue(element, nodes[0], language, html=0, template_from_caller=template_from_caller, mask=mask)[1]) else: return str(t.getFormatedValue(element, nodes[0], language, html=0)[1]) # return element.get("type") else: # standard view ret = '<div class="mask_row field-' + element.getName() + '"><div>' ret += '<div class="mask_label">' + label + '</div>\n<div class="mask_value">' + value + ' </div>\n' ret += '</div></div>' return ret
def render_mask_template(node, mfs, words=None, separator="", skip_empty_fields=True): """ mfs: [mask] + list_of_maskfields """ res = [] exception_count = {} mask = mfs[0] for node_attribute, fd in mfs[1:]: metafield_type = fd['metafield_type'] field_type = fd['field_type'] if metafield_type in ['date', 'url', 'hlist']: exception_count[ metafield_type] = exception_count.setdefault( metafield_type, 0) + 1 value = node.get(node_attribute) try: value = fd['metadatatype'].getFormatedValue( fd['element'], node, language=language, mask=mask)[1] except: value = fd['metadatatype'].getFormatedValue( fd['element'], node, language=language)[1] elif metafield_type in ['field']: if field_type in ['hgroup', 'vgroup']: _sep = '' if field_type == 'hgroup': fd['unit'] = '' # unit will be taken from definition of the hgroup use_label = False else: use_label = True value = getMetadataType(field_type).getViewHTML( fd['field'], # field [node], # nodes 0, # flags language=language, mask=mask, use_label=use_label) else: value = node.get(node_attribute) metadatatype = fd['metadatatype'] if hasattr(metadatatype, "language_snipper"): metafield = fd['element'] if (metafield.get("type") == "text" and metafield.get("valuelist") == "multilingual") \ or \ (metafield.get("type") in ['memo', 'htmlmemo'] and metafield.get("multilang") == '1'): value = metadatatype.language_snipper( value, language) if value.find('<') >= 0: # replace variables for var in re.findall(r'<(.+?)>', value): if var == "att:id": value = value.replace("<" + var + ">", node.id) elif var.startswith("att:"): val = node.get(var[4:]) if val == "": val = "____" value = value.replace("<" + var + ">", val) value = value.replace("<", "<").replace(">", ">") if value.find('<') >= 0: # replace variables for var in re.findall(r'\<(.+?)\>', value): if var == "att:id": value = value.replace("<" + var + ">", node.id) elif var.startswith("att:"): val = node.get(var[4:]) if val == "": val = "____" value = value.replace("<" + var + ">", val) value = value.replace("<", "<").replace(">", ">") if value.find('tal:') >= 0: context['node'] = node value = runTALSnippet(value, context) # don't escape before running TAL if (not value) and fd['default']: default = fd['default'] if fd['default_has_tal']: context['node'] = node value = runTALSnippet(default, context) else: value = default if skip_empty_fields and not value: continue if fd["unit"]: value = value + " " + fd["unit"] if fd["format"]: value = fd["format"].replace("<value>", value) if words: value = highlight(value, words, '<font class="hilite">', "</font>") res.append(fd["template"] % value) if exception_count and len(exception_count.keys()) > 1: pass return separator.join(res)
def render_mask_template(node, mfs, words=None, separator="", skip_empty_fields=True): """ mfs: [mask] + list_of_maskfields """ res = [] exception_count = {} mask = mfs[0] for node_attribute, fd in mfs[1:]: metafield_type = fd['metafield_type'] field_type = fd['field_type'] if metafield_type in ['date', 'url', 'hlist']: exception_count[metafield_type] = exception_count.setdefault(metafield_type, 0) + 1 value = node.get(node_attribute) try: value = fd['metadatatype'].getFormatedValue(fd['element'], node, language=language, mask=mask)[1] except: value = fd['metadatatype'].getFormatedValue(fd['element'], node, language=language)[1] elif metafield_type in ['field']: if field_type in ['hgroup', 'vgroup']: _sep = '' if field_type == 'hgroup': fd['unit'] = '' # unit will be taken from definition of the hgroup use_label = False else: use_label = True value = getMetadataType(field_type).getViewHTML( fd['field'], # field [node], # nodes 0, # flags language=language, mask=mask, use_label=use_label) else: value = node.get(node_attribute) metadatatype = fd['metadatatype'] if hasattr(metadatatype, "language_snipper"): metafield = fd['element'] if (metafield.get("type") == "text" and metafield.get("valuelist") == "multilingual") \ or \ (metafield.get("type") in ['memo', 'htmlmemo'] and metafield.get("multilang") == '1'): value = metadatatype.language_snipper(value, language) if value.find('<') >= 0: # replace variables for var in re.findall(r'<(.+?)>', value): if var == "att:id": value = value.replace("<" + var + ">", node.id) elif var.startswith("att:"): val = node.get(var[4:]) if val == "": val = "____" value = value.replace("<" + var + ">", val) value = value.replace("<", "<").replace(">", ">") if value.find('<') >= 0: # replace variables for var in re.findall(r'\<(.+?)\>', value): if var == "att:id": value = value.replace("<" + var + ">", node.id) elif var.startswith("att:"): val = node.get(var[4:]) if val == "": val = "____" value = value.replace("<" + var + ">", val) value = value.replace("<", "<").replace(">", ">") if value.find('tal:') >= 0: context['node'] = node value = runTALSnippet(value, context) # don't escape before running TAL if (not value) and fd['default']: default = fd['default'] if fd['default_has_tal']: context['node'] = node value = runTALSnippet(default, context) else: value = default if skip_empty_fields and not value: continue if fd["unit"]: value = value + " " + fd["unit"] if fd["format"]: value = fd["format"].replace("<value>", value) if words: value = highlight(value, words, '<font class="hilite">', "</font>") res.append(fd["template"] % value) if exception_count and len(exception_count.keys()) > 1: pass return separator.join(res)
def replaceVars(self, s, node, attrnode=None, field_value="", options=[], mask=None, raw=0, default=""): # if attrnode and node: for var in re.findall(r"\[(.+?)\]", s): if var.startswith("att:field|replacestring"): s2 = self.replaceStr(attrnode.getName(), var[24:]) s = s.replace("[" + var + "]", s2) elif var.startswith("att:field|substring"): s2 = self.subStr(attrnode.getName(), var[20:]) s = s.replace("[" + var + "]", s2) elif var == "field": s = s.replace("[field]", field_value) elif var == ("cmd:getTAL"): s = exportutils.handleCommand("cmd:getTAL", var, s, node, attrnode, field_value, options, mask) elif var.startswith("value|formatdate"): date_from = format_date(parse_date(node.get(attrnode.getName())), var[18:-1]) s = s.replace("[" + var + "]", date_from) elif var.startswith("value|replacestring"): s2 = self.replaceStr(node.get(attrnode.getName()), var[20:]) s = s.replace("[" + var + "]", s2) elif var.startswith("value|substring"): s2 = self.subStr(node.get(attrnode.getName()), var[16:]) s = s.replace("[" + var + "]", s2) elif var.startswith("value|nodename"): try: s2 = tree.getNode(node.get(attrnode.getName())).getName() except: s2 = node.getName() s = s.replace("[" + var + "]", s2) elif var == "value": v = getMetadataType(attrnode.getFieldtype()).getFormatedValue(attrnode, node)[1] if v == "": v = node.get(attrnode.getName()) if v == "" and default != "": v = default if "t" in options and not v.isdigit(): v = '"' + v + '"' s = s.replace("[value]", v) elif var == "ns": ns = "" for mapping in attrnode.get("exportmapping").split(";"): n = tree.getNode(mapping) if n.getNamespace() != "" and n.getNamespaceUrl() != "": ns += "xmlns:" + n.getNamespace() + '="' + n.getNamespaceUrl() + '" ' s = s.replace("[" + var + "]", ns) for ext in self.extensions: s = ext.func(s, var, node, attrnode) if raw == 1: return s ret = "" for i in range(0, len(s)): if s[i - 1] == "\\": if s[i] == "r": ret += "\r" elif s[i] == "n": ret += "\n" elif s[i] == "t": ret += "\t" elif s[i] == "\\": pass else: ret += s[i] return desc(ret)
def getFormHTML(self, field, nodes, req, sub=False): """ create editor field (editarea)""" element = field.getField() ret = '' label = '' description = '<div id="div_description"></div>' unit = '' if not sub: label += '<div class="label">' + field.getLabel() + ':' if (int(field.getRequired()) > 0): label += ' <span class="required">*</span>' label += '</div>' else: if field.getLabel() != "": label += field.getLabel() + ': ' if int(field.getRequired()) > 0: label += '<span class="required">*</span> ' if field.getDescription() != "": description = '<div id="div_description"><a href="#" onclick="openPopup(\'/popup_help?id=' + ustr(element.id) + \ '&maskid=' + ustr(field.id) + '\', \'\', 400, 250)"><img src="/img/tooltip.png" border="0"/></a></div>' if not sub: if ustr(element.id) in req.params.get("errorlist", []): ret += '<div class="editorerror">' else: ret += '<div class="editorrow">' ret += label + description elementtype = element.get("type") val = nodes[0].get_special(element.getName()) for node in nodes: elementname = node.get_special(element.getName()) if elementname == "": val = "" valuelist = {} lock = 0 differentvalues = 0 containsemptystring = val == "" for node in nodes: newvalue = node.get_special(element.getName()) containsemptystring = containsemptystring or newvalue == "" if newvalue not in valuelist: differentvalues += 1 valuelist[newvalue] = 1 if differentvalues == 2 and containsemptystring: for t in valuelist.keys(): if t != "": val = t lock = 1 elif differentvalues >= 2: val = "? " lock = 1 if val == "" and field.getDefault() != "": val = field.getDefault() t = getMetadataType(elementtype) if field.getUnit() != "": unit += field.getUnit() ret += '<div id="editor_content">' + \ t.getEditorHTML(element, value=val, width=field.getWidth(), lock=lock, language=lang(req), required=field.getRequired()) + unit + '</div>' if not sub: ret += '</div>' return ret
def getMetaEditor(self, item, req): """ editor mask for field definition """ attr = {} fields = [] pidnode = None if "pid" not in req.params.keys(): for p in item.getParents(): try: if p.getMasktype() == "export": pidnode = p break except: continue metadatatype = req.params.get("metadatatype") for t in metadatatype.getDatatypes(): content_class = Node.get_class_for_typestring(t) node = content_class(name=u'') attr.update(node.getTechnAttributes()) if req.params.get("op", "") == "new": pidnode = q(Node).get(req.params.get("pid")) if hasattr(pidnode, 'getMasktype') and pidnode.getMasktype() in ("vgroup", "hgroup"): # XXX: getAllChildren does not exist anymore, is this dead code? for field in pidnode.getAllChildren(): if field.getType().getName() == "maskitem" and field.id != pidnode.id: fields.append(field) else: for m in metadatatype.getMasks(): if ustr(m.id) == ustr(req.params.get("pid")): for field in m.getChildren(): fields.append(field) fields.sort(lambda x, y: cmp(x.getOrderPos(), y.getOrderPos())) add_values = [] val = u"" if item.getField(): val = item.getField().getValues() db.session.commit() for t in getMetaFieldTypeNames(): f = getMetadataType(t) add_values.append(f.getMaskEditorHTML(val, metadatatype=metadatatype, language=lang(req))) metafields = metadatatype.getMetaFields() metafields.sort(lambda x, y: cmp(x.getName().lower(), y.getName().lower())) metafieldtypes = getMetaFieldTypes().values() metafieldtypes.sort(lambda x, y: cmp(translate(x.getName(), request=req).lower(), translate(y.getName(), request=req).lower())) add_descriptions = [] for metafield in metafields: add_descriptions.append('<div style="display:none" id="div_%d" name="%s" description="%s"/>' % (metafield.id, metafield.name, metafield.getDescription())) v = {} v["op"] = req.params.get("op", "") v["pid"] = req.params.get("pid", "") v["item"] = item v["metafields"] = metafields v["fields"] = fields v["fieldtypes"] = metafieldtypes v["dateoption"] = dateoption v["t_attrs"] = attr v["icons"] = {"externer Link": "/img/extlink.png", "Email": "/img/email.png"} v["add_values"] = add_values v["add_descriptions"] = add_descriptions v["translate"] = translate v["language"] = lang(req) if pidnode and hasattr(pidnode, 'getMasktype') and pidnode.getMasktype() == "export": v["mappings"] = [] for m in pidnode.getExportMapping(): v["mappings"].append(q(Node).get(m)) return req.getTAL("schema/mask/field.html", v, macro="metaeditor_" + pidnode.getMasktype()) else: return req.getTAL("schema/mask/field.html", v, macro="metaeditor")
def render_mask_template(node, mask, field_descriptors, language, words=None, separator="", skip_empty_fields=True): res = [] for node_attribute, fd in field_descriptors: metafield_type = fd['metafield_type'] maskitem = fd['maskitem'] metafield = fd["metafield"] metatype = fd["metatype"] maskitem_type = fd["maskitem_type"] if metafield_type in ['date', 'url', 'hlist']: value = metatype.getFormattedValue(metafield, maskitem, mask, node, language)[1] elif metafield_type in ['field']: if maskitem_type in ['hgroup', 'vgroup']: _sep = '' if maskitem_type == 'hgroup': fd['unit'] = '' # unit will be taken from definition of the hgroup use_label = False else: use_label = True value = getMetadataType(maskitem_type).getViewHTML( metafield, [node], # nodes 0, # flags language=language, mask=mask, use_label=use_label) else: value = node.get_special(node_attribute) if hasattr(metatype, "language_snipper"): if (metafield.get("type") == "text" and metafield.get("valuelist") == "multilingual") \ or \ (metafield.get("type") in ['memo', 'htmlmemo'] and metafield.get("multilang") == '1'): value = metatype.language_snipper(value, language) if value.find('<') >= 0: # replace variables value = replace_attribute_variables(value, node.id, node.get_special, r'<(.+?)>', "<", ">") value = value.replace("<", "<").replace(">", ">") if value.find('<') >= 0: # replace variables value = replace_attribute_variables(value, node.id, node.get_special, r'\<(.+?)\>', "<", ">") value = value.replace("<", "<").replace(">", ">") default = fd['default'] if not value and default: value = default if skip_empty_fields and not value: continue if fd["unit"]: value = value + " " + fd["unit"] if fd["format"]: value = fd["format"].replace("<value>", value) if words: value = highlight(value, words, '<font class="hilite">', "</font>") res.append(fd["template"] % value) return separator.join(res)
def getMetaHTML(self, parent, index, sub=False, language=None, itemlist=[], ptype="", fieldlist={}): """ return formated row for metaeditor """ if len(itemlist) > 0: # parent still not existing item = q(Node).get(itemlist[index]) pitems = len(itemlist) else: item = parent.getChildren().sort_by_orderpos()[index] ptype = parent.get("type") pitems = len(parent.getChildren()) field = item.getField() ret = '' label = '' description = '' if field: f = getMetadataType(field.get("type")) fieldstring = f.getEditorHTML(field, width=item.getWidth(), value=item.getDefault(), language=language) + ' ' + item.getUnit() else: # node for export mask attribute = q(Node).get(item.get("attribute")) field = item fieldstring = getMetadataType("mappingfield").getEditorHTML( field, width=item.getWidth(), value=attribute.getName(), language=language) + ' ' + item.getUnit() if item.getDescription() != "": description = '<div id="div_description"><a href="#" onclick="openPopup(\'/popup_help?id=%s&maskid=%s\', \'\', 400, 250)"> <img src="/img/tooltip.png" border="0"/></a></div>' % ( field.id, item.id) if len(item.getLabel()) > 0 and item.getLabel() != "mapping": label = item.getLabel() + ': ' required = "" if item.getRequired(): required = '<span class="required">*</span>' if ptype in("vgroup", "hgroup") or not sub: label = '<div class="label">%s %s</div>%s' % (label, required, description) else: label += required else: label = '<div class="label"> </div>' if not sub: ret += '<div id="%s" class="row" onmouseover="pick(this)" onmouseout="unpick(this)" onclick="select(this)" style="position:relative;min-height:30px">' % ( item.id) if len(label) > 0: ret += '%s<div id="editor_content">%s</div>' % (label, fieldstring) else: ret += fieldstring if not sub: # <small style="color:silver">('+(item.get("type"))+')</small>' ret += '<div align="right" id="%s_sub" style="display:none; position:absolute; right:1px; top:3px" class="edit_tools">' % ( item.id) if index > 0: ret += '<input type="image" src="/img/uparrow.png" name="up_%s" i18n:attributes="title mask_edit_up_title"/>' % (item.id) else: ret += ' ' if index < pitems - 1: ret += '<input type="image" src="/img/downarrow.png" name="down_%s" i18n:attributes="title mask_edit_down_title"/>' % ( item.id) else: ret += ' ' if field.getName() in fieldlist.keys(): if len(fieldlist[field.getName()]) > 1: ret += ' <img src="/img/attention.gif" title="%s ' % (translate("mask_edit_multi_label", language)) ret += ", ".join([schema.getName() for schema in fieldlist[field.getName()]]) + '"/>' ret += ' <input type="image" src="/img/edit.png" name="edit_%s" i18n:attributes="title mask_edit_edit_row"/> <input type="image" src="/img/delete.png" name="delete_%s" i18n:attributes="title mask_edit_delete_row" onClick="return questionDel()"/></div></div>' % (item.id, item.id) return ret
def show_node_text_deep(self, words=None, language=None, separator="", labels=0): if not separator: separator = u"<br/>" lookup_key = make_lookup_key(self, language, labels) # if the lookup_key is already in the cache dict: render the cached mask_template # else: build the mask_template if not 'maskcache' in request.app_cache: request.app_cache['maskcache'] = {} request.app_cache['maskcache_accesscount'] = {} if lookup_key in request.app_cache['maskcache']: mask, field_descriptors = request.app_cache['maskcache'][lookup_key] res = render_mask_template(self, mask, field_descriptors, language, words=words, separator=separator) request.app_cache['maskcache_accesscount'][lookup_key] = request.app_cache['maskcache_accesscount'].get(lookup_key, 0) + 1 else: mask = self.metadatatype.get_mask(u"nodesmall") for m in self.metadatatype.filter_masks(u"shortview", language=language): mask = m if mask: fields = mask.getMaskFields(first_level_only=True) ordered_fields = sorted([(f.orderpos, f) for f in fields]) field_descriptors = [] for _, maskitem in ordered_fields: fd = {} # field descriptor fd['maskitem_type'] = maskitem.get('type') fd['format'] = maskitem.getFormat() fd['unit'] = maskitem.getUnit() fd['label'] = maskitem.getLabel() fd['maskitem'] = maskitem default = maskitem.getDefault() fd['default'] = default metafield = maskitem.metafield metafield_type = metafield.get('type') fd['metafield'] = metafield fd['metafield_type'] = metafield_type t = getMetadataType(metafield_type) fd['metatype'] = t def getNodeAttributeName(maskitem): metafields = maskitem.children.filter_by(type=u"metafield").all() if len(metafields) != 1: # this can only happen in case of vgroup or hgroup logg.error("maskitem %s has zero or multiple metafield child(s)", maskitem.id) return maskitem.name return metafields[0].name node_attribute = getNodeAttributeName(maskitem) fd['node_attribute'] = node_attribute def build_field_template(field_descriptor): if labels: template = "<b>" + field_descriptor['label'] + ":</b> %s" else: if field_descriptor['node_attribute'].startswith("author"): template = '<span class="author">%s</span>' elif field_descriptor['node_attribute'].startswith("subject"): template = '<b>%s</b>' else: template = "%s" return template template = build_field_template(fd) fd['template'] = template long_field_descriptor = (node_attribute, fd) field_descriptors.append(long_field_descriptor) request.app_cache['maskcache'][lookup_key] = (mask, field_descriptors) request.app_cache['maskcache_accesscount'][lookup_key] = 0 res = render_mask_template(self, mask, field_descriptors, language, words=words, separator=separator) else: res = '<smallview mask not defined>' return res
def getMetaEditor(self, item, req): """ editor mask for field definition """ attr = {} fields = [] pidnode = None if "pid" not in req.params.keys(): for p in item.getParents(): try: if p.getMasktype() == "export": pidnode = p break except: continue metadatatype = req.params.get("metadatatype") for t in metadatatype.getDatatypes(): content_class = Node.get_class_for_typestring(t) node = content_class(name=u'') attr.update(node.getTechnAttributes()) if req.params.get("op", "") == "new": pidnode = q(Node).get(req.params.get("pid")) if hasattr(pidnode, 'getMasktype') and pidnode.getMasktype() in ("vgroup", "hgroup"): # XXX: getAllChildren does not exist anymore, is this dead code? for field in pidnode.getAllChildren(): if field.getType().getName( ) == "maskitem" and field.id != pidnode.id: fields.append(field) else: for m in metadatatype.getMasks(): if ustr(m.id) == ustr(req.params.get("pid")): for field in m.getChildren(): fields.append(field) fields.sort(lambda x, y: cmp(x.getOrderPos(), y.getOrderPos())) add_values = [] val = u"" if item.getField(): val = item.getField().getValues() db.session.commit() for t in getMetaFieldTypeNames(): f = getMetadataType(t) add_values.append( f.getMaskEditorHTML(val, metadatatype=metadatatype, language=lang(req))) metafields = metadatatype.getMetaFields() metafields.sort(lambda x, y: cmp(x.getName().lower(), y.getName().lower())) metafieldtypes = getMetaFieldTypes().values() metafieldtypes.sort(lambda x, y: cmp( translate(x.getName(), request=req).lower(), translate(y.getName(), request=req).lower())) add_descriptions = [] for metafield in metafields: add_descriptions.append( '<div style="display:none" id="div_%d" name="%s" description="%s"/>' % (metafield.id, metafield.name, metafield.getDescription())) v = {} v["op"] = req.params.get("op", "") v["pid"] = req.params.get("pid", "") v["item"] = item v["metafields"] = metafields v["fields"] = fields v["fieldtypes"] = metafieldtypes v["dateoption"] = dateoption v["t_attrs"] = attr v["icons"] = { "externer Link": "/img/extlink.png", "Email": "/img/email.png" } v["add_values"] = add_values v["add_descriptions"] = add_descriptions v["translate"] = translate v["language"] = lang(req) if pidnode and hasattr( pidnode, 'getMasktype') and pidnode.getMasktype() == "export": v["mappings"] = [] for m in pidnode.getExportMapping(): v["mappings"].append(q(Node).get(m)) return req.getTAL("schema/mask/field.html", v, macro="metaeditor_" + pidnode.getMasktype()) else: return req.getTAL("schema/mask/field.html", v, macro="metaeditor")
def show_node_text_deep(self, words=None, language=None, separator="", labels=0): if not separator: separator = u"<br/>" lookup_key = make_lookup_key(self, language, labels) # if the lookup_key is already in the cache dict: render the cached mask_template # else: build the mask_template if not 'maskcache' in request.app_cache: request.app_cache['maskcache'] = {} request.app_cache['maskcache_accesscount'] = {} if lookup_key in request.app_cache['maskcache']: mask, field_descriptors = request.app_cache['maskcache'][ lookup_key] res = render_mask_template(self, mask, field_descriptors, language, words=words, separator=separator) request.app_cache['maskcache_accesscount'][ lookup_key] = request.app_cache['maskcache_accesscount'].get( lookup_key, 0) + 1 else: mask = self.metadatatype.get_mask(u"nodesmall") for m in self.metadatatype.filter_masks(u"shortview", language=language): mask = m if mask: fields = mask.getMaskFields(first_level_only=True) ordered_fields = sorted([(f.orderpos, f) for f in fields]) field_descriptors = [] for _, maskitem in ordered_fields: fd = {} # field descriptor fd['maskitem_type'] = maskitem.get('type') fd['format'] = maskitem.getFormat() fd['unit'] = maskitem.getUnit() fd['label'] = maskitem.getLabel() fd['maskitem'] = maskitem default = maskitem.getDefault() fd['default'] = default metafield = maskitem.metafield metafield_type = metafield.get('type') fd['metafield'] = metafield fd['metafield_type'] = metafield_type t = getMetadataType(metafield_type) fd['metatype'] = t def getNodeAttributeName(maskitem): metafields = maskitem.children.filter_by( type=u"metafield").all() if len(metafields) != 1: # this can only happen in case of vgroup or hgroup logg.error( "maskitem %s has zero or multiple metafield child(s)", maskitem.id) return maskitem.name return metafields[0].name node_attribute = getNodeAttributeName(maskitem) fd['node_attribute'] = node_attribute def build_field_template(field_descriptor): if labels: template = "<b>" + field_descriptor[ 'label'] + ":</b> %s" else: if field_descriptor['node_attribute'].startswith( "author"): template = '<span class="author">%s</span>' elif field_descriptor['node_attribute'].startswith( "subject"): template = '<b>%s</b>' else: template = "%s" return template template = build_field_template(fd) fd['template'] = template long_field_descriptor = (node_attribute, fd) field_descriptors.append(long_field_descriptor) request.app_cache['maskcache'][lookup_key] = ( mask, field_descriptors) request.app_cache['maskcache_accesscount'][lookup_key] = 0 res = render_mask_template(self, mask, field_descriptors, language, words=words, separator=separator) else: res = '<smallview mask not defined>' return res
def FieldDetail(req, pid, id, err=0): _option = "" for key in req.params.keys(): if key.startswith("option_"): _option += key[7] if err == 0 and id == "": # new field field = tree.Node("", type="metafield") elif id != "": # edit field field = getMetaField(pid, id) else: # error filling values _fieldvalue = "" if req.params.get('mtype', '') + "_value" in req.params.keys(): _fieldvalue = str(req.params[req.params.get('mtype', '') + "_value"]) if (req.params.get("mname") == ""): field = tree.Node(req.params.get("orig_name"), type="metafield") else: field = tree.Node(req.params.get("mname"), type="metafield") field.setLabel(req.params.get("mlabel")) field.setOrderPos(req.params.get("orderpos")) field.setFieldtype(req.params.get("mtype")) field.setOption(_option) field.setValues(_fieldvalue) field.setDescription(req.params.get("mdescription")) attr = {} metadatatype = getMetaType(pid) for t in metadatatype.getDatatypes(): node = tree.Node(type=t) try: attr.update(node.getTechnAttributes()) except AttributeError: continue metafields = {} for fields in getFieldsForMeta(pid): if fields.getType() != "union": metafields[fields.getName()] = fields v = getAdminStdVars(req) v["metadatatype"] = metadatatype v["metafield"] = field v["error"] = err v["fieldtypes"] = getMetaFieldTypeNames() v["dateoptions"] = dateoption v["datatypes"] = attr v["requiredoptions"] = requiredoption v["fieldoptions"] = fieldoption v["metafields"] = metafields v["filtertype"] = req.params.get("filtertype", "") v["actpage"] = req.params.get("actpage") v["icons"] = {"externer Link": "/img/extlink.png", "Email": "/img/email.png"} v["url_targets"] = {"selbes Fenster": "same", "neues Fenster": "_blank"} v["valuelist"] = ("", "", "", "") if field.getFieldtype() == "url": v["valuelist"] = field.getValueList() while len(v["valuelist"]) != 4: v["valuelist"].append("") else: v["valuelist"] = field.getValueList() v["field"] = None if field.id: v["field"] = field v["adminfields"] = [] for t in getMetaFieldTypeNames(): f = getMetadataType(t) if 'attr_dict' in inspect.getargspec(f.getMaskEditorHTML).args: attr_dict = dict(field.items()) v["adminfields"] .append(f.getMaskEditorHTML(v["field"], metadatatype=metadatatype, language=lang(req), attr_dict=attr_dict)) else: v["adminfields"] .append(f.getMaskEditorHTML(v["field"], metadatatype=metadatatype, language=lang(req))) return req.getTAL("web/admin/modules/metatype_field.html", v, macro="modify_field")
def getViewHTML(self, field, nodes, flags, language=None, template_from_caller=None, mask=None): element = field.getField() if not element: return [] fieldtype = element.get("type") t = getMetadataType(element.get("type")) unit = '' if field.getUnit() != "": unit = ' ' + field.getUnit() if flags & VIEW_DATA_ONLY: if fieldtype in ['text']: value = u( t.getFormatedValue( element, nodes[0], language, template_from_caller=template_from_caller, mask=mask)[1]) else: value = u(t.getFormatedValue(element, nodes[0], language)[1]) else: if field.getFormat() != "": if fieldtype in ['text']: value = t.getFormatedValue( element, nodes[0], language, template_from_caller=template_from_caller, mask=mask)[1] else: value = t.getFormatedValue(element, nodes[0], language)[1] value = field.getFormat().replace("<value>", value) else: if fieldtype in ['text']: if template_from_caller and template_from_caller[ 0]: # checking template on test nodes: show full length fieldvalue = nodes[0].get(element.name) if fieldvalue.strip(): # field is filled for this node value = str( t.getFormatedValue( element, nodes[0], language, template_from_caller=fieldvalue, mask=mask)[1]) else: # use default value = str( t.getFormatedValue( element, nodes[0], language, template_from_caller=template_from_caller, mask=mask)[1]) else: # cut long values value = str( formatLongText( t.getFormatedValue( element, nodes[0], language, template_from_caller=template_from_caller, mask=mask)[1], element)) elif fieldtype in ['upload']: # passing mask necessary for fieldtype='upload' value = str( formatLongText( t.getFormatedValue(element, nodes[0], language, mask=mask)[1], element)) else: value = str( formatLongText( t.getFormatedValue(element, nodes[0], language)[1], element)) if len(value.strip()) > 0: value += str(unit) label = ' ' if field.getLabel() != "": label = field.getLabel() + ': ' if flags & VIEW_DATA_ONLY: # return a valuelist return [ element.getName(), value, element.getLabel(), element.get("type") ] elif flags & VIEW_SUB_ELEMENT: # element in hgroup # only using value omitting label, delimiter like ' ' may be inserted in hgroup.getViewHTML return value elif flags & VIEW_HIDE_EMPTY and value.strip() == "": # hide empty elements return '' elif flags & VIEW_DATA_EXPORT: if fieldtype in ['text']: return str( t.getFormatedValue( element, nodes[0], language, html=0, template_from_caller=template_from_caller, mask=mask)[1]) else: return str( t.getFormatedValue(element, nodes[0], language, html=0)[1]) # return element.get("type") else: # standard view ret = '<div class="mask_row field-' + element.getName() + '"><div>' ret += '<div class="mask_label">' + label + '</div>\n<div class="mask_value">' + value + ' </div>\n' ret += '</div></div>' return ret
def FieldDetail(req, pid, id, err=0): _option = "" for key in req.params.keys(): if key.startswith("option_"): _option += key[7] if err == 0 and id == "": # new field field = Metafield(u"") db.session.commit() elif id != "": # edit field field = q(Metadatatype).get(pid).children.filter_by(name=id, type=u'metafield').scalar() else: # error filling values _fieldvalue = "" if req.params.get('mtype', '') + "_value" in req.params.keys(): _fieldvalue = ustr(req.params[req.params.get('mtype', '') + "_value"]) if (req.params.get("mname") == ""): field = Metafield(req.params.get("orig_name")) else: field = Metafield(req.params.get("mname")) field.setLabel(req.params.get("mlabel")) field.setOrderPos(req.params.get("orderpos")) field.setFieldtype(req.params.get("mtype")) field.setOption(_option) field.setValues(_fieldvalue) field.setDescription(req.params.get("mdescription")) db.session.commit() attr = {} metadatatype = getMetaType(pid) for t in metadatatype.getDatatypes(): content_class = Node.get_class_for_typestring(t) node = content_class(name=u'') try: attr.update(node.getTechnAttributes()) except AttributeError: logg.exception("attribute error in FieldDetail, continue") continue metafields = {} for fields in getFieldsForMeta(pid): if fields.getType() != "union": metafields[fields.name] = fields v = getAdminStdVars(req) v["metadatatype"] = metadatatype v["metafield"] = field v["error"] = err v["fieldtypes"] = getMetaFieldTypeNames() v["dateoptions"] = dateoption v["datatypes"] = attr v["requiredoptions"] = requiredoption v["fieldoptions"] = fieldoption v["metafields"] = metafields v["filtertype"] = req.params.get("filtertype", "") v["actpage"] = req.params.get("actpage") v["icons"] = {"externer Link": "/img/extlink.png", "Email": "/img/email.png"} v["url_targets"] = {"selbes Fenster": "same", "neues Fenster": "_blank"} v["valuelist"] = ("", "", "", "") if field.getFieldtype() == "url": v["valuelist"] = field.getValueList() while len(v["valuelist"]) != 4: v["valuelist"].append("") else: v["valuelist"] = field.getValueList() v["field"] = None if field.id: v["field"] = field v["adminfields"] = [] for t in getMetaFieldTypeNames(): f = getMetadataType(t) if 'attr_dict' in inspect.getargspec(f.getMaskEditorHTML).args: attr_dict = dict(field.attrs.items()) v["adminfields"] .append(f.getMaskEditorHTML(v["field"], metadatatype=metadatatype, language=lang(req), attr_dict=attr_dict)) else: v["adminfields"] .append(f.getMaskEditorHTML(v["field"], metadatatype=metadatatype, language=lang(req))) db.session.commit() return req.getTAL("web/admin/modules/metatype_field.html", v, macro="modify_field")
def getFormHTML(self, field, nodes, req, sub=False): """ create editor field (editarea)""" element = field.getField() ret = '' label = '' description = '<div id="div_description"></div>' unit = '' if not sub: label += '<div class="label">' + field.getLabel() + ':' if (int(field.getRequired()) > 0): label += ' <span class="required">*</span>' label += '</div>' else: if field.getLabel() != "": label += field.getLabel() + ': ' if int(field.getRequired()) > 0: label += '<span class="required">*</span> ' if field.getDescription() != "": description = '<div id="div_description"><a href="#" onclick="openPopup(\'/popup_help?id=' + element.id + \ '&maskid=' + field.id + '\', \'\', 400, 250)"><img src="/img/tooltip.png" border="0"/></a></div>' if not sub: if str(element.id) in req.params.get("errorlist", []): ret += '<div class="editorerror">' else: ret += '<div class="editorrow">' ret += label + description elementtype = element.get("type") val = nodes[0].get(element.getName()) for node in nodes: elementname = node.get(element.getName()) if elementname == "": val = "" valuelist = {} lock = 0 differentvalues = 0 containsemptystring = val == "" for node in nodes: newvalue = node.get(element.getName()) containsemptystring = containsemptystring or newvalue == "" if newvalue not in valuelist: differentvalues += 1 valuelist[newvalue] = 1 if differentvalues == 2 and containsemptystring: for t in valuelist.keys(): if t != "": val = t lock = 1 elif differentvalues >= 2: val = "? " lock = 1 if val == "" and field.getDefault() != "": val = field.getDefault() t = getMetadataType(elementtype) if field.getUnit() != "": unit += field.getUnit() ret += '<div id="editor_content">' + \ t.getEditorHTML(element, value=val, width=field.getWidth(), lock=lock, language=lang(req), required=field.getRequired()) + unit + '</div>' if not sub: ret += '</div>' return ret
def show_node_text_deep(self, words=None, language=None, separator="", labels=0): def render_mask_template(node, mfs, words=None, separator="", skip_empty_fields=True): """ mfs: [mask] + list_of_maskfields """ res = [] exception_count = {} mask = mfs[0] for node_attribute, fd in mfs[1:]: metafield_type = fd['metafield_type'] field_type = fd['field_type'] if metafield_type in ['date', 'url', 'hlist']: exception_count[metafield_type] = exception_count.setdefault(metafield_type, 0) + 1 value = node.get(node_attribute) try: value = fd['metadatatype'].getFormatedValue(fd['element'], node, language=language, mask=mask)[1] except: value = fd['metadatatype'].getFormatedValue(fd['element'], node, language=language)[1] elif metafield_type in ['field']: if field_type in ['hgroup', 'vgroup']: _sep = '' if field_type == 'hgroup': fd['unit'] = '' # unit will be taken from definition of the hgroup use_label = False else: use_label = True value = getMetadataType(field_type).getViewHTML( fd['field'], # field [node], # nodes 0, # flags language=language, mask=mask, use_label=use_label) else: value = node.get(node_attribute) metadatatype = fd['metadatatype'] if hasattr(metadatatype, "language_snipper"): metafield = fd['element'] if (metafield.get("type") == "text" and metafield.get("valuelist") == "multilingual") \ or \ (metafield.get("type") in ['memo', 'htmlmemo'] and metafield.get("multilang") == '1'): value = metadatatype.language_snipper(value, language) if value.find('<') >= 0: # replace variables for var in re.findall(r'<(.+?)>', value): if var == "att:id": value = value.replace("<" + var + ">", node.id) elif var.startswith("att:"): val = node.get(var[4:]) if val == "": val = "____" value = value.replace("<" + var + ">", val) value = value.replace("<", "<").replace(">", ">") if value.find('<') >= 0: # replace variables for var in re.findall(r'\<(.+?)\>', value): if var == "att:id": value = value.replace("<" + var + ">", node.id) elif var.startswith("att:"): val = node.get(var[4:]) if val == "": val = "____" value = value.replace("<" + var + ">", val) value = value.replace("<", "<").replace(">", ">") if value.find('tal:') >= 0: context['node'] = node value = runTALSnippet(value, context) # don't escape before running TAL if (not value) and fd['default']: default = fd['default'] if fd['default_has_tal']: context['node'] = node value = runTALSnippet(default, context) else: value = default if skip_empty_fields and not value: continue if fd["unit"]: value = value + " " + fd["unit"] if fd["format"]: value = fd["format"].replace("<value>", value) if words: value = highlight(value, words, '<font class="hilite">', "</font>") res.append(fd["template"] % value) if exception_count and len(exception_count.keys()) > 1: pass return separator.join(res) if not separator: separator = "<br/>" lookup_key = make_lookup_key(self, language, labels) # if the lookup_key is already in the cache dict: render the cached mask_template # else: build the mask_template if lookup_key in maskcache: mfs = maskcache[lookup_key] res = render_mask_template(self, mfs, words=words, separator=separator) maskcache_accesscount[lookup_key] += 1 else: mask = self.getMask("nodesmall") for m in self.getMasks("shortview", language=language): mask = m if mask: mfs = [mask] # mask fields values = [] fields = mask.getMaskFields(first_level_only=True) ordered_fields = sorted([(f.orderpos, f) for f in fields]) for orderpos, field in ordered_fields: fd = {} # field descriptor fd['field'] = field element = field.getField() element_type = element.get('type') field_type = field.get('type') t = getMetadataType(element.get("type")) fd['format'] = field.getFormat() fd['unit'] = field.getUnit() label = field.getLabel() fd['label'] = label default = field.getDefault() fd['default'] = default fd['default_has_tal'] = (default.find('tal:') >= 0) fd['metadatatype'] = t fd['metafield_type'] = element_type fd['element'] = element fd['field_type'] = field_type def getNodeAttributeName(field): metafields = [x for x in field.getChildren() if x.type == 'metafield'] if len(metafields) != 1: # this can only happen in case of vgroup or hgroup logging.getLogger("error").error("maskfield %s zero or multiple metafield child(s)" % field.id) return field.name return metafields[0].name node_attribute = getNodeAttributeName(field) fd['node_attribute'] = node_attribute def build_field_template(field_descriptor): if labels: template = "<b>" + field_descriptor['label'] + ":</b> %s" else: if field_descriptor['node_attribute'].startswith("author"): template = '<span class="author">%s</span>' elif field_descriptor['node_attribute'].startswith("subject"): template = '<b>%s</b>' else: template = "%s" return template template = build_field_template(fd) fd['template'] = template long_field_descriptor = [node_attribute, fd] mfs = mfs + [long_field_descriptor] maskcache[lookup_key] = mfs maskcache_accesscount[lookup_key] = 0 res = render_mask_template(self, mfs, words=words, separator=separator) else: res = '<smallview mask not defined>' if element_type == 'date': comp = res.split(separator) pre = comp[0].split('(')[-1].strip(')') print comp, pre return res
def getMetaEditor(self, item, req): """ editor mask for field definition """ attr = {} fields = [] pidnode = None if "pid" not in req.params.keys(): for p in item.getParents(): try: if p.getMasktype() == "export": pidnode = p break except: continue metadatatype = req.params.get("metadatatype") for t in metadatatype.getDatatypes(): node = tree.Node(type=t) attr.update(node.getTechnAttributes()) if req.params.get("op", "") == "new": pidnode = tree.getNode(req.params.get("pid")) if hasattr(pidnode, 'getMasktype') and pidnode.getMasktype() in ("vgroup", "hgroup"): for field in pidnode.getAllChildren(): if field.getType().getName() == "maskitem" and field.id != pidnode.id: fields.append(field) else: for m in metadatatype.getMasks(): if str(m.id) == str(req.params.get("pid")): for field in m.getChildren(): fields.append(field) fields.sort(lambda x, y: cmp(x.getOrderPos(), y.getOrderPos())) add_values = [] val = "" if item.getField(): val = item.getField().getValues() for t in getMetaFieldTypeNames(): f = getMetadataType(t) add_values.append(f.getMaskEditorHTML(val, metadatatype=metadatatype, language=lang(req))) metafields = metadatatype.getMetaFields() metafields.sort(lambda x, y: cmp(x.getName().lower(), y.getName().lower())) metafieldtypes = getMetaFieldTypes().values() metafieldtypes.sort(lambda x, y: cmp(translate(x.getName(), request=req).lower(), translate(y.getName(), request=req).lower())) v = {} v["op"] = req.params.get("op", "") v["pid"] = req.params.get("pid", "") v["item"] = item v["metafields"] = metafields v["fields"] = fields v["fieldtypes"] = metafieldtypes v["dateoption"] = dateoption v["t_attrs"] = attr v["icons"] = {"externer Link": "/img/extlink.png", "Email": "/img/email.png"} v["add_values"] = add_values v["translate"] = translate v["language"] = lang(req) if pidnode and hasattr(pidnode, 'getMasktype') and pidnode.getMasktype() == "export": v["mappings"] = [] for m in pidnode.getExportMapping(): v["mappings"].append(tree.getNode(m)) return req.getTAL("schema/mask/field.html", v, macro="metaeditor_" + pidnode.getMasktype()) else: return req.getTAL("schema/mask/field.html", v, macro="metaeditor")
def getMetaHTML(self, parent, index, sub=False, language=None, itemlist=[], ptype="", fieldlist={}): """ return formated row for metaeditor """ if len(itemlist) > 0: # parent still not existing item = getNode(itemlist[index]) pitems = len(itemlist) else: item = parent.getChildren().sort_by_orderpos()[index] ptype = parent.get("type") pitems = len(parent.getChildren()) field = item.getField() ret = '' label = '' description = '' if field: f = getMetadataType(field.get("type")) fieldstring = f.getEditorHTML( field, width=item.getWidth(), value=item.getDefault(), language=language) + ' ' + item.getUnit() else: # node for export mask attribute = tree.getNode(item.get("attribute")) field = item fieldstring = getMetadataType("mappingfield").getEditorHTML( field, width=item.getWidth(), value=attribute.getName(), language=language) + ' ' + item.getUnit() if item.getDescription() != "": description = '<div id="div_description"><a href="#" onclick="openPopup(\'/popup_help?id=%s&maskid=%s\', \'\', 400, 250)"> <img src="/img/tooltip.png" border="0"/></a></div>' % ( field.id, item.id) if len(item.getLabel()) > 0 and item.getLabel() != "mapping": label = item.getLabel() + ': ' required = "" if item.getRequired(): required = '<span class="required">*</span>' if ptype in ("vgroup", "hgroup") or not sub: label = '<div class="label">%s %s</div>%s' % (label, required, description) else: label += required else: label = '<div class="label"> </div>' if not sub: ret += '<div id="%s" class="row" onmouseover="pick(this)" onmouseout="unpick(this)" onclick="select(this)" style="position:relative;min-height:30px">' % ( item.id) if len(label) > 0: ret += '%s<div id="editor_content">%s</div>' % (label, fieldstring) else: ret += fieldstring if not sub: # <small style="color:silver">('+(item.get("type"))+')</small>' ret += '<div align="right" id="%s_sub" style="display:none; position:absolute; right:1px; top:3px" class="edit_tools">' % ( item.id) if index > 0: ret += '<input type="image" src="/img/uparrow.png" name="up_%s" i18n:attributes="title mask_edit_up_title"/>' % ( item.id) else: ret += ' ' if index < pitems - 1: ret += '<input type="image" src="/img/downarrow.png" name="down_%s" i18n:attributes="title mask_edit_down_title"/>' % ( item.id) else: ret += ' ' if field.getName() in fieldlist.keys(): if len(fieldlist[field.getName()]) > 1: ret += ' <img src="/img/attention.gif" title="%s ' % ( translate("mask_edit_multi_label", language)) ret += ", ".join([ schema.getName() for schema in fieldlist[field.getName()] ]) + '"/>' ret += ' <input type="image" src="/img/edit.png" name="edit_%s" i18n:attributes="title mask_edit_edit_row"/> <input type="image" src="/img/delete.png" name="delete_%s" i18n:attributes="title mask_edit_delete_row" onClick="return questionDel()"/></div></div>' % ( item.id, item.id) return ret
def replaceVars(self, s, node, attrnode=None, field_value="", options=[], mask=None, raw=0, default=""): # if attrnode and node: for var in re.findall(r'\[(.+?)\]', s): if var.startswith("att:field|replacestring"): s2 = self.replaceStr(attrnode.getName(), var[24:]) s = s.replace("[" + var + "]", s2) elif var.startswith("att:field|substring"): s2 = self.subStr(attrnode.getName(), var[20:]) s = s.replace("[" + var + "]", s2) elif var == "field": s = s.replace("[field]", field_value) elif var == ("cmd:getTAL"): s = exportutils.handleCommand('cmd:getTAL', var, s, node, attrnode, field_value, options, mask) elif var.startswith("value|formatdate"): date_from = format_date( parse_date(node.get(attrnode.getName())), var[18:-1]) s = s.replace("[" + var + "]", date_from) elif var.startswith("value|replacestring"): s2 = self.replaceStr(node.get(attrnode.getName()), var[20:]) s = s.replace("[" + var + "]", s2) elif var.startswith("value|substring"): s2 = self.subStr(node.get(attrnode.getName()), var[16:]) s = s.replace("[" + var + "]", s2) elif var.startswith("value|nodename"): try: s2 = tree.getNode(node.get(attrnode.getName())).getName() except: s2 = node.getName() s = s.replace("[" + var + "]", s2) elif var == "value": v = getMetadataType(attrnode.getFieldtype()).getFormatedValue( attrnode, node)[1] if v == "": v = node.get(attrnode.getName()) if v == "" and default != "": v = default if "t" in options and not v.isdigit(): v = '"' + v + '"' s = s.replace("[value]", v) elif var == "ns": ns = "" for mapping in attrnode.get("exportmapping").split(";"): n = tree.getNode(mapping) if n.getNamespace() != "" and n.getNamespaceUrl() != "": ns += 'xmlns:' + n.getNamespace( ) + '="' + n.getNamespaceUrl() + '" ' s = s.replace("[" + var + "]", ns) for ext in self.extensions: s = ext.func(s, var, node, attrnode) if raw == 1: return s ret = "" for i in range(0, len(s)): if s[i - 1] == '\\': if s[i] == 'r': ret += "\r" elif s[i] == 'n': ret += "\n" elif s[i] == 't': ret += "\t" elif s[i] == '\\': pass else: ret += s[i] return desc(ret)
def getMetaEditor(self, item, req): """ editor mask for field definition """ attr = {} fields = [] pidnode = None if "pid" not in req.params.keys(): for p in item.getParents(): try: if p.getMasktype() == "export": pidnode = p break except: continue metadatatype = req.params.get("metadatatype") for t in metadatatype.getDatatypes(): node = tree.Node(type=t) attr.update(node.getTechnAttributes()) if req.params.get("op", "") == "new": pidnode = tree.getNode(req.params.get("pid")) if hasattr(pidnode, 'getMasktype') and pidnode.getMasktype() in ("vgroup", "hgroup"): for field in pidnode.getAllChildren(): if field.getType().getName( ) == "maskitem" and field.id != pidnode.id: fields.append(field) else: for m in metadatatype.getMasks(): if str(m.id) == str(req.params.get("pid")): for field in m.getChildren(): fields.append(field) fields.sort(lambda x, y: cmp(x.getOrderPos(), y.getOrderPos())) add_values = [] val = "" if item.getField(): val = item.getField().getValues() for t in getMetaFieldTypeNames(): f = getMetadataType(t) add_values.append( f.getMaskEditorHTML(val, metadatatype=metadatatype, language=lang(req))) metafields = metadatatype.getMetaFields() metafields.sort(lambda x, y: cmp(x.getName().lower(), y.getName().lower())) metafieldtypes = getMetaFieldTypes().values() metafieldtypes.sort(lambda x, y: cmp( translate(x.getName(), request=req).lower(), translate(y.getName(), request=req).lower())) v = {} v["op"] = req.params.get("op", "") v["pid"] = req.params.get("pid", "") v["item"] = item v["metafields"] = metafields v["fields"] = fields v["fieldtypes"] = metafieldtypes v["dateoption"] = dateoption v["t_attrs"] = attr v["icons"] = { "externer Link": "/img/extlink.png", "Email": "/img/email.png" } v["add_values"] = add_values v["translate"] = translate v["language"] = lang(req) if pidnode and hasattr( pidnode, 'getMasktype') and pidnode.getMasktype() == "export": v["mappings"] = [] for m in pidnode.getExportMapping(): v["mappings"].append(tree.getNode(m)) return req.getTAL("schema/mask/field.html", v, macro="metaeditor_" + pidnode.getMasktype()) else: return req.getTAL("schema/mask/field.html", v, macro="metaeditor")
def show_node_text_deep(self, words=None, language=None, separator="", labels=0): def render_mask_template(node, mfs, words=None, separator="", skip_empty_fields=True): """ mfs: [mask] + list_of_maskfields """ res = [] exception_count = {} mask = mfs[0] for node_attribute, fd in mfs[1:]: metafield_type = fd['metafield_type'] field_type = fd['field_type'] if metafield_type in ['date', 'url', 'hlist']: exception_count[ metafield_type] = exception_count.setdefault( metafield_type, 0) + 1 value = node.get(node_attribute) try: value = fd['metadatatype'].getFormatedValue( fd['element'], node, language=language, mask=mask)[1] except: value = fd['metadatatype'].getFormatedValue( fd['element'], node, language=language)[1] elif metafield_type in ['field']: if field_type in ['hgroup', 'vgroup']: _sep = '' if field_type == 'hgroup': fd['unit'] = '' # unit will be taken from definition of the hgroup use_label = False else: use_label = True value = getMetadataType(field_type).getViewHTML( fd['field'], # field [node], # nodes 0, # flags language=language, mask=mask, use_label=use_label) else: value = node.get(node_attribute) metadatatype = fd['metadatatype'] if hasattr(metadatatype, "language_snipper"): metafield = fd['element'] if (metafield.get("type") == "text" and metafield.get("valuelist") == "multilingual") \ or \ (metafield.get("type") in ['memo', 'htmlmemo'] and metafield.get("multilang") == '1'): value = metadatatype.language_snipper( value, language) if value.find('<') >= 0: # replace variables for var in re.findall(r'<(.+?)>', value): if var == "att:id": value = value.replace("<" + var + ">", node.id) elif var.startswith("att:"): val = node.get(var[4:]) if val == "": val = "____" value = value.replace("<" + var + ">", val) value = value.replace("<", "<").replace(">", ">") if value.find('<') >= 0: # replace variables for var in re.findall(r'\<(.+?)\>', value): if var == "att:id": value = value.replace("<" + var + ">", node.id) elif var.startswith("att:"): val = node.get(var[4:]) if val == "": val = "____" value = value.replace("<" + var + ">", val) value = value.replace("<", "<").replace(">", ">") if value.find('tal:') >= 0: context['node'] = node value = runTALSnippet(value, context) # don't escape before running TAL if (not value) and fd['default']: default = fd['default'] if fd['default_has_tal']: context['node'] = node value = runTALSnippet(default, context) else: value = default if skip_empty_fields and not value: continue if fd["unit"]: value = value + " " + fd["unit"] if fd["format"]: value = fd["format"].replace("<value>", value) if words: value = highlight(value, words, '<font class="hilite">', "</font>") res.append(fd["template"] % value) if exception_count and len(exception_count.keys()) > 1: pass return separator.join(res) if not separator: separator = "<br/>" lookup_key = make_lookup_key(self, language, labels) # if the lookup_key is already in the cache dict: render the cached mask_template # else: build the mask_template if lookup_key in maskcache: mfs = maskcache[lookup_key] res = render_mask_template(self, mfs, words=words, separator=separator) maskcache_accesscount[lookup_key] += 1 else: mask = self.getMask("nodesmall") for m in self.getMasks("shortview", language=language): mask = m if mask: mfs = [mask] # mask fields values = [] fields = mask.getMaskFields(first_level_only=True) ordered_fields = sorted([(f.orderpos, f) for f in fields]) for orderpos, field in ordered_fields: fd = {} # field descriptor fd['field'] = field element = field.getField() element_type = element.get('type') field_type = field.get('type') t = getMetadataType(element.get("type")) fd['format'] = field.getFormat() fd['unit'] = field.getUnit() label = field.getLabel() fd['label'] = label default = field.getDefault() fd['default'] = default fd['default_has_tal'] = (default.find('tal:') >= 0) fd['metadatatype'] = t fd['metafield_type'] = element_type fd['element'] = element fd['field_type'] = field_type def getNodeAttributeName(field): metafields = [ x for x in field.getChildren() if x.type == 'metafield' ] if len(metafields) != 1: # this can only happen in case of vgroup or hgroup logging.getLogger("error").error( "maskfield %s zero or multiple metafield child(s)" % field.id) return field.name return metafields[0].name node_attribute = getNodeAttributeName(field) fd['node_attribute'] = node_attribute def build_field_template(field_descriptor): if labels: template = "<b>" + field_descriptor[ 'label'] + ":</b> %s" else: if field_descriptor['node_attribute'].startswith( "author"): template = '<span class="author">%s</span>' elif field_descriptor['node_attribute'].startswith( "subject"): template = '<b>%s</b>' else: template = "%s" return template template = build_field_template(fd) fd['template'] = template long_field_descriptor = [node_attribute, fd] mfs = mfs + [long_field_descriptor] maskcache[lookup_key] = mfs maskcache_accesscount[lookup_key] = 0 res = render_mask_template(self, mfs, words=words, separator=separator) else: res = '<smallview mask not defined>' return res