def action(self, type_name='', id=''): if not type_name: raise UserError("You must select the type of object to add.") if type_name.startswith('@@'): type_name = type_name[2:] if '/' in type_name: view_name = type_name.split('/', 1)[0] else: view_name = type_name if zapi.queryView(self, view_name, self.request) is not None: url = "%s/%s=%s" % (zapi.getView(self, "absolute_url", self.request), type_name, id) self.request.response.redirect(url) return if not self.contentName: self.contentName = id factory = zapi.getUtility(IFactory, type_name) content = factory() notify(ObjectCreatedEvent(content)) self.add(content) self.request.response.redirect(self.nextURL())
def createAndAdd(self, data): """Add the desired object using the data in the data argument. The data argument is a dictionary with the data entered in the form. """ args = [] if self._arguments: for name in self._arguments: args.append(data[name]) kw = {} if self._keyword_arguments: for name in self._keyword_arguments: if name in data: kw[str(name)] = data[name] content = self.create(*args, **kw) adapted = self.schema(content) errors = [] if self._set_before_add: for name in self._set_before_add: if name in data: field = self.schema[name] try: field.set(adapted, data[name]) except ValidationError: errors.append(sys.exc_info()[1]) if errors: raise WidgetsError(*errors) notify(ObjectCreatedEvent(content)) content = self.add(content) adapted = self.schema(content) if self._set_after_add: for name in self._set_after_add: if name in data: field = self.schema[name] try: field.set(adapted, data[name]) except ValidationError: errors.append(sys.exc_info()[1]) # We have modified the object, so we need to publish an # object-modified event: description = Attributes(self.schema, *self._set_after_add) notify(ObjectModifiedEvent(content, description)) if errors: raise WidgetsError(*errors) return content