def listen_featurelet_installed(proj, event): """need to create a default discussion mailing list and subscribe all project members to the list""" proj_id = proj.getId() proj_title = proj.Title().decode('utf-8') ml_id = '%s-discussion' % proj_id address = '%s%s' % (ml_id, getSuffix()) # need to verify that a mailing list with this name isn't already created portal = getToolByName(proj, 'portal_url').getPortalObject() ll = getUtility(IListLookup, context=portal) if ll.getListForAddress(address) is not None: # XXX we'll just silently fail for now, not sure what else we can do # psm maybe? return # XXX we need a request utility request = proj.REQUEST # invokeFactory depends on the title being set in the request ml_title = u'%s discussion' % (proj_title) request.set('title', ml_title) lists_folder = proj.lists.aq_inner lists_folder.invokeFactory(OpenMailingList.portal_type, ml_id) ml = lists_folder[ml_id] ml.mailto = ml_id ms_tool = getToolByName(proj, 'portal_membership') cur_mem_id = unicode(ms_tool.getAuthenticatedMember().getId()) ml.managers = (cur_mem_id,) ml.setDescription(translate(_(u'discussion_list_desc', u'Discussion list for this ${project_noun}, consisting of all ${project_noun} members.', mapping={'project_noun':project_noun()}), context=request)) # http://www.openplans.org/projects/opencore/lists/opencore-dev/archive/2009/04/1239543233615/forum_view from zope.interface import alsoProvides alsoProvides(ml, ISyncWithProjectMembership) notify(ObjectCreatedEvent(ml)) memlist = IWriteMembershipList(ml) cat = getToolByName(portal, 'portal_catalog') teams = getToolByName(portal, 'portal_teams') try: team = teams[proj_id] except KeyError: # if the team doesn't exist # then nobody is on the project yet # so we only need to subscribe the current user memlist.subscribe(cur_mem_id) return active_states = teams.getDefaultActiveStates() team_path = '/'.join(team.getPhysicalPath()) mships = cat(portal_type='OpenMembership', review_state=active_states, path=team_path) for mship in mships: memlist.subscribe(mship.getId)
def _createIndexPage(self): """ Create the project index page from the specified file. """ home_page_title = 'Home' self.invokeFactory('Document', self.home_page_id, title=home_page_title) page = self._getOb(self.home_page_id) page_file = pkg_resources.resource_stream(OPENCORE, 'copy/%s' % self.home_page_file) page.setText(page_file.read().replace('${project_noun}', project_noun()))
def _construct_request_email(self, request_message=None): team = self.context team_manage_url = self.team_manage_url member = self._loggedinmember member_string = member.getId() member_fn = member.getFullname() if member_fn: member_string = member_string + ' (' + member_fn + ')' email_msg = _(u'email_membership_requested', mapping = {'member_id': member_string, 'project_title': team.title, 'project_noun': project_noun(), 'team_manage_url': team_manage_url, } ) email_subject = _(u'email_membership_requested_subject', mapping = {'member_id': member_string, 'project_title': team.title, 'project_noun': project_noun(), 'team_manage_url': team_manage_url, } ) sender = IEmailSender(self.portal) email_msg = sender.constructMailMessage(email_msg) email_subject = sender.constructMailMessage(email_subject) if request_message: member_message = _(u'email_mship_request_message', mapping = {'member_id': member_string, 'project_title': team.title, 'team_manage_url': team_manage_url, 'member_message': detag(request_message), } ) member_message = sender.constructMailMessage(member_message) email_msg += member_message return (email_msg, email_subject)
def create_topnav_viewlet(name, sort_order, text, url, item_url, filter, container, css_class, selected, application_header, template, **kw ): """factory function that creates viewlet classes based on configuration""" # set the name to help when getting a repr on the object""" klass_name = "%s-%s" % (ViewletBase.__name__, str(name)) # replaces 'project' text with the dynamic project_noun that comes from base.ini # XXX TODO this doesn't seem appropriate at all. surely this should be controlled # by just spelling out ${project_noun} in the ZCML text? text = text.replace('Project', project_noun().title()).replace('project', project_noun()) attrs = dict(name=name, _text=text, sort_order=sort_order, url=url, item_url=item_url, filter=filter, container=container, css_class=css_class, selected=selected, application_header=application_header, render=template, ) return type(klass_name, (TopnavViewletBase,), attrs)
def translate(self, msgid, mapping=None, context=None, target_language=None, default=None): if msgid == "project_noun": noun = TranslationDomain.translate(self, msgid, mapping, context, target_language, default) return noun mapping = mapping or {} # defer import to circumvent loops from opencore.project.utils import project_noun mapping["project_noun"] = project_noun() if isinstance(msgid, zope.i18nmessageid.Message) and msgid.mapping: combined_mapping = dict(mapping) combined_mapping.update(msgid.mapping) msgid = zope.i18nmessageid.Message(msgid, mapping=combined_mapping) return TranslationDomain.translate(self, msgid, mapping, context, target_language, default)
read_permission=ModifyPortalContent, write_permission=ModifyPortalContent, widget=atapi.BooleanWidget( label='Anonymize email address by default?', label_msgid='label_useAnonByDefault', description="Would you like your email address to be anonymized by " \ "default when sending email via the forms on this site?", description_msgid='help_useAnonByDefault', ), ), atapi.ComputedField('projects', read_permission=View, expression='context.getProjectListing()', widget=atapi.ComputedWidget( label= project_noun().title() + "s", label_msgid='label_projects', description="%ss this user is a member of." % project_noun().title(), description_msgid='help_projects', macro='member_projects', ), ), )) content_schema.moveField('useAnonByDefault', after='email') # Support for PleiadesGeocoder, which out-of-the-box assumes # non-remember members. geo_schema = atapi.Schema(( StringField('geometryType', searchable=0), StringField('spatialCoordinates', searchable=0),
def project_noun(self): return project_noun()
def project_noun(self): """Do we call them 'projects' or 'groups' or... ? """ return project_noun()