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 "&#26085;&#35486;"...]
 
     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.

Reply via email to