[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/ - added 2 browser views for authentication: LoginFormView and MailPasswordFormView

Yvo Schubbe y.2010 at wcm-solutions.de
Mon Apr 12 07:35:52 EDT 2010


Log message for revision 110737:
  - added 2 browser views for authentication: LoginFormView and MailPasswordFormView

Changed:
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/authentication.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/configure.zcml
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/templates/login.pt
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/templates/mail_password.pt
  _U  Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/__init__.py
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/authentication.txt
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/test_authentication.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/formlib/editform.pt
  U   Products.CMFDefault/trunk/Products/CMFDefault/locales/cmf_default.pot

-=-
Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/authentication.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/authentication.py	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/authentication.py	2010-04-12 11:35:51 UTC (rev 110737)
@@ -0,0 +1,173 @@
+##############################################################################
+#
+# Copyright (c) 2010 Zope Foundation and Contributors.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Authentication browser views.
+
+$Id$
+"""
+
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from zope.app.form.browser import TextWidget
+from zope.formlib import form
+from zope.interface import implements
+from zope.interface import Interface
+from zope.schema import Bool
+from zope.schema import Choice
+from zope.schema import Password
+from zope.schema import URI
+from zope.schema.interfaces import ISource
+from zope.site.hooks import getSite
+
+from Products.CMFCore.utils import getToolByName
+from Products.CMFDefault.formlib.form import EditFormBase
+from Products.CMFDefault.utils import Message as _
+
+
+class NameSource(object):
+
+    implements(ISource)
+
+    def __contains__(self, value):
+        rich_context = getSite()
+        mtool = getToolByName(rich_context, 'portal_membership')
+        if mtool.getMemberById(value):
+            return True
+        candidates = mtool.searchMembers('email', value)
+        for candidate in candidates:
+            if candidate['email'].lower() == value.lower():
+                return True
+        return False
+
+available_names = NameSource()
+
+
+class ILoginSchema(Interface):
+
+    """Schema for login form.
+    """
+
+    came_from = URI(
+        required=False)
+
+    name = Choice(
+        title=_(u'Member ID'),
+        description=_(u'Member ID or email address'),
+        source=available_names)
+
+    password = Password(
+        title=_(u'Password'),
+        description=_(u'Case sensitive'))
+
+    persistent = Bool(
+        title=_(u'Remember my ID.'),
+        description=_(u'Saves your member ID in a cookie.'),
+        default=True)
+
+
+class IMailPasswordSchema(Interface):
+
+    """Schema for mail password form.
+    """
+
+    name = Choice(
+        title=_(u'Member ID'),
+        description=_(u'Member ID or email address'),
+        source=available_names)
+
+
+class LoginFormView(EditFormBase):
+
+    """Form view for ILoginSchema.
+    """
+
+    base_template = EditFormBase.template
+    template = ViewPageTemplateFile('templates/login.pt')
+    label = _(u'Log in')
+
+    form_fields = form.FormFields(ILoginSchema)
+    form_fields['name'].custom_widget = TextWidget
+
+    actions = form.Actions(
+        form.Action(
+            name='login',
+            label=_(u'Login'),
+            success='handle_login_success',
+            failure='handle_failure'))
+
+    def setUpWidgets(self, ignore_request=False):
+        ac_name = self.request.get('__ac_name')
+        if ac_name and not self.request.has_key('%s.name' % self.prefix):
+            self.request.form['%s.name' % self.prefix] = ac_name
+        super(LoginFormView,
+              self).setUpWidgets(ignore_request=ignore_request)
+        self.widgets['came_from'].hide = True
+
+    def handle_login_success(self, action, data):
+        mtool = self._getTool('portal_membership')
+        if not mtool.getMemberById(data['name']):
+            candidates = mtool.searchMembers('email', data['name'])
+            for candidate in candidates:
+                if candidate['email'].lower() == data['name'].lower():
+                    data['name'] = candidate['username']
+                    break
+        # logged_in uses default charset for decoding
+        charset = self._getDefaultCharset()
+        self.request.form['__ac_name'] = data['name'].encode(charset)
+        self.request.form['__ac_password'] = data['password'].encode(charset)
+        self.request.form['__ac_persistent'] = data['persistent']
+        cctool = self._getTool('cookie_authentication')
+        cctool(self.context, self.request)
+        return self._setRedirect('portal_actions', 'user/logged_in',
+                                 '%s.came_from' % self.prefix)
+
+
+class MailPasswordFormView(EditFormBase):
+
+    """Form view for IMailPasswordSchema.
+    """
+
+    base_template = EditFormBase.template
+    template = ViewPageTemplateFile('templates/mail_password.pt')
+    label = _(u"Don't panic!")
+    description = _(u"Just enter your member ID below, click 'Send', and "
+                    u"your password will be mailed to you if you gave a "
+                    u"valid email address when you signed on.")
+
+    form_fields = form.FormFields(IMailPasswordSchema)
+    form_fields['name'].custom_widget = TextWidget
+
+    actions = form.Actions(
+        form.Action(
+            name='send',
+            label=_(u'Send'),
+            success='handle_send_success',
+            failure='handle_failure'))
+
+    def setUpWidgets(self, ignore_request=False):
+        ac_name = self.request.get('__ac_name')
+        if ac_name and not self.request.has_key('%s.name' % self.prefix):
+            self.request.form['%s.name' % self.prefix] = ac_name
+        super(MailPasswordFormView,
+              self).setUpWidgets(ignore_request=ignore_request)
+
+    def handle_send_success(self, action, data):
+        mtool = self._getTool('portal_membership')
+        if not mtool.getMemberById(data['name']):
+            candidates = mtool.searchMembers('email', data['name'])
+            for candidate in candidates:
+                if candidate['email'].lower() == data['name'].lower():
+                    data['name'] = candidate['username']
+                    break
+        rtool = self._getTool('portal_registration')
+        rtool.mailPassword(data['name'], self.request)
+        self.status = _(u'Your password has been mailed to you.')
+        return self._setRedirect('portal_actions', 'user/login')


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/authentication.py
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/configure.zcml
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/configure.zcml	2010-04-11 10:59:30 UTC (rev 110736)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/configure.zcml	2010-04-12 11:35:51 UTC (rev 110737)
@@ -169,4 +169,18 @@
      permission="zope.Public"
      />
 
+  <browser:page
+      for="Products.CMFCore.interfaces.ISiteRoot"
+      name="login.html"
+      class=".authentication.LoginFormView"
+      permission="zope2.View"
+      />
+
+  <browser:page
+      for="Products.CMFCore.interfaces.ISiteRoot"
+      name="mail_password.html"
+      class=".authentication.MailPasswordFormView"
+      permission="zope2.View"
+      />
+
 </configure>

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/templates/login.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/templates/login.pt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/templates/login.pt	2010-04-12 11:35:51 UTC (rev 110737)
@@ -0,0 +1,20 @@
+<html metal:use-macro="context/main_template/macros/master">
+<body>
+
+<metal:slot metal:fill-slot="body" i18n:domain="cmf_default">
+<metal:macro metal:use-macro="view/base_template/macros/form" />
+
+<p><a href=""
+    tal:attributes="href string:${portal_url}/mail_password.html"
+    i18n:translate=""
+   >I forgot my password!</a></p>
+
+<p i18n:translate="">Having trouble logging in? Make sure to enable cookies in
+ your web browser.</p>
+
+<p i18n:translate="">Don't forget to logout or exit your browser when you're
+ done.</p>
+</metal:slot>
+
+</body>
+</html>


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/templates/login.pt
___________________________________________________________________
Added: svn:eol-style
   + native

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/templates/mail_password.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/templates/mail_password.pt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/templates/mail_password.pt	2010-04-12 11:35:51 UTC (rev 110737)
@@ -0,0 +1,18 @@
+<html metal:use-macro="context/main_template/macros/master">
+<body>
+
+<metal:slot metal:fill-slot="body" i18n:domain="cmf_default">
+<metal:macro metal:use-macro="view/base_template/macros/form" />
+
+<p i18n:translate="">If this will not work for you (for example, if you forget
+ your member ID or didn't enter your email address) send email to
+ <a href="mailto:me at example.org"
+    tal:define="ptool context/portal_properties"
+    tal:attributes="href string:mailto:${ptool/email_from_address}"
+    tal:content="ptool/email_from_address"
+    i18n:name="admin_email">me at example.org</a>.</p>
+
+</metal:slot>
+
+</body>
+</html>


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/templates/mail_password.pt
___________________________________________________________________
Added: svn:eol-style
   + native


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/__init__.py
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/authentication.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/authentication.txt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/authentication.txt	2010-04-12 11:35:51 UTC (rev 110737)
@@ -0,0 +1,71 @@
+Authentication Views
+--------------------
+
+Set up user.
+
+    >>> uf = app.site.acl_users
+    >>> uf._doAddUser('mgr', 'mgrpw', ['Manager'], [])
+
+Create the browser object we'll be using.
+
+    >>> from Products.Five.testbrowser import Browser
+    >>> browser = Browser()
+    >>> browser.handleErrors = False
+
+Use the login form without input.
+
+    >>> browser.open('http://localhost/site/@@login.html')
+    >>> '[[cmf_default][Log in]]' in browser.contents
+    True
+    >>> browser.getControl('[[cmf_default][Login]]').click()
+    >>> '[[zope][There were errors]]' in browser.contents
+    True
+
+Use the login form with invalid input.
+
+    >>> browser.open('http://localhost/site/@@login.html')
+    >>> browser.getControl('[[cmf_default][Member ID]]').value = 'unknown'
+    >>> browser.getControl('[[cmf_default][Login]]').click()
+    >>> '[[zope][There were errors]]' in browser.contents
+    True
+    >>> '[[zope][Constraint not satisfied]]' in browser.contents
+    True
+
+Use the login form with valid input but wrong password.
+
+    >>> browser.open('http://localhost/site/@@login.html')
+    >>> browser.getControl('[[cmf_default][Member ID]]').value = 'mgr'
+    >>> browser.getControl('[[cmf_default][Password]]').value = 'wrong'
+    >>> browser.getControl('[[cmf_default][Remember my ID.]]').selected = False
+    >>> browser.getControl('[[cmf_default][Login]]').click()
+    >>> '[[cmf_default][Login failure]]' in browser.contents
+    True
+
+Use the login form with valid input and correct password.
+
+    >>> browser.open('http://localhost/site/@@login.html')
+    >>> browser.getControl('[[cmf_default][Member ID]]').value = 'mgr'
+    >>> browser.getControl('[[cmf_default][Password]]').value = 'mgrpw'
+    >>> browser.getControl('[[cmf_default][Remember my ID.]]').selected = False
+    >>> browser.getControl('[[cmf_default][Login]]').click()
+    >>> '[[cmf_default][Login success]]' in browser.contents
+    True
+
+Use the mail password form without input.
+
+    >>> browser.open('http://localhost/site/@@mail_password.html')
+    >>> "[[cmf_default][Don't panic!]]" in browser.contents
+    True
+    >>> browser.getControl('[[cmf_default][Send]]').click()
+    >>> '[[zope][There were errors]]' in browser.contents
+    True
+
+Use the mail password form with invalid input.
+
+    >>> browser.open('http://localhost/site/@@mail_password.html')
+    >>> browser.getControl('[[cmf_default][Member ID]]').value = 'unknown'
+    >>> browser.getControl('[[cmf_default][Send]]').click()
+    >>> '[[zope][There were errors]]' in browser.contents
+    True
+    >>> '[[zope][Constraint not satisfied]]' in browser.contents
+    True


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/authentication.txt
___________________________________________________________________
Added: svn:eol-style
   + native

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/test_authentication.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/test_authentication.py	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/test_authentication.py	2010-04-12 11:35:51 UTC (rev 110737)
@@ -0,0 +1,30 @@
+##############################################################################
+#
+# Copyright (c) 2010 Zope Foundation and Contributors.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" Test Products.CMFDefault.browser.authentication
+
+$Id$
+"""
+
+import unittest
+from Testing import ZopeTestCase
+
+from Products.CMFDefault.testing import FunctionalLayer
+
+
+ftest_suite = ZopeTestCase.FunctionalDocFileSuite('authentication.txt')
+ftest_suite.layer = FunctionalLayer
+
+def test_suite():
+    return unittest.TestSuite((
+        ftest_suite,
+    ))


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/tests/test_authentication.py
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

Modified: Products.CMFDefault/trunk/Products/CMFDefault/formlib/editform.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/formlib/editform.pt	2010-04-11 10:59:30 UTC (rev 110736)
+++ Products.CMFDefault/trunk/Products/CMFDefault/formlib/editform.pt	2010-04-12 11:35:51 UTC (rev 110737)
@@ -2,7 +2,8 @@
 <body>
 
 <metal:slot metal:fill-slot="body" i18n:domain="cmf_default">
-<ul class="errors" tal:condition="view/errors">
+<metal:macro metal:define-macro="form"
+><ul class="errors" tal:condition="view/errors">
  <li tal:repeat="error view/error_views"><tal:span
      tal:replace="structure error" /></li>
 </ul>
@@ -36,7 +37,8 @@
     tal:replace="structure action/render" />
 </div>
 </form>
-</metal:slot>
+</metal:macro
+></metal:slot>
 
 </body>
 </html>

Modified: Products.CMFDefault/trunk/Products/CMFDefault/locales/cmf_default.pot
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/locales/cmf_default.pot	2010-04-11 10:59:30 UTC (rev 110736)
+++ Products.CMFDefault/trunk/Products/CMFDefault/locales/cmf_default.pot	2010-04-12 11:35:51 UTC (rev 110737)
@@ -20,7 +20,7 @@
 "Content-Transfer-Encoding: 8bit\n"
 
 #: Products/CMFCore/PortalContent.py:73
-#: Products/CMFDefault/formlib/form.py:250
+#: Products/CMFDefault/formlib/form.py:251
 msgid "This resource is locked via webDAV."
 msgstr ""
 
@@ -29,27 +29,27 @@
 msgid "The login name you selected is already in use or is not valid. Please choose another."
 msgstr ""
 
-#: Products/CMFCore/WorkflowTool.py:228
-#: Products/CMFCore/WorkflowTool.py:254
+#: Products/CMFCore/WorkflowTool.py:227
+#: Products/CMFCore/WorkflowTool.py:253
 msgid "No workflows found."
 msgstr ""
 
-#: Products/CMFCore/WorkflowTool.py:235
+#: Products/CMFCore/WorkflowTool.py:234
 #. Default: ""
 msgid "No workflow provides the '${action_id}' action."
 msgstr ""
 
-#: Products/CMFCore/WorkflowTool.py:242
-#: Products/CMFCore/WorkflowTool.py:274
+#: Products/CMFCore/WorkflowTool.py:241
+#: Products/CMFCore/WorkflowTool.py:273
 msgid "Requested workflow definition not found."
 msgstr ""
 
-#: Products/CMFCore/WorkflowTool.py:264
+#: Products/CMFCore/WorkflowTool.py:263
 #. Default: ""
 msgid "No workflow provides '${name}' information."
 msgstr ""
 
-#: Products/CMFCore/WorkflowTool.py:279
+#: Products/CMFCore/WorkflowTool.py:278
 #. Default: ""
 msgid "Could not get info: ${name}"
 msgstr ""
@@ -184,6 +184,70 @@
 msgid "Export content type registry's predicates / bindings."
 msgstr ""
 
+#: Products/CMFCore/permissions.zcml:14
+msgid "List undoable changes"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:19
+msgid "Access inactive portal content"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:24
+msgid "Manage portal"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:29
+msgid "Modify portal content"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:34
+msgid "Manage properties"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:39
+msgid "List portal members"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:44
+msgid "Add portal folders"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:49
+msgid "Add portal content"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:54
+msgid "Add portal member"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:59
+msgid "Set own password"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:64
+msgid "Set own properties"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:69
+msgid "Mail forgotten password"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:74
+msgid "Request review"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:79
+msgid "Review portal content"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:84
+msgid "Access future portal content"
+msgstr ""
+
+#: Products/CMFCore/permissions.zcml:9
+msgid "List folder contents"
+msgstr ""
+
 #: Products/CMFDefault/Document.py:151
 msgid "Intervening changes from elsewhere detected. Please refetch the document and reapply your changes. (You may be able to recover your version using the browser 'back' button, but will have to apply them to a freshly fetched copy.)"
 msgstr ""
@@ -224,6 +288,70 @@
 msgid "You must enter a valid name."
 msgstr ""
 
+#: Products/CMFDefault/browser/authentication.py:102
+#: Products/CMFDefault/skins/zpt_generic/login_form.pt:44
+#: Products/CMFDefault/profiles/default/actions.xml:10
+msgid "Login"
+msgstr ""
+
+#: Products/CMFDefault/browser/authentication.py:140
+#: Products/CMFDefault/skins/zpt_generic/mail_password_form.pt:6
+msgid "Don't panic!"
+msgstr ""
+
+#: Products/CMFDefault/browser/authentication.py:141
+msgid "Just enter your member ID below, click 'Send', and your password will be mailed to you if you gave a valid email address when you signed on."
+msgstr ""
+
+#: Products/CMFDefault/browser/authentication.py:151
+#: Products/CMFDefault/skins/zpt_generic/mail_password_form.pt:22
+msgid "Send"
+msgstr ""
+
+#: Products/CMFDefault/browser/authentication.py:172
+msgid "Your password has been mailed to you."
+msgstr ""
+
+#: Products/CMFDefault/browser/authentication.py:62
+#: Products/CMFDefault/browser/authentication.py:82
+#: Products/CMFDefault/skins/zpt_generic/join_template.pt:57
+#: Products/CMFDefault/skins/zpt_generic/login_form.pt:22
+#: Products/CMFDefault/skins/zpt_generic/password_form_template.pt:26
+#: Products/CMFDefault/skins/zpt_generic/registered_email_template.pt:20
+msgid "Member ID"
+msgstr ""
+
+#: Products/CMFDefault/browser/authentication.py:63
+#: Products/CMFDefault/browser/authentication.py:83
+msgid "Member ID or email address"
+msgstr ""
+
+#: Products/CMFDefault/browser/authentication.py:67
+#: Products/CMFDefault/skins/zpt_generic/join_template.pt:71
+#: Products/CMFDefault/skins/zpt_generic/login_form.pt:29
+#: Products/CMFDefault/skins/zpt_generic/registered_email_template.pt:22
+msgid "Password"
+msgstr ""
+
+#: Products/CMFDefault/browser/authentication.py:68
+msgid "Case sensitive"
+msgstr ""
+
+#: Products/CMFDefault/browser/authentication.py:71
+#: Products/CMFDefault/skins/zpt_generic/login_form.pt:38
+msgid "Remember my ID."
+msgstr ""
+
+#: Products/CMFDefault/browser/authentication.py:72
+msgid "Saves your member ID in a cookie."
+msgstr ""
+
+#: Products/CMFDefault/browser/authentication.py:94
+#: Products/CMFDefault/skins/zpt_generic/join_form.py:53
+#: Products/CMFDefault/skins/zpt_generic/login_form.pt:5
+msgid "Log in"
+msgstr ""
+
 #: Products/CMFDefault/browser/document.py:151
 msgid "Intervening changes from elsewhere detected. Please refetch the document and reapply your changes."
 msgstr ""
@@ -314,7 +442,7 @@
 
 #: Products/CMFDefault/browser/favorite.py:120
 #: Products/CMFDefault/browser/link.py:125
-#: Products/CMFDefault/formlib/form.py:192
+#: Products/CMFDefault/formlib/form.py:193
 msgid "ID"
 msgstr ""
 
@@ -529,7 +657,7 @@
 #: Products/CMFDefault/browser/folder.py:557
 #: Products/CMFDefault/browser/folder.py:575
 #: Products/CMFDefault/browser/folder.py:593
-#: Products/CMFDefault/formlib/form.py:246
+#: Products/CMFDefault/formlib/form.py:247
 #: Products/CMFDefault/skins/zpt_content/document_edit_control.py:14
 #: Products/CMFDefault/skins/zpt_content/folder_edit_control.py:9
 #: Products/CMFDefault/skins/zpt_content/link_edit_control.py:13
@@ -620,7 +748,7 @@
 msgstr ""
 
 #: Products/CMFDefault/browser/metadata.py:224
-#: Products/CMFDefault/formlib/form.py:216
+#: Products/CMFDefault/formlib/form.py:217
 #: Products/CMFDefault/skins/zpt_content/document_edit_form.py:34
 #: Products/CMFDefault/skins/zpt_content/file_edit_form.py:25
 #: Products/CMFDefault/skins/zpt_content/folder_edit_form.py:24
@@ -641,7 +769,7 @@
 msgstr ""
 
 #: Products/CMFDefault/browser/metadata.py:236
-#: Products/CMFDefault/formlib/form.py:222
+#: Products/CMFDefault/formlib/form.py:223
 #: Products/CMFDefault/skins/zpt_content/document_edit_form.py:35
 #: Products/CMFDefault/skins/zpt_content/file_edit_form.py:26
 #: Products/CMFDefault/skins/zpt_content/folder_edit_form.py:25
@@ -743,6 +871,26 @@
 msgid "Link: ${link}"
 msgstr ""
 
+#: Products/CMFDefault/browser/templates/login.pt:12
+#: Products/CMFDefault/skins/zpt_generic/login_form.pt:56
+msgid "Having trouble logging in? Make sure to enable cookies in your web browser."
+msgstr ""
+
+#: Products/CMFDefault/browser/templates/login.pt:15
+#: Products/CMFDefault/skins/zpt_generic/login_form.pt:59
+msgid "Don't forget to logout or exit your browser when you're done."
+msgstr ""
+
+#: Products/CMFDefault/browser/templates/login.pt:7
+#: Products/CMFDefault/skins/zpt_generic/login_form.pt:51
+msgid "I forgot my password!"
+msgstr ""
+
+#: Products/CMFDefault/browser/templates/mail_password.pt:9
+#: Products/CMFDefault/skins/zpt_generic/mail_password_form.pt:14
+msgid "If this will not work for you (for example, if you forget your member ID or didn't enter your email address) send email to ${admin_email}."
+msgstr ""
+
 #: Products/CMFDefault/browser/ursa.py:110
 #: Products/CMFDefault/skins/zpt_generic/breadcrumbs.py:14
 msgid "root"
@@ -761,7 +909,13 @@
 msgid "Import various settings from PortalGenerator."
 msgstr ""
 
-#: Products/CMFDefault/formlib/form.py:105
+#: Products/CMFDefault/formlib/form.py:100
+#: Products/CMFDefault/skins/zpt_generic/discussion_reply_form.py:39
+#: Products/CMFDefault/skins/zpt_generic/folder_factories_template.pt:34
+msgid "Add"
+msgstr ""
+
+#: Products/CMFDefault/formlib/form.py:106
 #: Products/CMFDefault/skins/zpt_generic/folder_rename_form.py:42
 #: Products/CMFDefault/skins/zpt_generic/join_form.py:57
 #: Products/CMFDefault/skins/zpt_generic/members_delete_form.py:29
@@ -769,33 +923,27 @@
 msgid "Cancel"
 msgstr ""
 
-#: Products/CMFDefault/formlib/form.py:135
+#: Products/CMFDefault/formlib/form.py:136
 #. Default: ""
 msgid "Add ${obj_type}"
 msgstr ""
 
-#: Products/CMFDefault/formlib/form.py:170
-#: Products/CMFDefault/formlib/form.py:205
+#: Products/CMFDefault/formlib/form.py:171
+#: Products/CMFDefault/formlib/form.py:206
 #. Default: ""
 msgid "${obj_type} added."
 msgstr ""
 
-#: Products/CMFDefault/formlib/form.py:239
+#: Products/CMFDefault/formlib/form.py:240
 #. Default: ""
 msgid "Edit ${obj_type}"
 msgstr ""
 
-#: Products/CMFDefault/formlib/form.py:244
+#: Products/CMFDefault/formlib/form.py:245
 #. Default: ""
 msgid "${obj_type} changed."
 msgstr ""
 
-#: Products/CMFDefault/formlib/form.py:99
-#: Products/CMFDefault/skins/zpt_generic/discussion_reply_form.py:39
-#: Products/CMFDefault/skins/zpt_generic/folder_factories_template.pt:34
-msgid "Add"
-msgstr ""
-
 #: Products/CMFDefault/formlib/widgets.py:144
 #: Products/CMFDefault/skins/zpt_control/validateId.py:9
 msgid "Please choose another ID."
@@ -885,6 +1033,14 @@
 msgid "CMF 'Bare' / hybrid skin"
 msgstr ""
 
+#: Products/CMFDefault/profiles.zcml:45
+msgid "'Absolut' - the pure CSS skin"
+msgstr ""
+
+#: Products/CMFDefault/profiles.zcml:45
+msgid "All layouting done using CSS"
+msgstr ""
+
 #: Products/CMFDefault/profiles.zcml:6
 msgid "CMFDefault Site"
 msgstr ""
@@ -1069,34 +1225,37 @@
 msgid "News Items contain short text articles and carry a title as well as an optional description."
 msgstr ""
 
-#: Products/CMFDefault/skins/werebear/main_template.pt:187
-#: Products/CMFDefault/skins/zpt_generic/main_template.pt:215
-msgid "Status:"
+#: Products/CMFDefault/skins/absolut/main_template.pt:50
+#: Products/CMFDefault/skins/werebear/main_template.pt:42
+#: Products/CMFDefault/skins/zpt_generic/main_template.pt:65
+msgid "home"
 msgstr ""
 
-#: Products/CMFDefault/skins/werebear/main_template.pt:235
-#: Products/CMFDefault/skins/zpt_generic/main_template.pt:265
-msgid "Add..."
+#: Products/CMFDefault/skins/absolut/main_template.pt:61
+#: Products/CMFDefault/skins/werebear/main_template.pt:51
+#: Products/CMFDefault/skins/zpt_generic/main_template.pt:74
+msgid "news"
 msgstr ""
 
-#: Products/CMFDefault/skins/werebear/main_template.pt:303
-#: Products/CMFDefault/skins/zpt_generic/main_template.pt:343
-msgid "Permanent Link:"
+#: Products/CMFDefault/skins/absolut/main_template.pt:66
+#: Products/CMFDefault/skins/werebear/main_template.pt:54
+#: Products/CMFDefault/skins/zpt_generic/main_template.pt:77
+msgid "search"
 msgstr ""
 
-#: Products/CMFDefault/skins/werebear/main_template.pt:44
-#: Products/CMFDefault/skins/zpt_generic/main_template.pt:70
-msgid "home"
+#: Products/CMFDefault/skins/werebear/main_template.pt:167
+#: Products/CMFDefault/skins/zpt_generic/main_template.pt:192
+msgid "Status:"
 msgstr ""
 
-#: Products/CMFDefault/skins/werebear/main_template.pt:53
-#: Products/CMFDefault/skins/zpt_generic/main_template.pt:79
-msgid "news"
+#: Products/CMFDefault/skins/werebear/main_template.pt:215
+#: Products/CMFDefault/skins/zpt_generic/main_template.pt:242
+msgid "Add..."
 msgstr ""
 
-#: Products/CMFDefault/skins/werebear/main_template.pt:56
-#: Products/CMFDefault/skins/zpt_generic/main_template.pt:82
-msgid "search"
+#: Products/CMFDefault/skins/werebear/main_template.pt:283
+#: Products/CMFDefault/skins/zpt_generic/main_template.pt:320
+msgid "Permanent Link:"
 msgstr ""
 
 #: Products/CMFDefault/skins/zpt_content/content_hide_form.pt:10
@@ -1571,11 +1730,6 @@
 msgid "Become a Member"
 msgstr ""
 
-#: Products/CMFDefault/skins/zpt_generic/join_form.py:53
-#: Products/CMFDefault/skins/zpt_generic/login_form.pt:5
-msgid "Log in"
-msgstr ""
-
 #: Products/CMFDefault/skins/zpt_generic/join_form.py:56
 msgid "Register"
 msgstr ""
@@ -1608,19 +1762,6 @@
 msgid "You must submit a valid email address. This address will be used to send you a randomly-generated password. Once you have logged in with this password, you may change it to anything you like."
 msgstr ""
 
-#: Products/CMFDefault/skins/zpt_generic/join_template.pt:57
-#: Products/CMFDefault/skins/zpt_generic/login_form.pt:22
-#: Products/CMFDefault/skins/zpt_generic/password_form_template.pt:26
-#: Products/CMFDefault/skins/zpt_generic/registered_email_template.pt:20
-msgid "Member ID"
-msgstr ""
-
-#: Products/CMFDefault/skins/zpt_generic/join_template.pt:71
-#: Products/CMFDefault/skins/zpt_generic/login_form.pt:29
-#: Products/CMFDefault/skins/zpt_generic/registered_email_template.pt:22
-msgid "Password"
-msgstr ""
-
 #: Products/CMFDefault/skins/zpt_generic/join_template.pt:77
 msgid "Password (confirm)"
 msgstr ""
@@ -1633,11 +1774,11 @@
 msgid "Check this box to have the password mailed."
 msgstr ""
 
-#: Products/CMFDefault/skins/zpt_generic/logged_in.py:25
+#: Products/CMFDefault/skins/zpt_generic/logged_in.py:26
 msgid "Login failure"
 msgstr ""
 
-#: Products/CMFDefault/skins/zpt_generic/logged_in.py:47
+#: Products/CMFDefault/skins/zpt_generic/logged_in.py:48
 msgid "Login success"
 msgstr ""
 
@@ -1657,43 +1798,10 @@
 msgid "You are logged in outside the portal. You may need to <a href=\"/manage_zmi_logout\">log out of the Zope management interface</a>."
 msgstr ""
 
-#: Products/CMFDefault/skins/zpt_generic/login_form.pt:38
-msgid "Remember my ID."
-msgstr ""
-
-#: Products/CMFDefault/skins/zpt_generic/login_form.pt:44
-#: Products/CMFDefault/profiles/default/actions.xml:10
-msgid "Login"
-msgstr ""
-
-#: Products/CMFDefault/skins/zpt_generic/login_form.pt:51
-msgid "I forgot my password!"
-msgstr ""
-
-#: Products/CMFDefault/skins/zpt_generic/login_form.pt:56
-msgid "Having trouble logging in? Make sure to enable cookies in your web browser."
-msgstr ""
-
-#: Products/CMFDefault/skins/zpt_generic/login_form.pt:59
-msgid "Don't forget to logout or exit your browser when you're done."
-msgstr ""
-
 #: Products/CMFDefault/skins/zpt_generic/login_form.pt:62
 msgid "Setting the 'Remember my ID' option will set a cookie with your member ID, so that when you next log in, your member ID will already be filled in for you."
 msgstr ""
 
-#: Products/CMFDefault/skins/zpt_generic/mail_password_form.pt:14
-msgid "If this will not work for you (for example, if you forget your member ID or didn't enter your email address) send email to ${admin_email}."
-msgstr ""
-
-#: Products/CMFDefault/skins/zpt_generic/mail_password_form.pt:22
-msgid "Send"
-msgstr ""
-
-#: Products/CMFDefault/skins/zpt_generic/mail_password_form.pt:6
-msgid "Don't panic!"
-msgstr ""
-
 #: Products/CMFDefault/skins/zpt_generic/mail_password_form.pt:8
 msgid "Just enter your member ID below, click <em>Send</em>, and your password will be mailed to you if you gave a valid email address when you signed on."
 msgstr ""



More information about the checkins mailing list