def createNewDaviz(self): """ Create new visualization """ davizsettings = queryUtility(IDavizSettings) strFolder = davizsettings.settings.get("daviz.defaultfolder", "") if (strFolder != ""): portal = getSite() folder = portal.restrictedTraverse(strFolder) else: folder = self.context.aq_parent found = False while True: try: allowedContentTypes = folder.allowedContentTypes() except AttributeError: break for allowedContentType in allowedContentTypes: if allowedContentType.id == "DavizVisualization": found = True if found: break folder = folder.aq_parent if not found: return chooser = INameChooser(folder) newId = chooser.chooseName(self.context.title, folder) if newId in folder.objectIds(): raise NameError, 'Object id %s already exists' % newId else: folder.invokeFactory("DavizVisualization", newId) newObj = folder[newId] newObj.title = self.context.title newObj.setRelatedItems([self.context]) self.request.response.redirect(newObj.absolute_url()+"/daviz-edit.html")
def __call__(self): request = self.request container = self.context.context image = request.form.get('file', '') if not image: return encoder.encode({'success': False, 'message': '', 'error': 'No image provided'}) name = os.path.split(image.filename)[-1] image = FileData(image) chooser = INameChooser(container) content = Image() name = chooser.chooseName(name, content) event.notify(ObjectCreatedEvent(content)) container[name] = content try: content.data = image except NotAllowedFileType: transaction.abort() return encoder.encode({'success': False, 'message': '', 'error': 'File is not image'}) return encoder.encode( {'success': True, 'message': '', 'file': name})
def copyTo(self, target, new_name=None): """Copy this object to the `target` given. Returns the new name within the `target`. Typically, the `target` is adapted to `IPasteTarget`. After the copy is added to the `target` container, publish an `IObjectCopied` event in the context of the target container. If a new object is created as part of the copying process, then an `IObjectCreated` event should be published. """ obj = self.context container = obj.__parent__ orig_name = obj.__name__ if new_name is None: new_name = orig_name checkObject(target, new_name, obj) chooser = INameChooser(target) new_name = chooser.chooseName(new_name, obj) copy = locationCopy(obj) copy.__parent__ = copy.__name__ = None notify(ObjectCopiedEvent(copy, obj)) target[new_name] = copy return new_name
def moveTo(self, target, new_name=None): """Move this object to the `target` given. Returns the new name within the `target` Typically, the `target` is adapted to `IPasteTarget`.""" obj = self.context container = obj.__parent__ orig_name = obj.__name__ if new_name is None: new_name = orig_name checkObject(target, new_name, obj) if target is container and new_name == orig_name: # Nothing to do return chooser = INameChooser(target) new_name = chooser.chooseName(new_name, obj) target[new_name] = obj del container[orig_name] return new_name
def validate(self, data): form = self.view if 'shortname' not in form.widgets: return super(ContentNameValidator, self).validate(data) widget = form.widgets['shortname'] if widget.error: return super(ContentNameValidator, self).validate(data) context = self.view.context shortname = data.get('shortname').lower() valid_chars = "-.%s%s" % (string.lowercase, string.digits) shortname = ''.join(c for c in shortname if c in valid_chars) if shortname == context.__name__: return super(ContentNameValidator, self).validate(data) errors = [] chooser = INameChooser(context.__parent__) try: chooser.checkName(shortname, None) except (UserError, ValueError), err: exc = NameError(unicode(err)) widget.error = NameErrorViewSnippet( exc, self.request, widget, widget.field, form, self.context) widget.error.update() errors.append(exc)
def assignStackerRelatedPortlet(portal): from ubify.policy.config import list_of_portletmanagers_for_stackerportlet_assignment,cynin_desktop_left_column_text static_portlet_text = cynin_desktop_left_column_text #static_portlet_nav_url = portal.absolute_url() + "/stacker-badge" #static_portlet_text = static_portlet_text % (static_portlet_nav_url) from plone.portlet.static import static assignments = ( static.Assignment(header='cyn.in Desktop',text=static_portlet_text,omit_border=True), ) for name in list_of_portletmanagers_for_stackerportlet_assignment: if assignments: try: portletManager = getUtility(IPortletManager, name=name) except ComponentLookupError: sm = getSiteManager(portal) objportletManager = PortletManager() sm.registerUtility(component=objportletManager, provided=IPortletManager, name = name) portletManager = getUtility(IPortletManager, name=name) assignable = getMultiAdapter((portal, portletManager,), ILocalPortletAssignmentManager) manager = getMultiAdapter((portal, portletManager), IPortletAssignmentMapping) if portletManager is not None: chooser = INameChooser(manager) for assignment in assignments: strtitle = assignment.title.lower() strtitle = strtitle.replace(' ','-') if manager.has_key(strtitle) == 0: manager[chooser.chooseName(None, assignment)] = assignment
def setUp(self): """ """ app = self.layer['app'] self.portal = self.layer['portal'] self.request = self.layer['request'] self.tool = getToolByName(self.portal, SUBSCRIPTION_TOOL, None) self.markRequestWithLayer() self.portal_url = self.portal.absolute_url() self.browser = Browser(app) self.browser.addHeader('Authorization', 'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)) #Create some rules for x in ["first", "second", "third"]: #set some rules rule = Rule() rule.event = IObjectAddedEvent rule.title = "%s rule" % x #add the rules to rule's storage storage = getUtility(IRuleStorage) chooser = INameChooser(storage) storage[chooser.chooseName(None, rule)] = rule #set the action and add it to the rule action = MailSubscriptionsAction() action.subject = "Test %s action subject" % x rule.actions.append(action) email1 = "*****@*****.**" email2 = "*****@*****.**" self.tool.registerUser(action.actionUID, email1) self.tool.registerUser(action.actionUID, email2) transaction.commit()
def install_plone3_portlets(self): """Adds the discountable portlet to the root of the site so that it shows up on discountable items """ if not HAS_PLONE30: return # Do the imports here, as we only need them here and this only # gets run on Plone 3.0. from zope.app.container.interfaces import INameChooser from zope.component import getUtility, getMultiAdapter from plone.portlets.interfaces import IPortletManager, IPortletAssignmentMapping from getpaid.discount.browser.portlets import portlets30 # Get some definitions. portal = self.portal_url.getPortalObject() column = getUtility(IPortletManager, name="plone.rightcolumn", context=portal) manager = getMultiAdapter((portal, column), IPortletAssignmentMapping) portletnames = [v.title for v in manager.values()] chooser = INameChooser(manager) assignments = [ portlets30.DiscountableAssignment(), portlets30.BuyXGetXfreeableAssignment(), ] for assignment in assignments: title = assignment.title if title not in portletnames: manager[chooser.chooseName(title, assignment)] = assignment
def add_course_portlet(obj, event): # Only do this if the parent is not a course, i.e. only do it on # top-level course. Of course, site managers can move things # around once the site structure is created parent = aq_parent(aq_inner(obj)) if ICourse.providedBy(parent): return # A portlet manager is akin to a column column = getUtility(IPortletManager, name=COURSEBOX_PORTLET_COLUMN) # We multi-adapt the object and the column to an assignment mapping, # which acts like a dict where we can put portlet assignments manager = getMultiAdapter(( obj, column, ), IPortletAssignmentMapping) # We then create the assignment and put it in the assignment manager, # using the default name-chooser to pick a suitable name for us. assignment = coursebox.Assignment() chooser = INameChooser(manager) manager[chooser.chooseName(None, assignment)] = assignment
def addObject(self,id_obs_value, what_is_that=None): try: flatten = getUtility(IQreatureUtility, name="Flatten") id_obs_value_list = [i for i in flatten(id_obs_value)] if len(id_obs_value_list) == 3: value = id_obs_value_list[2] elif len(id_obs_value_list) == 6: value = [id_obs_value_list[2],id_obs_value_list[5]] else: return -1 answer_id = int(id_obs_value_list[0]) ob = id_obs_value_list[1] quiz = removeSecurityProxy(self.context) sm = quiz.getSiteManager() answer = removeSecurityProxy(sm['intids'].getObject(int(answer_id))) notify(CachedObjectChangedEvent([answer])) TYPE_OBJECT_MAP = {'lead':AnswerLeads,'depend':AnswerDepends, 'value':AnswerValue} if type(value) == type([]): ob = TYPE_OBJECT_MAP[ob](int(value[0]),int(value[1])) elif ob == 'value' or ob ==u'value': ob = TYPE_OBJECT_MAP[ob](unicode(value)) else: ob = TYPE_OBJECT_MAP[ob](int(value)) notify(ObjectCreatedEvent(ob)) chooser = INameChooser(answer) name = chooser.chooseName(None, ob) if chooser.checkName(name, ob): answer[name] = ob else: return (0-1) return IAsyncDataManager(answer[name]).addSelf() except: return (0-1)
def new_user(principal, event): """Initialise the dashboard for a new user """ principal = IEduMember(principal) #defaults = IDefaultDashboard(principal, None) defaults = DefaultDashboard() if defaults is None: return userid = principal.getId() portlets = defaults() for name in ('plone.dashboard1', 'plone.dashboard2', 'plone.dashboard3', 'plone.dashboard4'): assignments = portlets.get(name) if assignments: column = queryUtility(IPortletManager, name=name) if column is not None: category = column.get(USER_CATEGORY, None) if category is not None: manager = category.get(userid, None) if manager is None: manager = category[userid] = UserPortletAssignmentMapping() chooser = INameChooser(manager) for assignment in assignments: manager[chooser.chooseName(None, assignment)] = assignment
def drop(self, mail): """ drop a mail into this mail box. The mail is a string with the complete email content """ # code unicode to utf-8 if isinstance(mail,unicode): mail = mail.encode( 'utf-8' ) type = 'Email' format = 'text/plain' content_type='text/plain' #generate title mailobj = email.message_from_string(mail) # Subject for key in "Subject subject Betreff betreff".split(): subject = mailobj.get(key) if subject: subject = self.decodeheader(subject) break id = subject or DEFAULT_ID title = id # generate id normalizer = component.getUtility(IIDNormalizer) chooser = INameChooser(self.context) id = chooser.chooseName(normalizer.normalize(id), aq_base(self.context)) self.context.invokeFactory(type ,id=id , title=title, format=format, \ content_type=content_type, file=mail) getattr(self.context, id, None).setContentType(content_type) getattr(self.context, id, None).processForm() notify(MailDroppedEvent(getattr(self.context, id, None), self.context))
def setUp(self): """ """ app = self.layer['app'] self.portal = self.layer['portal'] self.request = self.layer['request'] self.tool = getToolByName(self.portal, SUBSCRIPTION_TOOL, None) self.markRequestWithLayer() self.portal_url = self.portal.absolute_url() self.browser = Browser(app) self.browser.addHeader( 'Authorization', 'Basic %s:%s' % ( SITE_OWNER_NAME, SITE_OWNER_PASSWORD, )) #Create some rules for x in ["first", "second", "third"]: #set some rules rule = Rule() rule.event = IObjectAddedEvent rule.title = "%s rule" % x #add the rules to rule's storage storage = getUtility(IRuleStorage) chooser = INameChooser(storage) storage[chooser.chooseName(None, rule)] = rule #set the action and add it to the rule action = MailSubscriptionsAction() action.subject = "Test %s action subject" % x rule.actions.append(action) email1 = "*****@*****.**" email2 = "*****@*****.**" self.tool.registerUser(action.actionUID, email1) self.tool.registerUser(action.actionUID, email2) transaction.commit()
def add(self, content): """See zope.app.container.interfaces.IAdding """ container = self.context name = self.contentName chooser = INameChooser(container) # check precondition checkObject(container, name, content) if IContainerNamesContainer.providedBy(container): # The container picks it's own names. # We need to ask it to pick one. name = chooser.chooseName(self.contentName or '', content) else: request = self.request name = request.get('add_input_name', name) if name is None: name = chooser.chooseName(self.contentName or '', content) elif name == '': name = chooser.chooseName('', content) else: # Invoke the name chooser even when we have a # name. It'll do useful things with it like converting # the incoming unicode to an ASCII string. name = chooser.chooseName(name, container) content.id = name container._setObject(name, content) self.contentName = name # Set the added object Name return container._getOb(name)
def create(self, data): chooser = INameChooser(self.container) obj = self.factory(id=u"temporary") utils.applyChanges(obj.__of__(self.container), self.form_fields, data) oid = chooser.chooseName(obj.title, obj) obj.id = oid return obj
def get_id_from_filename(filename, context): charset = context.getCharset() id = filename.decode(charset).rsplit('.', 1) normalizer = component.getUtility(IIDNormalizer) chooser = INameChooser(context) newid = '.'.join((normalizer.normalize(id[0]), id[1])) newid = newid.replace('_','-').replace(' ','-').lower() return chooser.chooseName(newid, context)
def create(self, name): normalized_id = normalize_id(name) chooser = INameChooser(self.container) new_id = chooser.chooseName(normalized_id, self.container) obj_id = self.container.invokeFactory(self.fti.id, new_id, title=name) obj = getattr(self.container, obj_id) obj.processForm() return obj
def addExternalPortlet(self): """ """ parent = getParent(self) obj = getattr(parent, 'oshnetwork') column = getUtility(IPortletManager, name='plone.rightcolumn') manager = getMultiAdapter((obj, column,), IPortletAssignmentMapping) assignment = classic.Assignment(template='oshnetwork_external_links_portlet', macro='portlet') chooser = INameChooser(manager) manager[chooser.chooseName(None, assignment)] = assignment
def createClassicPortletWithCountryDropdown(self): """ """ parent = getParent(self) obj = getattr(parent, 'oshnetwork') column = getUtility(IPortletManager, name='plone.leftcolumn') manager = getMultiAdapter((obj, column,), IPortletAssignmentMapping) assignment = classic.Assignment(template='oshnetwork_country_select', macro='portlet') chooser = INameChooser(manager) manager[chooser.chooseName(None, assignment)] = assignment
def get_id_from_filename(filename, context): charset = context.getCharset() id = filename.decode(charset).rsplit('.', 1) if len(id) != 2: raise MissingExtension('It seems like the file extension is missing.') normalizer = component.getUtility(IIDNormalizer) chooser = INameChooser(context) newid = '.'.join((normalizer.normalize(id[0]), id[1])) newid = newid.replace('_','-').replace(' ','-').lower() return chooser.chooseName(newid, context)
def changeHomePortletsTitles(portal, logger): from plone.portlets.interfaces import IPortletManager from plone.portlets.interfaces import ILocalPortletAssignmentManager from plone.portlets.constants import CONTEXT_CATEGORY from zope.app.container.interfaces import INameChooser from plone.portlets.interfaces import IPortletAssignmentMapping from zope.component.interfaces import ComponentLookupError from plone.portlets.interfaces import IPortletManager from plone.portlets.manager import PortletManager from zope.interface import alsoProvides from ubify.viewlets.browser.interfaces import IHomeContent try: objviews = getattr(portal, 'views') assignments = get_assignments_for_sitehome_collectionportlets( portal, objviews, logger) sm = getSiteManager(portal) name = 'ubify.homecontentportletsmanager' try: portletManager = getUtility(IPortletManager, name=name) except ComponentLookupError: objportletManager = PortletManager() alsoProvides(objportletManager, IHomeContent) sm.registerUtility(component=objportletManager, provided=IPortletManager, name=name) portletManager = getUtility(IPortletManager, name=name) assignable = getMultiAdapter(( portal, portletManager, ), ILocalPortletAssignmentManager) manager = getMultiAdapter((portal, portletManager), IPortletAssignmentMapping) mgkeys = manager.keys() for k in mgkeys: del manager[k] if assignments: if portletManager is not None: chooser = INameChooser(manager) for assignment in assignments: if manager.has_key(assignment.id) == 0: manager[chooser.chooseName(None, assignment)] = assignment logger.info( "Assigning collection portlet manager for %s" % (assignment.id, )) except AttributeError: logger.info("Unable to set up site home collection portlets.")
def __call__(self, filename, title, description, content_type, data, portal_type): context = aq_inner(self.context) error = '' result = {} result['success'] = None newid = get_id_from_filename(filename, context) chooser = INameChooser(context) newid = chooser.chooseName(newid, context) # consolidation because it's different upon Plone versions if not title : # try to split filenames because we don't want # big titles without spaces title = filename.rsplit('.', 1)[0].replace('_',' ').replace('-',' ') if newid in context: # only here for flashupload method since a check_id is done # in standard uploader - see also XXX in quick_upload.py raise NameError, 'Object id %s already exists' %newid else : upload_lock.acquire() try: transaction.begin() try: context.invokeFactory(type_name=portal_type, id=newid, title=title, description=description) except Unauthorized : error = u'serverErrorNoPermission' except ConflictError : # rare with xhr upload / happens sometimes with flashupload error = u'serverErrorZODBConflict' except ValueError: error = u'serverErrorDisallowedType' except Exception, e: error = u'serverError' logger.exception(e) if error: if error == u'serverError': logger.info("An error happens with setId from filename, " "the file has been created with a bad id, " "can't find %s", newid) else: obj = getattr(context, newid) if obj: error = IQuickUploadFileSetter(obj).set(data, filename, content_type) obj._at_rename_after_creation = False try: obj.processForm() except AttributeError: pass del obj._at_rename_after_creation #@TODO : rollback if there has been an error transaction.commit() finally:
def addExternalPortlet(self): """ """ parent = getParent(self) obj = getattr(parent, 'oshnetwork') column = getUtility(IPortletManager, name='plone.rightcolumn') manager = getMultiAdapter(( obj, column, ), IPortletAssignmentMapping) assignment = classic.Assignment( template='oshnetwork_external_links_portlet', macro='portlet') chooser = INameChooser(manager) manager[chooser.chooseName(None, assignment)] = assignment
def createClassicPortletWithCountryDropdown(self): """ """ parent = getParent(self) obj = getattr(parent, 'oshnetwork') column = getUtility(IPortletManager, name='plone.leftcolumn') manager = getMultiAdapter(( obj, column, ), IPortletAssignmentMapping) assignment = classic.Assignment(template='oshnetwork_country_select', macro='portlet') chooser = INameChooser(manager) manager[chooser.chooseName(None, assignment)] = assignment
def renameAfterCreation(obj, event): """Rename object after first edit. """ # Do no rename when the object is first added if not IContainerModifiedEvent.providedBy(event): utils = getToolByName(obj, 'plone_utils') # Rename only if the current id is autogenerated if utils.isIDAutoGenerated(obj.id): parent = aq_inner(obj).getParentNode() if parent is not None: chooser = INameChooser(parent) newid = chooser.chooseName('', obj) parent.manage_renameObject(obj.id, newid)
def _check_file_id(self, id): context = aq_inner(self.context) charset = context.getCharset() id = id.decode(charset).rsplit('.', 1) normalizer = getUtility(IIDNormalizer) chooser = INameChooser(context) newid = '.'.join((normalizer.normalize(id[0]), id[1])) newid = chooser.chooseName(newid, context) # consolidation because it's different upon Plone versions if newid in context.objectIds() : return False else: return True
def create(container=None, type=None, id=None, title=None, strict=True, *args, **kwargs): """Create a new object. :param container: [required] Container object in which to create the new object. :type container: Folderish content object :param type: [required] Type of the object. :type type: string :param id: Id of the object. If the id conflicts with another object in the container, a suffix will be added to the new object's id. If no id is provided, automatically generate one from the title. If there is no id or title provided, raise a ValueError. :type id: string :param title: Title of the object. If no title is provided, use id as the title. :type title: string :param strict: When True, the given id will be enforced. If the id is conflicting with another object in the target container, raise a KeyError. When False, ``create`` creates a new, non-conflicting id. :type param: boolean :returns: Content object :Example: :ref:`create_content_example` """ if not container: raise ValueError('The ``container`` attribute is required.') if not type: raise ValueError('The ``type`` attribute is required.') if not id and not title: raise ValueError('You have to provide either the ``id`` or the ' '``title`` attribute') # Create a temporary id id = str(random.randint(0, 99999999)) container.invokeFactory(type, id, title=title, **kwargs) content = container[id] # Archetypes specific code if IBaseObject.providedBy(content): # Will finish Archetypes content item creation process, # rename-after-creation and such content.processForm() # Create a new id from title chooser = INameChooser(container) new_id = chooser.chooseName(title, content) content.aq_parent.manage_renameObject(id, new_id) return content
def __call__(self, filename, title, description, content_type, data, portal_type): context = aq_inner(self.context) charset = context.getCharset() name = filename.decode(charset) error = '' result = {} result['success'] = None normalizer = component.getUtility(IIDNormalizer) chooser = INameChooser(self.context) # normalize all filename but dots normalized = ".".join([normalizer.normalize(n) for n in name.split('.')]) newid = chooser.chooseName(normalized, context) # consolidation because it's different upon Plone versions newid = newid.replace('_','-').replace(' ','-').lower() if not title : # try to split filenames because we don't want # big titles without spaces title = name.split('.')[0].replace('_',' ').replace('-',' ') if newid in context.objectIds() : # only here for flashupload method since a check_id is done # in standard uploader - see also XXX in quick_upload.py raise NameError, 'Object id %s already exists' %newid else : upload_lock.acquire() try: transaction.begin() try: context.invokeFactory(type_name=portal_type, id=newid, title=title, description=description) except Unauthorized : error = u'serverErrorNoPermission' except ConflictError : # rare with xhr upload / happens sometimes with flashupload error = u'serverErrorZODBConflict' except Exception, e: error = u'serverError' logger.exception(e) if error: error = u'serverError' logger.info("An error happens with setId from filename, " "the file has been created with a bad id, " "can't find %s", newid) else: obj = getattr(context, newid) if obj: error = IQuickUploadFileSetter(obj).set(data, filename, content_type) #@TODO : rollback if there has been an error transaction.commit() finally:
def addUtility(root_folder, utility_type, utility_factory, **kw): """ Add a Utility to the root folder's site manager. The utility is added to the default package and activated. """ package = getSiteManagerDefault(root_folder) chooser = INameChooser(package) utility = utility_factory() name = chooser.chooseName(utility_type, utility) package[name] = utility # Set additional attributes on the utility for k, v in kw.iteritems(): setattr(utility, k, v) return name
def create(self, filename, temp_file, mimetype): normalized_id = normalize_id(filename) chooser = INameChooser(self.container) new_id = chooser.chooseName(normalized_id, self.container) obj_id = self.container.invokeFactory(self.fti.id, new_id, title=filename) obj = getattr(self.container, obj_id) file_wrapper = obj.getFile() file_wrapper.getBlob().consumeFile(temp_file.name) file_wrapper.setContentType(mimetype) file_wrapper.setFilename(filename) obj.processForm() return obj
def move(source=None, target=None, id=None, safe_id=False): """Move the object to the target container. :param source: [required] Object that we want to move. :type source: Content object :param target: Target container to which the source object will be moved. If no target is specified, the source object's container will be used as a target, effectively making this operation a rename (:ref:`content_rename_example`). :type target: Folderish content object :param id: Pass this parameter if you want to change the id of the moved object on the target location. If the new id conflicts with another object in the target container, a suffix will be added to the moved object's id. :type id: string :param safe_id: When False, the given id will be enforced. If the id is conflicting with another object in the target container, raise a InvalidParameterError. When True, choose a new, non-conflicting id. :type safe_id: boolean :raises: KeyError ValueError :Example: :ref:`content_move_example` """ if not source: raise ValueError if not target and not id: raise ValueError source_id = source.getId() # If no target is given the object is probably renamed if target: target.manage_pasteObjects(source.manage_cutObjects(source_id)) else: target = source if id: if not safe_id: new_id = id else: try: chooser = INameChooser(target) except TypeError: chooser = INameChooser(target.aq_parent) new_id = chooser.chooseName(id, source) target.manage_renameObject(source_id, new_id)
def _get_file_id(self, id): context = aq_inner(self.context) charset = context.getCharset() id = id.decode(charset) normalizer = getUtility(IIDNormalizer) chooser = INameChooser(context) newid = chooser.chooseName(normalizer.normalize(id), context) # Make sure our chosen id is unique, iterate until we get one that is. chooser = INameChooser(context) newid = chooser._findUniqueName(id, None) # consolidation because it's different upon Plone versions newid = newid.replace('_','-').replace(' ','-').lower() return newid
def validateActionFields(self, cat_name, data, allow_dup=False): """ Check action fields on validity """ errors = {} if allow_dup: category = ActionCategory(cat_name) # create dummy category to avoid id duplication during action update else: category = self.getOrCreateCategory(cat_name) # get or create (if necessary) actions category # validate action id chooser = INameChooser(category) try: chooser.checkName(data['id'], self.context) except Exception, e: errors['id'] = "%s" % str(e)
def makeQuizContainer(self,el,parent,factory): title, err = self.getContent(el, 'title') if err: return None, err body, err = self.getContent(el, 'content') if err: return None, err chooser = INameChooser(parent) quiz_container = factory(title, body) try: name = chooser.chooseName(None, quiz_container) parent[name] = quiz_container #this one is for testing only! its better specify ObjectAddedEvent in test setUP !!! #notify(ObjectAddedEvent(quiz_container)) except UserError, err: return None, err
def addEventsAndNewsPortlets(self): """ """ parent = getParent(self) obj = getattr(parent, 'oshnetwork') column = getUtility(IPortletManager, name='plone.leftcolumn') manager = getMultiAdapter((obj, column,), IPortletAssignmentMapping) assignment = events.Assignment() chooser = INameChooser(manager) manager[chooser.chooseName(None, assignment)] = assignment column = getUtility(IPortletManager, name='plone.rightcolumn') manager = getMultiAdapter((obj, column,), IPortletAssignmentMapping) assignment = news.Assignment() chooser = INameChooser(manager) manager[chooser.chooseName(None, assignment)] = assignment
def setupUtility(site, utility, provides, name=u'', name_in_container=None, public=False, setup=None): """Set up a utility in a site. site - the site to set up the utility in utility - the utility to set up provides - the interface the utility should be registered with name - the name the utility should be registered under, default the empty string (no name) name_in_container - if given it will be used to add the utility object to its container. Otherwise a name will be made up public - if False, the utility will be stored in the site manager. If True, the utility will be storedin the site (it is assumed the site is a container) setup - if not None, it will be called with the utility as its first argument. This function can then be used to further set up the utility. """ site_manager = site.getSiteManager() if not public: container = site_manager else: container = site if name_in_container is None: name_in_container = INameChooser(container).chooseName( utility.__class__.__name__, utility) container[name_in_container] = utility if setup is not None: setup(utility) site_manager.registerUtility(utility, provided=provides, name=name)
def add(self, obj): container = self.context portal_type = self.ti.getId() # check allowed (sometimes redundant, but better safe than sorry) if not self.ti.isConstructionAllowed(container): raise AccessControl_Unauthorized('Cannot create %s' % portal_type) #check container constraints ttool = self._getTool('portal_types') container_ti = ttool.getTypeInfo(container) if container_ti is not None and \ not container_ti.allowType(portal_type): raise ValueError('Disallowed subobject type: %s' % portal_type) name = INameChooser(container).chooseName(obj.getId(), obj) obj.id = name container._setObject(name, obj) obj = container._getOb(name) obj_type = translate(obj.Type(), container) self.status = _(u'${obj_type} added.', mapping={'obj_type': obj_type}) self._finished_add = True self._added_obj = obj return obj
def validate(self, value): super(AddName, self).validate(value) if self.context is None: return return True container = getUtility(IIntIds).queryObject(self.context.get('location')) if container is not None: # check content name chooser = INameChooser(container) try: chooser.checkName(value, None) except UserError, err: raise NameError(unicode(err))
def add(self, **data): shelf = self.context book = Book() self.applyData(book, **data) name = INameChooser(shelf).chooseName(data.get('title'), book) shelf[name] = book self.redirect(self.url(shelf))
def changeHomePortletsTitles(portal,logger): from plone.portlets.interfaces import IPortletManager from plone.portlets.interfaces import ILocalPortletAssignmentManager from plone.portlets.constants import CONTEXT_CATEGORY from zope.app.container.interfaces import INameChooser from plone.portlets.interfaces import IPortletAssignmentMapping from zope.component.interfaces import ComponentLookupError from plone.portlets.interfaces import IPortletManager from plone.portlets.manager import PortletManager from zope.interface import alsoProvides from ubify.viewlets.browser.interfaces import IHomeContent try: objviews = getattr(portal,'views') assignments = get_assignments_for_sitehome_collectionportlets(portal,objviews,logger) sm = getSiteManager(portal) name = 'ubify.homecontentportletsmanager' try: portletManager = getUtility(IPortletManager, name=name) except ComponentLookupError: objportletManager = PortletManager() alsoProvides(objportletManager,IHomeContent) sm.registerUtility(component=objportletManager, provided=IPortletManager, name = name) portletManager = getUtility(IPortletManager, name=name) assignable = getMultiAdapter((portal, portletManager,), ILocalPortletAssignmentManager) manager = getMultiAdapter((portal, portletManager), IPortletAssignmentMapping) mgkeys = manager.keys() for k in mgkeys: del manager[k] if assignments: if portletManager is not None: chooser = INameChooser(manager) for assignment in assignments: if manager.has_key(assignment.id) == 0: manager[chooser.chooseName(None, assignment)] = assignment logger.info("Assigning collection portlet manager for %s" % (assignment.id,) ) except AttributeError: logger.info("Unable to set up site home collection portlets.")
def create(self, title, text): """ create the Blog Entry on the context and return it""" normalizer = component.getUtility(IIDNormalizer) chooser = INameChooser(self.context) id = chooser.chooseName(normalizer.normalize(title), aq_base(self.context)) self.context.invokeFactory( 'Blog Entry', id=id, title=title, text=text) blog_entry = getattr(self.context, id) blog_entry.processForm() notify(MailDroppedEvent(blog_entry, self.context)) return blog_entry
def add(self, content): """See zope.app.container.interfaces.IAdding """ container = self.context name = self.contentName chooser = INameChooser(container) # check precondition checkObject(container, name, content) if IContainerNamesContainer.providedBy(container): # The container picks its own names. # We need to ask it to pick one. name = chooser.chooseName(self.contentName or '', content) else: request = self.request name = request.get('add_input_name', name) if name is None: name = chooser.chooseName(self.contentName or '', content) elif name == '': name = chooser.chooseName('', content) chooser.checkName(name, content) container[name] = content self.contentName = name # Set the added object Name return container[name]
def pasteAsAlias(context, cb_copy_data=None, request=None): """Paste the clipboard contents as an alias. Either pass the data, or a valid request with the __cp key. """ cp = None if cb_copy_data is not None: cp = cb_copy_data elif request and request.has_key('__cp'): cp = request['__cp'] else: cp = None if cp is None: raise ValueError("No clipboard data") try: cp = _cb_decode(cp) except: raise ValueError("Can't decode clipboard: %r" % cp) oblist = [] app = context.getPhysicalRoot() failed = [] success = [] for mdata in cp[1]: m = OFS.Moniker.loadMoniker(mdata) try: ob = m.bind(app) except: raise ValueError("Objects not found in %s" % app) oblist.append(ob) intids = getUtility(IIntIds) for ob in oblist: relation = RelationValue(intids.getId(ob)) alias = createContent('collective.alias', _aliasTarget=relation) notify(ObjectCreatedEvent(alias)) name = INameChooser(context).chooseName(ob.getId(), alias) alias.id = name new_name = context._setObject(name, alias) # XXX: When we move to CMF 2.2, an event handler will take care of this new_object = context._getOb(new_name) new_object.notifyWorkflowCreated() return ' '.join(success) + ' '.join(failed)
def copy(source=None, target=None, id=None, safe_id=False): """Copy the object to the target container. :param source: [required] Object that we want to copy. :type source: Content object :param target: Target container to which the source object will be moved. If no target is specified, the source object's container will be used as a target. :type target: Folderish content object :param id: Id of the copied object on the target location. If no id is provided, the copied object will have the same id as the source object - however, if the new object's id conflicts with another object in the target container, a suffix will be added to the new object's id. :type id: string :returns: Content object that was created in the target location :param safe_id: When True, the given id will be enforced. If the id is conflicting with another object in the target container, raise a InvalidParameterError. When True, choose a new, non-conflicting id. :type safe_id: boolean :raises: KeyError, ValueError :Example: :ref:`content_copy_example` """ if not source: raise ValueError if not target and not id: raise ValueError source_id = source.getId() target.manage_pasteObjects(source.manage_copyObjects(source_id)) if id: if not safe_id: new_id = id else: chooser = INameChooser(target) new_id = chooser.chooseName(id, source) target.manage_renameObject(source_id, new_id)
def get_id_from_filename(filename, context, unique=False): charset = getattr(context, 'getCharset', None) and context.getCharset()\ or 'utf-8' name = filename.decode(charset).rsplit('.', 1) if len(name) != 2: raise MissingExtension('It seems like the file extension is missing.') normalizer = component.getUtility(IIDNormalizer) newid = '.'.join((normalizer.normalize(name[0]), name[1])) newid = newid.replace('_', '-').replace(' ', '-').lower() if unique: newid = INameChooser(context).chooseName(newid, context) return newid
def assignStackerRelatedPortlet(portal): from ubify.policy.config import list_of_portletmanagers_for_stackerportlet_assignment, cynin_desktop_left_column_text static_portlet_text = cynin_desktop_left_column_text #static_portlet_nav_url = portal.absolute_url() + "/stacker-badge" #static_portlet_text = static_portlet_text % (static_portlet_nav_url) from plone.portlet.static import static assignments = (static.Assignment(header='cyn.in Desktop', text=static_portlet_text, omit_border=True), ) for name in list_of_portletmanagers_for_stackerportlet_assignment: if assignments: try: portletManager = getUtility(IPortletManager, name=name) except ComponentLookupError: sm = getSiteManager(portal) objportletManager = PortletManager() sm.registerUtility(component=objportletManager, provided=IPortletManager, name=name) portletManager = getUtility(IPortletManager, name=name) assignable = getMultiAdapter(( portal, portletManager, ), ILocalPortletAssignmentManager) manager = getMultiAdapter((portal, portletManager), IPortletAssignmentMapping) if portletManager is not None: chooser = INameChooser(manager) for assignment in assignments: strtitle = assignment.title.lower() strtitle = strtitle.replace(' ', '-') if manager.has_key(strtitle) == 0: manager[chooser.chooseName(None, assignment)] = assignment
def test_already_registered_email(self): """ try to re-register an email for the same rule id """ rule = Rule() rule.event = IObjectAddedEvent rule.title = "Test rule" #add the rule to rule's storage storage = getUtility(IRuleStorage) chooser = INameChooser(storage) storage[chooser.chooseName(None, rule)] = rule #set the action and add it to the rule action = MailSubscriptionsAction() action.subject = "Test Rule subject" action.message = "Test Rule message" rule.actions.append(action) tool = getToolByName(self.portal, SUBSCRIPTION_TOOL, None) email = "*****@*****.**" result, msg = tool.registerUser(action.actionUID, email) result2, msg2 = tool.registerUser(action.actionUID, email) self.assertTrue(result) self.assertFalse(result2) self.assertEquals(msg2, 'already_subscribed_error')
def setUp(self): """ """ self.portal = self.layer['portal'] self.request = self.layer['request'] self.markRequestWithLayer() # Creating empty value for ACTUAL_URL to prevent KeyError self.request['ACTUAL_URL'] = '' app = self.layer['app'] #set some things #create a test user with email self.acl_users = getToolByName(self.portal, 'acl_users') self.acl_users.userFolderAddUser('user1', 'secret', ['Member'], []) self.user1 = self.acl_users.getUser('user1') self.user1.setProperties(email='*****@*****.**') #now set some rules self.tool = getToolByName(self.portal, SUBSCRIPTION_TOOL, None) self.portal_url = self.portal.absolute_url() self.browser = Browser(app) for x in ["first", "second", "third"]: #set some rules rule = Rule() rule.event = IObjectAddedEvent rule.title = "%s rule" % x #add the rules to rule's storage storage = getUtility(IRuleStorage) chooser = INameChooser(storage) storage[chooser.chooseName(None, rule)] = rule #set the action and add it to the rule action = MailSubscriptionsAction() action.subject = "Test %s action subject" % x rule.actions.append(action) #set one only norobots question registry = queryUtility(IRegistry) settings = registry.forInterface(INorobotsWidgetSettings, check=False) settings.questions = (u'What is 4 + 4 ?::8', ) transaction.commit()
def importAssignment(self, obj, node): """ Import an assignment from a node """ # 1. Determine the assignment mapping and the name manager_name = node.getAttribute('manager') manager = getUtility(IPortletManager, manager_name) mapping = getMultiAdapter((obj, manager), IPortletAssignmentMapping) if mapping is None: return # 2. Either find or create the assignment assignment = None name = node.getAttribute('name') if name: assignment = mapping.get(name, None) type_ = node.getAttribute('type') if assignment is None: portlet_factory = getUtility(IFactory, name=type_) assignment = portlet_factory() if not name: chooser = INameChooser(mapping) name = chooser.chooseName(None, assignment) mapping[name] = assignment # aq-wrap it so that complex fields will work assignment = assignment.__of__(obj) # 3. Use an adapter to update the portlet settings portlet_interface = getUtility(IPortletTypeInterface, name=type_) assignment_handler = IPortletAssignmentExportImportHandler(assignment) assignment_handler.import_assignment(portlet_interface, node)
def _get_file_id(self, id): context = aq_inner(self.context) charset = context.getCharset() id = id.decode(charset) normalizer = getUtility(IIDNormalizer) chooser = INameChooser(context) newid = chooser.chooseName(normalizer.normalize(id), context) # Make sure our chosen id is unique, iterate until we get one that is. chooser = INameChooser(context) newid = chooser._findUniqueName(id, None) # consolidation because it's different upon Plone versions newid = newid.replace('_', '-').replace(' ', '-').lower() return newid
def add(self, obj): container = self.context #check container constraints ttool = self._getTool('portal_types') container_ti = ttool.getTypeInfo(container) portal_type = obj.getPortalTypeName() if container_ti is not None and \ not container_ti.allowType(portal_type): raise ValueError('Disallowed subobject type: %s' % portal_type) name = INameChooser(container).chooseName(obj.getId(), obj) obj.id = name container._setObject(name, obj) obj = container._getOb(name) obj_type = translate(obj.Type(), self.context) self.status = _(u'${obj_type} added.', mapping={'obj_type': obj_type}) self._finished_add = True self._added_obj = obj return obj
def __call__(self): """ Rename the current classlist """ new_title = self.request.form['rename.form.newtitle'] # name/title must exist if new_title == '': msg = _("Name is required") IStatusMessage(self.request).addStatusMessage(msg, "error") return self.request.RESPONSE.redirect( \ "%s" % self.context.absolute_url()) classlist = self.context old_title = classlist.Title() # name/title must be unique if old_title.lower() != new_title.lower(): parent = classlist.aq_inner.aq_parent for alist in parent.objectValues(): if alist != self and alist.Title() == new_title: msg = _("Name is not unique") IStatusMessage(self.request).addStatusMessage(msg, "error") return self.request.RESPONSE.redirect( \ "%s" % self.context.absolute_url()) # Create/Modify if old_title.lower() != new_title.lower(): classlists = classlist.aq_parent classlist.edit(title=new_title) name = INameChooser(classlists).chooseName(None, classlist) classlists.manage_renameObject(classlist.id, name) msg = _("Classlist was modified") IStatusMessage(self.request).addStatusMessage(msg, "info") return self.request.RESPONSE.redirect( \ "%s" % self.context.absolute_url()) msg = _("New name identical to old name") IStatusMessage(self.request).addStatusMessage(msg, "error") return self.request.RESPONSE.redirect( \ "%s" % self.context.absolute_url())
def add(self, object): fti = getUtility(IDexterityFTI, name=self.portal_type) container = aq_inner(self.context) container = aq_inner(container) container_fti = container.getTypeInfo() if not fti.isConstructionAllowed(container): raise Unauthorized("Cannot create %s" % self.portal_type) if container_fti is not None and not container_fti.allowType( self.portal_type): raise ValueError("Disallowed subobject type: %s" % self.portal_type) target = aq_inner(object._target) name = None if target is not None: name = target.getId() name = INameChooser(container).chooseName(name, object) object.id = name new_name = container._setObject(name, object) # XXX: When we move to CMF 2.2, an event handler will take care of this new_object = container._getOb(new_name) new_object.notifyWorkflowCreated() immediate_view = fti.immediate_view or 'view' self.immediate_view = "%s/%s/%s" % ( container.absolute_url(), new_object.id, immediate_view, )
def initializeArchetype(self, **kwargs): ATBTreeFolder.initializeArchetype(self, **kwargs) left = getUtility(IPortletManager, name='plone.leftcolumn') right = getUtility(IPortletManager, name='plone.rightcolumn') leftAssignable = getMultiAdapter((self, left), IPortletAssignmentMapping).__of__(self) rightAssignable = getMultiAdapter((self, right), IPortletAssignmentMapping).__of__(self) # IPortletPermissionChecker(leftAssignable)() # IPortletPermissionChecker(rightAssignable)() leftChooser = INameChooser(leftAssignable) rightChooser = INameChooser(rightAssignable) # Set slot properties left_slots = zconf.coreblog2.left_slots_default for item in left_slots: path = item.split('/') if len(path) == 4: newPortlet = classic.Assignment(path[1], path[3]) leftAssignable[leftChooser.chooseName(None, newPortlet)] = newPortlet right_slots = zconf.coreblog2.right_slots_default for item in right_slots: path = item.split('/') if len(path) == 4: newPortlet = classic.Assignment(path[1], path[3]) rightAssignable[rightChooser.chooseName(None, newPortlet)] = newPortlet labLeftColumnManager = getMultiAdapter((self, left), ILocalPortletAssignmentManager) labLeftColumnManager.setBlacklistStatus(CONTEXT_CATEGORY, True) labRightColumnManager = getMultiAdapter((self, right), ILocalPortletAssignmentManager) labRightColumnManager.setBlacklistStatus(CONTEXT_CATEGORY, True) # finalize # make subfolders, etc. self.cbfinalize_creation(self, (comment_folder_id, catetory_folder_id, stuff_folder_id, images_folder_id)) self.indexObject()
def addEventsAndNewsPortlets(self): """ """ parent = getParent(self) obj = getattr(parent, 'oshnetwork') column = getUtility(IPortletManager, name='plone.leftcolumn') manager = getMultiAdapter(( obj, column, ), IPortletAssignmentMapping) assignment = events.Assignment() chooser = INameChooser(manager) manager[chooser.chooseName(None, assignment)] = assignment column = getUtility(IPortletManager, name='plone.rightcolumn') manager = getMultiAdapter(( obj, column, ), IPortletAssignmentMapping) assignment = news.Assignment() chooser = INameChooser(manager) manager[chooser.chooseName(None, assignment)] = assignment
def add(self, quotation): container = zope.component.getUtility(IQuotationContainer, context=self.context) name = INameChooser(container).chooseName(quotation, None) self._obj = container[name] = quotation