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 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 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 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 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 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 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 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 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_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 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 __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 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 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 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 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 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 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 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 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 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 __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 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 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 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 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 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 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 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 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 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 _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 _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, content, name=''): if not self.isAddable(): raise Unauthorized("Can't create '%s' instance"%self.name) context = self.container content = removeAllProxies(content) if IContentContainer.providedBy(context) or \ IContentNamesContainer.providedBy(content): chooser = INameChooser(context) if IContainerNamesContainer.providedBy(context): name = chooser.chooseName('', content) else: name = chooser.chooseName(name, content) chooser.checkName(name, content) self.checkObject(context, name, content) removeSecurityProxy(context)[name] = content return context[name] else: raise ValueError(_("Can't add content."))
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 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 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 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 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 assign_cynin_navigation(portal): cyninnav = ICyninNavigation(portal) if cyninnav is None: return portlets = cyninnav() for name in portlets.keys(): assignments = portlets.get(name) if assignments: try: portletManager = getUtility(IPortletManager, name=name) except ComponentLookupError: sm = getSiteManager(portal) objportletManager = PortletManager() if name == 'ubify.navigationspacesportletmanager': alsoProvides(objportletManager,INavigationSpacesContent) elif name == 'ubify.navigationcollectionportletmanager': alsoProvides(objportletManager,INavigationCollectionContent) elif name == 'ubify.navigationmembersportletmanager': alsoProvides(objportletManager,INavigationMembersContent) 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: if name == 'ubify.navigationspacesportletmanager': bfound = False for eobj in manager.values(): if isinstance(eobj,assignment.__class__): bfound = True if bfound and eobj.root == '/' + contentroot_details['oldid']: bfound = False del manager[eobj.id] if bfound: break; if not bfound: manager[chooser.chooseName(None, assignment)] = assignment elif name == 'ubify.navigationcollectionportletmanager': bfound = False for eobj in manager.values(): if isinstance(eobj,assignment.__class__): bfound = True if bfound: break; if not bfound: manager[chooser.chooseName(None, assignment)] = assignment elif name == 'ubify.navigationmembersportletmanager': bfound = False for eobj in manager.values(): if isinstance(eobj,assignment.__class__): bfound = True if bfound: break; if not bfound: manager[chooser.chooseName(None, assignment)] = assignment assignable.setBlacklistStatus(CONTEXT_CATEGORY, True)
def generate_uid(name, context): normalized_id = normalize_id(name) chooser = INameChooser(context) return chooser.chooseName(normalized_id, context)
def assign_portal_dashboard(portal, event, isReinstall=False): site = portal objDashboard = ISiteDefaultDashboard(portal, None) if objDashboard is None: return portlets = objDashboard() for name in portlets.keys(): assignments = portlets.get(name) try: portletManager = getUtility(IPortletManager, name=name) except ComponentLookupError: sm = getSiteManager(site) objportletManager = PortletManager() if name == spacedashboardportletmanager_name: alsoProvides(objportletManager, IHomeContent) elif name == spacemindmapmanager_name: alsoProvides(objportletManager, IMindMapContent) elif name == spacehomeleftblockmanager_name: alsoProvides(objportletManager, IHomeLeftblockContent) 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: reorderrecentportlet = False recentportletname = '' chooser = INameChooser(manager) for assignment in assignments: if name == spacemindmapmanager_name: bfound = False if isReinstall: removeAssignedPortlets(portal, manager, name) for eobj in manager.values(): if isinstance( eobj, static.Assignment ) and eobj.id == site_home_top_banner_static_header.lower( ).replace(' ', '-'): bfound = True if bfound: break if not bfound: manager[chooser.chooseName(None, assignment)] = assignment elif name == spacehomeleftblockmanager_name: bfound = False if isReinstall: removeAssignedPortlets(portal, manager, name) for eobj in manager.values(): if isinstance(eobj, assignment.__class__): bfound = True if bfound: #check for recentsiteupdate portlet fix try: if isinstance( eobj, recentsiteupdatesportlet.Assignment ) and hasattr(eobj, 'data') and hasattr( eobj.data, 'resultcount') and isinstance( eobj.data.resultcount, int): bfound = False del manager[eobj.id] reorderrecentportlet = True recentportletname = eobj.id.encode( 'ascii', 'replace') except AttributeError: pass if bfound: break if not bfound: manager[chooser.chooseName(None, assignment)] = assignment elif name == spacedashboardportletmanager_name: bfound = False if isReinstall: removeAssignedPortlets(portal, manager, name) for eobj in manager.values(): if isinstance(eobj, assignment.__class__): bfound = True if bfound: break if not bfound: manager[chooser.chooseName(None, assignment)] = assignment if reorderrecentportlet and isReinstall: keys = list(manager.keys()) idx = keys.index(recentportletname) keys.remove(recentportletname) keys.insert(0, recentportletname) manager.updateOrder(keys) if assignable is not None: assignable.setBlacklistStatus(CONTEXT_CATEGORY, True)
def __call__(self, name, title, description, content_type, data, portal_type): context = aq_inner(self.context) charset = context.getCharset() filename = name name = name.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() 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 not error: obj = getattr(context, newid) if obj: primaryField = obj.getPrimaryField() if primaryField is not None: mutator = primaryField.getMutator(obj) # mimetype arg works with blob files mutator(data, content_type=content_type, mimetype=content_type) # XXX when getting file through request.BODYFILE (XHR direct upload) # the filename is not inside the file # and the filename must be a string, not unicode # otherwise Archetypes raise an error (so we use filename and not name) if not obj.getFilename(): if isinstance(filename, unicode): filename = filename.encode(charset) obj.setFilename(filename) obj.reindexObject() notify(ObjectInitializedEvent(obj)) else: # some products remove the 'primary' attribute on ATFile or ATImage (which is very bad) error = u'serverError' # logger.info("An error happens : impossible to get the primary field for file %s, rawdata can't be created" %obj.absolute_url()) else: 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) transaction.commit() upload_lock.release()
def saveAssignment(mapping, assignment): chooser = INameChooser(mapping) mapping[chooser.chooseName(None, assignment)] = assignment
def create(container=None, type=None, id=None, title=None, safe_id=False, **kwargs): """Create a new content item. :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 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 :returns: Content object :raises: KeyError, :class:`~plone.api.exc.MissingParameterError`, :class:`~plone.api.exc.InvalidParameterError` :Example: :ref:`content_create_example` """ if not container: raise MissingParameterError("Missing required parameter: container") if not type: raise MissingParameterError("Missing required parameter: type") if not id and not title: raise MissingParameterError( 'You have to provide either the ``id`` or the ' '``title`` parameter') # Create a temporary id if the id is not given content_id = not safe_id and id or str(random.randint(0, 99999999)) if title: kwargs['title'] = title try: container.invokeFactory(type, content_id, **kwargs) except ValueError: if ISiteRoot.providedBy(container): types = [type.id for type in container.allowedContentTypes()] else: types = container.getLocallyAllowedTypes() raise InvalidParameterError( "Cannot add a '%s' object to the container. \n" "Allowed types are:\n" "%s" % (type, '\n'.join(sorted(types)))) content = container[content_id] # Archetypes specific code if IBaseObject.providedBy(content): # Will finish Archetypes content item creation process, # rename-after-creation and such content.processForm() if not id or (safe_id and id): # Create a new id from title chooser = INameChooser(container) derived_id = id or title new_id = chooser.chooseName(derived_id, content) # kacee: we must do a partial commit, else the renaming fails because # the object isn't in the zodb. # Thus if it is not in zodb, there's nothing to move. We should # choose a correct id when # the object is created. # maurits: tests run fine without this though. transaction.savepoint(optimistic=True) content.aq_parent.manage_renameObject(content_id, new_id) return content
def evolve(context): """ restructre form referatory/collectanea/figures to referatory/figuresng. relations now live in one single thing.""" root = getRootFolder(context) site = None for s in findObjectsProviding(root, IQuotationtoolSite): site = s break if site is None: raise Exception('No quotationtool site') hooks.setSite(site) sm = site.getSiteManager() # a container for comments about figures was added container = site['aboutfigures'] = CommentAboutFigureContainer() sm.registerUtility(container, ICommentAboutFigureContainer) IWriteZopeDublinCore(container).title = u"Comments about Examples" IWriteZopeDublinCore(container).description = u"""Comments about examples are stored here.""" # relation catalog was restructured to one catalog with several indices cat = sm['default']['relation_catalog'] = zc.relation.catalog.Catalog( dump, load) cat.addValueIndex( IReference['uniform_title'], dump = dump, load = load, name = 'ireference-uniform_title') cat.addValueIndex( IFigure['reference'], dump = dump, load = load, name = 'ifigure-reference') cat.addValueIndex( ICommentAboutFigure['figure'], dump = dump, load = load, name = 'icommentaboutfigure-figure') cat.addValueIndex( ICommentAboutReference['reference'], dump = dump, load = load, name = 'icommentaboutreference-reference') sm.registerUtility(cat, zc.relation.interfaces.ICatalog) for obj in findObjectsProviding(site, IReference): cat.index(obj) for obj in findObjectsProviding(site, IFigure): cat.index(obj) for obj in findObjectsProviding(site, ICommentAboutFigure): cat.index(obj) for obj in findObjectsProviding(site, ICommentAboutReference): cat.index(obj) # figuresng (figures next generation) need some restructuring old_examples = site['examples-g2'] = site['examples'] site.__delitem__('examples') site['examples'] = examples_ng = ExampleContainer() sm.registerUtility(examples_ng, IExampleContainer) name_chooser = INameChooser(examples_ng) extent = zc.catalog.extentcatalog.FilterExtent(filter) cat = sm['default']['examples_search_catalog'] = zc.catalog.extentcatalog.Catalog(extent) createReferenceIndices(cat) createExampleIndices(cat) sm.registerUtility(cat, zope.app.catalog.interfaces.ICatalog, name = "examples") for old in old_examples.values(): new = Example() new.reference = old.quotation.reference new.quotation = unicode(old.quotation.quotation) new.source_type = 'quotationtool.figuresng.plaintext' new.position = unicode(old.quotation.position) new.quid = unicode(getattr(old, 'quid', u"")) new.pro_quo = unicode(getattr(old, 'pro_quo', u"")) new.marker = unicode(getattr(old, 'marker', u"")) name_ = name_chooser.chooseName(new, None) examples_ng[name_] = new dcdata = IAnnotations(old).get(DCkey) annotations = IAnnotations(new) annotations[DCkey] = dcdata
def assign_space_dashboard(space,event): #import pdb;pdb.set_trace() site = space.portal_url.getPortalObject() objDashboard = ISpaceDefaultDashboard(space,None) if objDashboard is None: return spaceid = space.id portlets = objDashboard() for name in (spacemembersportletmanager_name,spacedashboardportletmanager_name,spacemindmapmanager_name,spacehomeleftblockmanager_name): assignments = portlets.get(name) if assignments: try: portletManager = getUtility(IPortletManager, name=name) except ComponentLookupError: sm = getSiteManager(site) objportletManager = PortletManager() if name == spacedashboardportletmanager_name: alsoProvides(objportletManager,IHomeContent) elif name == spacemembersportletmanager_name: alsoProvides(objportletManager,ISpaceMembersContent) elif name == spacemindmapmanager_name: alsoProvides(objportletManager,IMindMapContent) elif name == spacehomeleftblockmanager_name: alsoProvides(objportletManager,IHomeLeftblockContent) sm.registerUtility(component=objportletManager, provided=IPortletManager, name = name) portletManager = getUtility(IPortletManager, name=name) assignable = getMultiAdapter((space, portletManager,), ILocalPortletAssignmentManager) manager = getMultiAdapter((space, portletManager), IPortletAssignmentMapping) if portletManager is not None: chooser = INameChooser(manager) for assignment in assignments: if name == spacemindmapmanager_name: bfound = False for eobj in manager.values(): if isinstance(eobj,spacemindmapportlet.Assignment): bfound = True if bfound: break; if not bfound: manager[chooser.chooseName(None, assignment)] = assignment elif name == spacehomeleftblockmanager_name: bfound = False for eobj in manager.values(): if isinstance(eobj,assignment.__class__): bfound = True elif isinstance(eobj,assignment.__class__): bfound = True if bfound: break; if not bfound: manager[chooser.chooseName(None, assignment)] = assignment elif name == spacemembersportletmanager_name: bfound = False for eobj in manager.values(): if isinstance(eobj,assignment.__class__): bfound = True elif isinstance(eobj,assignment.__class__): bfound = True if bfound: break; if not bfound: manager[chooser.chooseName(None, assignment)] = assignment else: strtitle = assignment.title.lower() strtitle = strtitle.replace(' ','-') if manager.has_key(strtitle) == 0: manager[chooser.chooseName(None, assignment)] = assignment assignable.setBlacklistStatus(CONTEXT_CATEGORY, True) #def enable_addable_types(space, event): # """Give the given role the add permission on all the selected types. # """ # portal_types = getToolByName(space, 'portal_types') # role = 'TeamMember' # #import pdb;pdb.set_trace() # for fti in portal_types.listTypeInfo(): # type_id = fti.getId() # # permission = get_factory_permission(space, fti) # if permission is not None: # roles = [r['name'] for r in space.rolesOfPermission(permission) if r['selected']] # acquire = bool(space.permission_settings(permission)[0]['acquire']) # if type_id in space.addable_types and role not in roles: # roles.append(role) # elif type_id not in space.addable_types and role in roles: # roles.remove(role) # space.manage_permission(permission, roles, acquire)
def evolve(context): """ Evolve data from the 2009 version to 2011 version. - create bibliography - create biblatex entries from references - let examples point to new entry objects - grant 'quotationtool.Creator' role to dc.creators[0] of examples, comments and entries. """ # We moved the imports here because of getInfo which only takes # the __doc__ string in evolve. getInfo should not import # anything. from zope.app.zopeappgenerations import getRootFolder from zope.app.generations.utility import findObjectsProviding from zope.app.component import hooks from zope.dublincore.interfaces import IWriteZopeDublinCore from zope.securitypolicy.interfaces import IPrincipalRoleManager from zope.dublincore.annotatableadapter import DCkey from zope.annotation.interfaces import IAnnotations from zope.app.container.interfaces import INameChooser from quotationtool.site.interfaces import IQuotationtoolSite from quotationtool.figuresng.iexample import IExample from quotationtool.commentary.interfaces import IComment from quotationtool.bibliography.bibliography import Bibliography from quotationtool.bibliography.interfaces import IBibliography from quotationtool.biblatex.biblatexentry import BiblatexEntry from quotationtool.referatory.interfaces import IReference from quotationtool.referatory.bibtex.iarticle import IArticle from quotationtool.referatory.bibtex.ibook import IBook from quotationtool.referatory.bibtex.iincollection import IIncollection root = getRootFolder(context) site = None for s in findObjectsProviding(root, IQuotationtoolSite): site = s break if site is None: raise Exception('No quotationtool site!') hooks.setSite(site) sm = site.getSiteManager() # grant quotationtool.Creator to the principal who created the # object. The principal must be therefor looked up in dc # annotation. def grantCreator(obj): dc = IWriteZopeDublinCore(obj) role_manager = IPrincipalRoleManager(obj) role_manager.assignRoleToPrincipal('quotationtool.Creator', dc.creators[0]) # create bibliography site['bibliography'] = bibliography = Bibliography() sm.registerUtility(bibliography, IBibliography) IWriteZopeDublinCore(bibliography).title = u"Bibliography" # create new catalogs # create biblatex entries form old references namechooser = INameChooser(bibliography) map = {} for reference in findObjectsProviding(site, IReference): entry = BiblatexEntry() au = getattr(reference, 'author', ()) if au: entry.author = list(au) ed = getattr(reference, 'editor', ()) if ed: entry.editor = list(ed) titles = getattr(reference, 'title', ()) if len(titles) >= 1: entry.title = titles[0] if len(titles) > 1: entry.subtitle = titles[1] if len(titles) > 2: entry.subtitle += u". " + titles[2] entry.publisher = getattr(reference, 'publisher', None) entry.date = getattr(reference, 'year', None) entry.volume = getattr(reference, 'volume', None) entry.number = getattr(reference, 'number', None) entry.series = getattr(reference, 'series', None) entry.location = getattr(reference, 'address', None) entry.edition = getattr(reference, 'edition', None) entry.month = getattr(reference, 'month', None) entry.note = getattr(reference, 'note', None) entry.journaltitle = getattr(reference, 'journal', None) entry.pages = getattr(reference, 'pages', None) titles = getattr(reference, 'booktitle', ()) if len(titles) >= 1: entry.booktitle = titles[0] if len(titles) > 1: entry.booksubtitle = titles[1] if len(titles) > 2: entry.booksubtitle += u". " + titles[2] entry.type = getattr(reference, 'type', None) entry.chapter = getattr(reference, 'chapter', None) if getattr(reference, 'language', None) == 'de': entry.hyphenation = 'ngerman' else: entry.hyphenation = 'english' title = getattr(reference.uniform_title, 'uniform_title', ()) origtitle = u"" if title: for t in title: origtitle += t + u". " entry.origtitle = origtitle[:-2] year = getattr(reference.uniform_title, 'year', None) if year: origdate = year else: origdate = unicode(getattr( reference.uniform_title, 'post', u"")) + u"/" + unicode( getattr(reference.uniform_title, 'ante', u"")) try: entry.origdate = origdate except Exception: pass if IBook.providedBy(reference): entry.entry_type = 'Book' if IIncollection.providedBy(reference): entry.entry_type = 'InCollection' if IArticle.providedBy(reference): entry.entry_type = 'Article' name = namechooser.chooseName(None, entry) bibliography[name] = entry map[reference.__name__] = entry.__name__ dcdata = IAnnotations(reference).get(DCkey) annotations = IAnnotations(entry) annotations[DCkey] = dcdata grantCreator(entry) if 1 == 0: #hack for testing break for example in findObjectsProviding(site, IExample): grantCreator(example) if '.plaintext' in example.source_type: example.source_type = 'plaintext' if '.rest' in example.source_type: example.source_type = 'rest' example.reference = bibliography[map[example.reference.__name__]] for comment in findObjectsProviding(site, IComment): grantCreator(comment) if '.plaintext' in comment.source_type: comment.source_type = 'plaintext' if '.rest' in comment.source_type: comment.source_type = 'rest' if 1 == 0: raise Exception