Example #1
0
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)
Example #2
0
 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)
Example #4
0
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)
Example #5
0
    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)
Example #6
0
                       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),
Example #7
0
 def project_noun(self):
     return project_noun()
Example #8
0
 def project_noun(self):
     """Do we call them 'projects' or 'groups' or... ?
     """
     return project_noun()