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)
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()
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 _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)
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
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))
def test_doesImplementATCT(self): self.failUnless(IATContentType.providedBy(self._ATCT)) self.failUnless(verifyObject(IATContentType, self._ATCT))
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
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))