Example #1
0
def registerATCT(class_, project):
    """Registers an ATContentTypes based type

    One reason to use it is to hide the lingua plone related magic.
    """
    assert IATContentType.implementedBy(class_)
    registerType(class_, project)
def get_field(obj, key):
    """ get the value for the given key
        => handles Dexterity/AT Content types
    """
    if IATContentType.providedBy(obj):
        return obj.getField(key).getAccessor(obj)()
    return getattr(obj, key)
Example #3
0
def get_schema(obj):
    """ return the schema of this type """
    if IATContentType.providedBy(obj):
        return obj.schema
    pt = get_portal_types_tool()
    fti = pt.getTypeInfo(obj.portal_type)
    return fti.lookupSchema()
Example #4
0
File: base.py Project: dtgit/dtedu
def registerATCT(class_, project):
    """Registers an ATContentTypes based type

    One reason to use it is to hide the lingua plone related magic.
    """
    assert IATContentType.isImplementedByInstancesOf(class_)
    registerType(class_, project)
def get_field(obj, key):
    """ get the value for the given key
        => handles Dexterity/AT Content types
    """
    if IATContentType.providedBy(obj):
        return obj.getField(key).getAccessor(obj)()
    return getattr(obj, key)
    def _factory(self, container, entry):
        for i in self.find_objs_by_url(container, entry['orig_url']):
            print "Found %s" % i.absolute_url()
            self._objects.add(i)

            if IDexterityContent.providedBy(i):
                self._dexterity_apply(container, i, entry)
                continue

            if IATContentType.providedBy(i):
                self._atct_apply(container, i, entry)
Example #7
0
def update_object_with_data(content, record):
    """ update the content with the values from records
    """
    schema = get_schema(content)
    is_atct = IATContentType.providedBy(content)
    is_dext = IDexterityContent.providedBy(content)

    for k, v in record.items():

        if is_atct:
            field = schema.get(k)

        if is_dext:
            schemas = list()
            schemas.append(schema)
            schemas.extend(get_behaviors_schema(content))
            for i in schemas:
                field = i.get(k)
                if field:
                    break

        logger.info("update_object_with_data::processing key=%r, value=%r, field=%r", k, v, field)
        if field is None:
            logger.info("update_object_with_data::skipping key=%r", k)
            continue

        if is_atct:
            # XXX handle security
            mutator = field.getMutator(content)
            mutator(v)
        else:
            #ugly hack for tags
            if ICategorization is field.interface:
                content.setSubject(v)

            elif IPublication is field.interface:
                if k == u'effective':
                    content.setEffectiveDate(v)
                elif k == u'expires':
                    content.setExpirationDate(v)

            elif INamedBlobFileField.providedBy(field):
                filename = v.get("filename")
                data = b64decode(v.get("data"))
                file_obj = NamedBlobFile(data, filename=filename)
                field.validate(file_obj)
                field.set(content, file_obj)

            else:
                field.validate(v)
                field.set(content, v)

    content.reindexObject()
    return content
    def getContentType(self):
        result = {}

        if IATContentType.providedBy(self.context):
            py_file = inspect.getsourcefile(self.context.__class__)

            result['meta_type'] = self.context.meta_type
            result['portal_type'] = self.context.portal_type
            result['py_file'] = py_file

        return result
    def _get_fields(self, context):
        fields = {}

        if IATContentType.providedBy(context):
            context_schema = context.Schema()
            for field in context_schema.fields():
                fields[field.getName()] = (context_schema, field)
        elif IDexterityContent.providedBy(context):
            # main schema should override behaviours
            for schema in reversed(list(iterSchemata(context))):
                for fieldid, field in getFieldsInOrder(schema):
                    fields[fieldid] = (schema, field)
        else:
            raise Exception("Unknown content type for context at %s" %
                            context.absolute_url())  # noqa:E501

        return fields
Example #10
0
def update_object_with_data(content, record):
    """ update the content with the values from records
    """
    schema = get_schema(content)
    is_atct = IATContentType.providedBy(content)

    for k, v in record.items():
        field = schema.get(k)

        logger.info("update_object_with_data::processing key=%r, value=%r, field=%r", k, v, field)
        if field is None:
            logger.info("update_object_with_data::skipping key=%r", k)
            continue

        if is_atct:
            # XXX handle security
            mutator = field.getMutator(content)
            mutator(v)
        else:
            setattr(content, k, v)

    content.reindexObject()
    return content
 def test_doesImplementATCT(self):
     self.assertTrue(IATContentType.providedBy(self._ATCT))
     self.assertTrue(verifyObject(IATContentType, self._ATCT))
 def testPortalTypeName(self):
     for pt in atct_types:
         ob = self.construct(pt, pt, self.folder)
         self.assertEqual(ob._getPortalTypeName(), pt)
         self.assertEqual(ob.portal_type, pt)
         self.assertTrue(IATContentType.providedBy(ob))
Example #13
0
 def test_doesImplementATCT(self):
     self.failUnless(IATContentType.providedBy(self._ATCT))
     self.failUnless(verifyObject(IATContentType, self._ATCT))
Example #14
0
 def test_doesImplementATCT(self):
     self.assertTrue(IATContentType.providedBy(self._ATCT))
     self.assertTrue(verifyObject(IATContentType, self._ATCT))
Example #15
0
 def test_doesImplementATCT(self):
     self.failUnless(IATContentType.providedBy(self._ATCT))
     self.failUnless(verifyObject(IATContentType, self._ATCT))
 def testPortalTypeName(self):
     for pt in atct_types:
         ob = self.construct(pt, pt, self.folder)
         self.assertEqual(ob._getPortalTypeName(), pt)
         self.assertEqual(ob.portal_type, pt)
         self.assertTrue(IATContentType.providedBy(ob))
    def process_script(self, item):
        state = ""
        wft = self.context.portal_workflow
        cur_wf = wft.getWorkflowsFor(item)
        if len(cur_wf) > 0:
            cur_wf = cur_wf[0].id
            state = wft.getStatusOf(cur_wf, item)
            if state is not None:
                state = state["review_state"]

        history = getattr(item, "workflow_history", {})
        if len(history):
            history = {
                i: item.workflow_history[i]
                for i in item.workflow_history
            }
        cp = PyScript(self.value_script)
        cp_globals = dict(
            context=item,
            state=state,
            workflow=wft,
            history=history,
            event=self.event,
            values={},
        )
        try:
            script = cp.execute(cp_globals)
        except Exception as e:  # noqa:B902
            self.error(item, e)
            return False

        fields = self._get_fields(item)
        item_updated = False
        for v_key, value in script["values"].iteritems():
            # if value is None and getattr(item, v_key, None) is None:
            #     continue
            # if item.get(item, v_key, None) == value:
            #     continue

            # TODO: should validate against the content type otherwise
            #   this is a security problem
            if v_key not in fields:
                self.error(item, "Field '%s' not found so not set" % v_key)
                continue

            schema, field = fields[v_key]

            # Handle item being an Archetypes content
            if IATContentType.providedBy(item):
                existing_value = field.getRaw(item)
                if existing_value == value:
                    continue
                error = field.validate(value, item)
                if error:
                    self.error(item, str(error))
                    continue
                field.set(item, value)
                item_updated = True
                continue

            dm = queryMultiAdapter((item, field), IDataManager)
            # Handles case where old value is not set and new value is None
            if dm.get() == value:
                continue
            if dm is None or not dm.canWrite():
                self.error(item, "Not able to write %s" % v_key)
                continue
            # TODO: Could also check permission to write however should
            #   be checked against owner for content rule not current user.
            #   Owner is not kept

            bound = field.bind(self.context)
            try:
                bound.validate(value)
            except ValidationError as e:
                self.error(item, str(e))
                continue

            try:
                dm.set(value)
                item_updated = True
            except Exception as e:  # noqa:B902
                self.error(item, "Error setting %s: %s" % (v_key, str(e)))
        if item_updated:
            # TODO: shouldn't it reindex just the indexes for
            #   whats changed (and SearchableText)?
            # TODO: I think this is done in the handler below anyway
            item.reindexObject()
            notify(ObjectModifiedEvent(item))
        return True
Example #18
0
 def testPortalTypeName(self):
     for pt in atct_types:
         ob = self.construct(pt, pt, self.folder)
         self.failUnlessEqual(ob._getPortalTypeName(), pt)
         self.failUnlessEqual(ob.portal_type, pt)
         self.failUnless(IATContentType.isImplementedBy(ob))