def get_json(self): """ Return json from the PlominoView content """ data = [] columnids = [col.id for col in self.context.getColumns() if not getattr(col, 'HiddenColumn', False)] for b in self.context.getAllDocuments(getObject=False): row = {'label': b.id} for colid in columnids: v = getattr(b, self.context.getIndexKey(colid), '') if isinstance(v, list): v = [asUnicode(e).encode('utf-8').replace('\r', '') for e in v] else: v = asUnicode(v).encode('utf-8').replace('\r', '') row[colid.split('$')[0]] = v or '' data.append(row) columns = [] for colid in columnids: if '$' in colid: (id, type) = colid.split('$') columns.append([id, type]) else: columns.append([colid, 'text']) return {'items': data, 'properties': dict([[col[0], {"valueType": col[1]}] for col in columns])}
def recordify(self, object): """ turns an object into a record tuple """ record = [] # the unique id is always the first element for x in self.names: if x.startswith("PlominoViewColumn_"): param = x.split('_') viewname = param[1] columnname = param[2] if not object.isSelectedInView(viewname): v = None else: v = asUnicode( object.computeColumnValue(viewname, columnname)) record.append(v) else: attr = getattr(object, x, MV) if attr is not MV and safe_callable(attr): attr = attr() if type(attr) == type(''): attr = attr.decode('utf-8') elif type(attr) == type([]) or type(attr) == type(()): new_value = [] for v in attr: if type(v) == type(''): v = v.decode('utf-8') new_value.append(v) attr = new_value record.append(attr) return tuple(record)
def migrate_to_1_12(db): """ Convert resources script lib File into PythonScript and Image """ libs = db.resources.objectValues('File') for lib in libs: lib_id = lib.id() lib_data = lib.data content_type = lib.getContentType() if 'image' in content_type: db.resources.manage_delObjects(lib_id) lib_id = manage_addImage(db.resources, lib_id, lib_data) else: error_re = re.compile('^## Errors:$', re.MULTILINE) ps = PythonScript('testing') try: lib_data = asUnicode(lib_data) except UnicodeDecodeError, e: logger.info("Unknown encoding, skipping: %s" % lib_id) continue ps.write(lib_data) if not error_re.search(ps.read()): db.resources.manage_delObjects(lib_id) blank = manage_addPythonScript(db.resources, lib_id) sc = db.resources._getOb(lib_id) sc.write(lib_data) logger.info("Converted to Script: %s" % lib_id) continue
def processInput(self, values): """ """ values = BaseField.processInput(self, values) if type(values) == list: values = [asUnicode(v) for v in values] return values
def recordify(self, obj): """ Turns an obj into a record tuple """ record = [] # the unique id is always the first element for name in self.names: if name.startswith("PlominoViewColumn_"): marker, viewname, columnname = name.split('_') if not obj.isSelectedInView(viewname): v = None else: v = asUnicode(obj.computeColumnValue(viewname, columnname)) record.append(v) else: attr = getattr(obj, name, MV) if attr is not MV and safe_callable(attr): attr = attr() if isinstance(attr, str): attr = attr.decode('utf-8') elif isinstance(attr, (list, tuple)): new_value = [] for v in attr: if isinstance(v, str): v = v.decode('utf-8') new_value.append(v) attr = new_value record.append(attr) return tuple(record)
def recordify(self, obj): """ Turns an obj into a record tuple """ record = [] # the unique id is always the first element for name in self.names: if name.startswith("PlominoViewColumn_"): marker, viewname, columnname = name.split('_') if not obj.isSelectedInView(viewname): v = None else: v = asUnicode( obj.computeColumnValue(viewname, columnname)) record.append(v) else: attr = getattr(obj, name, MV) if attr is not MV and safe_callable(attr): attr = attr() if isinstance(attr, str): attr = attr.decode('utf-8') elif isinstance(attr, (list, tuple)): new_value = [] for v in attr: if isinstance(v, str): v = v.decode('utf-8') new_value.append(v) attr = new_value record.append(attr) return tuple(record)
def migrate_to_1_12(db): """ Convert resources script lib File into PythonScript and Image """ libs = db.resources.objectValues('File') for lib in libs: lib_id = lib.id() lib_data = lib.data content_type = lib.getContentType() if 'image' in content_type: db.resources.manage_delObjects(lib_id) lib_id = manage_addImage(db.resources, lib_id, lib_data) else: error_re = re.compile('^## Errors:$', re.MULTILINE) ps = PythonScript('testing') try: lib_data = asUnicode(lib_data) except UnicodeDecodeError, e: logger.info("Unknown encoding, skipping: %s" % lib_id) continue ps.write(lib_data) if not error_re.search(ps.read()): db.resources.manage_delObjects(lib_id) ignored = manage_addPythonScript(db.resources, lib_id) sc = db.resources._getOb(lib_id) sc.write(lib_data) logger.info("Converted to Script: %s" % lib_id) continue
def getFieldValue(self, form, doc, editmode, creation, request): """ """ fieldName = self.context.id mode = self.context.getFieldMode() db = self.context.getParentDatabase() if doc is None: target = form else: target = doc fieldValue = None if mode == "EDITABLE": if doc is None: if creation and not self.context.Formula() == "": fieldValue = form.computeFieldValue(fieldName, target) elif request is None: fieldValue = "" else: row_data_json = request.get("Plomino_datagrid_rowdata", None) if row_data_json is not None: # datagrid form case parent_form = request.get("Plomino_Parent_Form", None) parent_field = request.get("Plomino_Parent_Field", None) data = json.loads(row_data_json) datagrid_fields = db.getForm(parent_form).getFormField( parent_field).getSettings().field_mapping.split( ',') if fieldName in datagrid_fields: fieldValue = data[datagrid_fields.index(fieldName)] else: fieldValue = "" else: fieldValue = asUnicode(request.get(fieldName, '')) else: fieldValue = doc.getItem(fieldName) if mode == "DISPLAY" or mode == "COMPUTED": fieldValue = form.computeFieldValue(fieldName, target) if mode == "CREATION": if creation: # Note: on creation, there is no doc, we use form as target # in formula fieldValue = form.computeFieldValue(fieldName, form) else: fieldValue = doc.getItem(fieldName) if mode == "COMPUTEDONSAVE" and doc: fieldValue = doc.getItem(fieldName) if fieldValue is None: fieldValue = "" return fieldValue
def getSelectionList(self, doc): """ Return the documents list, format: label|docid_or_path, use value is used as label if no label. """ #if formula available, use formula, else use view entries f = self.documentslistformula if not f: if not(self.sourceview and self.labelcolumn): return [] v = self.context.getParentDatabase().getView(self.sourceview) if not v: return [] label_key = v.getIndexKey(self.labelcolumn) if not label_key: return [] result = [] for b in v.getAllDocuments(getObject=False): val = getattr(b, label_key, '') if not val: val = '' result.append(asUnicode(val) + "|" + b.id) return result else: #if no doc provided (if OpenForm action), we use the PlominoForm if doc is None: obj = self.context.getParentNode() else: obj = doc try: s = self.context.runFormulaScript( SCRIPT_ID_DELIMITER.join(['field', self.context.getParentNode().id, self.context.id, 'DocumentListFormula']), obj, lambda: f) except PlominoScriptException, e: p = self.context.absolute_url_path() e.reportError( '%s doclink field selection list formula failed' % self.context.id, path=p+'/getSettings?key=documentslistformula') s = None if s is None: s = []
class SelectionField(BaseField): """ """ implements(ISelectionField) def getSelectionList(self, doc): """return the values list, format: label|value, use label as value if no label """ #if formula available, use formula, else use manual entries f = self.selectionlistformula if f == '' or f is None: s = self.selectionlist if s == '': return [] else: #if no doc provided (if OpenForm action), we use the PlominoForm if doc is None: obj = self.context else: obj = doc try: s = self.context.runFormulaScript( "field_" + self.context.getParentNode().id + "_" + self.context.id + "_SelectionListFormula", obj, lambda: f) except PlominoScriptException, e: e.reportError('%s field selection list formula failed' % self.context.id, path=self.context.absolute_url_path() + '/getSettings?key=selectionlistformula') s = None if s is None: s = [] # if values not specified, use label as value proper = [] for v in s: v = asUnicode(v) l = v.split('|') if len(l) == 2: proper.append(v) else: proper.append(v + '|' + v) return proper
def migrate_to_1_11(db): """ getAllDocuments now returns documents, unless requested. """ # # Field formulas # # Selection formulas # # Hidewhen formulas # getHidewhenFormulas # # Column formulas # # Agents # agent.Content # # Script libraries # File: use str() to get the content and manage_edit to set it. # Page Template: read() and write() from zope.interface import providedBy from Products.CMFPlomino.fields.selection import ISelectionField forms = db.getForms() for form in forms: fields = form.getFormFields() for field in fields: # NB: Don't use getFormula, this strips markup from strings. f = field.Formula() if f: logger.info("Migrated formula: %s\n" "Old version: %s" % (field, f)) field.setFormula( f.replace('getAllDocuments()', 'getAllDocuments(getObject=False)')) f = field.ValidationFormula() if f: logger.info("Migrated validation formula: %s\n" "Old version: %s" % (field, f)) field.setValidationFormula( f.replace('getAllDocuments()', 'getAllDocuments(getObject=False)')) settings = field.getSettings() if ISelectionField in providedBy(settings).interfaces(): selectionlistformula = settings.selectionlistformula if selectionlistformula: settings.selectionlistformula = selectionlistformula.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)') hidewhens = form.getHidewhenFormulas() for hidewhen in hidewhens: f = hidewhen.Formula() if f: logger.info("Migrated hidewhen formula: %s\n" "Old version: %s" % (hidewhen, f)) hidewhen.setFormula( f.replace('getAllDocuments()', 'getAllDocuments(getObject=False)')) actions = form.objectValues(spec='PlominoAction') for action in actions: f = action.Content() if f: logger.info("Migrated action formula: %s\n" "Old version: %s" % (action, f)) action.setContent( f.replace('getAllDocuments()', 'getAllDocuments(getObject=False)')) f = action.Hidewhen() if f: logger.info("Migrated action hidewhen: %s\n" "Old version: %s" % (action, f)) action.setHidewhen( f.replace('getAllDocuments()', 'getAllDocuments(getObject=False)')) views = db.getViews() for view in views: columns = view.getColumns() for column in columns: f = column.Formula() if f: logger.info("Migrated column formula: %s\n" "Old version: %s" % (column, f)) column.setFormula( f.replace('getAllDocuments()', 'getAllDocuments(getObject=False)')) actions = view.objectValues(spec='PlominoAction') for action in actions: f = action.Content() if f: logger.info("Migrated action formula: %s\n" "Old version: %s" % (action, f)) action.setContent( f.replace('getAllDocuments()', 'getAllDocuments(getObject=False)')) f = action.Hidewhen() if f: logger.info("Migrated action hidewhen: %s\n" "Old version: %s" % (action, f)) action.setHidewhen( f.replace('getAllDocuments()', 'getAllDocuments(getObject=False)')) agents = db.getAgents() for agent in agents: f = agent.Content() if f: logger.info("Migrated agent formula: %s\n" "Old version: %s" % (agent, f)) agent.setContent( f.replace('getAllDocuments()', 'getAllDocuments(getObject=False)')) files = db.resources.objectValues('File') for f in files: if f.content_type.startswith('text'): formula = asUnicode(f).encode('utf-8') logger.info("Migrated script library formula: %s" % f.id()) f.manage_edit(f.title, f.content_type, filedata=formula.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) templates = db.resources.objectValues('Page Template') for template in templates: f = template.read() logger.info("Migrated template formula: %s" % template.id) template.write( f.replace('getAllDocuments()', 'getAllDocuments(getObject=False)')) msg = "Migration to 1.11: getAllDocuments API change." db.plomino_version = "1.11" return msg
def getFieldValue(self, form, doc=None, editmode_obsolete=False, creation=False, request=None): """ Return the field as rendered by ``form`` on ``doc``. """ # XXX: The editmode_obsolete parameter is unused. fieldName = self.context.id mode = self.context.getFieldMode() db = self.context.getParentDatabase() if doc is None: target = form else: target = doc fieldValue = None # XXX This is super-ugly, sorry. The reason I do this is that # I changed some logic upper in the call chain to give a # properly populated TemporaryDocument to hideWhens # to avoid users coding defensively with unneeded # try: catch blocks. # A proper solution would probably be to factor out the logic # that finds a field value and use that logic to populate # the TemporaryDocument. # But *right now* (that is better than never) I see this solution # works without breaking any test. temporary_doc_in_overlay = ( isinstance(aq_base(doc), TemporaryDocument) and hasattr(self.context, 'REQUEST') and 'Plomino_Parent_Form' in self.context.REQUEST.form and not self.context.REQUEST.get('ACTUAL_URL').endswith( '/createDocument')) if temporary_doc_in_overlay: request = self.context.REQUEST if mode == "EDITABLE": if doc is None or creation or temporary_doc_in_overlay: # The aforementioned ugliness ends here if self.context.Formula(): fieldValue = form.computeFieldValue(fieldName, target) elif request is None: fieldValue = "" else: row_data_json = request.get("Plomino_datagrid_rowdata", None) if row_data_json is not None: # datagrid form case parent_form = request.get("Plomino_Parent_Form", None) parent_field = request.get("Plomino_Parent_Field", None) data = json.loads( unquote(row_data_json).decode( 'raw_unicode_escape')) datagrid_fields = ( db.getForm(parent_form).getFormField(parent_field). getSettings().field_mapping.split(',')) if fieldName in datagrid_fields: fieldValue = data[datagrid_fields.index(fieldName)] else: fieldValue = "" else: # if no doc context and no default formula, we accept # value passed in the REQUEST so we look for 'fieldName' # but also for 'fieldName_querystring' which allows to # pass value via the querystring without messing the # POST content request_value = request.get(fieldName, '') if not request_value: request_value = request.get( fieldName + '_querystring', '') fieldValue = asUnicode(request_value) else: fieldValue = doc.getItem(fieldName) elif mode in ["DISPLAY", "COMPUTED"]: if mode == "DISPLAY" and not self.context.Formula() and doc: fieldValue = doc.getItem(fieldName) else: fieldValue = form.computeFieldValue(fieldName, target) elif mode == "CREATION": if creation: # Note: on creation, there is no doc, we use form as target # in formula fieldValue = form.computeFieldValue(fieldName, form) else: fieldValue = doc.getItem(fieldName) elif mode == "COMPUTEDONSAVE" and doc: fieldValue = doc.getItem(fieldName) if fieldValue is None: fieldValue = "" return fieldValue
def getFieldValue(self, form, doc, editmode, creation, request): """ """ fieldName = self.context.id mode = self.context.getFieldMode() db = self.context.getParentDatabase() if doc is None: target = form else: target = doc fieldValue = None # XXX This is super-ugly, sorry. The reason I do this is that # I changed some logic upper in the call chain to give a # properly populated TemporaryDocument to hideWhens # to avoid users coding defensively with unneeded # try: catch blocks. # A proper solution would probably be to factor out the logic # that finds a field value and use that logic to populate # the TemporaryDocument. # But *right now* (that is better than never) I see this solution # works without breaking any test. temporary_doc_in_overlay = (isinstance(aq_base(doc), TemporaryDocument) and hasattr(self.context, 'REQUEST') and 'Plomino_Parent_Form' in self.context.REQUEST.form) if temporary_doc_in_overlay: request = self.context.REQUEST if mode == "EDITABLE": if doc is None or temporary_doc_in_overlay: # The aforemntioned ugliness ends here if creation and self.context.Formula(): fieldValue = form.computeFieldValue(fieldName, target) elif request is None: fieldValue = "" else: row_data_json = request.get("Plomino_datagrid_rowdata", None) if row_data_json is not None: # datagrid form case parent_form = request.get("Plomino_Parent_Form", None) parent_field = request.get("Plomino_Parent_Field", None) data = json.loads(row_data_json) datagrid_fields = db.getForm(parent_form).getFormField( parent_field).getSettings().field_mapping.split( ',') if fieldName in datagrid_fields: fieldValue = data[datagrid_fields.index(fieldName)] else: fieldValue = "" else: fieldValue = asUnicode(request.get(fieldName, '')) else: fieldValue = doc.getItem(fieldName) if mode == "DISPLAY" or mode == "COMPUTED": fieldValue = form.computeFieldValue(fieldName, target) if mode == "CREATION": if creation: # Note: on creation, there is no doc, we use form as target # in formula fieldValue = form.computeFieldValue(fieldName, form) else: fieldValue = doc.getItem(fieldName) if mode == "COMPUTEDONSAVE" and doc: fieldValue = doc.getItem(fieldName) if fieldValue is None: fieldValue = "" return fieldValue
]), obj, lambda: f) except PlominoScriptException, e: p = self.context.absolute_url_path() e.reportError('%s field selection list formula failed' % self.context.id, path=p + '/getSettings?key=selectionlistformula') s = [] else: s = self.selectionlist if not s: return [] # if values not specified, use label as value label_value = [] for v in s: v = asUnicode(v) l = v.split('|') if len(l) == 2: label_value.append(v) else: label_value.append(v + '|' + v) return label_value def processInput(self, values): """ """ values = BaseField.processInput(self, values) if type(values) == list: values = [asUnicode(v) for v in values] return values
def getFieldRender(self, form, doc, editmode, creation=False, request=None): """ Rendering the field """ mode = self.getFieldMode() fieldname = self.id if doc is None: target = form else: target = doc adapt = self.getSettings() fieldvalue = adapt.getFieldValue(form, doc, editmode, creation, request) # get the rendering template pt = None if mode=="EDITABLE" and editmode: templatemode = "Edit" t = self.getFieldEditTemplate() # if custom template, use it if t: pt = getattr(self.resources, t).__of__(self) else: templatemode = "Read" # if custom template, use it t = self.getFieldReadTemplate() if t: pt = getattr(self.resources, t).__of__(self) # If no custom template provided, get the template associated with the field type if not pt: if templatemode=="Read" and hasattr(adapt, 'read_template'): pt = adapt.read_template elif templatemode=="Edit" and hasattr(adapt, 'edit_template'): pt = adapt.edit_template else: fieldType = self.FieldType pt = self.getRenderingTemplate(fieldType+"Field"+templatemode) if not pt: pt = self.getRenderingTemplate("DefaultField"+templatemode) selection = self.getSettings().getSelectionList(target) try: html = pt(fieldname=fieldname, fieldvalue=fieldvalue, selection=selection, field=self, doc=target ) injection_zone = 'name="%s"' % self.id if (injection_zone in html and hasattr(self, 'HTMLAttributesFormula') and self.HTMLAttributesFormula ): injection_position = html.index(injection_zone) html_attributes = self.runFormulaScript( SCRIPT_ID_DELIMITER.join([ 'field', self.getParentNode().id, self.id, 'attributes']), target, self.HTMLAttributesFormula ) html = ' '.join([ html[:injection_position], asUnicode(html_attributes), html[injection_position:], ]) return html except Exception, e: self.traceRenderingErr(e, self) return ""
if self.REQUEST: e.reportError('Search event failed.') return self.OpenForm(searchresults=[]) else: # Allow Plomino to filter by view, default query, and formula db = self.getParentDatabase() searchview = db.getView(self.getSearchView()) #index search index = db.getIndex() query = {'PlominoViewFormula_' + searchview.getViewName(): True} for f in self.getFormFields(includesubforms=True): fieldname = f.id #if fieldname is not an index -> search doesn't matter and returns all submittedValue = asUnicode(REQUEST.get(fieldname)) if submittedValue is not None: if not submittedValue == '': # if non-text field, convert the value if f.getFieldType() == "NUMBER": v = long(submittedValue) elif f.getFieldType() == "FLOAT": v = float(submittedValue) elif f.getFieldType() == "DATETIME": v = submittedValue else: v = submittedValue # rename Plomino_SearchableText to perform full-text searches on # regular SearchableText index if fieldname == "Plomino_SearchableText": fieldname = "SearchableText"
except PlominoScriptException, e: p = self.context.absolute_url_path() e.reportError( '%s field selection list formula failed' % self.context.id, path=p+'/getSettings?key=selectionlistformula') s = [] else: s = self.selectionlist if not s: return [] # if values not specified, use label as value label_value = [] for v in s: v = asUnicode(v) l = v.split('|') if len(l) == 2: label_value.append(v) else: label_value.append(v + '|' + v) return label_value def processInput(self, values): """ """ values = BaseField.processInput(self, values) if type(values) == list: values = [asUnicode(v) for v in values] return values
def getFieldValue(self, form, doc=None, editmode_obsolete=False, creation=False, request=None): """ Return the field as rendered by ``form`` on ``doc``. We may be called on: - a blank form, e.g. while creating a document; - an existing document; - a TemporaryDocument used during datagrid editing. - If EDITABLE, look for the field value: - are we creating a doc or editing a datagrid row? - do we have a request? - if we're being used for a datagrid, - get field value from `getDatagridRowdata`, - or compute a default value; - otherwise look for `request[fieldName]`; - otherwise look for `request[fieldName+'_querystring']`; - otherwise compute a default value. - otherwise just `getItem` - if DISPLAY/COMPUTED: - if DISPLAY and doc and no formula: `getItem`. - else compute - if CREATION - compute or `getItem` - if COMPUTEDONSAVE and doc: `getItem` - otherwise, give up. """ # XXX: The editmode_obsolete parameter is unused. fieldName = self.context.id mode = self.context.getFieldMode() db = self.context.getParentDatabase() if doc: target = doc else: target = form fieldValue = None if mode == "EDITABLE": # if (not doc) or creation: if doc: fieldValue = doc.getItem(fieldName) #DBG _logger.info('BaseField.getFieldValue> 1 got doc') if (not fieldValue) and self.context.Formula(): # This implies that if a falsy fieldValue is possible, # Formula needs to take it into account, e.g. using hasItem fieldValue = form.computeFieldValue(fieldName, target) #DBG _logger.info('BaseField.getFieldValue> 2 default formula') elif (not fieldValue) and request: # if no doc context and no default formula, we accept # value passed in the REQUEST so we look for 'fieldName' # but also for 'fieldName_querystring' which allows to # pass value via the querystring without messing the # POST content request_value = request.get(fieldName, '') #DBG _logger.info('BaseField.getFieldValue> 3 request') if not request_value: request_value = request.get(fieldName + '_querystring', '') #DBG _logger.info('BaseField.getFieldValue> 3 request _querystring') fieldValue = asUnicode(request_value) if not fieldValue: #DBG _logger.info('BaseField.getFieldValue> 4 blank') fieldValue = "" elif mode in ["DISPLAY", "COMPUTED"]: if mode == "DISPLAY" and not self.context.Formula() and doc: fieldValue = doc.getItem(fieldName) else: fieldValue = form.computeFieldValue(fieldName, target) elif mode == "CREATION": if creation or not doc: # Note: on creation, there is no doc, we use form as target # in formula, and we do the same when no doc (e.g. with tojson) fieldValue = form.computeFieldValue(fieldName, form) else: fieldValue = doc.getItem(fieldName) elif mode == "COMPUTEDONSAVE" and doc: fieldValue = doc.getItem(fieldName) if fieldValue is None: fieldValue = "" #DBG _logger.info('BaseField.getFieldValue> doc: %s, fieldName: %s, fieldValue: %s, creation: %s' % (`doc`, `fieldName`, `fieldValue`[:20], creation)) return fieldValue
def migrate_to_1_11(db): """ getAllDocuments now returns documents, unless requested. """ # # Field formulas # # Selection formulas # # Hidewhen formulas # getHidewhenFormulas # # Column formulas # # Agents # agent.Content # # Script libraries # File: use str() to get the content and manage_edit to set it. # Page Template: read() and write() from zope.interface import providedBy from Products.CMFPlomino.fields.selection import ISelectionField forms = db.getForms() for form in forms: fields = form.getFormFields() for field in fields: # NB: Don't use getFormula, this strips markup from strings. f = field.Formula() if f: logger.info("Migrated formula: %s\n" "Old version: %s"%(field, f)) field.setFormula( f.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) f = field.ValidationFormula() if f: logger.info("Migrated validation formula: %s\n" "Old version: %s"%(field, f)) field.setValidationFormula( f.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) settings = field.getSettings() if ISelectionField in providedBy(settings).interfaces(): f = settings.selectionlistformula if f: settings.selectionlistformula = f.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)') hidewhens = form.getHidewhenFormulas() for hidewhen in hidewhens: f = hidewhen.Formula() if f: logger.info("Migrated hidewhen formula: %s\n" "Old version: %s"%(hidewhen, f)) hidewhen.setFormula( f.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) actions = form.objectValues(spec='PlominoAction') for action in actions: f = action.Content() if f: logger.info("Migrated action formula: %s\n" "Old version: %s"%(action, f)) action.setContent( f.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) f = action.Hidewhen() if f: logger.info("Migrated action hidewhen: %s\n" "Old version: %s"%(action, f)) action.setHidewhen( f.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) views = db.getViews() for view in views: columns = view.getColumns() for column in columns: f = column.Formula() if f: logger.info("Migrated column formula: %s\n" "Old version: %s"%(column, f)) column.setFormula( f.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) actions = view.objectValues(spec='PlominoAction') for action in actions: f = action.Content() if f: logger.info("Migrated action formula: %s\n" "Old version: %s"%(action, f)) action.setContent( f.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) f = action.Hidewhen() if f: logger.info("Migrated action hidewhen: %s\n" "Old version: %s"%(action, f)) action.setHidewhen( f.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) agents = db.getAgents() for agent in agents: f = agent.Content() if f: logger.info("Migrated agent formula: %s\n" "Old version: %s"%(agent, f)) agent.setContent( f.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) files = db.resources.objectValues('File') for f in files: if f.content_type.startswith('text'): formula = asUnicode(f).encode('utf-8') logger.info("Migrated script library formula: %s"%f.id()) f.manage_edit(f.title, f.content_type, filedata=formula.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) templates = db.resources.objectValues('Page Template') for template in templates: f = template.read() logger.info("Migrated template formula: %s"%template.id) template.write( f.replace( 'getAllDocuments()', 'getAllDocuments(getObject=False)')) msg = "Migration to 1.11: getAllDocuments API change." db.plomino_version = "1.11" return msg
def getFieldRender(self, form, doc, editmode, creation=False, request=None): """ Rendering the field """ mode = self.getFieldMode() fieldname = self.id if doc is None: target = form else: target = doc adapt = self.getSettings() fieldvalue = adapt.getFieldValue(form, doc, editmode, creation, request) # get the rendering template pt = None if mode == "EDITABLE" and editmode: templatemode = "Edit" t = self.getFieldEditTemplate() # if custom template, use it if t: pt = getattr(self.resources, t).__of__(self) else: templatemode = "Read" # if custom template, use it t = self.getFieldReadTemplate() if t: pt = getattr(self.resources, t).__of__(self) # If no custom template provided, get the template associated with the field type if not pt: if templatemode == "Read" and hasattr(adapt, 'read_template'): pt = adapt.read_template elif templatemode == "Edit" and hasattr(adapt, 'edit_template'): pt = adapt.edit_template else: fieldType = self.FieldType pt = self.getRenderingTemplate(fieldType + "Field" + templatemode) if not pt: pt = self.getRenderingTemplate("DefaultField" + templatemode) selection = self.getSettings().getSelectionList(target) try: html = pt(fieldname=fieldname, fieldvalue=fieldvalue, selection=selection, field=self, doc=target) injection_zone = 'name="%s"' % self.id if (injection_zone in html and hasattr(self, 'HTMLAttributesFormula') and self.HTMLAttributesFormula): injection_position = html.index(injection_zone) html_attributes = self.runFormulaScript( SCRIPT_ID_DELIMITER.join([ 'field', self.getParentNode().id, self.id, 'attributes' ]), target, self.HTMLAttributesFormula) html = ' '.join([ html[:injection_position], asUnicode(html_attributes), html[injection_position:], ]) return html except Exception, e: self.traceRenderingErr(e, self) return ""
def search_json(self, REQUEST=None): """ Returns a JSON representation of view filtered data """ data = [] categorized = self.getCategorized() start = 1 search = None sort_index = None reverse = 1 if REQUEST: start = int(REQUEST.get('iDisplayStart', 1)) limit = REQUEST.get('iDisplayLength') limit = (limit and int(limit)) # In case limit == -1 we want it to be None if limit < 1: limit = None search = REQUEST.get('sSearch', '').lower() if search: search = " ".join([term+'*' for term in search.split(' ')]) sort_column = REQUEST.get('iSortCol_0') if sort_column: sort_index = self.getIndexKey(self.getColumns()[int(sort_column)-1].id) reverse = REQUEST.get('sSortDir_0') or 'asc' if reverse=='desc': reverse = 0 if reverse=='asc': reverse = 1 query_request = json.loads(REQUEST['query']) # Some fields might express a date # We try to convert those strings to datetime #indexes = self.aq_parent.aq_base.plomino_index.Indexes indexes = self.getParentDatabase().getIndex().Indexes for key, value in query_request.iteritems(): if key in indexes: index = indexes[key] # This is lame: we should check if it quacks, not # if it's a duck! # XXX Use a more robust method to tell apart # date indexes from non-dates # I'd use a solution like this one: http://getpython3.com/diveintopython3/examples/customserializer.py if isinstance(index, DateIndex): # convert value(s) to date(s) if isinstance(value, basestring): query_request[key] = parse_date(value) else: if isinstance(value['query'], basestring): value['query'] = parse_date(value['query']) else: query_request[key]['query'] = [parse_date(v) for v in value['query']] results, total = self.search_documents(start=1, limit=None, getObject=False, fulltext_query=search, sortindex=sort_index, reverse=reverse, query_request=query_request) if limit: if HAS_PLONE43: results = Batch(items=results, size=limit, start=int(start/limit)+1)*limit else: results = Batch(items=results, pagesize=limit, pagenumber=int(start/limit)+1) display_total = len(results) columnids = [col.id for col in self.getColumns() if not getattr(col, 'HiddenColumn', False)] for b in results: row = [b.getPath().split('/')[-1]] for colid in columnids: v = getattr(b, self.getIndexKey(colid), '') if isinstance(v, list): v = [asUnicode(e).encode('utf-8').replace('\r', '') for e in v] else: v = asUnicode(v).encode('utf-8').replace('\r', '') row.append(v or ' ') if categorized: for cat in asList(row[1]): entry = [c for c in row] entry[1] = cat data.append(entry) else: data.append(row) return json.dumps({ 'iTotalRecords': total, 'iTotalDisplayRecords': display_total, 'aaData': data })