r655 - in zope-cmfplone/trunk: . browser debian exportimport/tests
migrations migrations/v2_5 profiles/default
profiles/default/structure setup skins/plone_3rdParty
skins/plone_content skins/plone_ecmascript
skins/plone_form_scripts skins/plone_forms skins/plone_images
skins/plone_login skins/plone_prefs skins/plone_scripts
skins/plone_styles skins/plone_tableless
skins/plone_templates tests www
Fabio Tranchitella
kobold at alioth.debian.org
Fri Feb 9 15:39:15 CET 2007
Author: kobold
Date: 2007-02-09 15:39:12 +0100 (Fri, 09 Feb 2007)
New Revision: 655
Added:
zope-cmfplone/trunk/migrations/v2_5/two51_two52.py
Removed:
zope-cmfplone/trunk/www/main.dtml
Modified:
zope-cmfplone/trunk/ActionsTool.py
zope-cmfplone/trunk/CatalogTool.py
zope-cmfplone/trunk/HISTORY.txt
zope-cmfplone/trunk/INSTALL.txt
zope-cmfplone/trunk/MembershipTool.py
zope-cmfplone/trunk/PloneFolder.py
zope-cmfplone/trunk/PloneTool.py
zope-cmfplone/trunk/Portal.py
zope-cmfplone/trunk/RELEASENOTES.txt
zope-cmfplone/trunk/RegistrationTool.py
zope-cmfplone/trunk/browser/navigation.py
zope-cmfplone/trunk/debian/changelog
zope-cmfplone/trunk/exportimport/tests/base.py
zope-cmfplone/trunk/factory.py
zope-cmfplone/trunk/i18nl10n.py
zope-cmfplone/trunk/migrations/__init__.py
zope-cmfplone/trunk/migrations/v2_5/__init__.py
zope-cmfplone/trunk/migrations/v2_5/final_two51.py
zope-cmfplone/trunk/profiles/default/jsregistry.xml
zope-cmfplone/trunk/profiles/default/structure/front-page
zope-cmfplone/trunk/setup/dependencies.py
zope-cmfplone/trunk/setuphandlers.py
zope-cmfplone/trunk/skins/plone_3rdParty/event-registration.js
zope-cmfplone/trunk/skins/plone_3rdParty/livesearch.js
zope-cmfplone/trunk/skins/plone_3rdParty/se-highlight.js
zope-cmfplone/trunk/skins/plone_content/document_byline.pt
zope-cmfplone/trunk/skins/plone_content/document_view.pt
zope-cmfplone/trunk/skins/plone_content/event_view.pt
zope-cmfplone/trunk/skins/plone_content/file_view.pt
zope-cmfplone/trunk/skins/plone_content/folder_tabular_view.pt
zope-cmfplone/trunk/skins/plone_content/image_view_fullscreen.pt
zope-cmfplone/trunk/skins/plone_ecmascript/dragdropreorder.js
zope-cmfplone/trunk/skins/plone_ecmascript/highlightsearchterms.js
zope-cmfplone/trunk/skins/plone_ecmascript/mark_special_links.js
zope-cmfplone/trunk/skins/plone_ecmascript/plone_javascript_variables.js.pt
zope-cmfplone/trunk/skins/plone_ecmascript/register_function.js
zope-cmfplone/trunk/skins/plone_ecmascript/testHighlightsearchterms.js
zope-cmfplone/trunk/skins/plone_form_scripts/enableSyndication.cpy
zope-cmfplone/trunk/skins/plone_form_scripts/send_feedback.cpy
zope-cmfplone/trunk/skins/plone_form_scripts/send_feedback_site.cpy
zope-cmfplone/trunk/skins/plone_form_scripts/sendto.cpy
zope-cmfplone/trunk/skins/plone_forms/content_status_history.cpt
zope-cmfplone/trunk/skins/plone_forms/discussion_reply_form.cpt
zope-cmfplone/trunk/skins/plone_forms/folder_localrole_form.pt
zope-cmfplone/trunk/skins/plone_forms/history_form.pt
zope-cmfplone/trunk/skins/plone_forms/member_search_form.pt
zope-cmfplone/trunk/skins/plone_forms/member_search_results.pt
zope-cmfplone/trunk/skins/plone_forms/undo_form.pt
zope-cmfplone/trunk/skins/plone_images/add_icon.gif
zope-cmfplone/trunk/skins/plone_login/enabling_cookies.pt
zope-cmfplone/trunk/skins/plone_login/insufficient_privileges.pt
zope-cmfplone/trunk/skins/plone_login/login_failed.pt
zope-cmfplone/trunk/skins/plone_prefs/personalize_form.cpt
zope-cmfplone/trunk/skins/plone_prefs/prefs_error_log_form.pt
zope-cmfplone/trunk/skins/plone_prefs/prefs_error_log_showEntry.pt
zope-cmfplone/trunk/skins/plone_prefs/prefs_group_edit.py
zope-cmfplone/trunk/skins/plone_prefs/prefs_group_members.cpt
zope-cmfplone/trunk/skins/plone_prefs/prefs_main_template.pt
zope-cmfplone/trunk/skins/plone_prefs/prefs_navigation_form.cpt
zope-cmfplone/trunk/skins/plone_prefs/prefs_navigation_set.cpy
zope-cmfplone/trunk/skins/plone_prefs/prefs_search_macros.pt
zope-cmfplone/trunk/skins/plone_prefs/prefs_user_details.cpt
zope-cmfplone/trunk/skins/plone_prefs/prefs_users_overview.cpt
zope-cmfplone/trunk/skins/plone_prefs/reconfig_form.cpt
zope-cmfplone/trunk/skins/plone_scripts/check_id.py
zope-cmfplone/trunk/skins/plone_scripts/computeRoleMap.py
zope-cmfplone/trunk/skins/plone_scripts/folder_rename.cpy
zope-cmfplone/trunk/skins/plone_scripts/getEventString.py
zope-cmfplone/trunk/skins/plone_scripts/hasIndexHtml.py
zope-cmfplone/trunk/skins/plone_scripts/livesearch_reply.py
zope-cmfplone/trunk/skins/plone_scripts/selectedTabs.py
zope-cmfplone/trunk/skins/plone_styles/IEFixes.css.dtml
zope-cmfplone/trunk/skins/plone_styles/authoring.css.dtml
zope-cmfplone/trunk/skins/plone_styles/base.css.dtml
zope-cmfplone/trunk/skins/plone_styles/base_properties.props
zope-cmfplone/trunk/skins/plone_styles/columns.css.dtml
zope-cmfplone/trunk/skins/plone_styles/portlets.css.dtml
zope-cmfplone/trunk/skins/plone_styles/public.css.dtml
zope-cmfplone/trunk/skins/plone_tableless/main_template.pt
zope-cmfplone/trunk/skins/plone_templates/folder_contents.pt
zope-cmfplone/trunk/skins/plone_templates/header.pt
zope-cmfplone/trunk/skins/plone_templates/main_template.pt
zope-cmfplone/trunk/skins/plone_templates/registered_notify_template.pt
zope-cmfplone/trunk/skins/plone_templates/rss_template.pt
zope-cmfplone/trunk/skins/plone_templates/site_feedback_template.pt
zope-cmfplone/trunk/skins/plone_templates/standard_error_message.py
zope-cmfplone/trunk/tests/forms.txt
zope-cmfplone/trunk/tests/rendering.txt
zope-cmfplone/trunk/tests/testCalendarView.py
zope-cmfplone/trunk/tests/testCookieAuth.py
zope-cmfplone/trunk/tests/testMigrations.py
zope-cmfplone/trunk/tests/testPortalCreation.py
zope-cmfplone/trunk/tests/testRegistrationTool.py
zope-cmfplone/trunk/tests/testTranslationServiceTool.py
zope-cmfplone/trunk/tests/test_doctests.py
zope-cmfplone/trunk/tests/test_functional.py
zope-cmfplone/trunk/tests/zcheck.py
zope-cmfplone/trunk/utils.py
zope-cmfplone/trunk/version.txt
zope-cmfplone/trunk/www/addSite.zpt
Log:
New upstream release.
Modified: zope-cmfplone/trunk/ActionsTool.py
===================================================================
--- zope-cmfplone/trunk/ActionsTool.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/ActionsTool.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -43,8 +43,8 @@
actions = []
# Include actions from specific tools.
- [self._getActions(provider_name, actions, object) \
- for provider_name in self.listActionProviders()]
+ for provider_name in self.listActionProviders():
+ self._getActions(provider_name, actions, object)
# Include actions from object.
if object is not None:
Modified: zope-cmfplone/trunk/CatalogTool.py
===================================================================
--- zope-cmfplone/trunk/CatalogTool.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/CatalogTool.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -29,6 +29,7 @@
INonStructuralFolder as z2INonStructuralFolder
from Products.CMFPlone.utils import base_hasattr
from Products.CMFPlone.utils import safe_callable
+from Products.CMFPlone.utils import safe_unicode
from Products.CMFPlone.utils import log_deprecated
from OFS.IOrderSupport import IOrderedContainer
from ZODB.POSException import ConflictError
@@ -140,7 +141,6 @@
>>> sortable_title(self.folder, self.portal)
'plone00000042 _foo'
"""
- def_charset = portal.plone_utils.getSiteEncoding()
title = getattr(obj, 'Title', None)
if title is not None:
if safe_callable(title):
@@ -150,17 +150,7 @@
# Replace numbers with zero filled numbers
sortabletitle = num_sort_regex.sub(zero_fill, sortabletitle)
# Truncate to prevent bloat
- for charset in [def_charset, 'latin-1', 'utf-8']:
- try:
- sortabletitle = unicode(sortabletitle, charset)[:30]
- sortabletitle = sortabletitle.encode(def_charset or 'utf-8')
- break
- except UnicodeError:
- pass
- except TypeError:
- # If we get a TypeError if we already have a unicode string
- sortabletitle = sortabletitle[:30]
- break
+ sortabletitle = safe_unicode(sortabletitle)[:30].encode('utf-8')
return sortabletitle
return ''
Modified: zope-cmfplone/trunk/HISTORY.txt
===================================================================
--- zope-cmfplone/trunk/HISTORY.txt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/HISTORY.txt 2007-02-09 14:39:12 UTC (rev 655)
@@ -2,10 +2,191 @@
(name of developer listed in brackets)
+Plone 2.5.2 - Orb - released January 16, 2007
+
+ - Fix issue with drag and drop caused by changing of css ids in
+ folder_contents.
+ [alecm]
+
+ - Added some classes to document_byline.pt for more flexibility when styling
+ this template. This closes
+ http://dev.plone.org/plone/ticket/5025
+ [spliter]
+
+
+Plone 2.5.2 - Release Candidate - released January 3, 2007
+
+ - In livesearch results, don't append ... at the end, when the lenght of
+ the title or description is exactly the limit. This closes
+ http://dev.plone.org/plone/ticket/5989.
+ [hannosch]
+
+ - Do not display the right column on prefs_main_template anymore, as it
+ was unneeded and could cause design problems. This closes
+ http://dev.plone.org/plone/ticket/5803.
+ [hannosch]
+
+ - Moved the global_cache_settings call in main_template before the call to
+ header.pt as otherwise the encoding in the header would not be defined
+ and fall back to ZPublishers default_encoding. This closes
+ http://dev.plone.org/plone/ticket/6013
+ [hannosch]
+
+ - Optimized the check_id.py uniqueness check to not use contentIds,
+ fixes http://dev.plone.org/plone/ticket/5976
+ [alecm]
+
+ - Add search term highlighting to livesearch result links.
+ [alecm]
+
+ - links in Contents table behave as they should now - show the "pointer"
+ hand when hovering the mouse over them. It was broken due to ajax sorting
+ feature somehow
+ [spliter]
+
+ - event_view.pt has a better position for details table now, letting byLine
+ and Description info to be content-wide and not to be shifted to the left,
+ bacuse of Details table
+ [spliter]
+
+ - main table for columns (#portal-columns) should not have paddings or
+ spacings - they can confuse when styling. Fixed with CSS for the table
+ cells, thanks to deo ;)
+ [spliter]
+
+ - Make the parameters for member image scaling more easily configurable
+ by putting them in a mutable data structure. Eventually, we should
+ provide a TTW configuration for this.
+ [alecm]
+
+ - Make hasIndexHtml script more efficient for BTreeFolders. Fixes
+ http://dev.plone.org/plone/ticket/5769
+ [alecm]
+
+ - Add event support to OrderedContainer so that moveObjectToPosition
+ doesn't break on Zope 2.9. Should fix
+ http://dev.plone.org/plone/ticket/5961
+ [alecm]
+
+ - Make css ids for rows in folder_contents sane. Fixes
+ http://dev.plone.org/plone/ticket/5940
+ [alecm]
+
+ - Make various icons in folder_contents explicitly render alt tags, because
+ the rendering of those images magically picks up items named 'alt' in
+ the context, which breaks the page (plus it adds usability). Fixes
+ http://dev.plone.org/plone/ticket/5934
+ [alecm]
+
+ - Don't assume portal_catalog when reindexing during ownership change.
+ Fixes http://dev.plone.org/plone/ticket/5063
+ [alecm]
+
+ - Ensure rss_template max items is an integer. Should fix
+ http://dev.plone.org/plone/ticket/5553
+ [alecm]
+
+ - Applied patch from aaronv to add includeTop setting to navigation
+ prefs form. Fixes http://dev.plone.org/plone/ticket/5519
+ [alecm]
+
+ - Made standard_error_message more tolerant of security issues and
+ acquisition problems. Fixes http://dev.plone.org/plone/ticket/5955
+ [alecm]
+
+ - Fixed issue with search for members of groups, using patch from
+ derek_richardson. Fixes http://dev.plone.org/plone/ticket/5902
+ [alecm]
+
+ - Use some url unquoting to ensure that the rename form redirects to the
+ correct url after rename, even if quoted characters are involved. Fixes
+ http://dev.plone.org/plone/ticket/5843
+ [alecm]
+
+ - Use current_page_url instead of ACTUAL_URL for accessibility anchors.
+ Fixes http://dev.plone.org/plone/ticket/5777
+ [alecm]
+
+ - Made the error displayed on SMTPRecipientsRefused during password reset
+ not display the email address, as this is an undesirable privacy leakage.
+ Fixes https://dev.plone.org/plone/ticket/5962
+ [alecm]
+
+ - Applied the Hotfix for CVE-2006-4249, which also fixes
+ http://dev.plone.org/plone/ticket/5906
+ [wiggy, alecm]
+
+ - Non-ascii characters in actions used in the portal tabs provoked an
+ UnicodeDecodeError. This closes http://dev.plone.org/plone/ticket/5791.
+ [hannosch]
+
+ - Fixed another UnicodeDecodeError in livesearch_reply.
+ This fixed http://dev.plone.org/plone/ticket/5828.
+ [hannosch]
+
+ - Added a general safe_unicode method to utils.py, which can be used to
+ convert any Unicode, 'utf-8' or 'ascii' encoded string to Unicode.
+ [hannosch]
+
+ - Added button tag styling that conforms to the standard input button
+ look.
+ [limi]
+
+ - Added optgroup styling, since the default in Firefox looks like crap.
+ [limi]
+
+ - Fixed the Live search error: 0x80040111 (NS_ERROR_NOT_AVAILABLE). This
+ closes http://dev.plone.org/plone/ticket/4519.
+ [deo]
+
+ - Injected Plone 2.1.4 into the migration chain.
+ [stefan]
+
+ - Lots of minor whitespace corrections, found by using the new i18ndude 3.0
+ which is based on zope.tal.talgettext for extraction of translation files.
+ [hannosch]
+
+ - Fixed a minor spelling inconsistency in folder_localrole_form.
+ [hannosch]
+
+ - Fixed flawed lookup of email_from_address in send_feedback scripts. This
+ closes http://dev.plone.org/plone/ticket/5839.
+ [hannosch]
+
+ - Added option to choose different base profile while creating a new Plone
+ site. This closes http://dev.plone.org/plone/ticket/5890.
+ [hannosch]
+
+ - Removed redundant getToolByName call in send_feedback_site. This closes
+ http://dev.plone.org/plone/ticket/5863.
+ [hannosch]
+
+ - Fixed the calendar portlet to display correctly in Internet Explorer 7.
+ [limi]
+
+ - Updated links in the automatically generated front-page.
+ [hannosch]
+
+ - Added a few macro hooks in personalize_form and prefs_user_details to
+ allow at least some form of easy customization without the need to
+ customize the entire forms. Now it looks for a file additional_memberdata
+ in your skin and uses the macros in there to inject them into these
+ horrible forms. Now it sucks slightly less ;-).
+ [ender]
+
+ - livesearch_reply.py mixed up utf-8-encoded strings and unicode strings
+ leading to unpredictable UnicodeDecodeErrors. This fixes
+ http://dev.plone.org/plone/ticket/5828.
+ [ajung]
+
+ - livesearch_reply.py wrote quotes (") in the title-attribute. misformed
+ XML was generated. replaced quotes by ".
+ [jensens]
+
Plone 2.5.1 - released September 28, 2006
- - The content tab selection logic now checks the request in addition
- to template_id when trying to determine which tab should be
+ - The content tab selection logic now checks the request in addition
+ to template_id when trying to determine which tab should be
selected.
[rocky]
@@ -32,13 +213,9 @@
- Made login_form and default_error_message not invoke the portlets, since
they are irrelevant and expensive in those forms. Also made the error
- template a valid HTML document.
+ template a valid HTML document.
[limi]
- - Updated the CSS validation link to use the CSS 2.1 and CSS 3 compatible
- profile, which is what Plone uses.
- [limi]
-
- Added description in the dict in WorkflowTool's getTransitionsFor.
[ender]
@@ -49,9 +226,9 @@
- Make the object_delete and folder_delete methods require non-GET
requests. This is a bit of a band-aid and it is likely we will want
to do the same for other object actions which could be easily triggered
- by a crawler (a paste for instance, which may have been preceeded by a
+ by a crawler (a paste for instance, which may have been preceeded by a
cut or copy). Related to http://dev.plone.org/plone/ticket/4886
- [alecm, limi]
+ [alecm] [limi]
- Make the syntool methods for enabling and disabling syndication check
for the Manager properties permission on the object.
@@ -66,7 +243,7 @@
images using PIL. This will throw an IOError on any invalid image and
also save some bandwidth and space in the zodb.
[alecm]
-
+
- Added method and management template to membership tool to cleanup
members with bad images.
[alecm]
@@ -99,7 +276,7 @@
[alecm]
- Made the code in utranslate more error resilient and added tests for it.
- [rafrombrc, hannosch]
+ [rafrombrc] [hannosch]
- Enhanced accessibility of adjacent links in main_template. This fixes
http://dev.plone.org/plone/ticket/5210.
@@ -143,11 +320,11 @@
- Applied patch from paregorius to add ids to all visualClear divs. Fixes
http://dev.plone.org/plone/ticket/4145.
- [paregorius, alecm]
+ [paregorius] [alecm]
- Applied patch from paregorius to make the LiveSearch div vanish in IE
- as needed. Fixes https://dev.plone.org/plone/ticket/5705.
- [paregorius, alecm]
+ as needed. Fixes http://dev.plone.org/plone/ticket/5705.
+ [paregorius] [alecm]
- Made PloneTool.browserDefault check for a result of None from getLayout
and raise a sensible error. Generally this means that the FTI is missing
@@ -186,7 +363,7 @@
[ender]
- Added test that ensures the language is getting set in header.
- This is related to http://dev.plone.org/plone/ticket/5444 and
+ This is related to http://dev.plone.org/plone/ticket/5444 and
http://dev.plone.org/plone/ticket/4770.
[hannosch]
@@ -1062,8 +1239,52 @@
in the next release.
[hannosch]
-Plone 2.1.4 - Devo - Unreleased
+Plone 2.1.5 - Fischerspooner - (Unreleased)
+ - Fixed handling of login_time and last_login member properties:
+ last_login_time is now the time of the previous login and login_time is
+ the time of the current login. This fixes
+ http://dev.plone.org/plone/ticket/5965.
+ [hannosch]
+
+ - Fixed the sharing page to handle groups which come from non-traditional
+ PAS sources. This closes
+ http://dev.plone.org/plone/ticket/5727.
+ [hannosch]
+
+ - Fixed the view of livesearch in fullscreen mode (contentActions were
+ overlapping the livesearch output).
+ [spliter]
+
+ - Enabled IEFixes.css for all IE's, not for <IE7 only
+ [spliter]
+
+ - Re-enabled livesearch back (removed overflow:hidden from
+ #portal-searchbox) and fixed horizontal scroll issue for IE's due to
+ floated searchbox.
+ [spliter]
+
+ - Removed www/main.dtml as it turns out we can use the default just fine.
+ [stefan]
+
+Plone 2.1.4 - Devo - Released September 19, 2006
+
+ - No changes since RC1.
+
+ RC1 - Released September 12, 2006
+
+ - Made sure validate_email is turned on by default.
+ [stefan]
+
+ - Fixed a bug in the highlighting of selected tabs in an environment which
+ uses Apache rewrite rules. This closes
+ http://dev.plone.org/plone/ticket/5518.
+ [hannosch]
+
+ - Updated the CSS validation link to use the CSS 2.1 and CSS 3 compatible
+ profile, which is what Plone uses.
+ [limi]
+
- Using 'indexObject' instead of 'reindexObject' for
CatalogTool.clearFindAndRebuild works just as well, but does not
touch every object and cause a monster transaction to be committed.
Modified: zope-cmfplone/trunk/INSTALL.txt
===================================================================
--- zope-cmfplone/trunk/INSTALL.txt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/INSTALL.txt 2007-02-09 14:39:12 UTC (rev 655)
@@ -34,15 +34,13 @@
**MANDATORY**
- - Zope 2.9.4+ (does not run natively on Zope 3)
- http://www.zope.org/Products/Zope/2.9.4
- **If you are running Zope 2.9.5+ you should consider removing the ``Five``
- Product included with Plone**
+ - Zope 2.9.5+ (does not run natively on Zope 3)
+ http://www.zope.org/Products/Zope/2.9.5
or
Zope 2.8.7+
http://www.zope.org/Products/Zope/2.8.7
- **To use Plone 2.5 with Zope 2.8, you must remove the included ``Five``
- package and replace it with Five 1.2.6+ from
+ **To use Plone 2.5 with Zope 2.8, you must add ``Five`` to your instance
+ Products, you may find it here:
http://codespeak.net/z3/five/release/Five-1.2.6.tgz**
- CMF 1.6.2+ (neither 1.5 nor 2.x+ will work)
@@ -51,25 +49,25 @@
- CMFQuickInstallerTool 1.5.9 or newer
Included in the Plone tarball
- - GroupUserFolder 3.54 or newer
+ - GroupUserFolder 3.54.1 or newer
Included in the Plone tarball
- - CMFFormController 2.0.5 or newer
+ - CMFFormController 2.0.6 or newer
Included in the Plone tarball
- SecureMailHost 1.0.4 or newer
Included in the Plone tarball
- - Archetypes 1.4.1 or newer
+ - Archetypes 1.4.2 or newer
Included in the Plone tarball
- - ATContentTypes 1.1.3 or newer
+ - ATContentTypes 1.1.4 or newer
Included in the Plone tarball
- - ATReferenceBrowserWidget 1.5 or newer
+ - ATReferenceBrowserWidget 1.7 or newer
Included in the Plone tarball
- - ResourceRegistries 1.3.2 or newer
+ - ResourceRegistries 1.3.3 or newer
Included in the Plone tarball
- ExtendedPathIndex 2.4 or newer
@@ -88,39 +86,39 @@
Not included in the Plone tarball
http://effbot.org/downloads/#elementtree
- - Placeless Translation Service 1.3.2 or newer
+ - Placeless Translation Service 1.3.4 or newer
Included in the Plone tarball
- - PloneTranslations 2.6.0
+ - PloneTranslations 2.6.1
Included in the Plone tarball
- - PloneLanguageTool 1.4 or newer
+ - PloneLanguageTool 1.5 or newer
Included in the Plone tarball
- CMFPlacefulWorkflow 1.0.2 or newer
Included in the Plone tarball
- - PlonePAS 2.1 or newer
+ - PlonePAS 2.2 or newer
Included in the Plone tarball
- - PasswordResetTool 0.4 or newer
+ - PasswordResetTool 0.4.2 or newer
Included in the Plone tarball
- - PluggableAuthService 1.4 or newer
+ - PluggableAuthService 1.4.1 or newer
Included in the Plone tarball
- - PluginRegistry 1.1 or newer
+ - PluginRegistry 1.1.1 or newer
Included in the Plone tarball
- - ExternalEditor 0.9.2 or newer
+ - ExternalEditor 0.9.3 or newer
Included in the Plone tarball
- - kupu 1.3.8 or newer
+ - kupu 1.3.9 or newer
Included in the Plone tarball
**OPTIONAL**
- - CacheFu 1.0.1 or newer
+ - CacheFu 1.0.2 or newer
Included in the Plone tarball
In order to use CacheFu, you must copy or link the directories
``CacheSetup``, ``CMFSquidTool``, ``PageCacheManager``, and
Modified: zope-cmfplone/trunk/MembershipTool.py
===================================================================
--- zope-cmfplone/trunk/MembershipTool.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/MembershipTool.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -564,7 +564,7 @@
if not self.isAnonymousUser():
member = self.getAuthenticatedMember()
login_time = member.getProperty('login_time', '2000/01/01')
- if str(login_time) == '2000/01/01':
+ if str(login_time) == '2000/01/01':
login_time = self.ZopeTime()
member.setProperties(login_time=self.ZopeTime(),
last_login_time=login_time)
Modified: zope-cmfplone/trunk/PloneFolder.py
===================================================================
--- zope-cmfplone/trunk/PloneFolder.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/PloneFolder.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -27,6 +27,7 @@
from Products.CMFPlone import PloneMessageFactory as _
from zope.interface import implements
+from zope.app.container.contained import notifyContainerModified
# ATM it's safer to define our own
from interfaces.OrderedContainer import IOrderedContainer
@@ -129,7 +130,8 @@
# the 2.7 specific class OFS.OrderedContainer.OrderedContainer
security.declareProtected(ModifyPortalContent, 'moveObjectsByDelta')
- def moveObjectsByDelta(self, ids, delta, subset_ids=None):
+ def moveObjectsByDelta(self, ids, delta, subset_ids=None,
+ suppress_events=False):
"""Move specified sub-objects by delta."""
if type(ids) is StringType:
ids = (ids,)
@@ -175,6 +177,10 @@
raise ValueError('The object with the id "%s" does '
'not exist.' % subset_ids[pos])
self._objects = tuple(objects)
+
+ if not suppress_events:
+ notifyContainerModified(self)
+
return counter
security.declarePrivate('getCMFObjectsSubsetIds')
@@ -224,10 +230,11 @@
RESPONSE.redirect('manage_workspace')
security.declareProtected(ModifyPortalContent, 'moveObjectToPosition')
- def moveObjectToPosition(self, id, position):
+ def moveObjectToPosition(self, id, position, suppress_events=False):
"""Move specified object to absolute position."""
delta = position - self.getObjectPosition(id)
- return self.moveObjectsByDelta(id, delta)
+ return self.moveObjectsByDelta(id, delta,
+ suppress_events=suppress_events)
security.declareProtected(ModifyPortalContent, 'orderObjects')
def orderObjects(self, key, reverse=None):
Modified: zope-cmfplone/trunk/PloneTool.py
===================================================================
--- zope-cmfplone/trunk/PloneTool.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/PloneTool.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -459,17 +459,19 @@
object.manage_setLocalRoles(user_id, roles)
fixOwnerRole(object, user.getId())
- catalog_tool = getToolByName(self, 'portal_catalog')
- catalog_tool.reindexObject(object)
+ if base_hasattr(object, 'reindexObject'):
+ object.reindexObject()
if recursive:
+ catalog_tool = getToolByName(self, 'portal_catalog')
purl = getToolByName(self, 'portal_url')
_path = purl.getRelativeContentURL(object)
subobjects = [b.getObject() for b in \
catalog_tool(path={'query':_path,'level':1})]
for obj in subobjects:
fixOwnerRole(obj, user.getId())
- catalog_tool.reindexObject(obj)
+ if base_hasattr(obj, 'reindexObject'):
+ obj.reindexObject()
security.declarePublic('urlparse')
def urlparse(self, url):
Modified: zope-cmfplone/trunk/Portal.py
===================================================================
--- zope-cmfplone/trunk/Portal.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/Portal.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -65,7 +65,7 @@
# Switch off ZMI ordering interface as it assumes a slightly
# different functionality
has_order_support = 0
- manage_main = Globals.DTMLFile('www/main', globals())
+ _default_sort_key = 'id'
def __browser_default__(self, request):
""" Set default so we can return whatever we want instead
Modified: zope-cmfplone/trunk/RELEASENOTES.txt
===================================================================
--- zope-cmfplone/trunk/RELEASENOTES.txt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/RELEASENOTES.txt 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,18 +1,15 @@
-Plone 2.5.1 - September 20, 2006
+Plone 2.5.2 - January 16, 2007
=========================
The following is a list of important things to note when installing or upgrading
-to Plone 2.5.1:
+to Plone 2.5.2:
-* The recommended Zope version for this release is now 2.9.5+ (which is not yet
-released), it will work out of the box with Zope 2.9.4, and can be used with
-Zope 2.8.7 by replacing the included ``Five`` product with the latest "Five
-1.2.x release":http://codespeak.net/z3/five **Note: This has changed from
+* The recommended Zope version for this release is now 2.9.5+ (which
+is not yet released), it will work out of the box with Zope 2.9.4, and
+can be used with Zope 2.8.7 by installing the latest "Five 1.2.x
+release":http://codespeak.net/z3/five **Note: This has changed from
the previous release**
-* When used with Zope 2.9.5+ the included ``Five`` product should be removed
-as a newer version is included with Zope.
-
* This release includes a number of important fixes addressing Cross Site
Scripting vulnerabilities in user uploaded content, including member portraits.
Details on the issues and steps for cleaning up any existing content exploiting
@@ -31,7 +28,7 @@
* Sites which have migrated from Plone 2.1.x and had local roles assigned to
groups in parts of the portal may find that those roles are now invalid because
they have the previously mandatory ``group_`` prefix. There is an
-``External Method`` included with Plone 2.5.1 which will reassign these roles
+``External Method`` included with Plone 2.5.1+ which will reassign these roles
to the proper groups. You may run this method on the portal to clean up any
folders or objects with invalid group roles. You should not use this method
if you have groups on your site that are intentionally named with a ``group_``
Modified: zope-cmfplone/trunk/RegistrationTool.py
===================================================================
--- zope-cmfplone/trunk/RegistrationTool.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/RegistrationTool.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,5 +1,6 @@
import random
import md5
+from smtplib import SMTPRecipientsRefused
from Products.CMFCore.utils import getToolByName
from Products.CMFDefault.RegistrationTool import RegistrationTool as BaseTool
@@ -195,9 +196,12 @@
# add the single email address
if not utils.validateSingleEmailAddress(member.getProperty('email')):
raise ValueError, 'The email address did not validate'
+ try:
+ return BaseTool.mailPassword(self, forgotten_userid, REQUEST)
+ except SMTPRecipientsRefused:
+ # Don't disclose email address on failure
+ raise SMTPRecipientsRefused('Recipient address rejected by server')
- return BaseTool.mailPassword(self, forgotten_userid, REQUEST)
-
security.declarePublic('registeredNotify')
def registeredNotify(self, new_member_id):
""" Wrapper around registeredNotify """
@@ -233,8 +237,27 @@
return self.mail_password_response( self, self.REQUEST )
+ def isMemberIdAllowed(self, id):
+ if len(id) < 1 or id == 'Anonymous User':
+ return 0
+ if not self._ALLOWED_MEMBER_ID_PATTERN.match( id ):
+ return 0
+ pas = getToolByName(self, 'acl_users')
+ if IPluggableAuthService.providedBy(pas):
+ results = pas.searchPrincipals(id=id)
+ if results:
+ return 0
+ else:
+ membership = getToolByName(self, 'portal_membership')
+ if membership.getMemberById(id) is not None:
+ return 0
+ groups = getToolByName(self, 'portal_groups')
+ if groups.getGroupById(id) is not None:
+ return 0
+ return 1
+
RegistrationTool.__doc__ = BaseTool.__doc__
InitializeClass(RegistrationTool)
Modified: zope-cmfplone/trunk/browser/navigation.py
===================================================================
--- zope-cmfplone/trunk/browser/navigation.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/browser/navigation.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -17,7 +17,6 @@
from Products.CMFPlone.browser.navtree import buildFolderTree
from Products.CMFPlone.browser.navtree import NavtreeQueryBuilder, SitemapQueryBuilder
from Products.CMFPlone.browser.navtree import getNavigationRoot
-
from Products.CMFPlone.browser.navtree import DefaultNavtreeStrategy, SitemapNavtreeStrategy
def get_url(item):
@@ -211,7 +210,8 @@
data = actionInfo.copy()
# We use PMF instead of _() here, as this should not be picked
# up by the extraction tool.
- data['name'] = PMF(data['title'], default=data['title'])
+ title = utils.safe_unicode(data['title'])
+ data['name'] = PMF(title, default=title)
result.append(data)
# check whether we only want actions
Modified: zope-cmfplone/trunk/debian/changelog
===================================================================
--- zope-cmfplone/trunk/debian/changelog 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/debian/changelog 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,3 +1,15 @@
+zope-cmfplone (2.5.2-1) UNRELEASED; urgency=low
+
+ * (NOT RELEASED YET) New upstream release
+
+ -- Fabio Tranchitella <kobold at debian.org> Fri, 9 Feb 2007 14:51:36 +0100
+
+zope-cmfplone (2.5.1-5) UNRELEASED; urgency=low
+
+ * NOT RELEASED YET
+
+ -- Fabio Tranchitella <kobold at debian.org> Thu, 18 Jan 2007 11:03:21 +0100
+
zope-cmfplone (2.5.1-4) unstable; urgency=medium
* debian/control: build-depends on zope-debhelper >= 0.3.6, which fixes a
Modified: zope-cmfplone/trunk/exportimport/tests/base.py
===================================================================
--- zope-cmfplone/trunk/exportimport/tests/base.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/exportimport/tests/base.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,15 +1,16 @@
from Products.GenericSetup.testing import BodyAdapterTestCase
from Products.GenericSetup.testing import NodeAdapterTestCase
-from Products.PloneTestCase.layer import ZCMLLayer
-import Products.PloneTestCase.setup as setup
+from Products.PloneTestCase import layer
+from Products.PloneTestCase import setup
+
# Disable PlacelessSetup as PTC does not like it
class BodyAdapterTestCase(BodyAdapterTestCase):
if setup.USELAYER:
- layer = ZCMLLayer
+ layer = layer.ZCML
def setUp(self):
pass
@@ -21,7 +22,7 @@
class NodeAdapterTestCase(NodeAdapterTestCase):
if setup.USELAYER:
- layer = ZCMLLayer
+ layer = layer.ZCML
def setUp(self):
pass
Modified: zope-cmfplone/trunk/factory.py
===================================================================
--- zope-cmfplone/trunk/factory.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/factory.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -3,33 +3,41 @@
from Products.CMFCore.utils import getToolByName
from Products.GenericSetup.tool import SetupTool
from Products.GenericSetup import profile_registry
-from Products.GenericSetup import EXTENSION
+from Products.GenericSetup import BASE, EXTENSION
from Portal import PloneSite
from utils import WWW_DIR
from interfaces import IPloneSiteRoot
_TOOL_ID = 'portal_setup'
+_DEFAULT_PROFILE = 'CMFPlone:plone'
-
def addPloneSiteForm(dispatcher):
"""
Wrap the PTF in 'dispatcher'.
"""
wrapped = PageTemplateFile('addSite', WWW_DIR).__of__(dispatcher)
+ base_profiles = []
extension_profiles = []
for info in profile_registry.listProfileInfo():
if info.get('type') == EXTENSION and \
info.get('for') in (IPloneSiteRoot, None):
extension_profiles.append(info)
-
- return wrapped(extension_profiles=tuple(extension_profiles))
+ for info in profile_registry.listProfileInfo():
+ if info.get('type') == BASE and \
+ info.get('for') in (IPloneSiteRoot, None):
+ base_profiles.append(info)
+
+ return wrapped(base_profiles=tuple(base_profiles),
+ extension_profiles=tuple(extension_profiles),
+ default_profile=_DEFAULT_PROFILE)
+
def addPloneSite(dispatcher, id, title='', description='',
create_userfolder=1, email_from_address='',
email_from_name='', validate_email=0,
- profile_id='CMFPlone:plone', snapshot=False,
+ profile_id=_DEFAULT_PROFILE, snapshot=False,
RESPONSE=None, extension_ids=()):
""" Add a PloneSite to 'dispatcher', configured according to 'profile_id'.
"""
Modified: zope-cmfplone/trunk/i18nl10n.py
===================================================================
--- zope-cmfplone/trunk/i18nl10n.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/i18nl10n.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,11 +1,13 @@
"""
Collection of i18n and l10n utility methods.
-All methods here may return unicode type.
"""
import re
+import logging
from DateTime import DateTime
-from log import log_exc
+from Products.CMFPlone.log import log
+from Products.CMFPlone.utils import safe_unicode
+
# get the registered translation service and the dummy
from Products.PageTemplates.GlobalTranslationService import \
getGlobalTranslationService
@@ -30,12 +32,7 @@
# of the utranslate method. As we have no context here which we could use
# to get to the site encoding, we only try to decode from utf-8 here.
text = service.translate(*args, **kw)
- if isinstance(text, str):
- try:
- text = unicode(text, 'utf-8')
- except UnicodeDecodeError:
- pass
- return text
+ return safe_unicode(text)
# unicode aware localized time method (l10n)
def ulocalized_time(time, long_format = None, context = None, domain='plone'):
@@ -76,7 +73,8 @@
try:
time = DateTime(time)
except:
- log_exc('Failed to convert %s to a DateTime object' % time)
+ log('Failed to convert %s to a DateTime object' % time,
+ severity=logging.DEBUG)
return None
if context is None:
Modified: zope-cmfplone/trunk/migrations/__init__.py
===================================================================
--- zope-cmfplone/trunk/migrations/__init__.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/migrations/__init__.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -154,6 +154,14 @@
null)
MigrationTool.registerUpgradePath('2.1.3',
+ '2.1.4-rc1',
+ null)
+
+ MigrationTool.registerUpgradePath('2.1.4-rc1',
+ '2.1.4',
+ null)
+
+ MigrationTool.registerUpgradePath('2.1.4',
'2.5-alpha1',
v2_5.alphas.two5_alpha1)
@@ -193,3 +201,11 @@
'2.5.1',
null)
+ MigrationTool.registerUpgradePath('2.5.1',
+ '2.5.2-rc1',
+ v2_5.two51_two52.two51_two52)
+
+ MigrationTool.registerUpgradePath('2.5.2-rc1',
+ '2.5.2',
+ null)
+
Modified: zope-cmfplone/trunk/migrations/v2_5/__init__.py
===================================================================
--- zope-cmfplone/trunk/migrations/v2_5/__init__.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/migrations/v2_5/__init__.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -3,3 +3,4 @@
import betas
import rcs
import final_two51
+import two51_two52
Modified: zope-cmfplone/trunk/migrations/v2_5/final_two51.py
===================================================================
--- zope-cmfplone/trunk/migrations/v2_5/final_two51.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/migrations/v2_5/final_two51.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -86,7 +86,7 @@
newaction = { 'id' : 'delete',
'name' : 'Delete',
'action' : 'string:${globals_view/getCurrentObjectUrl}/delete_confirmation',
- 'condition' : 'python:checkPermission("Delete objects", globals_view.getParentObject()) and not globals_view.isPortalOrPortalDefaultPage()',
+ 'condition' : 'python:checkPermission("Delete objects", globals_view.getParentObject()) and not globals_view.isPortalOrPortalDefaultPage()',
'permission' : 'Delete objects',
'category' : 'object_buttons',
}
Copied: zope-cmfplone/trunk/migrations/v2_5/two51_two52.py (from rev 625, zope-cmfplone/branches/upstream/current/migrations/v2_5/two51_two52.py)
Modified: zope-cmfplone/trunk/profiles/default/jsregistry.xml
===================================================================
--- zope-cmfplone/trunk/profiles/default/jsregistry.xml 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/profiles/default/jsregistry.xml 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,6 +1,8 @@
<?xml version="1.0"?>
<object name="portal_javascripts" meta_type="JavaScripts Registry">
<javascript cacheable="True" compression="safe" cookable="True"
+ enabled="True" expression="" id="event-registration.js" inline="False"/>
+ <javascript cacheable="True" compression="safe" cookable="True"
enabled="True" expression="" id="register_function.js" inline="False"/>
<javascript cacheable="True" compression="safe" cookable="True"
enabled="True" expression="" id="cssQuery.js" inline="False"/>
Modified: zope-cmfplone/trunk/profiles/default/structure/front-page
===================================================================
--- zope-cmfplone/trunk/profiles/default/structure/front-page 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/profiles/default/structure/front-page 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,17 +1,17 @@
-id: front-page
-title: Welcome to Plone
-excludeFromNav: False
-subject:
-description: Congratulations! You have successfully installed Plone.
-contributors:
-effectiveDate: None
-expirationDate: None
-language:
-rights:
-creation_date: 2005/11/01 14:28:30 US/Central
-modification_date: 2005/11/01 14:28:30 US/Central
-relatedItems:
-allowDiscussion: None
+id: front-page
+title: Welcome to Plone
+excludeFromNav: False
+subject:
+description: Congratulations! You have successfully installed Plone.
+contributors:
+effectiveDate: None
+expirationDate: None
+language:
+rights:
+creation_date: 2006/10/10 14:28:30 US/Central
+modification_date: 2006/10/10 14:28:30 US/Central
+relatedItems:
+allowDiscussion: None
Content-Type: text/html
<p class="discreet">
@@ -77,7 +77,7 @@
<p><a href="http://plone.org/documentation/whatsnew/2.5">What's new in Plone 2.5</a></p>
<p><a href="http://plone.org/documentation">Plone documentation</a></p>
<p><a href="http://plone.org/products">Plone add-on products</a></p>
-<p><a href="http://plone.org/contact">Plone mailing lists and support forums</a></p>
+<p><a href="http://plone.org/support">Plone mailing lists and support forums</a></p>
<p><a href="http://plone.org/documentation/books">Available Plone books</a> <span class="discreet">(recommended!)</span></p>
<p><a href="http://plone.org/documentation/faq/server-recommendations">Server recommendations for Plone</a></p>
Modified: zope-cmfplone/trunk/setup/dependencies.py
===================================================================
--- zope-cmfplone/trunk/setup/dependencies.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/setup/dependencies.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -105,10 +105,9 @@
# TODO: we might want to check if the user has jpeg and zlib support, too
import PIL.Image
except ImportError:
- log(("PIL not found. Plone needs PIL 1.1.5 or newer to scale images. "
+ log(("PIL not found. Plone needs PIL 1.1.5 or newer. "
"Please download it from http://www.pythonware.com/products/pil/ or "
- "http://effbot.org/downloads/#Imaging"),
- severity=logging.INFO)
+ "http://effbot.org/downloads/#Imaging"))
try:
from elementtree import ElementTree
Modified: zope-cmfplone/trunk/setuphandlers.py
===================================================================
--- zope-cmfplone/trunk/setuphandlers.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/setuphandlers.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -171,6 +171,7 @@
out = []
migs.v2_1.alphas.addDefaultTypesToPortalFactory(p, out)
migs.v2_1.rcs.enableSyndicationOnTopics(p, out)
+ migs.v2_5.two51_two52.setLoginFormInCookieAuth(p, out)
def setATCTToolVersion(self, p):
"""
Modified: zope-cmfplone/trunk/skins/plone_3rdParty/event-registration.js
===================================================================
--- zope-cmfplone/trunk/skins/plone_3rdParty/event-registration.js 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_3rdParty/event-registration.js 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,165 +1,99 @@
-// written by Dean Edwards, 2005
-// with input from Tino Zijdel - crisp at xs4all.nl
-// http://dean.edwards.name/weblog/2005/10/add-event/
-// this version from http://tanny.ica.com/ica/tko/tkoblog.nsf/dx/domcontentloaded-for-browsers-part-ii
+// this contains parts from:
+// http://tanny.ica.com/ica/tko/tkoblog.nsf/dx/domcontentloaded-for-browsers-part-ii
-function addEvent(element, type, handler) {
- // Modification by Tanny O'Haley, http://tanny.ica.com to add the
- // DOMContentLoaded for all browsers.
- if (type == "DOMContentLoaded" || type == "domload") {
- addDOMLoadEvent(handler);
- return;
- }
-
- if (element.addEventListener)
- element.addEventListener(type, handler, false);
- else {
- if (!handler.$$guid) handler.$$guid = addEvent.guid++;
- if (!element.events) element.events = {};
- var handlers = element.events[type];
- if (!handlers) {
- handlers = element.events[type] = {};
- if (element['on' + type]) handlers[0] = element['on' + type];
- element['on' + type] = handleEvent;
- }
-
- handlers[handler.$$guid] = handler;
- }
-}
-
-addEvent.guid = 1;
-
-function removeEvent(element, type, handler) {
- if (element.removeEventListener)
- element.removeEventListener(type, handler, false);
- else if (element.events && element.events[type] && handler.$$guid)
- delete element.events[type][handler.$$guid];
-}
-
-function handleEvent(event) {
- event = event || fixEvent(window.event);
- var returnValue = true;
- var handlers = this.events[event.type];
-
- for (var i in handlers) {
- if (!Object.prototype[i]) {
- this.$$handler = handlers[i];
- if (this.$$handler(event) === false) returnValue = false;
- }
- }
-
- if (this.$$handler) this.$$handler = null;
-
- return returnValue;
-}
-
-function fixEvent(event) {
- event.preventDefault = fixEvent.preventDefault;
- event.stopPropagation = fixEvent.stopPropagation;
- return event;
-}
-
-fixEvent.preventDefault = function() {
- this.returnValue = false;
-}
-
-fixEvent.stopPropagation = function() {
- this.cancelBubble = true;
-}
-
-// This little snippet fixes the problem that the onload attribute on the body-element will overwrite
-// previous attached events on the window object for the onload event
-if (!window.addEventListener) {
- document.onreadystatechange = function(){
- if (window.onload && window.onload != handleEvent) {
- addEvent(window, 'load', window.onload);
- window.onload = handleEvent;
- }
- }
-}
-
-// End Dean Edwards addEvent.
-
-
-// Here are my functions for adding the DOMContentLoaded event to browsers other
-// than Mozilla.
-
// Array of DOMContentLoaded event handlers.
window.onDOMLoadEvents = new Array();
window.DOMContentLoadedInitDone = false;
// Function that adds DOMContentLoaded listeners to the array.
function addDOMLoadEvent(listener) {
- window.onDOMLoadEvents[window.onDOMLoadEvents.length]=listener;
+ window.onDOMLoadEvents[window.onDOMLoadEvents.length]=listener;
}
// Function to process the DOMContentLoaded events array.
function DOMContentLoadedInit() {
- // quit if this function has already been called
- if (window.DOMContentLoadedInitDone) return;
+ // quit if this function has already been called
+ if (window.DOMContentLoadedInitDone) return;
- // flag this function so we don't do the same thing twice
- window.DOMContentLoadedInitDone = true;
+ // flag this function so we don't do the same thing twice
+ window.DOMContentLoadedInitDone = true;
- // iterates through array of registered functions
- var exceptions = new Array();
- for (var i=0; i<window.onDOMLoadEvents.length; i++) {
- var func = window.onDOMLoadEvents[i];
- try {
- func();
- } catch(e) {
- // continue running init functions but save exceptions for later
- exceptions[exceptions.length] = e;
- }
- }
- for (var i=0; i<exceptions.length; i++) {
- throw exceptions[i];
- }
+ // iterates through array of registered functions
+ var exceptions = new Array();
+ for (var i=0; i<window.onDOMLoadEvents.length; i++) {
+ var func = window.onDOMLoadEvents[i];
+ try {
+ func();
+ } catch(e) {
+ // continue running init functions but save exceptions for later
+ exceptions[exceptions.length] = e;
+ }
+ }
+ for (var i=0; i<exceptions.length; i++) {
+ throw exceptions[i];
+ }
}
function DOMContentLoadedScheduler() {
- // quit if the init function has already been called
- if (window.DOMContentLoadedInitDone) return true;
-
- // First check for Safari or
- //if DOM methods are supported, and the body element exists
- //(using a double-check including document.body, for the benefit of older moz builds [eg ns7.1]
- //in which getElementsByTagName('body')[0] is undefined, unless this script is in the body section)
- if(/KHTML|WebKit/i.test(navigator.userAgent)) {
- if(/loaded|complete/.test(document.readyState)) {
- DOMContentLoadedInit();
- } else {
- // Not ready yet, wait a little more.
- setTimeout("DOMContentLoadedScheduler()", 250);
- }
- } else if(typeof document.getElementsByTagName != 'undefined' && (document.getElementsByTagName('body')[0] != null || document.body != null)) {
- DOMContentLoadedInit();
- } else {
- // Not ready yet, wait a little more.
- setTimeout("DOMContentLoadedScheduler()", 250);
- }
-
- return true;
+ // quit if the init function has already been called
+ if (window.DOMContentLoadedInitDone) return true;
+
+ // First check for Safari or
+ //if DOM methods are supported, and the body element exists
+ //(using a double-check including document.body, for the benefit of older moz builds [eg ns7.1]
+ //in which getElementsByTagName('body')[0] is undefined, unless this script is in the body section)
+ if(/KHTML|WebKit/i.test(navigator.userAgent)) {
+ if(/loaded|complete/.test(document.readyState)) {
+ DOMContentLoadedInit();
+ } else {
+ // Not ready yet, wait a little more.
+ setTimeout("DOMContentLoadedScheduler()", 250);
+ }
+ } else if(typeof document.getElementsByTagName != 'undefined') {
+ var body = document.getElementsByTagName('body');
+ if (body.length > 0 || document.body != null) {
+ DOMContentLoadedInit();
+ }
+ } else {
+ // Not ready yet, wait a little more.
+ setTimeout("DOMContentLoadedScheduler()", 250);
+ }
+
+ return true;
}
// Schedule to run the init function.
setTimeout("DOMContentLoadedScheduler()", 250);
// Just in case window.onload happens first, add it there too.
-addEvent(window, "load", DOMContentLoadedInit);
+if (window.addEventListener) {
+ window.addEventListener("load", DOMContentLoadedInit, false);
+ // If addEventListener supports the DOMContentLoaded event.
+ document.addEventListener("DOMContentLoaded", DOMContentLoadedInit, false);
+} else if (window.attachEvent) {
+ window.attachEvent("onload", DOMContentLoadedInit);
+} else {
+ var _dummy = function() {
+ var $old_onload = window.onload;
+ window.onload = function(e) {
+ DOMContentLoadedInit();
+ $old_onload();
+ }
+ }
+}
-// If addEventListener supports the DOMContentLoaded event.
-if(document.addEventListener)
- document.addEventListener("DOMContentLoaded", DOMContentLoadedInit, false);
-
/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
- document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
- var script = document.getElementById("__ie_onload");
- script.onreadystatechange = function() {
- if (this.readyState == "complete") {
- DOMContentLoadedInit(); // call the onload handler
- }
- };
+{
+ var proto = "src='javascript:void(0)'";
+ if (location.protocol == "https:") proto = "src=//0";
+ document.write("<scr"+"ipt id=__ie_onload defer " + proto + "><\/scr"+"ipt>");
+ var script = document.getElementById("__ie_onload");
+ script.onreadystatechange = function() {
+ if (this.readyState == "complete") {
+ DOMContentLoadedInit(); // call the onload handler
+ }
+ }
+};
/*@end @*/
Modified: zope-cmfplone/trunk/skins/plone_3rdParty/livesearch.js
===================================================================
--- zope-cmfplone/trunk/skins/plone_3rdParty/livesearch.js 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_3rdParty/livesearch.js 2007-02-09 14:39:12 UTC (rev 655)
@@ -14,34 +14,32 @@
// +----------------------------------------------------------------------+
// | Author: Bitflux GmbH <devel at bitflux.ch> |
// +----------------------------------------------------------------------+
+*/
-*/
var liveSearchReq = false;
var t = null;
var liveSearchLast = "";
var queryTarget = "livesearch_reply?q=";
var searchForm = null;
-var searchInput = null;
+var searchInput = null;
var isIE = false;
-
var _cache = new Object();
-var widthOffset=1;
+var widthOffset = 1;
-function calculateWidth(){
+function calculateWidth() {
}
-
function getElementDimensions(elemID) {
var base = document.getElementById(elemID);
var offsetTrail = base;
var offsetLeft = 0;
var offsetTop = 0;
var width = 0;
-
+
while (offsetTrail) {
offsetLeft += offsetTrail.offsetLeft;
offsetTop += offsetTrail.offsetTop;
@@ -52,27 +50,24 @@
offsetLeft += document.body.leftMargin;
offsetTop += document.body.topMargin;
}
-
- if(!isIE){
- width = searchInput.offsetWidth-widthOffset*2;
- }
- else {
- width = searchInput.offsetWidth;
- }
-
- return { left:offsetLeft,
- top:offsetTop,
- width: width,
+ if (!isIE)
+ width = searchInput.offsetWidth-widthOffset*2;
+ else
+ width = searchInput.offsetWidth;
+ return { left: offsetLeft,
+ top: offsetTop,
+ width: width,
height: base.offsetHeight,
- bottom: offsetTop + base.offsetHeight,
- right : offsetLeft + width};
+ bottom: offsetTop + base.offsetHeight,
+ right: offsetLeft + width};
}
function liveSearchInit() {
searchInput = document.getElementById('searchGadget');
- if (searchInput == null || searchInput == undefined) return
-// Only keypress catches repeats in moz/FF but keydown is needed for
-// khtml based browsers.
+ if (searchInput == null || searchInput == undefined)
+ return
+ // Only keypress catches repeats in moz/FF but keydown is needed for
+ // khtml based browsers.
if (navigator.userAgent.indexOf("KHTML") > 0) {
searchInput.addEventListener("keydown",liveSearchKeyPress,false);
searchInput.addEventListener("focus",liveSearchDoSearch,false);
@@ -85,30 +80,32 @@
} else {
searchInput.attachEvent("onkeydown",liveSearchKeyPress);
searchInput.attachEvent("onkeydown",liveSearchStart);
- searchInput.attachEvent("onblur",liveSearchHide);
+ searchInput.attachEvent("onblur",liveSearchHideDelayed);
isIE = true;
}
-// Why doesn't this work in konq, setting it inline does.
- searchInput.setAttribute("autocomplete","off");
-
- var pos = getElementDimensions('searchGadget');
+ // Why doesn't this work in konq, setting it inline does.
+ searchInput.setAttribute("autocomplete", "off");
+ var pos = getElementDimensions('searchGadget');
result = document.getElementById('LSResult');
- pos.left = pos.left - result.offsetParent.offsetLeft + pos.width;
- result.style.display='none';
+ if ((typeof result.offsetParent != 'undefined') && (result.offsetParent != null)) {
+ pos.left = pos.left - result.offsetParent.offsetLeft + pos.width;
+ } else {
+ pos.left = pos.left + pos.width;
+ }
+ result.style.display = 'none';
}
function liveSearchHideDelayed() {
- window.setTimeout("liveSearchHide()",400);
+ window.setTimeout("liveSearchHide()", 400);
}
-
-function liveSearchHide() {
+
+function liveSearchHide() {
document.getElementById("LSResult").style.display = "none";
var highlight = document.getElementById("LSHighlight");
- if (highlight) {
+ if (highlight)
highlight.removeAttribute("id");
- }
}
function getFirstHighlight() {
@@ -124,173 +121,176 @@
function getHits() {
var res = document.getElementById("LSShadow");
var set = res.getElementsByTagName('li');
- return set
+ return set;
}
function findChild(object, specifier) {
var cur = object.firstChild;
try {
- while (cur != undefined) {
- cur = cur.nextSibling;
- if (specifier(cur) == true) return cur;
- }
+ while (cur != undefined) {
+ cur = cur.nextSibling;
+ if (specifier(cur) == true)
+ return cur;
+ }
} catch(e) {};
return null;
-
}
function findNext(object, specifier) {
- var cur = object;
- try {
- while (cur != undefined) {
-
- cur = cur.nextSibling;
- if (cur.nodeType==3) cur=cur.nextSibling;
-
- if (cur != undefined) {
- if (specifier(cur) == true) return cur;
- } else { break }
- }
- } catch(e) {};
- return null;
+ var cur = object;
+ try {
+ while (cur != undefined) {
+ cur = cur.nextSibling;
+ if (cur.nodeType==3)
+ cur=cur.nextSibling;
+ if (cur != undefined) {
+ if (specifier(cur) == true)
+ return cur;
+ } else { break; }
+ }
+ } catch(e) {};
+ return null;
}
function findPrev(object, specifier) {
- var cur = object;
- try {
+ var cur = object;
+ try {
cur = cur.previousSibling;
- if (cur.nodeType==3) cur=cur.previousSibling;
- if (cur!=undefined) {
- if (specifier(cur) == true)
+ if (cur.nodeType == 3)
+ cur = cur.previousSibling;
+ if (cur != undefined) {
+ if (specifier(cur) == true)
return cur;
- }
- } catch(e) {};
- return null;
+ }
+ } catch(e) {};
+ return null;
}
-
function liveSearchKeyPress(event) {
+ var highlight = document.getElementById("LSHighlight");
if (event.keyCode == 40 )
//KEY DOWN
{
- highlight = document.getElementById("LSHighlight");
if (!highlight) {
highlight = getFirstHighlight();
} else {
highlight.removeAttribute("id");
highlight = findNext(highlight, function (o) {return o.className =="LSRow";});
-
}
- if (highlight) {
+ if (highlight)
highlight.setAttribute("id","LSHighlight");
- }
- if (!isIE) { event.preventDefault(); }
- }
+ if (!isIE)
+ event.preventDefault();
+ }
//KEY UP
else if (event.keyCode == 38 ) {
- highlight = document.getElementById("LSHighlight");
if (!highlight) {
highlight = getLastHighlight();
- }
+ }
else {
highlight.removeAttribute("id");
highlight = findPrev(highlight, function (o) {return o.className=='LSRow';});
}
- if (highlight) {
- highlight.setAttribute("id","LSHighlight");
- }
- if (!isIE) { event.preventDefault(); }
- }
+ if (highlight)
+ highlight.setAttribute("id","LSHighlight");
+ if (!isIE)
+ event.preventDefault();
+ }
//ESC
else if (event.keyCode == 27) {
- highlight = document.getElementById("LSHighlight");
- if (highlight) {
+ if (highlight)
highlight.removeAttribute("id");
- }
document.getElementById("LSResult").style.display = "none";
- }
+ }
}
+
function liveSearchStart(event) {
if (t) {
window.clearTimeout(t);
}
- code = event.keyCode;
+ var code = event.keyCode;
if (code!=40 && code!=38 && code!=27 && code!=37 && code!=39) {
- t = window.setTimeout("liveSearchDoSearch()",200);
- }
+ t = window.setTimeout("liveSearchDoSearch()", 200);
+ }
}
function liveSearchDoSearch() {
-
if (typeof liveSearchRoot == "undefined") {
- liveSearchRoot = "";
+ if (typeof portal_url == "undefined") {
+ liveSearchRoot = "";
+ } else {
+ if (portal_url[portal_url.length-1] == '/') {
+ liveSearchRoot = portal_url;
+ } else {
+ liveSearchRoot = portal_url + '/';
+ }
+ }
}
if (typeof liveSearchRootSubDir == "undefined") {
liveSearchRootSubDir = "";
}
-
if (liveSearchLast != searchInput.value) {
- if (liveSearchReq && liveSearchReq.readyState < 4) {
- liveSearchReq.abort();
+ if (liveSearchReq && liveSearchReq.readyState < 4) {
+ liveSearchReq.abort();
+ }
+ if ( searchInput.value == "") {
+ liveSearchHide();
+ return false;
+ }
+ // Do nothing as long as we have less then two characters -
+ // the search results makes no sense, and it's harder on the server.
+ if ( searchInput.value.length < 2) {
+ liveSearchHide();
+ return false;
+ }
+ // Do we have cached results
+ var result = _cache[searchInput.value];
+ if (result) {
+ showResult(result);
+ return;
+ }
+ liveSearchReq = new XMLHttpRequest();
+ liveSearchReq.onreadystatechange = liveSearchProcessReqChange;
+ // Need to use encodeURIComponent instead of encodeURI, to escape +
+ liveSearchReq.open("GET", liveSearchRoot + queryTarget + encodeURIComponent(searchInput.value));
+ liveSearchLast = searchInput.value;
+ liveSearchReq.send(null);
}
- if ( searchInput.value == "") {
- liveSearchHide();
- return false;
- }
-
- // Do nothing as long as we have less then two characters -
- // the search results makes no sense, and it's harder on the server.
- if ( searchInput.value.length < 2) {
- liveSearchHide();
- return false;
- }
-
- // Do we have cached results
- var result = _cache[searchInput.value];
- if (result) {
- showResult(result);
- return;
- }
- liveSearchReq = new XMLHttpRequest();
- liveSearchReq.onreadystatechange= liveSearchProcessReqChange;
- // need to use encodeURIComponent instead of encodeURI, to escape +
- liveSearchReq.open("GET", liveSearchRoot + queryTarget + encodeURIComponent(searchInput.value) );
- liveSearchLast = searchInput.value;
- liveSearchReq.send(null);
- }
}
function showResult(result) {
- var res = document.getElementById("LSResult");
- res.style.display = "block";
- var sh = document.getElementById("LSShadow");
- sh.innerHTML = result;
+ var res = document.getElementById("LSResult");
+ res.style.display = "block";
+ var sh = document.getElementById("LSShadow");
+ sh.innerHTML = result;
}
function liveSearchProcessReqChange() {
if (liveSearchReq.readyState == 4) {
- if (liveSearchReq.status > 299 || liveSearchReq.status < 200 ||
- liveSearchReq.responseText.length < 10) return;
- showResult(liveSearchReq.responseText);
- _cache[liveSearchLast] = liveSearchReq.responseText;
+ try {
+ if (liveSearchReq.status > 299 || liveSearchReq.status < 200 ||
+ liveSearchReq.responseText.length < 10)
+ return;
+ } catch(e) {
+ return;
+ }
+ showResult(liveSearchReq.responseText);
+ _cache[liveSearchLast] = liveSearchReq.responseText;
}
}
function liveSearchSubmit() {
var highlight = document.getElementById("LSHighlight");
-
- if (highlight){
- target = highlight.getElementsByTagName('a')[0];
+ if (highlight) {
+ var target = highlight.getElementsByTagName('a')[0];
window.location = liveSearchRoot + liveSearchRootSubDir + target;
return false;
- }
- else {
+ } else {
return true;
}
}
-
-
-if (window.addEventListener) window.addEventListener("load",liveSearchInit,false);
-else if (window.attachEvent) window.attachEvent("onload", liveSearchInit);
-
+if (window.addEventListener)
+ window.addEventListener("load", liveSearchInit, false);
+else if (window.attachEvent)
+ window.attachEvent("onload", liveSearchInit);
Modified: zope-cmfplone/trunk/skins/plone_3rdParty/se-highlight.js
===================================================================
--- zope-cmfplone/trunk/skins/plone_3rdParty/se-highlight.js 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_3rdParty/se-highlight.js 2007-02-09 14:39:12 UTC (rev 655)
@@ -5,14 +5,15 @@
* details.
*/
var searchEngines = [
- ['^http://(www)?\\.?google.*', 'q='], // Google
+ ['^http://([^.]+\\.)?google.*', 'q='], // Google
['^http://search\\.yahoo.*', 'p='], // Yahoo
['^http://search\\.msn.*', 'q='], // MSN
['^http://search\\.aol.*', 'userQuery='], // AOL
['^http://(www\\.)?altavista.*', 'q='], // AltaVista
['^http://(www\\.)?feedster.*', 'q='], // Feedster
['^http://search\\.lycos.*', 'query='], // Lycos
- ['^http://(www\\.)?alltheweb.*', 'q='] // AllTheWeb
+ ['^http://(www\\.)?alltheweb.*', 'q='], // AllTheWeb
+ ['^http://(www\\.)?ask\\.com.*', 'q='] // Ask.com
]
function decodeReferrer(ref) {
@@ -25,9 +26,19 @@
var match = new RegExp('');
var seQuery = '';
for (var i = 0; i < searchEngines.length; i ++) {
- match.compile(searchEngines[i][0], 'i');
+ if (!match.compile) {
+ // Safari doesn't support the non-standard compile method
+ match = new RegExp(searchEngines[i][0], 'i');
+ } else {
+ match.compile(searchEngines[i][0], 'i');
+ }
if (ref.match(match)) {
- match.compile('^.*'+searchEngines[i][1]+'([^&]+)&?.*$');
+
+ if (!match.compile) {
+ match = new RegExp('^.*'+searchEngines[i][1]+'([^&]+)&?.*$', 'i');
+ } else {
+ match.compile('^.*'+searchEngines[i][1]+'([^&]+)&?.*$');
+ }
seQuery = ref.replace(match, '$1');
if (seQuery) {
seQuery = decodeURIComponent(seQuery);
Modified: zope-cmfplone/trunk/skins/plone_content/document_byline.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_content/document_byline.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_content/document_byline.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -5,16 +5,15 @@
<div class="documentByLine">
<img src="" alt=""
- title="This document is locked."
tal:define="locked portal/lock_icon.gif;"
tal:condition="isLocked"
tal:replace="structure python:locked.tag(title='Locked')"
- i18n:attributes="title label_document_locked;"
/>
<tal:name tal:condition="creator"
tal:define="author python:mtool.getMemberInfo(creator)">
- <span i18n:translate="label_by_author">
+ <span class="documentAuthor"
+ i18n:translate="label_by_author">
by
<a href="#"
tal:attributes="href string:${portal_url}/author/${creator}"
@@ -23,18 +22,20 @@
i18n:name="author">
Bob Dobalina
</a>
- </span>
—
-
+
+ </span>
</tal:name>
- <span i18n:translate="box_last_modified">
- last modified
+ <span class="documentModified">
+ <span i18n:translate="box_last_modified">
+ last modified
+ </span>
+ <span tal:replace="python:toLocalizedTime(here.ModificationDate(),long_format=1)">
+ August 16, 2001 at 23:35:59
+ </span>
</span>
- <span tal:replace="python:toLocalizedTime(here.ModificationDate(),long_format=1)">
- August 16, 2001 at 23:35:59
- </span>
<span class="state-expired"
tal:condition="python:portal.isExpired(here)"
@@ -42,15 +43,16 @@
— expired
</span>
- <span tal:define="locked portal/lock_icon.gif"
+ <span class="documentLocked"
+ tal:define="locked portal/lock_icon.gif"
tal:condition="isLocked">
<img src=""
tal:replace="structure python:locked.tag(title='This item is locked')"
- alt="Object locked"
- i18n:attributes="alt label_object_locked;" />
+ alt="Object locked" />
</span>
- <div tal:condition="here/Contributors"
+ <div class="documentContributors"
+ tal:condition="here/Contributors"
i18n:translate="text_contributors">
Contributors:
<span i18n:name="name"
Modified: zope-cmfplone/trunk/skins/plone_content/document_view.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_content/document_view.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_content/document_view.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -25,7 +25,6 @@
tal:condition="here/Description">
Description
</p>
-
<p tal:condition="python: not text and is_editable"
i18n:translate="no_body_text"
class="discreet">
Modified: zope-cmfplone/trunk/skins/plone_content/event_view.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_content/event_view.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_content/event_view.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -16,6 +16,16 @@
Title or id
</h1>
+ <div metal:use-macro="here/document_byline/macros/byline">
+ Get the byline - contains details about author and modification date.
+ </div>
+
+ <p class="documentDescription description"
+ tal:content="here/Description"
+ tal:condition="here/Description">
+ Description
+ </p>
+
<div class="eventDetails vcard">
<table class="vertical listing"
summary="Event details" i18n:attributes="summary summary_event_details;">
@@ -113,16 +123,6 @@
</table>
</div>
- <div metal:use-macro="here/document_byline/macros/byline">
- Get the byline - contains details about author and modification date.
- </div>
-
- <p class="documentDescription description"
- tal:content="here/Description"
- tal:condition="here/Description">
- Description
- </p>
-
<div tal:condition="here/getText|nothing">
<div tal:replace="structure here/getText" />
</div>
Modified: zope-cmfplone/trunk/skins/plone_content/file_view.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_content/file_view.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_content/file_view.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -64,13 +64,12 @@
</small>
<div class="row"
- tal:condition="python:test(content_type.startswith('text'),1,0)">
+ tal:condition="python: content_type.startswith('text')">
<h2 i18n:translate="heading_file_contents">File contents</h2>
<pre tal:content="here/get_data|here/data|nothing">
</pre>
-
</div>
<div metal:use-macro="here/document_relateditems/macros/relatedItems">
Modified: zope-cmfplone/trunk/skins/plone_content/folder_tabular_view.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_content/folder_tabular_view.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_content/folder_tabular_view.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -103,7 +103,7 @@
<a href="#"
tal:content="item_title_or_id"
tal:attributes="href item/getRemoteUrl;
- class item_wf_state_class;
+ class string:${item_wf_state_class} visualIconPadding;
title item_description;">
External Link
</a>
Modified: zope-cmfplone/trunk/skins/plone_content/image_view_fullscreen.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_content/image_view_fullscreen.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_content/image_view_fullscreen.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,3 +1,4 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
lang="en"
i18n:domain="plone">
Modified: zope-cmfplone/trunk/skins/plone_ecmascript/dragdropreorder.js
===================================================================
--- zope-cmfplone/trunk/skins/plone_ecmascript/dragdropreorder.js 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_ecmascript/dragdropreorder.js 2007-02-09 14:39:12 UTC (rev 655)
@@ -105,7 +105,9 @@
var req = new XMLHttpRequest();
req.open("POST", "folder_moveitem", true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
- req.send("item_id="+ploneDnDReorder.dragging.id+"&delta:int="+delta);
+ // Strip off id prefix
+ var item_id = ploneDnDReorder.dragging.id.substr('folder-contents-item-'.length);
+ req.send("item_id="+item_id+"&delta:int="+delta);
}
ploneDnDReorder.initializeDragDrop = function() {
Modified: zope-cmfplone/trunk/skins/plone_ecmascript/highlightsearchterms.js
===================================================================
--- zope-cmfplone/trunk/skins/plone_ecmascript/highlightsearchterms.js 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_ecmascript/highlightsearchterms.js 2007-02-09 14:39:12 UTC (rev 655)
@@ -25,6 +25,8 @@
for (var term_index=0; term_index < terms.length; term_index++) {
// don't highlight reserved catalog search terms
var term = terms[term_index];
+ if (term.length < 1)
+ continue;
var term_lower = term.toLowerCase();
if (term_lower != 'not'
&& term_lower != 'and'
Modified: zope-cmfplone/trunk/skins/plone_ecmascript/mark_special_links.js
===================================================================
--- zope-cmfplone/trunk/skins/plone_ecmascript/mark_special_links.js 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_ecmascript/mark_special_links.js 2007-02-09 14:39:12 UTC (rev 655)
@@ -8,8 +8,40 @@
// terminate if we hit a non-compliant DOM implementation
if (!W3CDOM) { return false; }
+ // first make external links open in a new window, afterwards do the
+ // normal plone link wrapping in only the content area
+
+ if ((typeof external_links_in_content_only != 'undefined') &&
+ (external_links_in_content_only == false)) {
+ links = document.getElementsByTagName('a');
+ for (i=0; i < links.length; i++) {
+ if ( (links[i].getAttribute('href'))
+ && (links[i].className.indexOf('link-plain')==-1) ) {
+ var linkval = links[i].getAttribute('href');
+
+ // check if the link href is a relative link, or an absolute link to
+ // the current host.
+ if (linkval.toLowerCase().indexOf(window.location.protocol
+ + '//'
+ + window.location.host)==0) {
+ // absolute link internal to our host - do nothing
+ } else if (linkval.indexOf('http:') != 0) {
+ // not a http-link. Possibly an internal relative link, but also
+ // possibly a mailto or other protocol add tests for relevant
+ // protocols as you like.
+ // do nothing
+ } else {
+ // we are in here if the link points to somewhere else than our
+ // site.
+ links[i].setAttribute('target', '_blank');
+ }
+ }
+ }
+ }
+
contentarea = getContentArea();
- if (!contentarea) { return false; }
+ if (!contentarea)
+ return false;
links = contentarea.getElementsByTagName('a');
for (i=0; i < links.length; i++) {
@@ -45,10 +77,14 @@
// we do not want to mess with those links that already have
// images in them
wrapNode(links[i], 'span', 'link-external');
- // uncomment the next line if you want external links to be
- // opened in a new window.
- // links[i].setAttribute('target', '_blank');
}
+ // set open_links_in_external_window in plone_javascript_variables.js.pt
+ // to true if you want external links to be opened in a new
+ // window.
+ if ((typeof external_links_open_new_window != 'undefined') &&
+ (external_links_open_new_window == true)) {
+ links[i].setAttribute('target', '_blank');
+ }
}
}
}
Modified: zope-cmfplone/trunk/skins/plone_ecmascript/plone_javascript_variables.js.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_ecmascript/plone_javascript_variables.js.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_ecmascript/plone_javascript_variables.js.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -4,4 +4,10 @@
var portal_url = '<tal:block replace="here/portal_url" />';
var form_modified_message = '<tal:block tal:replace="python: here.translate('text_form_modified_message', default='Your form has not been saved. All changes you have made will be lost.', escape_for_js=True)" />';
var form_resubmit_message = '<tal:block tal:replace="python: here.translate('text_form_resubmit_message', default='Your already clicked the submit button. Do you really want to submit this form again?', escape_for_js=True)" />';
+
+// the following are flags for mark_special_links.js
+// links get the target="_blank" attribute
+var external_links_open_new_window = false;
+// apply only to links in content area (id="content" or id="region-content")
+var external_links_in_content_only = true;
</metal:block>
\ No newline at end of file
Modified: zope-cmfplone/trunk/skins/plone_ecmascript/register_function.js
===================================================================
--- zope-cmfplone/trunk/skins/plone_ecmascript/register_function.js 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_ecmascript/register_function.js 2007-02-09 14:39:12 UTC (rev 655)
@@ -72,7 +72,7 @@
if (typeof addDOMLoadEvent != 'undefined') {
registerPloneFunction = function (func) {
// registers a function to fire ondomload.
- registerEventListener(window, "domload", func);
+ addDOMLoadEvent(func);
}
} else {
registerPloneFunction = function (func) {
Modified: zope-cmfplone/trunk/skins/plone_ecmascript/testHighlightsearchterms.js
===================================================================
--- zope-cmfplone/trunk/skins/plone_ecmascript/testHighlightsearchterms.js 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_ecmascript/testHighlightsearchterms.js 2007-02-09 14:39:12 UTC (rev 655)
@@ -42,6 +42,10 @@
this.sandbox.appendChild(testnode);
}
+ this.testEndlessLoop = function() {
+ highlightSearchTerms(['','site:plone.org','plone','rules'], this.sandbox)
+ }
+
this.tearDown = function() {
clearChildNodes(this.sandbox);
}
Modified: zope-cmfplone/trunk/skins/plone_form_scripts/enableSyndication.cpy
===================================================================
--- zope-cmfplone/trunk/skins/plone_form_scripts/enableSyndication.cpy 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_form_scripts/enableSyndication.cpy 2007-02-09 14:39:12 UTC (rev 655)
@@ -9,6 +9,7 @@
##parameters=
from Products.CMFPlone import PloneMessageFactory as _
+from Products.CMFPlone.utils import safe_unicode
if context.portal_syndication.isSiteSyndicationAllowed():
context.portal_syndication.enableSyndication(context)
@@ -17,7 +18,7 @@
message=_(u'Syndication not allowed')
from Products.CMFPlone.utils import transaction_note
-transaction_note('%s for %s at %s' % (message, unicode(context.title_or_id(), 'utf-8'), context.absolute_url()))
+transaction_note('%s for %s at %s' % (message, safe_unicode(context.title_or_id()), context.absolute_url()))
context.plone_utils.addPortalMessage(message)
return state
Modified: zope-cmfplone/trunk/skins/plone_form_scripts/send_feedback.cpy
===================================================================
--- zope-cmfplone/trunk/skins/plone_form_scripts/send_feedback.cpy 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_form_scripts/send_feedback.cpy 2007-02-09 14:39:12 UTC (rev 655)
@@ -15,17 +15,15 @@
from Products.CMFPlone import PloneMessageFactory as _
from ZODB.POSException import ConflictError
-##
## This may change depending on the called (portal_feedback or author)
state_success = "success"
state_failure = "failure"
-
plone_utils = getToolByName(context, 'plone_utils')
mtool = getToolByName(context, 'portal_membership')
+urltool = getToolByName(context, 'portal_url')
+portal = urltool.getPortalObject()
-site_properties = getToolByName(context, 'portal_properties').site_properties
-
## make these arguments?
referer = REQUEST.get('referer', 'unknown referer')
subject = REQUEST.get('subject', '')
@@ -33,12 +31,10 @@
author = REQUEST.get('author', None) # None means portal administrator
sender = mtool.getAuthenticatedMember()
+envelope_from = portal.getProperty('email_from_address')
-site_properties = getToolByName(context, 'portal_properties').site_properties
-envelope_from = site_properties.email_from_address
-
if author is None:
- send_to_address = site_properties.email_from_address
+ send_to_address = portal.getProperty('email_from_address')
else:
send_to_address = mtool.getMemberById(author).getProperty('email')
state_success = "success_author"
@@ -52,7 +48,7 @@
# happens if you don't exist as user in the portal (but at a higher level)
# or if your memberdata is incomplete.
# Would be nicer to check in the feedback form, but that's hard to do securely
- context.plone_utils.addPortalMessage(_(u'Could not find a valid email address'))
+ plone_utils.addPortalMessage(_(u'Could not find a valid email address'))
return state.set(status=state_failure)
sender_id = "%s (%s), %s" % (sender.getProperty('fullname'), sender.getId(), send_from_address)
@@ -77,10 +73,10 @@
except ConflictError:
raise
except: # TODO Too many things could possibly go wrong. So we catch all.
- exception = context.plone_utils.exceptionString()
+ exception = plone_utils.exceptionString()
message = _(u'Unable to send mail: ${exception}',
mapping={u'exception' : exception})
- context.plone_utils.addPortalMessage(message)
+ plone_utils.addPortalMessage(message)
return state.set(status=state_failure)
tmsg='Sent feedback from %s to %s' % ('x', 'y')
@@ -90,5 +86,5 @@
REQUEST.set('message', None)
REQUEST.set('subject', None)
-context.plone_utils.addPortalMessage(_(u'Mail sent.'))
+plone_utils.addPortalMessage(_(u'Mail sent.'))
return state
Modified: zope-cmfplone/trunk/skins/plone_form_scripts/send_feedback_site.cpy
===================================================================
--- zope-cmfplone/trunk/skins/plone_form_scripts/send_feedback_site.cpy 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_form_scripts/send_feedback_site.cpy 2007-02-09 14:39:12 UTC (rev 655)
@@ -20,24 +20,20 @@
state_success = "success"
state_failure = "failure"
-
plone_utils = getToolByName(context, 'plone_utils')
-mtool = getToolByName(context, 'portal_membership')
+urltool = getToolByName(context, 'portal_url')
+portal = urltool.getPortalObject()
+url = urltool()
-site_properties = getToolByName(context, 'portal_properties').site_properties
-
## make these arguments?
subject = REQUEST.get('subject', '')
message = REQUEST.get('message', '')
sender_from_address = REQUEST.get('sender_from_address', '')
sender_fullname = REQUEST.get('sender_fullname', '')
-url = context.portal_url
+send_to_address = portal.getProperty('email_from_address')
+envelope_from = portal.getProperty('email_from_address')
-site_properties = getToolByName(context, 'portal_properties').site_properties
-send_to_address = site_properties.email_from_address
-envelope_from = site_properties.email_from_address
-
state.set(status=state_success) ## until proven otherwise
host = context.MailHost # plone_utils.getMailHost() (is private)
@@ -56,10 +52,10 @@
except ConflictError:
raise
except: # TODO Too many things could possibly go wrong. So we catch all.
- exception = context.plone_utils.exceptionString()
+ exception = plone_utils.exceptionString()
message = _(u'Unable to send mail: ${exception}',
mapping={u'exception' : exception})
- context.plone_utils.addPortalMessage(message)
+ plone_utils.addPortalMessage(message)
return state.set(status=state_failure)
## clear request variables so form is cleared as well
@@ -68,5 +64,5 @@
REQUEST.set('sender_from_address', None)
REQUEST.set('sender_fullname', None)
-context.plone_utils.addPortalMessage(_(u'Mail sent.'))
+plone_utils.addPortalMessage(_(u'Mail sent.'))
return state
Modified: zope-cmfplone/trunk/skins/plone_form_scripts/sendto.cpy
===================================================================
--- zope-cmfplone/trunk/skins/plone_form_scripts/sendto.cpy 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_form_scripts/sendto.cpy 2007-02-09 14:39:12 UTC (rev 655)
@@ -20,7 +20,6 @@
mtool = getToolByName(context, 'portal_membership')
site_properties = getToolByName(context, 'portal_properties').site_properties
pretty_title_or_id = plone_utils.pretty_title_or_id
-empty_title = plone_utils.getEmptyTitle()
if not mtool.checkPermission(AllowSendto, context):
context.plone_utils.addPortalMessage(_(u'You are not allowed to send this link.'))
Modified: zope-cmfplone/trunk/skins/plone_forms/content_status_history.cpt
===================================================================
--- zope-cmfplone/trunk/skins/plone_forms/content_status_history.cpt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_forms/content_status_history.cpt 2007-02-09 14:39:12 UTC (rev 655)
@@ -47,7 +47,7 @@
<p i18n:translate="description_publishing_process">
An item's status (also called its review state) determines who
- can see it. A <strong>private</strong> item can only be
+ can see it. A <strong>private</strong> item can only be
viewed by its Owner and by the site management. Only
<strong>published</strong> items are available to the general
user base and anonymous visitors. To make an item published,
@@ -58,7 +58,7 @@
Another way to control the visibility of an item is with its
<strong>effective date</strong>. An item is not publicly
searchable before its effective date, <em>even if its status is
- <strong>published</strong></em>. This will prevent the item
+ <strong>published</strong></em>. This will prevent the item
from showing up in portlets (or any other templates fed by catalog
queries), although the item will still be available if accessed
directly via URL.
@@ -111,7 +111,7 @@
<div class="formHelp"
i18n:translate="help_effective_date">
The date when the item will be available (of course it
- needs to be published too). If no date is selected the
+ needs to be published too). If no date is selected the
item will be effective immediately.
</div>
Modified: zope-cmfplone/trunk/skins/plone_forms/discussion_reply_form.cpt
===================================================================
--- zope-cmfplone/trunk/skins/plone_forms/discussion_reply_form.cpt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_forms/discussion_reply_form.cpt 2007-02-09 14:39:12 UTC (rev 655)
@@ -66,7 +66,8 @@
<legend i18n:translate="legend_add_comment">Add comment</legend>
<p i18n:translate="description_add_comment">
- You can add a comment by filling out the form below. Plain text formatting.
+ You can add a comment by filling out the form below. Plain text
+ formatting.
</p>
<input type="hidden" name="Creator" value=""
@@ -78,9 +79,10 @@
<tal:block replace="structure here/info.gif"/>
<p i18n:translate="legend_note_reply_anonymous">
- Note: you are not logged in. You may optionally enter your username
- and password below. If you don't enter your username and
- password below, this comment will be posted as the 'Anonymous User'.
+ Note: you are not logged in. You may optionally enter your
+ username and password below. If you don't enter your
+ username and password below, this comment will be posted as
+ the 'Anonymous User'.
</p>
<div class="field">
Modified: zope-cmfplone/trunk/skins/plone_forms/folder_localrole_form.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_forms/folder_localrole_form.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_forms/folder_localrole_form.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -393,7 +393,7 @@
tabindex=""
tal:attributes="tabindex tabindex/next;">
<option value="fullname" i18n:translate="label_fullname">
- User Full Name
+ Full Name
</option>
<option value="login" i18n:translate="label_login_name">
Login Name
Modified: zope-cmfplone/trunk/skins/plone_forms/history_form.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_forms/history_form.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_forms/history_form.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -55,7 +55,7 @@
<metal:block tal:condition="not: has_history">
<h2 i18n:translate="label_historical_unavailable">Historical not available</h2>
<span tal:omit-tag="" i18n:translate="description_historical_unavailable">
- This class does not support the historical interface. The content must
+ This class does not support the historical interface. The content must
mix-in OFS.History.Historical
</span>
</metal:block>
Modified: zope-cmfplone/trunk/skins/plone_forms/member_search_form.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_forms/member_search_form.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_forms/member_search_form.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -38,6 +38,23 @@
tal:attributes="tabindex tabindex/next;"
/>
</div>
+
+ <div class="field">
+ <label for="fullname"
+ i18n:translate="label_fullname">Full Name</label>
+
+ <div class="formHelp" i18n:translate="help_search_fullname">
+ Return users with full names containing this value.
+ </div>
+
+ <input type="text"
+ id="fullname"
+ name="fullname"
+ size="25"
+ tabindex=""
+ tal:attributes="tabindex tabindex/next;"
+ />
+ </div>
<div class="field">
<label for="email"
Modified: zope-cmfplone/trunk/skins/plone_forms/member_search_results.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_forms/member_search_results.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_forms/member_search_results.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -26,7 +26,7 @@
<div>
<metal:block tal:repeat="result batch">
- <div class="card" tal:define="userid result/getUserId;
+ <div class="card" tal:define="userid result/getMemberId;
home python:container.portal_membership.getHomeUrl(userid, verifyPermission=1);
portrait python: here.portal_membership.getPersonalPortrait(userid);">
<a href="#" tal:attributes="href home">
Modified: zope-cmfplone/trunk/skins/plone_forms/undo_form.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_forms/undo_form.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_forms/undo_form.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -32,7 +32,7 @@
<p i18n:translate="description_undo_action_select">
Select one or more transactions below and then click on the "Undo"
- button to undo the transactions. Note that even though a transaction
+ button to undo the transactions. Note that even though a transaction
is shown below, you will not be able to undo it if later transactions
modified objects that were modified by the transaction.
</p>
Modified: zope-cmfplone/trunk/skins/plone_images/add_icon.gif
===================================================================
(Binary files differ)
Modified: zope-cmfplone/trunk/skins/plone_login/enabling_cookies.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_login/enabling_cookies.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_login/enabling_cookies.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -50,7 +50,7 @@
<ol>
<li i18n:translate="text_moz_cookies_step1">Click Edit on the menu at the top of your browser and select Preferences</li>
- <li i18n:translate="text_moz_cookies_step2">Find "Privacy & Security" in the menu on the left. If there is a [+] to the left of "Privacy & Security", click it.</li>
+ <li i18n:translate="text_moz_cookies_step2">Find "Privacy & Security" in the menu on the left. If there is a [+] to the left of "Privacy & Security", click it.</li>
<li i18n:translate="text_moz_cookies_step3">Select "Cookies".</li>
<li i18n:translate="text_moz_cookies_step4">Select "Enable cookies for the originating web site only" or "Enable all cookies" and click "OK"</li>
</ol>
@@ -68,7 +68,7 @@
<ol>
<li i18n:translate="text_netscape6_cookies_step1">Click Edit on the menu at the top of your browser and select Preferences</li>
- <li i18n:translate="text_netscape6_cookies_step2">Find "Privacy & Security" in the menu on the left. If there is a triangle pointing to the right next to Privacy & Security, click it.</li>
+ <li i18n:translate="text_netscape6_cookies_step2">Find "Privacy & Security" in the menu on the left. If there is a triangle pointing to the right next to Privacy & Security, click it.</li>
<li i18n:translate="text_netscape6_cookies_step3">Select "Cookies" under "Privacy & Security"</li>
<li i18n:translate="text_netscape6_cookies_step4">Select "Enable cookies for the originating web site only" or "Enable all cookies" and click "OK"</li>
</ol>
Modified: zope-cmfplone/trunk/skins/plone_login/insufficient_privileges.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_login/insufficient_privileges.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_login/insufficient_privileges.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -10,12 +10,12 @@
<h1 i18n:translate="heading_no_privileges">Insufficient Privileges</h1>
<p i18n:translate="description_no_privileges">
- You do not have sufficient privileges to view this page. If you believe
+ You do not have sufficient privileges to view this page. If you believe
you are receiving this message in error, please send an e-mail to
</p>
<a tal:replace="structure python: here.spamProtect(site_properties.email_from_address)" />.
-
+
</div>
</div>
Modified: zope-cmfplone/trunk/skins/plone_login/login_failed.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_login/login_failed.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_login/login_failed.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -37,7 +37,7 @@
<ul>
<li i18n:translate="description_still_failure_reason1">
You may be running web filtering software that
- disables cookies. If so, you will need to configure the
+ disables cookies. If so, you will need to configure the
software so that it enables you to accept cookies from
<span tal:content="utool" tal:omit-tag="" i18n:name="url">url</span>
</li>
Modified: zope-cmfplone/trunk/skins/plone_prefs/personalize_form.cpt
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/personalize_form.cpt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/personalize_form.cpt 2007-02-09 14:39:12 UTC (rev 655)
@@ -63,9 +63,19 @@
tal:condition="member"
tal:attributes="action template_id">
- <fieldset>
+ <fieldset tal:define="macros here/additional_memberdata/macros | nothing;
+ top_macro macros/top | nothing;
+ showTop python:top_macro;
+ bottom_macro macros/bottom | nothing;
+ showBottom python:bottom_macro;
+ after_primary macros/after_primary| nothing;
+ showAfterPrimary python:after_primary;">
<legend i18n:translate="legend_personal_details">Personal Details</legend>
+
+ <tal:macro condition="showTop">
+ <div metal:use-macro="top_macro"/>
+ </tal:macro>
<div class="field"
tal:define="error errors/fullname | nothing;
@@ -114,7 +124,11 @@
/>
</div>
-
+
+ <tal:macro condition="showAfterPrimary">
+ <div metal:use-macro="after_primary"/>
+ </tal:macro>
+
<div class="field"
tal:define="error errors/location | nothing;
location python:request.get('location', member.getProperty('location', ''));"
@@ -397,7 +411,11 @@
<label for="pdelete" i18n:translate="label_delete_portrait">Delete Portrait</label>
</div>
-
+
+ <tal:macro condition="showBottom">
+ <div metal:use-macro="bottom_macro" />
+ </tal:macro>
+
<div class="formControls">
<input class="context"
tabindex=""
Modified: zope-cmfplone/trunk/skins/plone_prefs/prefs_error_log_form.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/prefs_error_log_form.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/prefs_error_log_form.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -21,7 +21,7 @@
<p i18n:translate="description_error_log_setup">
This page lists the exceptions that have occurred in this site
- recently. You can configure how many exceptions should be kept
+ recently. You can configure how many exceptions should be kept
and whether the exceptions should be copied to Zope's event log
file(s).
</p>
Modified: zope-cmfplone/trunk/skins/plone_prefs/prefs_error_log_showEntry.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/prefs_error_log_showEntry.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/prefs_error_log_showEntry.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -25,7 +25,9 @@
<div tal:define="entry python:here.error_log.getLogEntryById(request.get('id'))">
<em tal:condition="not:entry">
- <span i18n:translate="text_errlog_notfound"> The specified log entry was not found. It may have expired.</span>
+ <span i18n:translate="text_errlog_notfound">
+ The specified log entry was not found. It may have expired.
+ </span>
</em>
<div tal:condition="entry">
Modified: zope-cmfplone/trunk/skins/plone_prefs/prefs_group_edit.py
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/prefs_group_edit.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/prefs_group_edit.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -14,7 +14,12 @@
msg = _(u'No changes done.')
if addname:
- context.portal_groups.addGroup(addname,(),())
+ success = context.portal_groups.addGroup(addname,(),())
+ if not success:
+ msg = _(u'Could not add group ${name}, perhaps a member or group with '
+ u'this name already exists.', mapping={u'name' : addname})
+ context.plone_utils.addPortalMessage(msg)
+ return context.prefs_group_details()
group=context.portal_groups.getGroupById(addname)
msg = _(u'Group ${name} has been added.',
mapping={u'name' : addname})
Modified: zope-cmfplone/trunk/skins/plone_prefs/prefs_group_members.cpt
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/prefs_group_members.cpt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/prefs_group_members.cpt 2007-02-09 14:39:12 UTC (rev 655)
@@ -134,7 +134,8 @@
<a href="" tal:attributes="href string:prefs_group_details?groupname=${this_user/getGroupName}"
tal:content="this_user/getGroupTitleOrName | default">
<span i18n:translate="link_groupname_not_available">
- groupname not available</span>
+ groupname not available
+ </span>
</a>
</td>
</tal:block>
@@ -145,7 +146,8 @@
<a href="" tal:attributes="href string:prefs_user_details?userid=${this_user/getId}"
tal:content="this_user/getUserName | default">
<span i18n:translate="link_username_not_available">
- username not available</span>
+ username not available
+ </span>
</a>
</td>
</tal:block>
Modified: zope-cmfplone/trunk/skins/plone_prefs/prefs_main_template.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/prefs_main_template.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/prefs_main_template.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,8 +1,6 @@
<metal:page define-macro="master">
<tal:block metal:use-macro="here/main_template/macros/master">
-
-
<head metal:use-macro="here/header/macros/html_header">
<metal:fillbase fill-slot="base">
@@ -12,7 +10,8 @@
<metal:headslot fill-slot="head_slot">
<metal:headslot define-slot="head_slot" />
- <tal:override-slot define="global sl python:True" />
+ <tal:override-slot define="global sl python:True;
+ global hidecolumns string:visualColumnHideTwo" />
</metal:headslot>
<metal:cssslot fill-slot="css_slot">
@@ -25,7 +24,6 @@
</head>
-
<metal:block fill-slot="top_slot"
tal:define="dummy python:request.set('disable_border',1)" />
Modified: zope-cmfplone/trunk/skins/plone_prefs/prefs_navigation_form.cpt
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/prefs_navigation_form.cpt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/prefs_navigation_form.cpt 2007-02-09 14:39:12 UTC (rev 655)
@@ -57,7 +57,6 @@
prefer manually constructing this part of the navigation.
</div>
</div>
-
<div class="field"
tal:define="value python:navtree_props.getProperty('name', None);
value request/name|value;
@@ -82,8 +81,29 @@
tal:attributes="value value;"/>
<div tal:content="error">Validation error output</div>
</div>
-
<div class="field"
+ tal:define="value python:navtree_props.getProperty('includeTop', False);
+ value request/includeTop|value;
+ error errors/includeTop|nothing"
+ tal:attributes="class python:test(error, 'field error', 'field')">
+
+ <input type="checkbox"
+ class="noborder"
+ id="cb_include_top"
+ name="includeTop"
+ value="1"
+ tal:attributes="checked python:test(value, 'checked', None)" />
+ <label for="cb_include_top"
+ i18n:translate="label_include_top_enable">
+ Include top level navigation link
+ </label>
+
+ <div class="formHelp" i18n:translate="help_include_top">
+ By default, a 'Home' link is generated that points to the root of your site. You can turn this off if you
+ prefer not to display it.
+ </div>
+ </div>
+ <div class="field"
tal:define="value python:navtree_props.getProperty('root', None);
value request/root|value;
error errors/root|nothing"
Modified: zope-cmfplone/trunk/skins/plone_prefs/prefs_navigation_set.cpy
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/prefs_navigation_set.cpy 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/prefs_navigation_set.cpy 2007-02-09 14:39:12 UTC (rev 655)
@@ -5,7 +5,7 @@
##bind script=script
##bind state=state
##bind subpath=traverse_subpath
-##parameters=generated_tabs=False, portaltypes=[], enable_wf_state_filtering=False, wf_states_to_show=[], bottomLevel=0, name='Navigation', root='/', currentFolderOnlyInNavtree=False, topLevel=0, RESPONSE=None
+##parameters=generated_tabs=False, portaltypes=[], enable_wf_state_filtering=False, wf_states_to_show=[], bottomLevel=0, name='Navigation', root='/', currentFolderOnlyInNavtree=False, topLevel=0, includeTop=False, RESPONSE=None
##title=Set Navigation Prefs
##
@@ -36,7 +36,8 @@
root=root,
currentFolderOnlyInNavtree=currentFolderOnlyInNavtree,
topLevel=topLevel,
- bottomLevel=bottomLevel)
+ bottomLevel=bottomLevel,
+ includeTop=includeTop)
context.plone_utils.addPortalMessage(_(u'Navigation settings updated.'))
return state
Modified: zope-cmfplone/trunk/skins/plone_prefs/prefs_search_macros.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/prefs_search_macros.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/prefs_search_macros.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -89,7 +89,8 @@
<a href="" tal:attributes="href string:prefs_group_details?groupname=${obj/getGroupName}"
tal:content="obj/getGroupName | default">
<span i18n:translate="link_groupname_not_available">
- groupname not available</span>
+ groupname not available
+ </span>
</a>
</tal:block>
<tal:block tal:condition="not:obj/getGroupName | nothing">
@@ -97,7 +98,8 @@
<a href="" tal:attributes="href string:prefs_user_details?userid=${obj/getId}"
tal:content="obj/getUserName | default">
<span i18n:translate="link_username_not_available">
- username not available</span>
+ username not available
+ </span>
</a>
</tal:block>
</td>
Modified: zope-cmfplone/trunk/skins/plone_prefs/prefs_user_details.cpt
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/prefs_user_details.cpt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/prefs_user_details.cpt 2007-02-09 14:39:12 UTC (rev 655)
@@ -75,9 +75,21 @@
tal:condition="user | nothing"
tal:attributes="action template_id">
- <fieldset>
+ <fieldset tal:define="macros here/additional_memberdata/macros | nothing;
+ top_macro macros/top | nothing;
+ showTop python:top_macro;
+ bottom_macro macros/bottom | nothing;
+ showBottom python:bottom_macro;
+ after_primary macros/after_primary| nothing;
+ showAfterPrimary python:after_primary;">
+
<legend i18n:translate="legend_member_details">User Details</legend>
+ <tal:macro condition="showTop">
+ <div metal:use-macro="top_macro"/>
+ </tal:macro>
+
+
<input type="hidden" name="userid" value="username"
tal:attributes="value member/getId" />
@@ -133,6 +145,10 @@
/>
</div>
+ <tal:macro condition="showAfterPrimary">
+ <div metal:use-macro="after_primary"/>
+ </tal:macro>
+
<div class="field"
tal:define="error errors/location | nothing;
location python:request.get('location', member.getProperty('location', ''));"
@@ -355,7 +371,10 @@
</div>
-
+ <tal:macro condition="showBottom">
+ <div metal:use-macro="bottom_macro" />
+ </tal:macro>
+
<div class="formControls">
<input class="context"
tabindex=""
Modified: zope-cmfplone/trunk/skins/plone_prefs/prefs_users_overview.cpt
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/prefs_users_overview.cpt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/prefs_users_overview.cpt 2007-02-09 14:39:12 UTC (rev 655)
@@ -56,7 +56,7 @@
<p i18n:translate="description_user_management">
Click the user's name to see and change the details of a
specific user. Click the envelope icon to send a mail to
- the user. You can also edit the e-mail addresses, and
+ the user. You can also edit the e-mail addresses, and
add/remove users.
</p>
<p i18n:translate="user_role_note">
Modified: zope-cmfplone/trunk/skins/plone_prefs/reconfig_form.cpt
===================================================================
--- zope-cmfplone/trunk/skins/plone_prefs/reconfig_form.cpt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_prefs/reconfig_form.cpt 2007-02-09 14:39:12 UTC (rev 655)
@@ -206,7 +206,7 @@
Determines if your Plone is optimized for small or large
sites. In environments with a lot of users and/or groups it
can be very slow or impossible to build a list all users or
- groups. This option tunes the user interface and behaviour
+ groups. This option tunes the user interface and behaviour
of Plone for this case by allowing you to search for
users/groups instead of listing all of them.
</div>
Modified: zope-cmfplone/trunk/skins/plone_scripts/check_id.py
===================================================================
--- zope-cmfplone/trunk/skins/plone_scripts/check_id.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_scripts/check_id.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -31,6 +31,7 @@
from ZODB.POSException import ConflictError
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone import PloneMessageFactory as _
+from Products.CMFPlone.utils import base_hasattr
# if an alternative id has been supplied, see if we need to use it
@@ -99,13 +100,28 @@
except Unauthorized:
return # nothing we can do
- if hasattr(contained_by, 'contentIds'):
+ # Check for an existing object. If it is a content object, then we don't
+ # try to replace it; there may be other attributes we shouldn't replace,
+ # but because there are some always replaceable attributes, this is the
+ # only type of filter we can reasonably expect to work.
+ exists = False
+ # Optimization for BTreeFolders
+ if base_hasattr(contained_by, 'has_key'):
+ exists = contained_by.has_key(id)
+ # Otherwise check object ids (using getattr can trigger Unauth exceptions)
+ elif base_hasattr(contained_by, 'objectIds'):
+ exists = id in contained_by.objectIds()
+ if exists:
try:
- if id in contained_by.contentIds():
+ existing_obj = getattr(contained_by, id, None)
+ if base_hasattr(existing_obj, 'portal_type'):
return _(u'There is already an item named ${name} in this folder.',
- mapping={u'name' : id})
+ mapping={u'name' : id})
except Unauthorized:
- pass # ignore if we don't have permission
+ # If we cannot access the object it is safe to assume we cannot
+ # replace it
+ return _(u'There is already an item named ${name} in this folder.',
+ mapping={u'name' : id})
if hasattr(contained_by, 'checkIdAvailable'):
try:
Modified: zope-cmfplone/trunk/skins/plone_scripts/computeRoleMap.py
===================================================================
--- zope-cmfplone/trunk/skins/plone_scripts/computeRoleMap.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_scripts/computeRoleMap.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -55,5 +55,3 @@
result = [a[-1] for a in dec_users]
return result
-
-
Modified: zope-cmfplone/trunk/skins/plone_scripts/folder_rename.cpy
===================================================================
--- zope-cmfplone/trunk/skins/plone_scripts/folder_rename.cpy 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_scripts/folder_rename.cpy 2007-02-09 14:39:12 UTC (rev 655)
@@ -12,6 +12,7 @@
from Products.CMFPlone.utils import transaction_note
from Products.CMFPlone import PloneMessageFactory as _
from ZODB.POSException import ConflictError
+from Products.PythonScripts.standard import url_unquote
portal = context.portal_url.getPortalObject()
failed = {}
@@ -43,7 +44,8 @@
# care that the user is not redirected to the object
# with the original id but with the new id.
newObjPath = parent[new_id].absolute_url_path()
- orig_template = orig_template.replace(origPath, newObjPath)
+ orig_template = orig_template.replace(url_unquote(origPath),
+ newObjPath)
request.set('orig_template', orig_template)
message = "Renamed '%s' to '%s'" % (id, new_id)
else:
Modified: zope-cmfplone/trunk/skins/plone_scripts/getEventString.py
===================================================================
--- zope-cmfplone/trunk/skins/plone_scripts/getEventString.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_scripts/getEventString.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,12 +1,10 @@
##parameters=event
from Products.CMFCore.utils import getToolByName
+from Products.CMFPlone.utils import safe_unicode
-plone_utils = getToolByName(context, 'plone_utils')
-encoding = plone_utils.getSiteEncoding()
-
start = event['start'] and ':'.join(event['start'].split(':')[:2]) or ''
end = event['end'] and ':'.join(event['end'].split(':')[:2]) or ''
-title = unicode(event['title'], encoding) or 'event'
+title = safe_unicode(event['title']) or 'event'
if start and end:
eventstring = "%s-%s %s" % (start, end, title)
Modified: zope-cmfplone/trunk/skins/plone_scripts/hasIndexHtml.py
===================================================================
--- zope-cmfplone/trunk/skins/plone_scripts/hasIndexHtml.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_scripts/hasIndexHtml.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -7,17 +7,20 @@
##bind subpath=traverse_subpath
##parameters=
from AccessControl import Unauthorized
+from Products.CMFPlone.utils import base_hasattr
# It's silly but because this is often called on the parent folder, we must
# ensure we have permission.
try:
if not context.isPrincipiaFolderish:
return False
except Unauthorized:
- return False
+ return False
-if 'index_html' in context.objectIds():
+# Use the BTreeFolder API if possible
+if base_hasattr(context, 'has_key'):
+ # BTreeFolder's has_key returns numeric values
+ return context.has_key('index_html') and True or False
+elif 'index_html' in context.objectIds():
return True
else:
return False
-
-
Modified: zope-cmfplone/trunk/skins/plone_scripts/livesearch_reply.py
===================================================================
--- zope-cmfplone/trunk/skins/plone_scripts/livesearch_reply.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_scripts/livesearch_reply.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -9,7 +9,9 @@
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone import PloneMessageFactory as _
+from Products.CMFPlone.utils import safe_unicode
from Products.PythonScripts.standard import url_quote
+from Products.PythonScripts.standard import url_quote_plus
ploneUtils = getToolByName(context, 'plone_utils')
pretty_title_or_id = ploneUtils.pretty_title_or_id
@@ -59,10 +61,14 @@
r = quote_bad_chars(r)+'*'
searchterms = url_quote(r.replace(' ','+'))
+site_encoding = context.plone_utils.getSiteEncoding()
+
results = catalog(SearchableText=r, portal_type=friendly_types)
+searchterm_query = '?searchterm=%s'%url_quote_plus(q)
+
RESPONSE = context.REQUEST.RESPONSE
-RESPONSE.setHeader('Content-Type', 'text/xml;charset=%s' % context.plone_utils.getSiteEncoding())
+RESPONSE.setHeader('Content-Type', 'text/xml;charset=%s' % site_encoding)
# replace named entities with their numbered counterparts, in the xml the named ones are not correct
# ↓ --> ↓
@@ -74,56 +80,64 @@
ts = getToolByName(context, 'translation_service')
+output = []
+
+def write(s):
+ output.append(safe_unicode(s))
+
+
if not results:
- print '''<fieldset class="livesearchContainer">'''
- print '''<legend id="livesearchLegend">%s</legend>''' % ts.translate(legend_livesearch)
- print '''<div class="LSIEFix">'''
- print '''<div id="LSNothingFound">%s</div>''' % ts.translate(label_no_results_found)
- print '''<div class="LSRow">'''
- print '<a href="search_form" style="font-weight:normal">%s</a>' % ts.translate(label_advanced_search)
- print '''</div>'''
- print '''</div>'''
- print '''</fieldset>'''
+ write('''<fieldset class="livesearchContainer">''')
+ write('''<legend id="livesearchLegend">%s</legend>''' % ts.translate(legend_livesearch))
+ write('''<div class="LSIEFix">''')
+ write('''<div id="LSNothingFound">%s</div>''' % ts.translate(label_no_results_found))
+ write('''<div class="LSRow">''')
+ write('<a href="search_form" style="font-weight:normal">%s</a>' % ts.translate(label_advanced_search))
+ write('''</div>''')
+ write('''</div>''')
+ write('''</fieldset>''')
else:
- print '''<fieldset class="livesearchContainer">'''
- print '''<legend id="livesearchLegend">%s</legend>''' % ts.translate(legend_livesearch)
- print '''<div class="LSIEFix">'''
- print '''<ul class="LSTable">'''
+ write('''<fieldset class="livesearchContainer">''')
+ write('''<legend id="livesearchLegend">%s</legend>''' % ts.translate(legend_livesearch))
+ write('''<div class="LSIEFix">''')
+ write('''<ul class="LSTable">''')
for result in results[:limit]:
itemUrl = result.getURL()
if result.portal_type in useViewAction:
itemUrl += '/view'
+ itemUrl = itemUrl + searchterm_query
- print '''<li class="LSRow">''',
- print '''<img src="%s"/>''' % result.getIcon,
- full_title = pretty_title_or_id(result)
- if len(full_title) >= MAX_TITLE:
+ write('''<li class="LSRow">''')
+ write('''<img src="%s"/>''' % result.getIcon)
+ full_title = safe_unicode(pretty_title_or_id(result))
+ if len(full_title) > MAX_TITLE:
display_title = ''.join((full_title[:MAX_TITLE],'...'))
else:
display_title = full_title
- print '''<a href="%s" title="%s">%s</a>''' % (itemUrl, full_title, display_title)
- print '''<span class="discreet">[%s%%]</span>''' % result.data_record_normalized_score_
- display_description = result.Description
- if len(display_description) >= MAX_DESCRIPTION:
+ full_title = full_title.replace('"', '"')
+ write('''<a href="%s" title="%s">%s</a>''' % (itemUrl, full_title, display_title))
+ write('''<span class="discreet">[%s%%]</span>''' % result.data_record_normalized_score_)
+ display_description = safe_unicode(result.Description)
+ if len(display_description) > MAX_DESCRIPTION:
display_description = ''.join((display_description[:MAX_DESCRIPTION],'...'))
- print '''<div class="discreet" style="margin-left: 2.5em;">%s</div>''' % (display_description)
- print '''</li>'''
+ write('''<div class="discreet" style="margin-left: 2.5em;">%s</div>''' % (display_description))
+ write('''</li>''')
full_title, display_title, display_description = None, None, None
- print '''<li class="LSRow">'''
- print '<a href="search_form" style="font-weight:normal">%s</a>' % ts.translate(label_advanced_search)
- print '''</li>'''
+ write('''<li class="LSRow">''')
+ write( '<a href="search_form" style="font-weight:normal">%s</a>' % ts.translate(label_advanced_search))
+ write('''</li>''')
if len(results)>limit:
# add a more... row
- print '''<li class="LSRow">'''
- print '<a href="%s" style="font-weight:normal">%s</a>' % ('search?SearchableText=' + searchterms, ts.translate(label_show_all))
- print '''</li>'''
- print '''</ul>'''
- print '''</div>'''
- print '''</fieldset>'''
+ write('''<li class="LSRow">''')
+ write( '<a href="%s" style="font-weight:normal">%s</a>' % ('search?SearchableText=' + searchterms, ts.translate(label_show_all)))
+ write('''</li>''')
+ write('''</ul>''')
+ write('''</div>''')
+ write('''</fieldset>''')
-return printed
+return '\n'.join(output).encode(site_encoding)
Modified: zope-cmfplone/trunk/skins/plone_scripts/selectedTabs.py
===================================================================
--- zope-cmfplone/trunk/skins/plone_scripts/selectedTabs.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_scripts/selectedTabs.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -17,7 +17,7 @@
request = context.REQUEST
valid_actions = []
-url = request['ACTUAL_URL']
+url = request['URL']
path = url[len(plone_url):]
for action in portal_tabs:
Modified: zope-cmfplone/trunk/skins/plone_styles/IEFixes.css.dtml
===================================================================
--- zope-cmfplone/trunk/skins/plone_styles/IEFixes.css.dtml 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_styles/IEFixes.css.dtml 2007-02-09 14:39:12 UTC (rev 655)
@@ -173,4 +173,13 @@
height: auto;
}
+/* fix for the horizontal scroll due to the floated searchbox without width definition */
+
+#portal-searchbox {
+ overflow: auto;
+}
+body.fullscreen #portal-searchbox {
+ overflow: visible;
+}
+
/* </dtml-with> */
Modified: zope-cmfplone/trunk/skins/plone_styles/authoring.css.dtml
===================================================================
--- zope-cmfplone/trunk/skins/plone_styles/authoring.css.dtml 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_styles/authoring.css.dtml 2007-02-09 14:39:12 UTC (rev 655)
@@ -141,6 +141,11 @@
vertical-align: middle;
}
+.listing td a label,
+.stx table td a label {
+ cursor: pointer;
+}
+
/* Vertical addition class */
.vertical {
Modified: zope-cmfplone/trunk/skins/plone_styles/base.css.dtml
===================================================================
--- zope-cmfplone/trunk/skins/plone_styles/base.css.dtml 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_styles/base.css.dtml 2007-02-09 14:39:12 UTC (rev 655)
@@ -173,12 +173,38 @@
vertical-align: middle;
background: White url(&dtml-portal_url;/input_background.gif) repeat-x;
}
+button {
+ font-family: <dtml-var fontFamily>;
+ visibility: visible;
+ border: &dtml-borderWidth; solid &dtml-globalBorderColor;;
+ color: &dtml-inputFontColor;;
+ vertical-align: middle;
+ background-color: &dtml-globalBackgroundColor;;
+ padding: 1px;
+ cursor: pointer;
+ font-size: &dtml-fontSmallSize;;
+ text-transform: &dtml-textTransform;;
+}
select {
border: &dtml-borderWidth; solid &dtml-globalBorderColor;;
color: &dtml-inputFontColor;;
background-color: White;
vertical-align: top;
}
+optgroup {
+ font-style: normal;
+ font-weight: bold;
+ color: #999;
+ padding-left: 0.25em;
+}
+
+option {
+ color: black;
+}
+
+optgroup > option {
+ padding: 0 0.25em 0 1em;
+}
abbr, acronym, .explain {
border-bottom: &dtml-borderWidth; dotted &dtml-fontColor;;
color: &dtml-fontColor;;
Modified: zope-cmfplone/trunk/skins/plone_styles/base_properties.props
===================================================================
--- zope-cmfplone/trunk/skins/plone_styles/base_properties.props 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_styles/base_properties.props 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,8 +1,3 @@
-# Please note that this approach will gradually be phased out, probably in
-# Plone 3.0 or 3.5. Using DTML in CSS is something we want to stop doing.
-
-DEPRECATED:string=This approach is deprecated and will be phased out in Plone 3.0 or 3.5
-
title:string=Plone's color, font, logo and border defaults
plone_skin:string=Plone Default
Modified: zope-cmfplone/trunk/skins/plone_styles/columns.css.dtml
===================================================================
--- zope-cmfplone/trunk/skins/plone_styles/columns.css.dtml 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_styles/columns.css.dtml 2007-02-09 14:39:12 UTC (rev 655)
@@ -16,17 +16,23 @@
#portal-column-one {
vertical-align: top;
width: <dtml-var columnOneWidth missing="16em">;
+ border-collapse: collapse;
+ padding: 0;
}
#portal-column-content {
vertical-align: top;
margin: 0;
padding: 0;
+ border-collapse: collapse;
+ padding: 0;
}
#portal-column-two {
vertical-align: top;
width: <dtml-var columnTwoWidth missing="16em">;
+ border-collapse: collapse;
+ padding: 0;
}
/* fullscreen */
Modified: zope-cmfplone/trunk/skins/plone_styles/portlets.css.dtml
===================================================================
--- zope-cmfplone/trunk/skins/plone_styles/portlets.css.dtml 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_styles/portlets.css.dtml 2007-02-09 14:39:12 UTC (rev 655)
@@ -211,7 +211,7 @@
.ploneCalendar {
border: &dtml-borderWidth; &dtml-borderStyle; &dtml-globalBorderColor;;
margin: 1px 0 1em 0;
- border-collapse: separate;
+ border-collapse: collapse;
border-spacing:0;
width: 100%;
}
Modified: zope-cmfplone/trunk/skins/plone_styles/public.css.dtml
===================================================================
--- zope-cmfplone/trunk/skins/plone_styles/public.css.dtml 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_styles/public.css.dtml 2007-02-09 14:39:12 UTC (rev 655)
@@ -1074,6 +1074,7 @@
margin: 0.5em 2em 0 0.5em;
padding: 0;
position: relative;
+ z-index: 3;
}
/* Kupu image alignment classes */
Modified: zope-cmfplone/trunk/skins/plone_tableless/main_template.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_tableless/main_template.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_tableless/main_template.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -8,6 +8,13 @@
tal:attributes="lang language;
xml:lang language">
+ <tal:cache tal:define="lang language;
+ charset site_properties/default_charset|string:utf-8">
+ <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
+ Get the global cache headers located in global_cache_settings.
+ </metal:cache>
+ </tal:cache>
+
<head metal:use-macro="here/header/macros/html_header">
<metal:fillbase fill-slot="base">
@@ -16,20 +23,13 @@
</metal:baseslot>
</metal:fillbase>
- <metal:headslot fill-slot="head_slot"
- tal:define="lang language;
- charset site_properties/default_charset|string:utf-8">
-
+ <metal:headslot fill-slot="head_slot">
<tal:comment replace="nothing">min-width support for IE via Javascript, required for tableless</tal:comment>
<tal:comment replace="structure string:<!--[if IE]>" />
<script type="text/javascript"
tal:attributes="src string:$portal_url/plone_minwidth.js"></script>
<tal:comment replace="structure string:<![endif]-->" />
- <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
- Get the global cache headers located in global_cache_settings.
- </metal:cache>
-
<metal:headslot define-slot="head_slot" />
<tal:comment replace="nothing"> A slot where you can insert elements in the header from a template </tal:comment>
</metal:headslot>
Modified: zope-cmfplone/trunk/skins/plone_templates/folder_contents.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_templates/folder_contents.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_templates/folder_contents.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -34,7 +34,7 @@
Document actions (print, sendto etc)
</div>
<h1>
- <tal:block replace="structure python:getattr(here, here.getIcon(1))"/>
+ <tal:block replace="structure python:getattr(here, here.getIcon(1)).tag(alt=here.portal_type)"/>
<span tal:content="python: view_title and here.utranslate(view_title) or putils.pretty_title_or_id(here)" tal:omit-tag="">Directory Id</span>
</h1>
<tal:full_view condition="full_view">
@@ -170,8 +170,10 @@
</thead>
<metal:block tal:condition="batch|not:standalone|nothing">
- <tbody tal:define="arrowUp portal/arrowUp.gif;
- arrowDown portal/arrowDown.gif;
+ <tbody tal:define="arrowUp nocall:portal/arrowUp.gif;
+ arrowUp python:arrowUp.tag(alt='Move Up');
+ arrowDown nocall:portal/arrowDown.gif;
+ arrowDown python:arrowDown.tag(alt='Move Down');
getRelativeContentURL nocall:utool/getRelativeContentURL
">
<tal:items tal:repeat="item batch">
@@ -195,7 +197,7 @@
isBrowserDefault python:len(browserDefaultResult[1]) == 1 and item.id == here.browserDefault()[1][0];
item_folderish item/is_folderish|nothing"
tal:attributes="class python:test(oddrow, 'draggable even', 'draggable odd');
- id item_id;" >
+ id string:folder-contents-item-${item_id};" >
<tal:comment replace="nothing">
* We have to check if the browserDefault stuff is really necessary
Modified: zope-cmfplone/trunk/skins/plone_templates/header.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_templates/header.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_templates/header.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -62,7 +62,7 @@
</metal:css>
<!-- Internet Explorer CSS Fixes -->
- <tal:iefixstart replace="structure string:<!--[if lt IE 7]>" />
+ <tal:iefixstart replace="structure string:<!--[if IE]>" />
<style type="text/css" media="all" tal:condition="exists: portal/IEFixes.css"
tal:content="string:@import url($portal_url/IEFixes.css);">
</style>
Modified: zope-cmfplone/trunk/skins/plone_templates/main_template.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_templates/main_template.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_templates/main_template.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -8,6 +8,13 @@
tal:attributes="lang language;
xml:lang language">
+ <tal:cache tal:define="lang language;
+ charset site_properties/default_charset|string:utf-8">
+ <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
+ Get the global cache headers located in global_cache_settings.
+ </metal:cache>
+ </tal:cache>
+
<head metal:use-macro="here/header/macros/html_header">
<metal:fillbase fill-slot="base">
@@ -16,14 +23,7 @@
</metal:baseslot>
</metal:fillbase>
- <metal:headslot fill-slot="head_slot"
- tal:define="lang language;
- charset site_properties/default_charset|string:utf-8">
-
- <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
- Get the global cache headers located in global_cache_settings.
- </metal:cache>
-
+ <metal:headslot fill-slot="head_slot">
<metal:headslot define-slot="head_slot" />
<tal:comment replace="nothing"> A slot where you can insert elements in the header from a template </tal:comment>
</metal:headslot>
@@ -53,11 +53,11 @@
<div id="portal-header">
<p class="hiddenStructure">
<a accesskey="2"
- tal:attributes="href string:${request/ACTUAL_URL}#documentContent"
+ tal:attributes="href string:${current_page_url}#documentContent"
i18n:translate="label_skiptocontent">Skip to content.</a> |
<a accesskey="6"
- tal:attributes="href string:${request/ACTUAL_URL}#portlet-navigation-tree"
+ tal:attributes="href string:${current_page_url}#portlet-navigation-tree"
i18n:translate="label_skiptonavigation">Skip to navigation</a>
</p>
Modified: zope-cmfplone/trunk/skins/plone_templates/registered_notify_template.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_templates/registered_notify_template.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_templates/registered_notify_template.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -18,8 +18,8 @@
Your login name and password are:
-Login name : <span i18n:name="username" tal:omit-tag="" tal:content="options/member/getUserName" />
-Password : <span i18n:name="password" tal:omit-tag="" tal:content="request/password | options/password" />
+Login name: <span i18n:name="username" tal:omit-tag="" tal:content="options/member/getUserName" />
+Password: <span i18n:name="password" tal:omit-tag="" tal:content="request/password | options/password" />
Log in here:
Modified: zope-cmfplone/trunk/skins/plone_templates/rss_template.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_templates/rss_template.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_templates/rss_template.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -11,10 +11,11 @@
<metal:block
define-macro="master"
- tal:define="
- syn context/portal_syndication;
- max max_items|python:syn.getMaxItems(here);
- objects python: objectList[:max]"
+ tal:define="syn context/portal_syndication;
+ default_max syn/getMaxItems;
+ max max_items|python:syn.getMaxItems(here);
+ max python:same_type(max, 1) and max or default_max;
+ objects python: objectList[:max]"
>
<metal:block tal:define="dummy python:request.RESPONSE.setHeader('Content-Type', 'text/xml;;charset='+context.plone_utils.getSiteEncoding())" />
Modified: zope-cmfplone/trunk/skins/plone_templates/site_feedback_template.pt
===================================================================
--- zope-cmfplone/trunk/skins/plone_templates/site_feedback_template.pt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_templates/site_feedback_template.pt 2007-02-09 14:39:12 UTC (rev 655)
@@ -13,6 +13,6 @@
</div>
--
-<span tal:replace="utool/email_from_name" />
+<span tal:replace="portal/email_from_name" />
</div>
Modified: zope-cmfplone/trunk/skins/plone_templates/standard_error_message.py
===================================================================
--- zope-cmfplone/trunk/skins/plone_templates/standard_error_message.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/skins/plone_templates/standard_error_message.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -12,6 +12,15 @@
# you could easily check for the error_type and
# dispatch to an appropriate PageTemplate.
+# Check if the object is traversable, if not it might be a view, get its parent
+# because we need to render the error on an actual content object
+from AccessControl import Unauthorized
+try:
+ while not hasattr(context.aq_explicit, 'restrictedTraverse'):
+ context = context.aq_parent
+except (Unauthorized, AttributeError):
+ context = context.portal_url.getPortalObject()
+
error_type=kwargs.get('error_type', None)
error_message=kwargs.get('error_message', None)
error_log_url=kwargs.get('error_log_url', None)
Modified: zope-cmfplone/trunk/tests/forms.txt
===================================================================
--- zope-cmfplone/trunk/tests/forms.txt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/tests/forms.txt 2007-02-09 14:39:12 UTC (rev 655)
@@ -66,7 +66,7 @@
... """ % (edit_path, default_user, default_password),
... handle_errors=False)
HTTP/1.1 200 OK...
- <h1> Edit ...Page... </h1>...
+ <h1 class="documentFirstHeading"> Edit ...Page... </h1>...
<div class="field error ArchetypesStringWidget"...
<div>Title is required, please correct.</div>
<input...type="text"...name="title"...value="My Title".../>...
Modified: zope-cmfplone/trunk/tests/rendering.txt
===================================================================
--- zope-cmfplone/trunk/tests/rendering.txt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/tests/rendering.txt 2007-02-09 14:39:12 UTC (rev 655)
@@ -47,6 +47,6 @@
... """ % (edit_path, default_user, default_password),
... handle_errors=False)
HTTP/1.1 200 OK...
- <h1> Edit ...Page... </h1>...
+ <h1 class="documentFirstHeading"> Edit ...Page... </h1>...
<input...type="text"...name="title"...value="".../>...
<input...type="submit"...name="form_submit"...value="Save".../>...
Modified: zope-cmfplone/trunk/tests/testCalendarView.py
===================================================================
--- zope-cmfplone/trunk/tests/testCalendarView.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/tests/testCalendarView.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -7,9 +7,9 @@
from Products.CMFPlone.tests import PloneTestCase
-from Products.CMFPlone.tests.PloneTestCase import FunctionalTestCase
from Products.CMFPlone.tests.PloneTestCase import default_user
from Products.CMFPlone.tests.PloneTestCase import default_password
+from Products.PloneTestCase import setup
try:
from zope.app.testing.ztapi import provideUtility
@@ -144,32 +144,32 @@
self.failUnless('event2' in response.getBody())
self.failUnless('event3' in response.getBody())
- def testLocalizedCalendarWithEvents(self):
- self.populateSite()
+ # BBB: Conditional check can be removed in Plone 3.0
+ if setup.USELAYER:
- # set up some messages to test the calendar date/time formatting
- messages = {
- ('ja', 'date_format_long'): u'${Y}\u5e74${m}\u6708${d}\u65e5 ${H}\u6642${M}\u5206',
- ('ja', 'date_format_short'): u'${Y}\u5e74${m}\u6708${d}\u65e5'}
- dates = SimpleTranslationDomain('plone', messages)
- provideUtility(ITranslationDomain, dates, 'plone')
+ def testLocalizedCalendarWithEvents(self):
+ self.populateSite()
- response = self.publish(self.portal_path, self.basic_auth,
- env={'HTTP_ACCEPT_LANGUAGE': 'ja'})
- self.assertEquals(response.getStatus(), 200)
- self.failUnless('id="thePloneCalendar"' in response.getBody())
- self.failUnless('event1' in response.getBody())
- self.failUnless('event2' in response.getBody())
- self.failUnless('event3' in response.getBody())
- # construct our date
- event1_date = self.portal.event1.start_date.strftime('%Y[s%m[s%d[s')
- event1_date = event1_date.replace('[s','%s')%(u'\u5e74', u'\u6708',
- u'\u65e5')
- self.failUnless(event1_date.encode('utf-8')
- in response.getBody())
+ # set up some messages to test the calendar date/time formatting
+ messages = {
+ ('ja', 'date_format_long'): u'${Y}\u5e74${m}\u6708${d}\u65e5 ${H}\u6642${M}\u5206',
+ ('ja', 'date_format_short'): u'${Y}\u5e74${m}\u6708${d}\u65e5'}
+ dates = SimpleTranslationDomain('plone', messages)
+ provideUtility(ITranslationDomain, dates, 'plone')
- # Clean up after ourselves
- unprovideUtility(ITranslationDomain, name='plone')
+ response = self.publish(self.portal_path, self.basic_auth,
+ env={'HTTP_ACCEPT_LANGUAGE': 'ja'})
+ self.assertEquals(response.getStatus(), 200)
+ self.failUnless('id="thePloneCalendar"' in response.getBody())
+ self.failUnless('event1' in response.getBody())
+ self.failUnless('event2' in response.getBody())
+ self.failUnless('event3' in response.getBody())
+ # construct our date
+ event1_date = self.portal.event1.start_date.strftime('%Y[s%m[s%d[s')
+ event1_date = event1_date.replace('[s','%s')%(u'\u5e74', u'\u6708',
+ u'\u65e5')
+ self.failUnless(event1_date.encode('utf-8')
+ in response.getBody())
def test_suite():
Modified: zope-cmfplone/trunk/tests/testCookieAuth.py
===================================================================
--- zope-cmfplone/trunk/tests/testCookieAuth.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/tests/testCookieAuth.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -10,6 +10,8 @@
import base64
from urlparse import urlparse
+from urllib import quote
+from urllib import urlencode
default_user = PloneTestCase.default_user
default_password = PloneTestCase.default_password
@@ -26,35 +28,35 @@
self.folder.manage_permission('View', ['Manager'], acquire=0)
def testAutoLoginPage(self):
- # Should send us to the login_form
+ # Should send us to login_form
response = self.publish(self.folder_path)
self.assertEqual(response.getStatus(), 302)
location = response.getHeader('Location')
self.failUnless(location.startswith(self.portal_url))
- self.failUnless(urlparse(location)[2].endswith('/login_form'))
+ self.failUnless(urlparse(location)[2].endswith('/require_login'))
def testInsufficientPrivileges(self):
- # Should send us to insufficient_privileges
+ # Should send us to login_form
response = self.publish(self.folder_path, extra={'__ac': self.cookie})
self.assertEqual(response.getStatus(), 302)
location = response.getHeader('Location')
self.failUnless(location.startswith(self.portal_url))
- urlpath=urlparse(location)[2]
- self.failUnless(urlpath.endswith('/insufficient_privileges') or
- urlpath.endswith('/login_form'))
+ self.failUnless(urlparse(location)[2].endswith('/require_login'))
def testSetSessionCookie(self):
# The __ac cookie should be set for the session only
form = {'__ac_name': default_user, '__ac_password': default_password}
- response = self.publish(self.portal_path + '/logged_in', extra=form)
+ response = self.publish(self.portal_path + '/logged_in',
+ env={'QUERY_STRING': urlencode(form)})
+
self.assertEqual(response.getStatus(), 200)
cookie = response.getCookie('__ac')
self.assertEqual(cookie.get('path'), '/')
- self.assertEqual(cookie.get('value'), self.cookie)
+ self.assertEqual(cookie.get('value'), quote(self.cookie))
self.assertEqual(cookie.get('expires'), None)
def testSetPersistentCookie(self):
@@ -62,12 +64,14 @@
self.portal.portal_properties.site_properties.auth_cookie_length = 7
form = {'__ac_name': default_user, '__ac_password': default_password}
- response = self.publish(self.portal_path + '/logged_in', extra=form)
+ response = self.publish(self.portal_path + '/logged_in',
+ env={'QUERY_STRING': urlencode(form)})
+
self.assertEqual(response.getStatus(), 200)
cookie = response.getCookie('__ac')
self.assertEqual(cookie.get('path'), '/')
- self.assertEqual(cookie.get('value'), self.cookie)
+ self.assertEqual(cookie.get('value'), quote(self.cookie))
self.failIfEqual(cookie.get('expires'), None)
Modified: zope-cmfplone/trunk/tests/testMigrations.py
===================================================================
--- zope-cmfplone/trunk/tests/testMigrations.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/tests/testMigrations.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -150,6 +150,8 @@
from Products.CMFPlone.migrations.v2_5.final_two51 import fixupPloneLexicon
from Products.CMFPlone.migrations.v2_5.final_two51 import fixObjDeleteAction
+from Products.CMFPlone.migrations.v2_5.two51_two52 import setLoginFormInCookieAuth
+
from Products.CMFDynamicViewFTI.migrate import migrateFTI
import types
@@ -4101,11 +4103,33 @@
self.failUnless(a in actions)
self.failUnlessEqual(len(editActions), len(actions))
- def testtFixHomeActionNoTool(self):
+ def testFixObjDeleteActionNoTool(self):
self.portal._delObject('portal_actions')
fixObjDeleteAction(self.portal, [])
+ def testSetLoginFormInCookieAuth(self):
+ setLoginFormInCookieAuth(self.portal, [])
+ cookie_auth = self.portal.acl_users.credentials_cookie_auth
+ self.failUnlessEqual(cookie_auth.getProperty('login_path'),
+ 'require_login')
+ def testSetLoginFormNoCookieAuth(self):
+ # Shouldn't error
+ uf = self.portal.acl_users
+ uf._delOb('credentials_cookie_auth')
+ setLoginFormInCookieAuth(self.portal, [])
+
+ def testSetLoginFormAlreadyChanged(self):
+ # Shouldn't change the value if it's not the default
+ cookie_auth = self.portal.acl_users.credentials_cookie_auth
+ cookie_auth.manage_changeProperties(login_path='foo')
+ out = []
+ setLoginFormInCookieAuth(self.portal, out)
+ self.failIf(len(out) > 0)
+ self.failIfEqual(cookie_auth.getProperty('login_path'),
+ 'require_login')
+
+
def test_suite():
from unittest import TestSuite, makeSuite
suite = TestSuite()
Modified: zope-cmfplone/trunk/tests/testPortalCreation.py
===================================================================
--- zope-cmfplone/trunk/tests/testPortalCreation.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/tests/testPortalCreation.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -702,7 +702,11 @@
snapshot_id = self.setup._mangleTimestampName('test')
self.setup.createSnapshot(snapshot_id)
+ def testValidateEmail(self):
+ # validate_email should be on by default
+ self.failUnless(self.portal.getProperty('validate_email'))
+
class TestPortalBugs(PloneTestCase.PloneTestCase):
def afterSetUp(self):
Modified: zope-cmfplone/trunk/tests/testRegistrationTool.py
===================================================================
--- zope-cmfplone/trunk/tests/testRegistrationTool.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/tests/testRegistrationTool.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -18,6 +18,9 @@
def afterSetUp(self):
self.registration = self.portal.portal_registration
+ self.portal.acl_users.userFolderAddUser("userid", "password",
+ (), (), ())
+ self.portal.acl_users._doAddGroup("groupid", ())
def testJoinCreatesUser(self):
self.registration.addMember(member_id, 'secret',
@@ -80,8 +83,18 @@
def testInvalidCMFDefaultEmailFailsValidation(self):
# http://dev.plone.org/plone/ticket/3910
self.failIf(self.registration.isValidEmail('bogus at 127.0.0.1'))
-
+ def testNewIdAllowed(self):
+ self.assertEqual(self.registration.isMemberIdAllowed('newuser'), 1)
+
+
+ def testTakenUserId(self):
+ self.assertEqual(self.registration.isMemberIdAllowed('userid'), 0)
+
+
+ def testTakenGroupd(self):
+ self.assertEqual(self.registration.isMemberIdAllowed('groupid'), 0)
+
class TestPasswordGeneration(PloneTestCase.PloneTestCase):
def afterSetUp(self):
Modified: zope-cmfplone/trunk/tests/testTranslationServiceTool.py
===================================================================
--- zope-cmfplone/trunk/tests/testTranslationServiceTool.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/tests/testTranslationServiceTool.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -50,9 +50,9 @@
value = self.tool.utranslate('domain', u'\xc3'.encode('utf-8'))
self.assertEquals(value, u'\xc3')
- # Test iso8859-1 value
+ # Test iso8859-1 value, should be replaced
value = self.tool.utranslate('domain', u'\xc3'.encode('iso8859-1'))
- self.assertEquals(value, '\xc3')
+ self.assertEquals(value, u'\ufffd')
# Test empty string
value = self.tool.utranslate('domain', '')
Modified: zope-cmfplone/trunk/tests/test_doctests.py
===================================================================
--- zope-cmfplone/trunk/tests/test_doctests.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/tests/test_doctests.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -10,8 +10,6 @@
from unittest import TestSuite
from Testing.ZopeTestCase import ZopeDocTestSuite
from Products.CMFPlone.tests import PloneTestCase
-from Products.PloneTestCase.layer import ZCMLLayer
-from Products.PloneTestCase import setup
def test_suite():
@@ -27,9 +25,14 @@
ZopeDocTestSuite('Products.CMFPlone.utils'),
)
+ # BBB: Fix for http://zope.org/Collectors/Zope/2178
+ from Products.PloneTestCase import layer
+ from Products.PloneTestCase import setup
+
if setup.USELAYER:
for s in suites:
- s.layer = ZCMLLayer
+ if not hasattr(s, 'layer'):
+ s.layer = layer.PloneSite
return TestSuite(suites)
Modified: zope-cmfplone/trunk/tests/test_functional.py
===================================================================
--- zope-cmfplone/trunk/tests/test_functional.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/tests/test_functional.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -17,8 +17,6 @@
from Globals import package_home
from Testing.ZopeTestCase import FunctionalDocFileSuite as Suite
from Products.CMFPlone.tests import PloneTestCase, GLOBALS
-from Products.PloneTestCase.layer import ZCMLLayer
-import Products.PloneTestCase.setup as setup
REQUIRE_TESTBROWSER = ['AddMoveAndDeleteDocument.txt',
'LoginAndLogout.txt']
@@ -54,9 +52,14 @@
test_class=PloneTestCase.FunctionalTestCase)
for filename in filenames]
+ # BBB: Fix for http://zope.org/Collectors/Zope/2178
+ from Products.PloneTestCase import layer
+ from Products.PloneTestCase import setup
+
if setup.USELAYER:
for s in suites:
- s.layer=ZCMLLayer
+ if not hasattr(s, 'layer'):
+ s.layer = layer.PloneSite
return unittest.TestSuite(suites)
Modified: zope-cmfplone/trunk/tests/zcheck.py
===================================================================
--- zope-cmfplone/trunk/tests/zcheck.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/tests/zcheck.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -22,6 +22,14 @@
from Products.CMFPlone.tests import PloneTestCase
+from Products.PloneTestCase import setup
+from Products.PloneTestCase import layer
+
+if setup.USELAYER:
+ # Set up the Plone site "layer"
+ layer.ZCML.setUp()
+ layer.PloneSite.setUp()
+
ignoredObjectIds = ['rssBody', 'RSS', 'rss_template', 'search_rss',
'test_ecmascripts',
# There is no DTD for the pdf topic stuff
Modified: zope-cmfplone/trunk/utils.py
===================================================================
--- zope-cmfplone/trunk/utils.py 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/utils.py 2007-02-09 14:39:12 UTC (rev 655)
@@ -20,9 +20,11 @@
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.UnicodeNormalizer import normalizeUnicode
from Products.CMFPlone.interfaces.Translatable import ITranslatable
-from Products.CMFPlone import PloneMessageFactory as _
import transaction
+from Products.PageTemplates.GlobalTranslationService import \
+ getGlobalTranslationService
+
# Canonical way to get at CMFPlone directory
PACKAGE_HOME = Globals.package_home(globals())
WWW_DIR = join(PACKAGE_HOME, 'www')
@@ -32,12 +34,6 @@
from log import log_exc
from log import log_deprecated
-# Keep these here to not fully change the old API
-# please use i18nl10n directly
-from i18nl10n import utranslate
-from i18nl10n import ulocalized_time
-from i18nl10n import getGlobalTranslationService
-
# Define and compile static regexes
IGNORE_REGEX = re.compile(r"[']")
FILENAME_REGEX = re.compile(r"^(.+)\.(\w{,4})$")
@@ -49,6 +45,10 @@
PIL_SCALING_ALGO = Image.ANTIALIAS
PIL_QUALITY = 88
MEMBER_IMAGE_SCALE = (75, 100)
+IMAGE_SCALE_PARAMS = {'scale': MEMBER_IMAGE_SCALE,
+ 'quality': PIL_QUALITY,
+ 'algorithm': PIL_SCALING_ALGO,
+ 'default_format': 'PNG'}
_marker = []
@@ -200,9 +200,10 @@
def getEmptyTitle(context, translated=True):
"""Returns string to be used for objects with no title or id"""
# The default is an extra fancy unicode elipsis
- empty = unicode('\x5b\xc2\xb7\xc2\xb7\xc2\xb7\x5d', 'utf-8', 'ignore')
+ empty = unicode('\x5b\xc2\xb7\xc2\xb7\xc2\xb7\x5d', 'utf-8')
if translated:
- empty = _(u'title_unset', default=empty)
+ service = getGlobalTranslationService()
+ empty = service.translate('plone', 'title_unset', context=context, default=empty)
return empty
def typesToList(context):
@@ -444,6 +445,39 @@
else:
return callable(obj)
+
+def safe_unicode(value, encoding='utf-8'):
+ """Converts a value to unicode, even it is already a unicode string.
+
+ >>> from Products.CMFPlone.utils import safe_unicode
+
+ >>> safe_unicode('spam')
+ u'spam'
+ >>> safe_unicode(u'spam')
+ u'spam'
+ >>> safe_unicode(u'spam'.encode('utf-8'))
+ u'spam'
+ >>> safe_unicode('\xc6\xb5')
+ u'\u01b5'
+ >>> safe_unicode(u'\xc6\xb5'.encode('iso-8859-1'))
+ u'\u01b5'
+ >>> safe_unicode('\xc6\xb5', encoding='ascii')
+ u'\u01b5'
+ >>> safe_unicode(1)
+ 1
+ >>> print safe_unicode(None)
+ None
+ """
+ if isinstance(value, unicode):
+ return value
+ elif isinstance(value, basestring):
+ try:
+ value = unicode(value, encoding)
+ except (UnicodeDecodeError):
+ value = value.decode('utf-8', 'replace')
+ return value
+
+
def tuplize(value):
if isinstance(value, tuple):
return value
@@ -597,8 +631,7 @@
setattr(klass, '__security__', security)
return security
-def scale_image(image_file, max_size=MEMBER_IMAGE_SCALE,
- default_format = 'PNG'):
+def scale_image(image_file, max_size=None, default_format=None):
"""Scales an image down to at most max_size preserving aspect ratio
from an input file
@@ -685,6 +718,10 @@
(50, 50)
"""
+ if max_size is None:
+ max_size = IMAGE_SCALE_PARAMS['scale']
+ if default_format is None:
+ default_format = IMAGE_SCALE_PARAMS['default_format']
# Make sure we have ints
size = (int(max_size[0]), int(max_size[1]))
# Load up the image, don't try to catch errors, we want to fail miserably
@@ -708,13 +745,21 @@
image = image.convert('RGBA')
# Rescale in place with an method that will not alter the aspect ratio
# and will only shrink the image not enlarge it.
- image.thumbnail(size, resample=PIL_SCALING_ALGO)
+ image.thumbnail(size, resample=IMAGE_SCALE_PARAMS['algorithm'])
# preserve palletted mode for GIF and PNG
if original_mode == 'P' and format in ('GIF', 'PNG'):
image = image.convert('P')
# Save
new_file = StringIO()
- image.save(new_file, format, quality=PIL_QUALITY)
+ image.save(new_file, format, quality=IMAGE_SCALE_PARAMS['quality'])
new_file.seek(0)
# Return the file data and the new mimetype
return new_file, mimetype
+
+
+# Keep these here to not fully change the old API
+# Put these at the end to avoid an ImportError for safe_unicode
+from i18nl10n import utranslate
+from i18nl10n import ulocalized_time
+from i18nl10n import getGlobalTranslationService
+
Modified: zope-cmfplone/trunk/version.txt
===================================================================
--- zope-cmfplone/trunk/version.txt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/version.txt 2007-02-09 14:39:12 UTC (rev 655)
@@ -1 +1 @@
-2.5.1
+2.5.2
Modified: zope-cmfplone/trunk/www/addSite.zpt
===================================================================
--- zope-cmfplone/trunk/www/addSite.zpt 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/www/addSite.zpt 2007-02-09 14:39:12 UTC (rev 655)
@@ -39,7 +39,27 @@
<textarea name="description" cols="60" rows="10"
style="width: 95%"></textarea>
+ <tal:baseprofile condition="python: len(options['base_profiles']) > 1">
+ <div class="form-label">
+ Base Profile
+ </div>
+ <div class="form-help">
+ You normally don't need to change anything here unless you have
+ specific reasons and know what you are doing.
+ </div>
+ <tal:profiles tal:repeat="info options/base_profiles">
+ <input type="radio"
+ name="profile_id:string"
+ value="profile"
+ tal:attributes="value info/id;
+ checked python: options['default_profile']==info['id'] and 'checked' or nothing"
+ />
+ <span tal:replace="info/title">profile title</span>
+ <br />
+ </tal:profiles>
+ </tal:baseprofile>
+
<tal:extensionprofiles condition="options/extension_profiles">
<div class="form-label">
Extension Profiles
Deleted: zope-cmfplone/trunk/www/main.dtml
===================================================================
--- zope-cmfplone/trunk/www/main.dtml 2007-02-09 14:38:39 UTC (rev 654)
+++ zope-cmfplone/trunk/www/main.dtml 2007-02-09 14:39:12 UTC (rev 655)
@@ -1,331 +0,0 @@
-<dtml-var manage_page_header>
-<dtml-var manage_tabs>
-
-<script type="text/javascript">
-<!--
-
-isSelected = false;
-
-function toggleSelect() {
- if (isSelected == false) {
- for (i = 0; i < document.objectItems.length; i++)
- document.objectItems.elements[i].checked = true ;
- isSelected = true;
- document.objectItems.selectButton.value = "Deselect All";
- return isSelected;
- }
- else {
- for (i = 0; i < document.objectItems.length; i++)
- document.objectItems.elements[i].checked = false ;
- isSelected = false;
- document.objectItems.selectButton.value = "Select All";
- return isSelected;
- }
-}
-
-//-->
-</script>
-
-<!-- Add object widget -->
-<br />
-<dtml-if filtered_meta_types>
- <table width="100%" cellspacing="0" cellpadding="0" border="0">
- <tr>
- <td align="left" valign="top"> </td>
- <td align="right" valign="top">
- <div class="form-element">
- <form action="&dtml-URL1;/" method="get">
- <dtml-if "_.len(filtered_meta_types) > 1">
- <select class="form-element" name=":action"
- onChange="location.href='&dtml-URL1;/'+this.options[this.selectedIndex].value">
- <option value="manage_workspace" disabled>Select type to add...</option>
- <dtml-in filtered_meta_types mapping sort=name>
- <option value="&dtml.url_quote-action;">&dtml-name;</option>
- </dtml-in>
- </select>
- <input class="form-element" type="submit" name="submit" value=" Add " />
- <dtml-else>
- <dtml-in filtered_meta_types mapping sort=name>
- <input type="hidden" name=":method" value="&dtml.html_quote-action;" />
- <input class="form-element" type="submit" name="submit" value="Add &dtml-name;" />
- </dtml-in>
- </dtml-if>
- </form>
- </div>
- </td>
- </tr>
- </table>
-</dtml-if>
-
-<form action="&dtml-URL1;/" name="objectItems" method="post">
-<dtml-if objectItems>
- <dtml-let hasOrderSupport="_.getattr(this().aq_explicit, 'has_order_support', 0)">
- <dtml-unless skey>
- <dtml-if hasOrderSupport>
- <dtml-call expr="REQUEST.set('skey', getDefaultSorting()[0])">
- <dtml-call expr="REQUEST.set('rkey', getDefaultSorting()[1])">
- <dtml-else>
- <dtml-call expr="REQUEST.set('skey', 'id')">
- </dtml-if>
- </dtml-unless>
- <dtml-unless rkey><dtml-call expr="REQUEST.set('rkey', '')"></dtml-unless>
-
-<table width="100%" cellspacing="0" cellpadding="2" border="0">
-<tr class="list-header">
- <td width="5%" align="right" colspan="2"><div
- class="list-item"><a href="./manage_main?skey=meta_type<dtml-if
- "skey == 'meta_type' and not rkey">&rkey=meta_type</dtml-if>"
- onMouseOver="window.status='Sort objects by type'; return true"
- onMouseOut="window.status=''; return true"><dtml-if
- "skey == 'meta_type' or rkey == 'meta_type'"
- ><strong>Type</strong><dtml-else>Type</dtml-if></a></div>
- </td>
- <td width="50%" align="left"><div class="list-item"><a
- href="./manage_main?skey=id<dtml-if
- "skey == 'id' and not rkey">&rkey=id</dtml-if>"
- onMouseOver="window.status='Sort objects by name'; return true"
- onMouseOut="window.status=''; return true"><dtml-if
- "skey == 'id' or rkey == 'id'"
- ><strong>Name</strong><dtml-else>Name</dtml-if></a></div>
- </td>
- <td width="15%" align="left"><div class="list-item"><a
- href="./manage_main?skey=get_size<dtml-if
- "skey == 'get_size' and not rkey">&rkey=get_size</dtml-if>"
- onMouseOver="window.status='Sort objects by size'; return true"
- onMouseOut="window.status=''; return true"><dtml-if
- "skey == 'get_size' or rkey == 'get_size'"
- ><strong>Size</strong><dtml-else>Size</dtml-if></a></div>
- </td>
- <td width="19%" align="left"><div class="list-item"><a
- href="./manage_main?skey=bobobase_modification_time<dtml-if
- "skey == 'bobobase_modification_time' and not rkey"
- >&rkey=bobobase_modification_time</dtml-if>"
- onMouseOver="window.status='Sort objects by modification time'; return true"
- onMouseOut="window.status=''; return true"><dtml-if
- "skey == 'bobobase_modification_time' or rkey == 'bobobase_modification_time'"
- ><strong>Last Modified</strong><dtml-else>Last Modified</dtml-if></a></div>
- </td>
- <dtml-if hasOrderSupport>
- <td width="10%" align="left"><div class="list-item"><a
- href="./manage_main?skey=position"
- onMouseOver="window.status='Sort objects by position'; return true"
- onMouseOut="window.status=''; return true"><dtml-if
- "skey == 'position'"
- ><strong>Position</strong><dtml-else>Position</dtml-if></a></div>
- </td>
- </dtml-if>
-</tr>
-
-<dtml-in objectItems sort_expr="skey+'/cmp/asc'" reverse_expr="rkey">
-<dtml-if sequence-odd>
-<tr class="row-normal">
-<dtml-else>
-<tr class="row-hilite">
-</dtml-if>
- <td align="left" valign="top" width="16">
- <input type="checkbox" name="ids:list" value="&dtml-sequence-key;" />
- </td>
- <td align="left" valign="top" nowrap="1">
-
- <dtml-if om_icons>
- <a href="&dtml.url_quote-sequence-key;/manage_workspace">
- <dtml-in om_icons mapping>
- <img src="&dtml-BASEPATH1;/&dtml.url_quote-path;" alt="&dtml.missing-alt;"
- title="&dtml.missing-title;" border="0" /></dtml-in></a>
- <dtml-else>
-
- <dtml-if icon>
- <a href="&dtml.url_quote-sequence-key;/manage_workspace">
- <img src="&dtml-BASEPATH1;/&dtml-icon;" alt="&dtml-meta_type;"
- title="&dtml-meta_type;" border="0" /></a>
- <dtml-else>
-
- </dtml-if>
-
- </dtml-if>
-
-
- </td>
-
- <td align="left" valign="top">
- <div class="list-item">
- <a href="&dtml.url_quote-sequence-key;/manage_workspace">
- &dtml-sequence-key; <dtml-if title>(&dtml-title;)</dtml-if>
- </a>
- <dtml-if locked_in_version>
- <dtml-if modified_in_version>
- <img src="&dtml-BASEPATH1;/p_/locked"
- alt="This item has been modified in this version" />
- <dtml-else>
- <img src="&dtml-BASEPATH1;/p_/lockedo"
- alt="This item has been modified in another version" />
- (<em>&dtml-locked_in_version;</em>)
- </dtml-if>
- </dtml-if>
- <dtml-try>
- <dtml-if "wl_isLocked()==1">
- <img src="/p_/davlocked">
- </dtml-if>
- <dtml-except>
- </dtml-try>
- </div>
- </td>
-
- <dtml-with sequence-key>
- <td>
- <div class="list-item">
- <dtml-try>
- <dtml-if get_size>
- <dtml-let ob_size=get_size>
- <dtml-if "ob_size < 1024">
- 1 Kb
- <dtml-elif "ob_size > 1048576">
- <dtml-var "ob_size / 1048576.0" fmt="%0.02f"> Mb
- <dtml-else>
- <dtml-var "_.int(ob_size / 1024)"> Kb
- </dtml-if>
- </dtml-let>
- <dtml-else>
-
- </dtml-if>
- <dtml-except>
-
- </dtml-try>
- </div>
- </td>
-
- <td>
- <div class="list-item">
- <dtml-var bobobase_modification_time fmt="%Y-%m-%d %H:%M">
- </div>
- </td>
- </dtml-with>
-
- <dtml-if hasOrderSupport>
- <td>
- <div class="list-item">
- <dtml-if "skey == 'position'">
- <dtml-var sequence-number>
- <dtml-else>
- ...
- </dtml-if>
- </div>
- </td>
- </dtml-if>
-</tr>
-</dtml-in>
-</table>
-
-<table cellspacing="0" cellpadding="2" border="0">
-<tr>
- <td align="left" valign="top" width="16"></td>
- <td align="left" valign="top">
- <div class="form-element">
- <dtml-unless dontAllowCopyAndPaste>
- <input class="form-element" type="submit" name="manage_renameForm:method"
- value="Rename" />
- <dtml-if "_.SecurityCheckPermission('Delete objects',this())">
- <input class="form-element" type="submit" name="manage_cutObjects:method"
- value="Cut" />
- </dtml-if>
- <input class="form-element" type="submit" name="manage_copyObjects:method"
- value="Copy" />
- <dtml-if cb_dataValid>
- <input class="form-element" type="submit" name="manage_pasteObjects:method"
- value="Paste" />
- </dtml-if>
- </dtml-unless>
- <dtml-if "_.SecurityCheckPermission('Delete objects',this())">
- <input class="form-element" type="submit" name="manage_delObjects:method"
- value="Delete" />
- </dtml-if>
- <dtml-if "_.SecurityCheckPermission('Import/Export objects', this())">
- <input class="form-element" type="submit"
- name="manage_importExportForm:method"
- value="Import/Export" />
- </dtml-if>
-<script type="text/javascript">
-<!--
-if (document.forms[0]) {
- document.write('<input class="form-element" type="submit" name="selectButton" value="Select All" onClick="toggleSelect(); return false">')
- }
-//-->
-</script>
- </div>
- </td>
-</tr>
-<dtml-if "hasOrderSupport and
- _.SecurityCheckPermission( 'Manage properties', this() )">
-<tr>
- <td align="left" valign="top" width="16"></td>
- <td align="left" valign="top">
- <div class="form-element">
- <dtml-if expr="skey == 'position' and _.len(objectItems) > 1">
- <input class="form-element" type="submit"
- name="manage_move_objects_up:method" value="Up" />
- /
- <input class="form-element" type="submit"
- name="manage_move_objects_down:method" value="Down" />
- by
- <select name="delta:int">
- <dtml-in "_.range(1,_.min(5,_.len(objectIds())))">
- <option>&dtml-sequence-item;</option>
- </dtml-in>
- <dtml-in "_.range(5,_.len(objectIds()),5)">
- <option>&dtml-sequence-item;</option>
- </dtml-in>
- </select>
- <input class="form-element" type="submit"
- name="manage_move_objects_to_top:method" value="Top" />
- <input class="form-element" type="submit"
- name="manage_move_objects_to_bottom:method" value="Bottom" />
- </dtml-if>
- <dtml-unless expr="(skey, rkey and 1 or 0) == getDefaultSorting()">
- <input type="hidden" name="key" value="&dtml-skey;">
- <input type="hidden" name="reverse" value="&dtml-rkey;">
- <input class="form-element" type="submit"
- name="manage_set_default_sorting:method"
- value="Set View as Default" />
- </dtml-unless>
- </div>
- </td>
-</tr>
-</dtml-if>
-</table>
-
- </dtml-let>
-<dtml-else>
-<table cellspacing="0" cellpadding="2" border="0">
-<tr>
-<td>
-<div class="std-text">
-There are currently no items in <em>&dtml-title_or_id;</em>
-<br /><br />
-</div>
-<dtml-unless dontAllowCopyAndPaste>
-<dtml-if cb_dataValid>
-<div class="form-element">
-<input class="form-element" type="submit" name="manage_pasteObjects:method"
- value="Paste" />
-</div>
-</dtml-if>
-</dtml-unless>
-<dtml-if "_.SecurityCheckPermission('Import/Export objects', this())">
-<input class="form-element" type="submit"
- name="manage_importExportForm:method" value="Import/Export" />
-</dtml-if>
-</td>
-</tr>
-</table>
-</dtml-if>
-</form>
-
-<dtml-if update_menu>
-<script type="text/javascript">
-<!--
-window.parent.update_menu();
-//-->
-</script>
-</dtml-if>
-
-<dtml-var manage_page_footer>
More information about the pkg-zope-commits
mailing list