Author: rmarianski Date: 2007-11-26 12:17:39 -0500 (Mon, 26 Nov 2007) New Revision: 11242
Modified: opencore/trunk/Products/OpenPlans/i18n/opencore-en.po opencore/trunk/opencore/browser/base.py opencore/trunk/opencore/browser/css/opencore.css opencore/trunk/opencore/listen/browser/mailinglist_view.pt opencore/trunk/opencore/member/browser/README.txt opencore/trunk/opencore/member/browser/profile.pt opencore/trunk/opencore/nui/wiki/add.py opencore/trunk/opencore/project/browser/item_row.pt opencore/trunk/opencore/project/browser/manage-team.txt opencore/trunk/opencore/project/browser/manageteam.py opencore/trunk/opencore/project/browser/team-manage-macros.pt opencore/trunk/opencore/project/browser/view.py Log: merge -r11185:11240 https://svn.openplans.org/svn/opencore/branches/bugday-11-21 to trunk Modified: opencore/trunk/Products/OpenPlans/i18n/opencore-en.po =================================================================== --- opencore/trunk/Products/OpenPlans/i18n/opencore-en.po 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/Products/OpenPlans/i18n/opencore-en.po 2007-11-26 17:17:39 UTC (rev 11242) @@ -2,8 +2,8 @@ msgstr "" "Project-Id-Version: opencore\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2007-11-20 16:01-0500\n" -"Last-Translator: \n" +"PO-Revision-Date: 2007-11-21 15:27-0500\n" +"Last-Translator: Rolando Penate <[EMAIL PROTECTED]>\n" "Language-Team: The Open Planning Project <[EMAIL PROTECTED]>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -934,7 +934,7 @@ #. Default: "Archive" #: opencore/listen/browser/mailinglist_view.pt:46 msgid "mailinglist_view_archive" -msgstr "" +msgstr "Message archive" #. Default: "Contact" #: opencore/listen/browser/mailinglist_view.pt:57 Modified: opencore/trunk/opencore/browser/base.py =================================================================== --- opencore/trunk/opencore/browser/base.py 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/opencore/browser/base.py 2007-11-26 17:17:39 UTC (rev 11242) @@ -143,9 +143,9 @@ msg = cleaner.clean_html(msg) if msg.startswith('<p>'): msg = msg[3:-4] + msg = unicode(msg) + plone_utils.addPortalMessage(msg, request=self.request) - plone_utils.addPortalMessage(msg) - addPortalStatusMessage = add_status_message # XXX not used Modified: opencore/trunk/opencore/browser/css/opencore.css =================================================================== --- opencore/trunk/opencore/browser/css/opencore.css 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/opencore/browser/css/opencore.css 2007-11-26 17:17:39 UTC (rev 11242) @@ -93,7 +93,6 @@ } ul#oc-topnav-context li a { padding: .25em .5em; - text-transform: capitalize; } #oc-topnav a:hover { } Modified: opencore/trunk/opencore/listen/browser/mailinglist_view.pt =================================================================== --- opencore/trunk/opencore/listen/browser/mailinglist_view.pt 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/opencore/listen/browser/mailinglist_view.pt 2007-11-26 17:17:39 UTC (rev 11242) @@ -44,14 +44,14 @@ List type </dd> <dt i18n:translate="mailinglist_view_archive" id="archival-state"> - Archive + Message archive </dt> <dd> <span tal:content="view/archived"> Messages to this list are archived </span> - <a tal:condition="view/is_archived" tal:attributes="href python:'%s/archive' % view.context.absolute_url()" i18n:translate="mailinglist_view_archive"> - View archive. + <a tal:condition="view/is_archived" tal:attributes="href python:'%s/archive' % view.context.absolute_url()" i18n:translate="mailinglist_view_archive_link"> + View messages. </a> </dd> <dt i18n:translate="mailinglist_view_contact"> Modified: opencore/trunk/opencore/member/browser/README.txt =================================================================== --- opencore/trunk/opencore/member/browser/README.txt 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/opencore/member/browser/README.txt 2007-11-26 17:17:39 UTC (rev 11242) @@ -148,7 +148,7 @@ >>> view.leave_project('i18n') False >>> view.portal_status_message - [u'You are the only remaining administrator of "\u65e5\u8a9e"...] + [u'You are the only remaining administrator of "日語"...] Now we'll try to set the listing as private: Modified: opencore/trunk/opencore/member/browser/profile.pt =================================================================== --- opencore/trunk/opencore/member/browser/profile.pt 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/opencore/member/browser/profile.pt 2007-11-26 17:17:39 UTC (rev 11242) @@ -33,7 +33,7 @@ </tal:location> <dt><tal:label i18n:translate="profile_projects">Projects</tal:label> <a tal:condition="view/viewingself" class="oc-actionLink" - href="account">Edit</a> + href="account">Manage</a> </dt> <dd tal:define="not_used view/populate_project_lists; pub_projs nocall:view/public_projects; Modified: opencore/trunk/opencore/nui/wiki/add.py =================================================================== --- opencore/trunk/opencore/nui/wiki/add.py 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/opencore/nui/wiki/add.py 2007-11-26 17:17:39 UTC (rev 11242) @@ -3,6 +3,7 @@ from Products.wicked.lib.normalize import titleToNormalizedId as normalize from opencore.browser.base import BaseView +from opencore.browser.base import _ from Products.wicked.utils import getFilter from zope.component import ComponentLookupError from zExceptions import Redirect @@ -48,11 +49,13 @@ title=title) newcontent = getattr(self.context, newcontentid) self.do_wicked(newcontent, title, section) - portal_status_message='"%s" has been created' % title - BaseView.add_status_message(self, portal_status_message) + self.add_status_message(_(u'psm_page_created', + u'"${pagetitle}" has been created', + mapping={'pagetitle': title}) + ) url = newcontent.absolute_url() restr = "%s/edit" %url - return BaseView.redirect(self, restr) + return self.redirect(restr) @property def names_for_context(self): Modified: opencore/trunk/opencore/project/browser/item_row.pt =================================================================== --- opencore/trunk/opencore/project/browser/item_row.pt 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/opencore/project/browser/item_row.pt 2007-11-26 17:17:39 UTC (rev 11242) @@ -55,9 +55,9 @@ <li tal:condition="editable"> <a href="#" class="oc-js-liveEdit_showForm oc-actionLink">Rename</a></li> <li tal:condition="deletable"> - <a class="oc-js-actionLink oc-actionLink" + <a class="oc-js-actionLink oc-actionLink oc-js-confirm" tal:attributes="href string:contents?task|${item/id}|delete=Delete&item_type=${item_type}&authenticator=${view/authenticator}"> - Delete + Delete <span class="oc-hidden oc-warning">This deletion is permanant. Are you sure you want to delete?</span> </a> </li> </ul> Modified: opencore/trunk/opencore/project/browser/manage-team.txt =================================================================== --- opencore/trunk/opencore/project/browser/manage-team.txt 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/opencore/project/browser/manage-team.txt 2007-11-26 17:17:39 UTC (rev 11242) @@ -109,6 +109,8 @@ True >>> self.login('m1') >>> res = view.reject_requests(['m4']) + >>> view.portal_status_message + [u'You have added m4.', u'Request discarded: m4', u'Request denied: m4'] >>> len(view.pending_requests) 0 >>> len(view.active_mships) @@ -137,6 +139,8 @@ >>> self.clearMemoCache() >>> res = view.remove_invitations(['m3']) + >>> view.portal_status_message + [u'Reminder sent: m3', u'Invitation removed: m3'] >>> len(view.pending_invitations) 0 >>> len(mailhost.messages) @@ -174,10 +178,8 @@ >>> view.remove_members(['portal_owner']) {'portal_owner': {'action': 'delete'}} >>> team.setTeamRolesForMember('portal_owner', ('ProjectMember', 'ProjectAdmin')) - -Clear out all the portal status messages >>> view.portal_status_message - [...] + [u'Member deactivated: m2', u'Member deactivated: portal_owner'] Now we can try to remove the last admin >>> view.remove_members(['m1']) @@ -238,6 +240,8 @@ ... [{'role': 'ProjectAdmin'}, ... {'role': 'ProjectMember'}, ... {'role': 'ProjectAdmin'}]) + >>> view.portal_status_message + [u'You have added m3.', u'Role changed for the following members: m3, portal_owner'] 2 events should have been fired (2 role changes) portal_owner was demoted, and m3 was promoted @@ -395,6 +399,9 @@ >>> self.clearMemoCache() >>> addys = [addy.strip() for addy in invites.split(',')] >>> view.remind_email_invites(addys) + >>> delattr(view, '_redirected') + >>> view.portal_status_message + [u'Role changed for the following member: m3', u'You invited m3 to join this project.', u'You invited m2 to join this project.', u'You invited m4 to join this project.', u'Email invitations: [EMAIL PROTECTED], [EMAIL PROTECTED]', u'Members invited: m3', u'Members for whom invitation failed: m3', u'Reminders sent: [EMAIL PROTECTED], [EMAIL PROTECTED]'] >>> len(mailhost.messages) # <- increase by two 15 @@ -403,6 +410,8 @@ >>> self.clearMemoCache() >>> view.remove_email_invites(addys) [EMAIL PROTECTED]@example.com...} + >>> view.portal_status_message + [u'Email invitations removed: [EMAIL PROTECTED], [EMAIL PROTECTED]'] >>> len(view.pending_email_invites) 0 >>> len(mailhost.messages) # <- increase by two Modified: opencore/trunk/opencore/project/browser/manageteam.py =================================================================== --- opencore/trunk/opencore/project/browser/manageteam.py 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/opencore/project/browser/manageteam.py 2007-11-26 17:17:39 UTC (rev 11242) @@ -231,6 +231,7 @@ brain = self.catalog(path='/'.join(mship.getPhysicalPath()))[0] extra_context={'item': self.getMshipInfoFromBrain(brain), 'team_manage_macros': self.team_manage_macros.macros, + 'changeable': True, # they're removable } html = self.render_macro(self.team_manage_macros.macros['mshiprow'], extra_context=extra_context) @@ -238,9 +239,11 @@ 'html': html, 'effects': 'fadeIn'} - plural = napproved != 1 - self.add_status_message(u'You have added %d member%s.' % - (napproved, plural and 's' or '')) + if napproved == 1: + self.add_status_message(u'You have added %s.' % mem_id) + else: + self.add_status_message(u'You have added %d members.' % napproved) + if napproved: self.team.reindexTeamSpaceSecurity() @@ -260,9 +263,11 @@ return {} # copy targets list b/c manage_delObjects empties the list + mem_ids = targets[:] self.team.manage_delObjects(ids=mem_ids) - msg = u"Requests discarded: %s" % ', '.join(mem_ids) + plural = len(targets[:]) != 1 + msg = u"Request%s discarded: %s" % (plural and 's' or '',', '.join(targets[:])) self.add_status_message(msg) return dict( ((mem_id, {'action': 'delete'}) for mem_id in mem_ids) ) @@ -286,7 +291,8 @@ sender.sendEmail(mem_id, msg=msg) self._add_transient_msg_for(mem_id, 'You have been denied membership to') - msg = u"Requests denied: %s" % ', '.join(mem_ids) + plural = len(mem_ids) != 1 + msg = u"Request%s denied: %s" % (plural and 's' or '',', '.join(mem_ids)) self.add_status_message(msg) return dict( ((mem_id, {'action': 'delete'}) for mem_id in mem_ids) ) @@ -331,7 +337,8 @@ if deletes: self.team.manage_delObjects(ids=deletes) - msg = u'Invitations removed: %s' % ', '.join(mem_ids) + plural = len(mem_ids) != 1 + msg = u'Invitation%s removed: %s' % (plural and 's' or '', ', '.join(mem_ids)) self.add_status_message(msg) return ret @@ -354,7 +361,8 @@ } sender.sendEmail(mem_id, msg_id='remind_invitee', **msg_vars) - msg = "Reminders sent: %s" % ", ".join(mem_ids) + plural = len(mem_ids) != 1 + msg = "Reminder%s sent: %s" % (plural and 's' or '', ", ".join(mem_ids)) self.add_status_message(msg) @@ -381,7 +389,8 @@ if email_confirmation(): sender.sendEmail(address, msg=msg) - msg = u'Email invitations removed: %s' % ', '.join(addresses) + plural = len(addresses) != 1 + msg = u'Email invitation%s removed: %s' % (plural and 's' or '',', '.join(addresses)) self.add_status_message(msg) ret = dict([(target, {'action': 'delete'}) for target in targets]) @@ -410,7 +419,9 @@ sender.sendEmail(address, msg_id='invite_email', **msg_subs) - msg = "Reminders sent: %s" % ", ".join(addresses) + plural = len(addresses) != 1 + + msg = "Reminder%s sent: %s" % (plural and 's' or '',', '.join(addresses)) self.add_status_message(msg) def mship_only_admin(self, mship): @@ -481,7 +492,8 @@ ret[mem_id] = {'action': 'delete'} if mems_removed: - msg = "Members deactivated: %s" % ', '.join(mems_removed) + plural = len(mems_removed) != 1 + msg = "Member%s deactivated: %s" % (plural and 's' or '', ', '.join(mems_removed)) elif mem_ids: msg = 'Cannot remove last admin: %s' % mem_ids[0] else: @@ -518,7 +530,8 @@ item = active_mships.get(mem_id) if item: extra_context={'item': item, - 'team_manage_macros': self.team_manage_macros} + 'team_manage_macros': self.team_manage_macros, + 'changeable': True} html = self.render_macro(self.team_manage_macros.macros['mshiprow'], extra_context=extra_context) commands[mem_id] = {'action': 'replace', @@ -529,9 +542,9 @@ or 'You are no longer an admin of') self._add_transient_msg_for(mem_id, transient_msg) - - msg = u'Role changed for the following members: %s' \ - % ', '.join(changes) + plural = len(changes) != 1 + msg = u'Role changed for the following member%s: %s' \ + % (plural and 's' or '', ', '.join(changes)) self.add_status_message(msg) return commands else: @@ -672,6 +685,8 @@ def add_email_invites(self, targets=None, fields=None): invites = self.email_invites psm = self._add_email_invites(invites) + if not psm: + return if psm['mem_invites']: self.add_status_message(u"Members invited: %s" % ', '.join(psm['mem_invites'])) @@ -703,8 +718,9 @@ bad = self.validate_email_invites(invites) if bad: - psm = (u"Poorly formed email addresses, please correct: %s" - % ', '.join(bad)) + plural = len(bad) != 1 + psm = (u"Poorly formed email address%s, please correct: %s" + % (plural and 'es' or '', ', '.join(bad))) self.add_status_message(psm) return # don't do anything, just re-render the form Modified: opencore/trunk/opencore/project/browser/team-manage-macros.pt =================================================================== --- opencore/trunk/opencore/project/browser/team-manage-macros.pt 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/opencore/project/browser/team-manage-macros.pt 2007-11-26 17:17:39 UTC (rev 11242) @@ -181,12 +181,14 @@ <tr tal:attributes="id item/id"> <td> - <input tal:condition="python: not view.id_is_loggedin(item)" - type="checkbox" name="checked:list" - tal:attributes="value item/id" /> - <input tal:condition="python: view.id_is_loggedin(item)" - type="checkbox" name="checked:list" disabled="true" - tal:attributes="value item/id" /> + <tal:checkbox condition="changeable"> + <input tal:condition="python: not view.id_is_loggedin(item)" + type="checkbox" name="checked:list" + tal:attributes="value item/id" /> + <input tal:condition="python: view.id_is_loggedin(item)" + type="checkbox" name="checked:list" disabled="true" + tal:attributes="value item/id" /> + </tal:checkbox> <input tal:condition="python: not view.id_is_loggedin(item)" type="hidden" name="all:list" @@ -248,12 +250,18 @@ </tr> </metal:mshiprow> + <metal:mshiplist define-macro="mshiplist"> + <!-- Every project must have at least one admin, so if there's only + one project member we don't expose the remove or change role + buttons --> <div class="oc-widget oc-widget-dataTable" tal:define="mships view/active_mships; - num_items python:len(mships)"> + num_items python:len(mships); + changeable python:num_items > 1"> - <h2 class="oc-dataTable-heading" tal:content="string:Your team members ($num_items)" /> + <h2 class="oc-dataTable-heading" + tal:content="string:Your team members ($num_items)" /> <form name="team-members" id="team-members" method="POST" tal:attributes="action view/request/ACTUAL_URL"> @@ -261,7 +269,7 @@ <thead> <tr> - <th class="oc-dataTable-checkBoxColumn"><input type="checkbox" class="oc-checkAll" /></th> + <th class="oc-dataTable-checkBoxColumn"><input tal:condition="changeable" type="checkbox" class="oc-checkAll" /></th> <th scope="col"><!--a class="oc-columnSortable" href=""-->Username<!--/a--></th> <th scope="col"><!--a class="oc-columnSortable" href=""-->Role<!--/a--></th> <th scope="col"><!--a class="oc-columnSortable" href=""-->Effective since<!--/a--></th> @@ -279,7 +287,8 @@ </table> - <ul class="oc-actions oc-dataTable-actions"> + <ul class="oc-actions oc-dataTable-actions" + tal:condition="python:len(mships) > 1"> <li> <input type="submit" name="task|batch_checked|remove-members" value="Remove" class="oc-button" /> Modified: opencore/trunk/opencore/project/browser/view.py =================================================================== --- opencore/trunk/opencore/project/browser/view.py 2007-11-26 17:01:48 UTC (rev 11241) +++ opencore/trunk/opencore/project/browser/view.py 2007-11-26 17:17:39 UTC (rev 11242) @@ -220,7 +220,8 @@ deleted_objects = [] if not brains: - self.add_status_message(_(u'psm_no_items_to_delete', u'Please select items to delete.')) + self.add_status_message(_(u'psm_no_items_to_delete', + u'Please select items to delete.')) # put obj ids in dict keyed on their parents for optimal batch deletion for brain in brains: -- Archive: http://www.openplans.org/projects/opencore/lists/openplans-svn/archive/2007/11/1196097460388 To unsubscribe send an email with subject unsubscribe to [EMAIL PROTECTED] Please contact [EMAIL PROTECTED] for questions.
