예제 #1
0
    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])} 
예제 #2
0
 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)
예제 #3
0
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
예제 #4
0
 def processInput(self, values):
     """
     """
     values = BaseField.processInput(self, values)
     if type(values) == list:
         values = [asUnicode(v) for v in values]
     return values
예제 #5
0
파일: selection.py 프로젝트: Vinsurya/Plone
 def processInput(self, values):
     """
     """
     values = BaseField.processInput(self, values)
     if type(values) == list:
         values = [asUnicode(v) for v in values]
     return values
예제 #6
0
 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)
예제 #7
0
 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)
예제 #8
0
파일: migration.py 프로젝트: Vinsurya/Plone
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
예제 #9
0
파일: base.py 프로젝트: ale-rt/Plomino
    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
예제 #10
0
    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 = []
예제 #11
0
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
예제 #12
0
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
예제 #13
0
파일: base.py 프로젝트: scraping-xx/Plomino
    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
예제 #14
0
    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
예제 #15
0
                    ]), 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
예제 #16
0
    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 ""
예제 #17
0
                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"
예제 #18
0
파일: selection.py 프로젝트: Vinsurya/Plone
            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
예제 #19
0
    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
예제 #20
0
파일: migration.py 프로젝트: Vinsurya/Plone
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
예제 #21
0
    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 ""
예제 #22
0
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 '&nbsp;')
        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 })