From b3b52f5b0ad754fd9036f816d0ab8e98a5373f40 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Beno=C3=AEt=20Pin?= Date: Mon, 1 Nov 2010 19:29:31 +0100 Subject: [PATCH 1/1] =?utf8?q?Merge=20des=20modifications=20du=20svn=20de?= =?utf8?q?=20Plinn=20r1524:1547.=20Ajout=20d'un=20profil=20de=20configurat?= =?utf8?q?ion=20d=C3=A9di=C3=A9=20pour=20la=20photo.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- File.py | 29 +- Folder.py | 43 +- MembershipTool.py | 60 +-- graphics/plinn.psd | Bin 254441 -> 151418 bytes locales/en/LC_MESSAGES/plinn.mo | Bin 0 -> 2328 bytes locales/fr/LC_MESSAGES/plinn.mo | Bin 35976 -> 36503 bytes locales/fr/LC_MESSAGES/plinn.po | 72 +++- locales/plinn-manual.pot | 3 - locales/plinn.pot | 64 ++- profiles.zcml | 6 + profiles/photo/actions.xml | 386 ++++++++++++++++++ profiles/photo/cachingpolicymgr.xml | 21 + profiles/photo/catalog.xml | 126 ++++++ profiles/photo/componentregistry.xml | 32 ++ profiles/photo/contenttyperegistry.xml | 28 ++ profiles/photo/cookieauth.xml | 13 + profiles/photo/export_steps.xml | 138 +++++++ profiles/photo/import_steps.xml | 186 +++++++++ profiles/photo/mailhost.xml | 3 + profiles/photo/properties.xml | 42 ++ profiles/photo/rolemap.xml | 149 +++++++ profiles/photo/skins.xml | 93 +++++ profiles/photo/skins/custom.xml | 4 + profiles/photo/toolset.xml | 63 +++ profiles/photo/types.xml | 29 ++ profiles/photo/types/CMF_Site.xml | 51 +++ profiles/photo/types/Calendar.xml | 42 ++ profiles/photo/types/Discussion_Item.xml | 36 ++ profiles/photo/types/Document.xml | 42 ++ profiles/photo/types/Event.xml | 46 +++ profiles/photo/types/Favorite.xml | 29 ++ profiles/photo/types/File.xml | 51 +++ profiles/photo/types/File_Slot.xml | 29 ++ profiles/photo/types/Huge_Plinn_Folder.xml | 58 +++ profiles/photo/types/Image_Slot.xml | 29 ++ profiles/photo/types/Lightbox.xml | 24 ++ profiles/photo/types/Link.xml | 41 ++ profiles/photo/types/List_Slot.xml | 29 ++ profiles/photo/types/Mosaic_Document.xml | 41 ++ profiles/photo/types/News_Item.xml | 43 ++ profiles/photo/types/Order.xml | 23 ++ profiles/photo/types/Order_Folder.xml | 48 +++ profiles/photo/types/Photo.xml | 41 ++ profiles/photo/types/Plinn_Document.xml | 43 ++ profiles/photo/types/Plinn_Folder.xml | 60 +++ profiles/photo/types/Portfolio.xml | 81 ++++ profiles/photo/types/Spacer_Slot.xml | 29 ++ profiles/photo/types/String_Slot.xml | 29 ++ profiles/photo/types/Text_Slot.xml | 29 ++ profiles/photo/types/Topic.xml | 53 +++ profiles/photo/typestool.xml | 30 ++ profiles/photo/various.py | 112 +++++ profiles/photo/workflows.xml | 39 ++ .../workflows/default_workflow/definition.xml | 256 ++++++++++++ .../scripts/sendNotificationEmail.py | 61 +++ .../workflows/folder_workflow/definition.xml | 184 +++++++++ .../scripts/sendNotificationEmail.py | 61 +++ .../workflows/member_workflow/definition.xml | 129 ++++++ .../member_workflow/scripts/after_reject.py | 45 ++ .../scripts/before_register.py | 27 ++ .../scripts/sendNotificationEmail.py | 64 +++ .../workflows/order_workflow/definition.xml | 245 +++++++++++ .../order_workflow/scripts/relistCopies.py | 10 + .../scripts/sendNotificationEmail.py | 72 ++++ .../portfolio_workflow/definition.xml | 241 +++++++++++ .../scripts/sendNotificationEmail.py | 61 +++ skins/ajax_scripts/javascript_events_api.js | 3 +- skins/ajax_scripts/palette.js | 3 +- skins/ajax_scripts/swfobject.js | 8 + skins/ajax_scripts/widget_form_manager.js | 15 +- skins/content/file_view.py | 10 + .../file_view_template.pt} | 0 skins/content/flash_view_template.pt | 50 +++ skins/control/getRecipients.py | 2 +- skins/control/send_email.py | 10 +- skins/custom_control/folder_rename_control.py | 26 ++ skins/custom_generic/expanded_title.py | 2 +- skins/generic/batch_macros.pt | 4 +- skins/generic/main_template_macros.pt | 2 +- skins/generic/plinn_style.css.dtml | 31 +- skins/generic/send_email_form.pt | 6 +- 81 files changed, 4323 insertions(+), 103 deletions(-) create mode 100644 locales/en/LC_MESSAGES/plinn.mo create mode 100644 profiles/photo/actions.xml create mode 100644 profiles/photo/cachingpolicymgr.xml create mode 100644 profiles/photo/catalog.xml create mode 100644 profiles/photo/componentregistry.xml create mode 100644 profiles/photo/contenttyperegistry.xml create mode 100644 profiles/photo/cookieauth.xml create mode 100644 profiles/photo/export_steps.xml create mode 100644 profiles/photo/import_steps.xml create mode 100644 profiles/photo/mailhost.xml create mode 100644 profiles/photo/properties.xml create mode 100644 profiles/photo/rolemap.xml create mode 100644 profiles/photo/skins.xml create mode 100644 profiles/photo/skins/custom.xml create mode 100644 profiles/photo/toolset.xml create mode 100644 profiles/photo/types.xml create mode 100644 profiles/photo/types/CMF_Site.xml create mode 100644 profiles/photo/types/Calendar.xml create mode 100644 profiles/photo/types/Discussion_Item.xml create mode 100644 profiles/photo/types/Document.xml create mode 100644 profiles/photo/types/Event.xml create mode 100644 profiles/photo/types/Favorite.xml create mode 100644 profiles/photo/types/File.xml create mode 100644 profiles/photo/types/File_Slot.xml create mode 100644 profiles/photo/types/Huge_Plinn_Folder.xml create mode 100644 profiles/photo/types/Image_Slot.xml create mode 100644 profiles/photo/types/Lightbox.xml create mode 100644 profiles/photo/types/Link.xml create mode 100644 profiles/photo/types/List_Slot.xml create mode 100644 profiles/photo/types/Mosaic_Document.xml create mode 100644 profiles/photo/types/News_Item.xml create mode 100644 profiles/photo/types/Order.xml create mode 100644 profiles/photo/types/Order_Folder.xml create mode 100644 profiles/photo/types/Photo.xml create mode 100644 profiles/photo/types/Plinn_Document.xml create mode 100644 profiles/photo/types/Plinn_Folder.xml create mode 100644 profiles/photo/types/Portfolio.xml create mode 100644 profiles/photo/types/Spacer_Slot.xml create mode 100644 profiles/photo/types/String_Slot.xml create mode 100644 profiles/photo/types/Text_Slot.xml create mode 100644 profiles/photo/types/Topic.xml create mode 100644 profiles/photo/typestool.xml create mode 100644 profiles/photo/various.py create mode 100644 profiles/photo/workflows.xml create mode 100644 profiles/photo/workflows/default_workflow/definition.xml create mode 100644 profiles/photo/workflows/default_workflow/scripts/sendNotificationEmail.py create mode 100644 profiles/photo/workflows/folder_workflow/definition.xml create mode 100644 profiles/photo/workflows/folder_workflow/scripts/sendNotificationEmail.py create mode 100644 profiles/photo/workflows/member_workflow/definition.xml create mode 100644 profiles/photo/workflows/member_workflow/scripts/after_reject.py create mode 100644 profiles/photo/workflows/member_workflow/scripts/before_register.py create mode 100644 profiles/photo/workflows/member_workflow/scripts/sendNotificationEmail.py create mode 100644 profiles/photo/workflows/order_workflow/definition.xml create mode 100755 profiles/photo/workflows/order_workflow/scripts/relistCopies.py create mode 100755 profiles/photo/workflows/order_workflow/scripts/sendNotificationEmail.py create mode 100644 profiles/photo/workflows/portfolio_workflow/definition.xml create mode 100644 profiles/photo/workflows/portfolio_workflow/scripts/sendNotificationEmail.py create mode 100644 skins/ajax_scripts/swfobject.js create mode 100755 skins/content/file_view.py rename skins/{custom_content/file_view.pt => content/file_view_template.pt} (100%) create mode 100644 skins/content/flash_view_template.pt create mode 100755 skins/custom_control/folder_rename_control.py diff --git a/File.py b/File.py index 11bdafa..c0e37c7 100755 --- a/File.py +++ b/File.py @@ -21,7 +21,7 @@ File. If exists, portal_transforms is called to extract text content, and publish attachments. -$Id: File.py 1261 2008-01-07 01:34:23Z pin $ +$Id: File.py 1549 2010-02-04 13:04:22Z pin $ $URL: http://svn.cri.ensmp.fr/svn/Plinn/branches/CMF-2.1/File.py $ """ @@ -33,6 +33,7 @@ from zope.component.factory import Factory from Products.CMFDefault.File import File as BaseFile from Products.CMFCore.permissions import View, ModifyPortalContent from Products.CMFCore.utils import getToolByName +from swfheader import parse as parseswf class File(BaseFile) : """ file class with portal_transforms support """ @@ -60,6 +61,32 @@ class File(BaseFile) : raise AttributeError, name + def manage_upload(self,file='',REQUEST=None): + ret = super(File, self).manage_upload(file=file, REQUEST=REQUEST) + + orig_name = OFS.Image.cookId('', '', file)[0] + if orig_name : + self.orig_name = orig_name + + print self.absolute_url(), self.Format() + if self.Format() == 'application/x-shockwave-flash' : + if file : + try : + swfmetadata = parseswf(file) + except IOError : + swfmetadata = {'width':600, 'height':600} + + for name in ('width', 'height') : + value = swfmetadata[name] + if self.hasProperty(name) : + self._updateProperty(name, value) + else : + self.manage_addProperty(name, value, 'int') + self.reindexObject() + return ret + + + security.declareProtected(ModifyPortalContent, 'edit') def edit(self, precondition='', file=''): orig_name = OFS.Image.cookId('', '', file)[0] diff --git a/Folder.py b/Folder.py index 9cd4d8b..9b3b155 100644 --- a/Folder.py +++ b/Folder.py @@ -19,13 +19,14 @@ ####################################################################################### """ Plinn portal folder implementation -$Id: Folder.py 1459 2009-02-02 00:57:24Z pin $ +$Id: Folder.py 1539 2009-10-30 13:48:34Z pin $ $URL: http://svn.cri.ensmp.fr/svn/Plinn/branches/CMF-2.1/Folder.py $ """ from OFS.CopySupport import CopyError, eNoData, _cb_decode, eInvalid, eNotFound,\ eNotSupported, sanity_check, cookie_path from App.Dialogs import MessageDialog +from zExceptions import BadRequest import sys import warnings from cgi import escape @@ -42,7 +43,9 @@ from zope.component.factory import Factory from Acquisition import aq_base, aq_inner, aq_parent from types import StringType -from Products.CMFCore.permissions import ListFolderContents, View, ManageProperties, AddPortalFolders, AddPortalContent, ManagePortal +from Products.CMFCore.permissions import ListFolderContents, View, ViewManagementScreens,\ + ManageProperties, AddPortalFolders, AddPortalContent,\ + ManagePortal, ModifyPortalContent from permissions import DeletePortalContents, DeleteObjects, DeleteOwnedObjects, SetLocalRoles, CheckMemberPermission from Products.CMFCore.utils import _checkPermission, getToolByName from Products.CMFCore.CMFCatalogAware import CMFCatalogAware @@ -53,6 +56,7 @@ from zope.interface import implements from Products.CMFCore.interfaces import IContentish from utils import _checkMemberPermission +from utils import Message as _ from Globals import InitializeClass from AccessControl import ClassSecurityInfo @@ -105,7 +109,7 @@ class PlinnFolder(CMFCatalogAware, PortalFolder, DefaultDublinCoreImpl) : security.declareProtected(DeletePortalContents, 'manage_delObjects') def manage_delObjects(self, ids=[], REQUEST=None): - """Delete a subordinate object. + """Delete subordinate objects. A member can delete his owned contents (if he has the 'Delete Portal Contents' permission) without 'Delete objects' permission in this folder. Return skipped object ids. @@ -133,7 +137,38 @@ class PlinnFolder(CMFCatalogAware, PortalFolder, DefaultDublinCoreImpl) : manage_tabs_message='Object(s) deleted.', update_menu=1) return notOwned - + + + security.declareProtected(AddPortalContent, 'manage_renameObjects') + def manage_renameObjects(self, ids=[], new_ids=[], REQUEST=None) : + """ Rename subordinate objects + A member can rename his owned contents if he has the 'Modify Portal Content' permission. + Returns skippend object ids. + """ + if len(ids) != len(new_ids): + raise BadRequest(_('Please rename each listed object.')) + + if _checkPermission(ViewManagementScreens, self) : # std zope perm + return super(PlinnFolder, self).manage_renameObjects(ids, new_ids, REQUEST) + + mtool = getToolByName(self, 'portal_membership') + authMember = mtool.getAuthenticatedMember() + skiped = [] + for id, new_id in zip(ids, new_ids) : + if id == new_id : continue + + ob = self._getOb(id) + if authMember.allowed(ob, object_roles=['Owner'] ) and \ + _checkPermission(ModifyPortalContent, ob) : + self.manage_renameObject(id, new_id) + else : + skiped.append(id) + + if REQUEST is not None : + return self.manage_main(self, REQUEST, update_menu=1) + + return skiped + security.declareProtected(ListFolderContents, 'listFolderContents') def listFolderContents( self, contentFilter=None ): diff --git a/MembershipTool.py b/MembershipTool.py index 3e45cb8..29960e7 100755 --- a/MembershipTool.py +++ b/MembershipTool.py @@ -19,7 +19,7 @@ ####################################################################################### """ Plinn portal_membership -$Id: MembershipTool.py 1524 2009-07-02 14:47:53Z pin $ +$Id: MembershipTool.py 1547 2010-01-05 16:24:22Z pin $ $URL: http://svn.cri.ensmp.fr/svn/Plinn/branches/CMF-2.1/MembershipTool.py $ """ @@ -390,31 +390,39 @@ class MembershipTool( BaseTool ): f.setTitle(memberFullName) info._finishConstruction(f) - def _(message, context, expand=()) : - trmessage = decode(translate(message, context), context) - expand = tuple([decode(e, context) for e in expand]) - return (trmessage % expand).encode('utf-8') - - # Create Member's home page. - addDocument( f - , 'index_html' - , title = _("%s's Home", self, (memberFullName,)) - , description = _("%s's front page", self, (memberFullName,)) - , text_format = "html" - , text = self.default_member_content(memberFullName=memberFullName).encode('utf-8') - ) - - # Grant Ownership and Owner role to Member - f.index_html.changeOwnership(user) - f.index_html.__ac_local_roles__ = None - f.index_html.manage_setLocalRoles(member_id, ['Owner']) - - f.index_html._setPortalTypeName( 'Document' ) - - # Overcome an apparent catalog bug. - f.index_html.reindexObject() - wftool = getToolByName( f, 'portal_workflow' ) - wftool.notifyCreated( f.index_html ) + # Create Member's initial content. + if hasattr(self, 'createMemberContent') : + self.createMemberContent(member=user, + member_id=member_id, + member_folder=f) + else : + def _(message, context, expand=()) : + trmessage = decode(translate(message, context), context) + expand = tuple([decode(e, context) for e in expand]) + return (trmessage % expand).encode('utf-8') + + # Create Member's home page. + addDocument( f + , 'index_html' + , title = _("%s's Home", self, (memberFullName,)) + , description = _("%s's front page", self, (memberFullName,)) + , text_format = "html" + , text = self.default_member_content(memberFullName=memberFullName).encode('utf-8') + ) + + # Grant Ownership and Owner role to Member + f.index_html.changeOwnership(user) + f.index_html.__ac_local_roles__ = None + f.index_html.manage_setLocalRoles(member_id, ['Owner']) + + f.index_html._setPortalTypeName( 'Document' ) + + # Overcome an apparent catalog bug. + f.index_html.reindexObject() + wftool = getToolByName( f, 'portal_workflow' ) + wftool.notifyCreated( f.index_html ) + + return f security.declareProtected(ListPortalMembers, 'looseSearchMembers') diff --git a/graphics/plinn.psd b/graphics/plinn.psd index b3a9cf33905740d137cb26f429a4ca2002aee388..fd637a8d7e3ccf379d0152b05c28249b09c1d198 100644 GIT binary patch literal 151418 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 literal 254441 zcmeEv31AdO)_=_ekZ^;b2nqv>;z5{6LN1Pwa3iNAh=M3XGJ(isCOb2M0E>XDvg?H93ZjS#D6FU}ilBJz;)2Mbf*cAWAQ0pd4C(*xRZmYJ(>+)4`+vLkBs10hs@|)r zSFc{Zs(RI(-DhM0voP_K#Fz!wmQ$=g!!>sVHIq|;aGztZYr^#=Hy zo+8(k)&OhP*XMEuN~gMPMc%S9ugA~xxtizGY{sVxzqf7?PJI3F7ddq*SQ{SKiQ;Djxo+*vfm6|hZoO)B;D>UjLEbscS`#l1R?$r$DsR^Hb&xpdGBpQ~WT@WP@QQ;Kqm zJNC|P(6h38Wm$QdE8w(MmbpFt?v=edI*Yv%UEOg_V0%X!PZF5Yt7CfC)UK&1si|ol za~s%fww}J?lJ2AW4G3c5u2;v&fk1h8yM5ZUXA>wa3 z;2Ei6nr>YPD~tbTcS%q0mJSGh0qK^V;o!e%{5OODW&$@o3$ge`di>_lZ#Gimm-0%_ zMtb~GF6r5zhF{>~m*eJScIlSd4YBl#(&ATyWbx~4`prQ(@ypZXWZ*h0jo?{nIrN*3 zlBec?CjAm_PB!7@WK)`)Y)X@p!_(xX@@t}&!>Q%uP>wmAW)77k&5@ef#nA;Rx@2_8 z?2^?byGu?NuqHLNOKMt|)buW?-MXY^bU~ujtS+h9UDA*?txH;Zm$YtO(lWZFWp+u+ z>Vm?hJ9=bi_37qF&+MDkEhDwtfIg}H`#Jje>(f6qBMl7B%fX;8aB+p=D$XU-@YS#-jY(c zD>t9CmTlC)KDKKi6xr7)sVI`^k{ML$4|sjk?V+Z+SZx?6Eiq746cgTZ1noY;SL%Y2 zBvqJ;whDtOs=(uJ8RhbO-4#527FyZiu&2^*5LFqiMZGmLsxn%ODr1iJlm>Fsg1KqH zS}awMNy|W&%RryYKxfRzK@UWC%tB{`PD+D5$$)mqNKeHz;LtK@=;i4S=p}UC^wgX# z8PFja>CjLP>bmI7SxB2j_s~)3>7@J8dSnc6^vld36_=HopVcj`e|A>i^z7`c0cjce zsrion!Gfzw7A*Ef>&ul+gItMkI45OdR%S^`k<&48Voqvyw#xR*KkVATYMrKZ0eokgaYG!I`zdrf-{V`7Fqz=eQb7c2Vg9wW>6?ne@ z(?*p}njG*)W}J_w31gm!+I@^`VgVGJi(eP- zf$O(ws9d~Un!Igzna|!L6+%sdb4Zh)h^@5(MJT3Bn0VPkGq14HaE@KrAY~m6< zGZTpuF@+|(Vq%k&$YhtqiI_r@T`{pqN@TK2;zUfL$*!2#BqcK0C2=CA&}3IkY?2b0 z?2?@5d3$xliQkSkm!}BFo#?>B=)wUh+5B*Ghkhga z7T!9tzYPa3{P5}@-Dl|FzP64jc6&a~Vz_L5y=CPU0hiBi?^oE*Hgf3TfOYJ68h~pb6D>31*Q)L)f6CfEe;gp$Z=0G8&$agEiNs>IgR9=Q(V(? zamuBuNUYq4^G;nyIw!dX@Z%v}M-Ch0^_9->;^?0nr|5dxDLv4F==%79QabY8HF)|! z!b$Gw4}kn6ZFT^aIX%eI*V7(M(I7b@;Zhvd$@lr3(`C|5x<$c&C>70sM)b-N5uE>V z=VsyjAip5G5ld9$rqhw3;vjK6b&X8B%v((7+?2#|_Dy{PFSUDWdiRWsu{iZXQBli_ zlUxDU0JjsTn#2aB`l0DvXoXxH;gc>oL+uhrd)g&7BcE91M{#ge$}H4Gy3+TbBRx7* zQ}PkVWR-k01t>Wo0V*hR;&BxrN&RmT9!<4KaJa64)R;Oaq+b#fnVT^V;!xv%M8NwAzCuA zSv@MVG{5-H3V*;=Ou$jDBH6GENnvDT0s{yh9U^6n`ov|8MzYGnP4DEMl2J&ElT1ar zjykn4tR`VAsN#+fiH@!?P36Hc3OFkpk2MHSosp5F0?RfDa@8-iWRYr({5bgXH z4{iqS{LoV}GPqxIZP{1E4r(ElZ*n?}YaU)fcq%}A=l={6XPKcen26M6WVT76|t`pN! z99b!jRC;nyx18?jnHNhZhRxb*D_5gE&i|d^JOY~|$?wG!un2WE(2Kv?F`Ym5j-H;S zw{{m%BmA$7>9W#Lwke>$;Gq70On|kOHIQI~A>07`Uo^7+he&XFdGW7dbT_J|Vua5( zNB4^|x(5xv{E>sPnnJsMp_#U1OF0}}(=b<+O{qu&FgD$$Vxl+HTQo%`RN{2|U3m6q zWCJNMyd*4AoflN*g?xoVQLNB9N2KC~SJSALk*MfYvS+A{kr0(tlrlEnu+&yj zsv#b{O1rJO4fu}jA=Dz%On5SNDgP;V6%4#_3y-7v+PHKRx>z z9@j*qoj2l2UvKAaqj*eX9z##~zMJ1)5xQ^3sh;Hb$@~{T7QRDWrvbmW1n(O1yEev; zIwVS+oAFc)LiOV%OFGS=gP6Uf1Tk*>))Q$5A0 z&saHQg6=2jdy3YL5^592`A4MbG3g?osKps;#D9Z7Je7mr)U)sphfp1;Uex;H6VK~& zNLTy|1^*TVA=$_g^<|Fe|xZM;*F%zAB7ftYk9BRZy zvjF(x#@CNh22j=t=0i%96;FEi6#G?mWuuA$sfgpb7JAF^0DaCejxf|!5>Vdv33$uI zdvrT|M&U7~!TVFVt>?#6H(mZI_VxTVh}lYHKaU_*)!Ru4`Z zc)q^NQ&9#;qy7a%9oy4@;l8o6BH$h9^0<5$W{L@=5aUKLaRV_iK`3T$*(4i+U%LKD zcuZ-q8AO5S4W)(*^G}kRN=#GF=?)Y+C#h03DRQ~pg|5oLVE>@PVM8TxtuKL9iIXRL zeKYdirIRF1H5Drl9~TjfnqLxpFexsRr(z#bCpqn*aIiXg!-`R@%l=-4nSBCvcBH(>70EwJeobnCO)dYU^@0) z%KWy$aNP2hd!-H|mXEMlbL}(TIrJj_P&-dU{aj77Vb zX*}7Qu@Ot4$f{*nxA}}M>cUvlzsRs_pzWI38GGkRE;}uGZlwLh5s#0Pjho}1y5}N% zN8xfWV~?+g=$&S*nML?Q*vp#TIAHJqX2IafttsIsYs7hYN8e#caf~(LcdU301G=!2 z-NPEyuU|j8exu~%M$H>GXxO|}(?*S&wrYLprL8W#v~}}F{1Xhs8||;9al?j23L zq)D@uO`0@mNk2_miYU!vAt0=0&FiB&i;^rInYFnkskue?8j8Px@V=!tN?BJl1yEr6 zB%yM3>ejoYesY6`FbLI=u<4Sd$Y#t^$C6~NW378hz4~>N8l@w$c~YGYEmG^|-{ics z<8SAt)ob}b&#db6n@+7py*n|zoA2(=`d)JNLj_g)P89hwE?fNf-(S=3;lkqn?>!sH zynM^(Z(KjVde4T>E51EBpz|Zo-MjiP?{D3IYRPLKY&&rJ=8~!RJ^K9XA8!BdOxD0L zlcvpkZ0Q>x?KpV0IkQ?(+B&>Um(;79!Hdu#wM8A2;I|zwt(!LYe_B!r-W~N>ReGn1 z`+Rpl)VH8jk-yuCtLsq#F1aS-y)7ujvzHh5ADtO+eG@8zaS1xhMG(GXjgokt%~@}D zs^{_L<1b%YJnONn>sIes-P_ru^OWZ@c5i>{?3Hr`*7L3vvv++r`w4+n-)$dx{)>pSvODkgpDdbw!rgM)|uSo3P2OP9Z;ru}{A=+gsV zc<;(VyXwwApVIrUXP%k8sr|A$&gLxqZk@nvOaFFy%rlb?-1_)m9ynrO)A+&5zWVa3 z?c4Xbrmk9;ziJP_%o*}RcU6xOnb<6ip^|;oxZ}XJ3EBt-uzrJqZ zfa9*$do6t8p{GV~tk|?-(|eaadDBg;T70?ka!*Q+@sKQ|Zk@f{bNI5I zTh{+`!^bn1PZ@G%&Ek`5Prv!{`Juaxf427i+j75tI{o#Hw_f;nn~&by^X}2RUb^6V z_Q>TUruMz{`#pUxbh&?Nd6W5{`mcKa@DD}nj{m9Dw`b&C%Zq2-acKLWmwG<=XZhd1 z*xM}gwG|6LEgCcG@$0|o+2i&<|Ia(kKUltObk{pxob|g6?;gI)x#LeI!zzz`IqOsZ zxF+rYo%zI`>f=jK_1d&__nLb@sTlFXu#JZ^4-|bj>**&S`&-KL9cw@Juid`pvExOv z2OXb%sI|a`3GB>Qciz6Vea9!CxZ#s$b{=|j{@>p?ky5_vqbb#YNtxvq2diSw@s%>Q`J6oLKN;P~*vU-x(^^~{9Z?5^Qo z{Ag+RP12d4H_XoXR}T&5zxqBOxa+AcQ~v&TgZV>W+qt{p?sMgqhtE&?^4yBSBZSST zo?g1`ym!z?SM(av;jgQ6zIpvi=bYQ}{kPUkx$@QC2aj*vQ~ml!0?QVd?>&KCx#y>c zmIBlzPF~#nt$fGrR&~5zw>la z>d{x)zVuD*M+>%(IpXN`e%1Dy&t@DOdt~Dpf&KK?LkFAeT+^igryD19E$MY^%Cg@z z{qB|vujM}W)=BrOGwA}$?J)cPrYjzQ^Rin{dviBTDP6Yp-I<%-T;VL6I&tPZ54YKo zaccH6r;b){8u9s!GhSKI{@aF&FO1prO417j50|~Z#XjYQGLL6R_kS)r|Hi1JKfgHb zyXCX1XVknTuwAza>}Suy3x~%)?d|{l*L}8sy>RaQ$EJ*1_4*w{x|F+*eX(Qgjvk(a z_G?k&r|i!Met6)K-3$LXpsm~W!8i9me)BhtdrUh&tmNp6*PUroR!GA7#~aLQyyTW%kzF{~@rKdf$FtU<1A%9oYTUXHPxxVeUs+wuVt4LC&5`HddgXUXtJ^;K{6DA7-f{bPv)^AftFOSWYWhmbRk_vezg*kfKWxR!_VWuC z9b0j>N2f3UvS7Qwo_%)fE3=nQdUoxfKFfXKLc#j;D?Y#Lqx)x#JKEvgt^F5u|ETG+ zKkvN$mFmVl)(sTc6|O&Cx9j#HH9glock02zcbqG|ef8UqRZpKi_)z<;>wetw(85uN z1hzSK-8T^97w=rT?3BR1Z@uRP^v~AUZW%n{>eD-)pH=bikKdoR?a6olIIi`H1&#l9 z_4{vp{&~^anPZ;1P;&T=Z`&XK^pS$C=ifT(%J}!BXG@N@nflhW@4tL)=KVjmKe10> z*PdGU)8A$ve&V5p-D-V6uaQFGI#DfOLu+$a{&QK2vo#fuHtRLy*tCPU7SAp^hZgQXzVx~uhritW!`@qO zd(vI~&U4jkQUadS%Rm0eU-R&)A8+{N)UKUfRxBJcX>-j)bi0Mmo?f@?>yoG6`s}ye zUrRZ)^N~+K{QIOSUk#f!W=-35pTGHF$%SQ4K!!F>dFS~rzUlO8$H%h1y?Wtk`^~dI z8288X^FROS*qW-|M}K}wV0R53Vc&7rYo~wL{>0Pe?YG|X;Fjy(x@!B@gY~xFaO%1> z7j~}8*mCNIcUE1PdH&qrT+jmLdS06c7L5Jj$u(zhJzO*G%kr9eFPm^rv-)D~}((;^j|2di$ysvo^i+r@lkRR}>v> zTef)nu}O#8jvrC8cFLFCr&f#~xb)jeo9i#@`urWY1U!vbE&g!chsUSAS-$7nRr7n_ zT>is@e*a%L|8D-Rb@!ZZ_>90VKhu5Fi%(ts@2&SI-8Ibr*FEPSc|>5s7H#)?jdwqE zUFv@QA;xPPzI1xeve)(nUdsJ!!LCPdxpnQI&t$y*+P}Z{ADOge=1l_oV9&tA<1at_ zLH1R{7ruHR?O(SYKAUkqXXoFJFWH`6^U#emimCHYxBv8G&BI%Izc~BAk{Mf0t~;^p zbipeZCahc9`?-l1mi*&~)njMfc;xPrw{JT5!?J0ctG7OK_Nm_I>t$6Bn|(Uv=F1<@3Dcf1Jt z;ApGfKh1l$W-aWD^V^E5C!X>w+5XP*adSVv?&kqRR;+k$?WZO4ryjiOZ1>k^Z|R3- z`?~WBf!QzpV{PvjM}O}sJTm0St{v+u9$fYG`SGsV`Fq}eXkqS=J8H&aG}>^>>~r5< zHM8T%;V+)6g)3+WnR^eob?{7c4#aHO=qdzWcBInr3+)&nx9?Uqo{kub27a9~Ksq4!spG~4 zR&Kdw!K!DW(>KW#C~yS=*s!4;qE?i!uiICs+E-{GEO+$Pm;Y}4z(rBcaSs%Ae+6m#>Y@m-`EzEaD`2DD2b$p@E^w!l_iMG?JoQ(J`=oS~{1LMXs1;t;d~N8MiRb_{c3 z`P(4q$YxZgH_7eV{Woj#mqo~~g<1P%pvIa=#rm(fdC70hZn4e#KiCQ+4 z#!8e(#Ml78Y9|)u@dbBzgH-$jd{TLc4N{In`-bEl35hSG(Bp7PyHotbdG#E>yt1ss zSBfhtyMhm*wx@J;xbhS|oBVfXCb&93_Q z26kV{$4KAiz2)q_ZN1p#-A?fE(kDLSp@lWOKbzgxr2%VFcM`kj%cZR0oWHW)&+8AI z2Dx@N_v}<2&bh(G!@F)@hZsupyG{3UoSCyaavC$Pe+Mx{clzA^j$m`*pm%I+Gok%yEI-OsHlW!8N|u^F>h$t9YKVRx`D+1(BJ{uO=! z!!J0}ppj4mo^ToU;Q0pvwy<#94?p7Gmx5t@Xk+YJ7$dlh{;e~>>nR34wO@g^FDb2Z zd=>4h=t(p#+f@CWVTZOa((@6QMpQ1p-n{^c9~yPFFdCVaFv{Cq;UU?gy4PU?FahI6?n81&H2jmx zD334jwa|T0nVb4Mecs16oEKEvCgj>M0Pl+~8R^Afspd+MXIz>G`DS>iwnR?)-0TY! zX<*CGUW|IwCA@a-MiW3k`}EDXbhy?a4JxVP!z_GOCBA4Dz4x1bvJe(eC;{UuiKt z^(1Hip%$SXw+%q^aM)bcj5FGOm=cECv(RS zPqC{~(FzUvd&m_A&&+TJiUUr@I`nVQpl8np$@X9bo?L+^m;e9>%r~!(oGj@!*-rFq z*VYJ%S~b27F}dW3X~zraov;GRCy%P|$TVS(pLoXngwawQHOkbkcw>_A^bAcNVeaIv#q5i!Iut8)lRk#DE0XRL(y`B(V(6H zl~F8qvb`YS^aaAf{XMY%!qS$*nC|1k>y2G15(LgKfpx2d=3}ZcXnOf%mj|9vwgBGN zEM*yj7LW1ziVI*s+Onm%kv^9gZA%Y7xy0HT9h4|O@I ziy|^qrXYyim*iF%gx57wI_|40mA+4f&*^tga{5Zu@FArhzjsQ-2wyR=SxVg>6AL_* z$b$(?S-IDbCIYrzwEJvb>WI9X+BWETYio zESf?R7m^>!c8H66qpG^71PdkX1OHAuDhB!#Q%PkvCkFI&miuLz1d)=<(9zH)KBAzm zcLCN3@Ib4{aJ!r|SsgXBbdr-iX#J{^^^?I0QBSr@Irb~{Vcv;pIu|(_7wm=piZZpr zqLG0VGPx^~nwOQwQ1r6p^uz+_ujha;m~Q2c{gD?4HAx`MPO$F!5RL(32Vh#VFn{t+Iz zZ1#f5-f5Ij0is*6S7wXdg5ybjDJ@L_47H*(BrDoaZak^cC?sz4%80d7l2(aD!UVZk zl2RYUmqZG^R2^z3f2fKgdtk_kMw_i0IAkB~cMU)fC*gOx`C!ExCe(lIqwsV+7uK<4 zb_SOfM0o`#ah!#lJW|=mV66@cL+(_fLa_IpT>)`Uo@N zfXnqtkdA_oE+zDRTFrxbRK{sK6un;R?VzYmlp4%6Bvrh~nnY=OMU%K7jd)TRgv%mI z0Q#c+{oV?!ruI{q=|Q^!lQiCzBCqV^${#e=wY#Z9_>{zt>FpG_^bdk_zmFA@A)jm? z?&a1bAv!D$tI$Yj;`mu;BeWIT3l>MUt(ENx+f_ocqm|H081G1SG;}m}G<7t0TyWGl zo^m|xsO!jg^mX)i40H^36ghtHxYsey@qptQ$Fq(lj-`$l9UC0qIu1AvI*vI`JI*-% z=6Dirjvd%-*RkN^@Z z8abLcnz7riW#iaP;eb$wJuBGQQb!9RNyHrDa+Pz$R<^4}h-9z@>xT@xPy}aqyo@UV z14~#yDr5x4MPr&oB4RzoMDbOLB*;F@duQp8in3CTfDER!b*PyLf|ALGp^kS#T!uhU z$`BS{gFe7gwLGf@t+b0sEBzwU>K3BKnOHd4HJl#$>6T4St_|&>h|v63p0LVuVh+dqVu=Z(6vMyvs7=ZtomEoo>-#uSInf^(Oh1dDT=c!=<(1zF$mF_C5jVGyLygjk2XV$VSX5WcBnfy z1Z6&1RE(K+NzKSsnO%2QXxEt&+9S*ext`)bTqtE(j9av1RB8Sti4mV2iS{9%DT!8C z(BKlMKblFA{**|?tk8r=;#Oz^VmF!w+4UzuG_ESAKs+01vLk0BL4wwfG`CPset7*9 zQy+dWB@G%ocG+lFw5HLd2bNLTl*g_+;nA7y1Z7@5*+ECupX%5{6P;ik!>2ju{mMyB zu!YqV9N9u9`$cIbbMr$oNy4T!wIUWin+ej_%w>25_|lg`p@dCi)RP!ggVc+rtMFOA zfrUhaoCjLBhFx`V)aLmqmw65VW2!o`XAMT_Blts*WQK-ru za)VLYsi5o+ZczkH5dBhfX6Th#)F2f&{qE<_T;lz_YeqKB|Lg@a97-882pIoZZVSdu z)Wrxw!_#BbbfcGv8DRN?m}c+iEyA4M6Ob%gOeeTVNh;AuqlG&Mn&zxzuAAnpY0es$ z?4~&@+MK32D=$;1EHr7WLo(1zb5^~=uVR*LXG$xQFq}jIGtF6P_1-jR`AZ~1E50zR z$TTWAo zfcvMvoOZ^hx-`)(HPIu;Pgj$s0i_w`rB|Cso+IR8f)a$hO6Xepke^M^8;bl~>MDFb zM2{wqpFCdbU3-D`;u2;LLO4ccos#>-|Lu-)MOc-_P~Sq=47$D5QTDx9u8mp)aD1pgNuF~`DWEub za+6mkc@o;tEe?vFb9I{Fo>^`tt%P5A&RK5Oc+PSEP9%!mbMB5ix^}%o(m(%9qDY&pGn_Of@~{XhV}Gc&6u^k>_03 zbUa8d2fGN$K-^;r?$&S)nl5yryDhDr@ZBZRVa{W^(3viD++ELfp_9BfNnh|TqPz$K zf&ter{F;8~Yr4>xE_CsD1@dij(}gY(H$ijH(cE*?9y$J=2BGbfHVO*Wwh1c_M@!V!$lPsESnIb)Xs^8eL~PEjshpE%QtPW|Axi{ozkf5D4R(eina!lw9cfUjKe z`Eyq-#J%D3=duyka3iI_CuT3YhWz<+wjytNsf&8}#d_MISPb!3dfK59COz#?f>GX6 z%luQ|I!OM#+`CixEJ!I`FeLv%qfbM48N$Ob>|K%f4&ho!v?&`t{Zp*yD{)5cFj$b z*}!MVv)_#S4az$p=R?-+xv@NKo$^1SP>iYXTgf5H(8}J;eU}kL8;UW_p54J?l%dE2 zf)Fp1AsA23IMn%A*{HIIcv@{J#HId0IF2$D>q8K#sWKE}=6LGx7-eW>lOHQ(1kr|KjJw-%9-|Dc zEby-kMi6Z%##HWI&100ISW|*fO_d?Nel=2?F1e`*$5Dn>Hh=nkj382YU*jLy(xGQS zY4*PM?8PlD*^D2Xu;qL2WK*FJUODzIV*Gy&u)qKF5D#Aq9N^*WpL~m$fcs(gk2-zW z)GnX1H?OY8rX9VMt?BktC z;Ds_2Yf2ERsWKE}HY{zyW0awlJ-B)(BZw5bGd%aiKft92G zyz3)>?6QWZ*t+kpV0ZR=i>+OKfK5WbeQWOD5mR!-ckIn(f8ycm6OQrl)e-k1W^� zY-R3MY|8GAY(B>1Pg`yk~uSr6bp&0YjhIe?3 zG8Ah{5aNL{jMmyaiqbibG89{zAk^9vQfq&CM_bf~T6^dI9NyZye|(U)_BZSRVyLzE zf8B(K2j?~5;rF{pe^6^5zN~~%YahwFfw%S#W2z8Ct$nmzOWxW?@4t$-_R-UegROn+ zhJ(Ddm7!Quf>2GBp%`=e%`6_H48_(a2(>na)Y=q^t$lh>Gv3;#N(S)OK6%ef#87LW zINyu6_VJGz@YX*1@D9XKYai*jl84{>Tk!CJ^CiSkYkxDc4{z-~xnJ_u-j(v(U~7N* zU=QBf#8GN(3dJ_1D{5_JD8_8s_AQT5hGI<#LOf80%2^A&6Skq^?2iqPGw|Zs%=F&u zXfv40f8iMnohZj&s%-FH zcM?ZT!G~nh=qwGQ8{$iED}p^Qoux_2!9BBdLeHdMI!n`usEALYrddF}dng4yG0y@T z@Ut{FYIa_ti!}?#yLApP2>nR203}SC1xPS?7GPZtl-kS!>VQA`vw-$1Y|JrnIMaq! zcIos29-|G#m^zpbP>eFPaw-HNYRZtY$R(H<@N*nxDCR>D%10TBF_}YV@fc+&mVh8s z0%d4y{aM)66Wnaok(XJ=ZD-l5-RCjekhyI2AHD|9uIfFXz2>-)UGZug9$t3Et31Th z{u{iUd@=ynppqIR>6v~utw_}vz4$aD17-3V|lpzZM;93r&*Sg#c^KT zIh50Q;g1s#Lv)wIvZ8z_qlX*z_(EZAB zLm?@VdHvH%`#5)$p~z8!5U-V?7_)Ki4?IR0io7NW@mdj*+y+mlwnk|h;FOqjTFk~D zyi>#iJdOO^{+4wA%RRT>T8wgNN28H|{eq*BV)cS4*3()dSKZM_|5U1KGy*DXa8XAi z{_Z!0g07|P= zT_B3}#P@huJ|;Z&D0(yfl7@a%`yLM(!cd!7c| zQZTJFP&AniYZLQWKVQLQwRuJmL^P&YrBJb9cn67e%D#`=GmH`pa|g;PjP30ulv4Ug zwU+KFltywTY(#lcAXJ}za!kb}_oPrQu*c@+iSj*@@@|(C_45ZjB66iWPaz0>r<4VW zR=VZXj7@Y``1H~b$207uLMYSID=VaP?+kA_D^RntU~+k1BesL_f`ABTtx8xXPjU~_3Jad)#$WV-IQ1*$F3PKJs4k#9LTabH z5pxK{KmOurVWp8o7jZF^MxsPvtfC9ba%qOh6edn}7fQULYlO4DrBSI=)u^vR;a-#J4V8NFPdBR^hf;EcC9W;D>;vaiKHIItf|K z-8;!mxzqcG zzz){wrvcY`Wu?C+08cd@ON)4;Ngt%OA$k9Dhpe2oT*RPIgP;H zA&4Qmfuvh_J`_^E6yjZPC`;h$CwbYXK0J$;wQ>-x(q8|JgUu*B$wSJA?q|2Li#$_2 zF{hsN{xD`^X~b`L@QFD^I3mpN<+;ffbpOlEO)mKZ+E6n$xr9bZk}b#|eQL8(CQ=Z8 zr4dpIQ_M}S09IX|fb5 zpmaafRZ^)oTY}s&joROsMlDHXxF7AniVg z5XCQS81wJf&4IZB{mtjUW@z%kln1jvn0mm}1EwDMb?E`D%9ys`ubcyBpZ|6Bd9%IE z_BL%j)7CTffT;(Rdcd>=OI73BOnETn!L$`kJ@D(&1Ewu#+Ja`E|8@0w zv%SssHf=rA)-&~hsRxvL0G@+5!GP!RT+aV4W0$cG>?(F8Ys>%I;JOXF0)K6AbmdC? zig#DA)*RXzq5O9lzfQx+(SEEC%fq)HzoP40eDl~?Hi{MET*^>3kPTsjSZ|gOXb;wl z<*@EZlM6^6)}LjtEY=Ob(qAU-vyd(u(Axf`;q9S1e{=u3&RxpcW?`eURA69{12Ds{^z!n@)fnNcYy(jR@^dB@} zR$e8ry@aR%#<~7RpwI2-`Ld##f9@0K8lahbXN_Mc3=V^N_yTb`6~`#PlO|;1fV+jt;yT z(bvLvfXQbe>)8bJhJZ zo>qz1lW63DhD~h2a2j~jn`84XqVau*h73C|(U>5~OgM$JXuhhi zNC_MYQIKIjOBCkF(il$TC$#boV#eVRi4dq-qCoPzQk2|q3g;MGv<*5_CLlp1d~hMy zd&05L1N(C>Ws*QikPAF_^vXPH38UP92L2ZG!Xu&LOOO!$0^kRGdwBlHb*S&6Rn+n4G&=?9T?FM@E|JuU zw3drBp|kS2*fnDmrjccM(?s5Rt!u zMy(>b7HubGzDEdo50g+sw<01{2wiNYWQ@sO5rbWoZ8z{(-f=EO3IGWqp3|6z-U;G* zxXgj37~iCH`^r#AZPP6U5T1KtutW*70+mFvq%R{a%P+mE)f}WO%1v z0CAZkQIR3<6VfMPNRa&n&}AfJK_n%FO!sCVhao}W_cl{wsX!ls=!ZI3Y$S#lMOLU- z2=Xz?H}ZopBuK-0SO^LvB?J?a1qU|aqCFD~e<*nC4 z!f>g~2}mKxCiLLEcj83aB3L(<+un{7YrBwyQPK8hoM>MON$VGtJ6?+u?OQ&@Tr{UV z&$cp7RJ3_{bslp(6F*+w-%K2n2k2j>9GEPJ&An0i607tDLnUVwhIv377?q`x*Hcg2>tYKcGkm0TFxAcX^eX>c+W(}#ZN zvcEEGv-0)Tf_3kr38&fXin|?bG3F{y05YfQEOyf-oMr!zZ@%QQf5R5*-jmouYIcsj z8M@xd!4e<9C9ofqn1P%btnR1bb7l~=#sPY1c9<&!aIjoX9G zS%y_?@&Wo*_ykwmLM^FoRk-Q!l-l%LkzP+ijM9HDi0>Mzl^I9HqDwFTl|+t3jQvI4FQ*#b6p z4PJB65w?T&uRVv*Z+rY@@?!~fq+uA2G>CtL*p2ub$V%|4q48`SyA^+9SOL3<4aVOf z{yPxAHzNIwz#E2R4|(_#k3-N^9u7wI1x-2E*`|uTv^K8Ptl5-`j-Tlz@ z{Jv_Ra86)D61%s+RjY)Jtx0E1KV?is%EBsl2=%_$xbX4PK8?18M{X99wmeys0%s&G z8V)k-zN;fsoJHUeiDwhh9*lNJsys5d%&6Ap(<)j2o(+17u*k?sFk zQGXN~=NA?y{|j%6(ZF$ZVPm_E;qdi>Wq(^#UYmZMVA;~@-{Ek0K^;83k?r0oSUySK zq#Hl4ie1t=J+oxyoIu|b72ODVoW_>#QnYHuW{cwIe+WIs76mTUR zz6CyWFB`UwqK^+Z%61#zO}N1z9xtq{w-)hzKG(;`NrtAI;JCKNARY%A zTJ1zU9f;9#7@VB<6|;0ciM`ha2JsND3Rv3*lOTb5_+K(h(igz*X%G*$x3P%6$1vKG zbP(lOYY-1#w)^2^dol@If_m8_z9-0EZy0S!J_GW@4dMY_k7%E9^y7%0Zya5L=q1YN zRm|Edy=QfaC9}g$wuxCgqz}4KVjZ8}`Uq5MB~s5r>M;mcE3t6GqV1SRzc?!-9bSD` z=RI`7qI2mB`*FW-nY-0-1?mu>zM(|LHrb8!0IIs8C~7*1exdI2t+pQPXvLx>jD=;cTy`w=ztRedX1 z9M0Tphsoy^q}~82 zg*1nA9-jP}`@ckkwKx(Y1=yG~fUQmXSwV{WUFS%p0ylb}+=14SDPhJ|x?Ny1Lv+vq zJD`J}QFPGoGJzMv&*1dNgdajhI>*>u+c1ixS4$-VrBamWLs=7q69Om3S8s*CZ0n;T zN|KG=MWO@&AN!fW9+v3<@-QG1LS(*RmKLNuhD4%+;`cdsTxf7^ zP354@jJ57La}yl3&$T`lDql6~bxdeb^|HHXTgEyKnztXr!54~L*jQp7&ErWGAoB4LaSRbT(7|JjiPzbOH=1qu zQLr8?Ny51bAJ97-4>G9EYQ|da2M0C{f_|vC1eA^{NxzJ!qshj!lR$eW(mdV>CpzW= z8-C=X_DTZfm$8a;&UX}p)EhXJf)~mKRRxB<>#M<$1@f?|

C;pTlX2lZ8;-No$b! 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 delta 12185 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\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,6 +20,10 @@ msgstr "" msgid "Object deleted" msgstr "" +#: Folder.py:149 +msgid "Please rename each listed object." +msgstr "" + #: MembershipTool.py:401 #. Default: "" msgid "%s's Home" @@ -155,15 +159,15 @@ msgstr "" msgid "Preview:" msgstr "" -#: skins/content/dateCriterionResolvedDescription.py:17 +#: skins/content/dateCriterionResolvedDescription.py:15 msgid "search from the beginning of the world until %s" msgstr "" -#: skins/content/dateCriterionResolvedDescription.py:19 +#: skins/content/dateCriterionResolvedDescription.py:17 msgid "search from %s and the end of the world" msgstr "" -#: skins/content/dateCriterionResolvedDescription.py:21 +#: skins/content/dateCriterionResolvedDescription.py:19 msgid "search between %s and %s" msgstr "" @@ -174,7 +178,7 @@ msgstr "" #: skins/content/folder_notifications_template.pt:23 #: skins/content/topic_edit_template.pt:26 #: skins/custom_content/event_edit_template.pt:135 -#: skins/generic/search_results_template.pt:86 +#: skins/generic/search_results_template.pt:87 msgid "Save" msgstr "" @@ -230,7 +234,7 @@ msgstr "" msgid "%(type)s restored." msgstr "" -#: skins/control/save_search_as_topic.py:17 +#: skins/control/save_search_as_topic.py:20 msgid "Topic added." msgstr "" @@ -369,15 +373,15 @@ msgstr "" msgid "Reversed sort" msgstr "" -#: skins/custom_content/topic_view.pt:42 +#: skins/custom_content/topic_view.pt:50 msgid "No result" msgstr "" -#: skins/custom_content/topic_view.pt:46 +#: skins/custom_content/topic_view.pt:54 msgid "Subtopics" msgstr "" -#: skins/custom_content/topic_view.pt:49 +#: skins/custom_content/topic_view.pt:57 msgid "Topic" msgstr "" @@ -410,6 +414,30 @@ msgstr "" msgid "%d item moved down.%d items moved down." msgstr "" +#: skins/custom_control/folder_rename_control.py:13 +msgid "Item renamed." +msgstr "" + +#: skins/custom_control/folder_rename_control.py:15 +msgid "Items renamed." +msgstr "" + +#: skins/custom_control/folder_rename_control.py:18 +msgid "This item has not been renamed: \"%s\"" +msgstr "" + +#: skins/custom_control/folder_rename_control.py:21 +msgid "These items have not been renamed: %s" +msgstr "" + +#: skins/custom_control/folder_rename_control.py:24 +msgid "Rename failed." +msgstr "" + +#: skins/custom_control/folder_rename_control.py:26 +msgid "Nothing to change." +msgstr "" + #: skins/custom_control/folder_top_control.py:17 msgid "%d item moved to top.%d items moved to top." msgstr "" @@ -1021,6 +1049,7 @@ msgid "Review members registration" msgstr "" #: skins/generic/recent_news.pt:21 +#: skins/generic/widgets.pt:123 msgid "News" msgstr "" @@ -1091,8 +1120,8 @@ msgstr "" msgid "next revision \342\206\222" msgstr "" -#: skins/generic/search.py:82 -#: skins/generic/search.py:86 +#: skins/generic/search.py:109 +#: skins/generic/search.py:113 msgid "ascending sort" msgstr "" @@ -1124,15 +1153,15 @@ msgstr "" msgid "(No title)" msgstr "" -#: skins/generic/search_results_template.pt:82 +#: skins/generic/search_results_template.pt:83 msgid "Save this search as topic" msgstr "" -#: skins/generic/search_results_template.pt:83 +#: skins/generic/search_results_template.pt:84 msgid "Title:" msgstr "" -#: skins/generic/search_results_template.pt:88 +#: skins/generic/search_results_template.pt:89 msgid "There are no items matching your specified criteria." msgstr "" @@ -1188,6 +1217,10 @@ msgstr "" msgid "(no email sent)" msgstr "" +#: skins/generic/widgets.pt:128 +msgid "News Item" +msgstr "" + #: skins/generic/widgets.pt:32 #: skins/generic/widgets.pt:33 msgid "Edit metadata" @@ -1733,9 +1766,6 @@ msgstr "" msgid "New layer" msgstr "" -msgid "News Item" -msgstr "" - msgid "No document" msgstr "" diff --git a/profiles.zcml b/profiles.zcml index 3c6d24c..e72a243 100644 --- a/profiles.zcml +++ b/profiles.zcml @@ -10,4 +10,10 @@ for="Products.CMFCore.interfaces.ISiteRoot" /> + diff --git a/profiles/photo/actions.xml b/profiles/photo/actions.xml new file mode 100644 index 0000000..3a1458c --- /dev/null +++ b/profiles/photo/actions.xml @@ -0,0 +1,386 @@ + + + + + + + + + + My selection + + string:${portal_url}/selection_view + + + + True + + + My cart + + string:${portal_url}/my_cart + + + + + + True + + + Login + + string:${portal_url}/login_form + + not: member + + + + True + + + My albums + + string:${portal_url}/member_albums + + member + + + + True + + + My orders + + string:${portal_url}/my_orders + + member + + + + True + + + My stuff + + string:${portal/portal_membership/getHomeUrl}/folder_contents + + python: member and portal.portal_membership.getHomeFolder() + + + + True + + + Add to favorites + + string:${object_url}/addtoFavorites + + portal/portal_membership/getHomeFolder + + + + False + + + My favorites + + string:${portal/portal_membership/getHomeUrl}/Favorites/folder_contents + + python: member and hasattr(portal.portal_membership.getHomeFolder(), "Favorites") + + + + False + + + My lightboxes + + string:${object_url}/visionneuses + + + + + + False + + + Preferences + + string:${portal_url}/personalize_form + + member + + + + True + + + Log out + + string:${portal_url}/logout?noajax=1 + + member + + + + True + + + Logged in + + string:${portal_url}/homepage_dispatcher + + + + + + False + + + Join + + string:${portal_url}/customer_join_form + + not: member + + + + True + + + + + + List + + string:${folder_url}/folder_contents + + python:member and folder is not object and object.portal_type !='Event' + + + + True + + + + + + Manage Boxes + + string:${portal_url}/manage_boxes?noajax=1 + + + + + + False + + + Send an email + + string:${object_url}/send_email_form + + member + + + + True + + + Undo + + string:${portal_url}/undo_form + + member + + + + True + + + Configure Portal + + string:${portal_url}/reconfig_form + + + + + + True + + + Directory + + string:${portal_url}/groups_members + + + + + + True + + + + + + Images + + string:${portal_url}/Images + + + + + + True + + + Boutique + + string:${portal_url}/Boutique + + + + + + True + + + Services + + string:${portal_url}/services + + + + + + True + + + Photographes + + string:${portal_url}/photographes + + + + + + True + + + + + + Credits + + string:${portal_url}/credits + + + + + + False + + + À propos + realis + string:${portal_url}/about + + + + + + True + + + Contact + + string:${portal_url}/contact + + + + + + True + + + + + + Add comment... + + string:${object_url}/discussion_reply_form + + python: object is not None and object.meta_type != 'Discussion Item' and portal.portal_discussion.isDiscussionAllowedFor(object) + + + + True + + + + + + Syndicate + + string:${folder_url}/synPropertiesForm + + python: folder is object and portal.portal_syndication.isSiteSyndicationAllowed() + + + + True + + + Calendar View + + string:${folder_url}/calendar_view + + python:member and folder is object and object.portal_type in ['Plinn Folder', 'Portfolio'] + + + + True + + + + + + Join + + string:${portal_url}/customer_join_form + + not: member + + + + True + + + Login + + string:${portal_url}/customer_login_form + + not: member + + + + True + + + diff --git a/profiles/photo/cachingpolicymgr.xml b/profiles/photo/cachingpolicymgr.xml new file mode 100644 index 0000000..098e911 --- /dev/null +++ b/profiles/photo/cachingpolicymgr.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/profiles/photo/catalog.xml b/profiles/photo/catalog.xml new file mode 100644 index 0000000..5ffb030 --- /dev/null +++ b/profiles/photo/catalog.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + True + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + True + + + True + + + True + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/componentregistry.xml b/profiles/photo/componentregistry.xml new file mode 100644 index 0000000..8cf408a --- /dev/null +++ b/profiles/photo/componentregistry.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/contenttyperegistry.xml b/profiles/photo/contenttyperegistry.xml new file mode 100644 index 0000000..3cc2552 --- /dev/null +++ b/profiles/photo/contenttyperegistry.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/cookieauth.xml b/profiles/photo/cookieauth.xml new file mode 100644 index 0000000..6c64558 --- /dev/null +++ b/profiles/photo/cookieauth.xml @@ -0,0 +1,13 @@ + + + __ac + __ac_name + __ac_password + __ac_persistent + login_form + logged_out + + False + private + True + diff --git a/profiles/photo/export_steps.xml b/profiles/photo/export_steps.xml new file mode 100644 index 0000000..98969f3 --- /dev/null +++ b/profiles/photo/export_steps.xml @@ -0,0 +1,138 @@ + + + + + + Export actions tool's action providers and their actions. + + + + + + + Export caching policy manager's policies. + + + + + + + Export catalog tool's sub-objects, indexes and columns. + + + + + + + Export local component registry configuration. + + + + + + + Export content type registry's predicates / bindings. + + + + + + + Export cookie crumbler settings + + + + + + + Export the mailhost's settings and properties + + + + + + + Export site properties. + + + + + + + Export custom roles and non-default role-permission mappings. + + + + + + + Export skins tool's filesystem directory views and skin path definitions. + + + + + + + Export current contents of import step registry and export step registry. + + + + + + + Export required / forbidden tools. + + + + + + + Export types tool's type information objects. + + + + + + + Export various plinn settings as python script. + + + + + + + Export workflow tool's workflow definitions and supporting scripts. + + + + diff --git a/profiles/photo/import_steps.xml b/profiles/photo/import_steps.xml new file mode 100644 index 0000000..94b2d6b --- /dev/null +++ b/profiles/photo/import_steps.xml @@ -0,0 +1,186 @@ + + + + + + + + + Import actions tool's action providers and their actions. + + + + + + + + + + Import caching policy manager's policies. + + + + + + + + + + Import catalog tool's sub-objects, indexes and columns. + + + + + + + + Import local component registry configuration. + + + + + + + + + + Import content type registry's predicates and bindings. + + + + + + + + + + Import cookie crumbler settings + + + + + + + + + + + + + Import mailhost settings + + + + + + + Import site properties. + + + + + + + Import custom roles and non-default role-permission mappings. + + + + + + + + + + Import skins tool's filesystem directory views and skin path definitions. + + + + + + + Create required tools, replacing any of the wrong class, and remove + forbidden ones. + + + + + + + + + + Import types tool's type information objects. + + + + + + + + + + + + Import various settings for CMF Calendar. + + + + + + + + + + + + + + + Import various settings from Plinn products. + + + + + + + + + + Import workflow tool's workflow definitions and supporting scripts. + + + + diff --git a/profiles/photo/mailhost.xml b/profiles/photo/mailhost.xml new file mode 100644 index 0000000..b00cae5 --- /dev/null +++ b/profiles/photo/mailhost.xml @@ -0,0 +1,3 @@ + + diff --git a/profiles/photo/properties.xml b/profiles/photo/properties.xml new file mode 100644 index 0000000..87304e5 --- /dev/null +++ b/profiles/photo/properties.xml @@ -0,0 +1,42 @@ + + + photo + Plinn photo website + postmaster@localhost + + 192 + 192 + + + + + + True + fr + False + 222 + Untitled- + utf-8 + utf-8 + + + + + + + + + + + + + 2 + + #484848 + 25 + 100 + 25 + diff --git a/profiles/photo/rolemap.xml b/profiles/photo/rolemap.xml new file mode 100644 index 0000000..fa7767b --- /dev/null +++ b/profiles/photo/rolemap.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/skins.xml b/profiles/photo/skins.xml new file mode 100644 index 0000000..1ca266e --- /dev/null +++ b/profiles/photo/skins.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/skins/custom.xml b/profiles/photo/skins/custom.xml new file mode 100644 index 0000000..07d15fd --- /dev/null +++ b/profiles/photo/skins/custom.xml @@ -0,0 +1,4 @@ + + + + diff --git a/profiles/photo/toolset.xml b/profiles/photo/toolset.xml new file mode 100644 index 0000000..1320220 --- /dev/null +++ b/profiles/photo/toolset.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types.xml b/profiles/photo/types.xml new file mode 100644 index 0000000..d15d20c --- /dev/null +++ b/profiles/photo/types.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/CMF_Site.xml b/profiles/photo/types/CMF_Site.xml new file mode 100644 index 0000000..4838f6d --- /dev/null +++ b/profiles/photo/types/CMF_Site.xml @@ -0,0 +1,51 @@ + + + + Portal portal_type + string:${portal_url}/plinn_icon.gif + + + + + + + False + True + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/Calendar.xml b/profiles/photo/types/Calendar.xml new file mode 100644 index 0000000..94f37c9 --- /dev/null +++ b/profiles/photo/types/Calendar.xml @@ -0,0 +1,42 @@ + + + Agenda + Calendar contains events. + string:${portal_url}/calendar_icon.gif + Plinn Calendar + Plinn + manage_addPlinnFolder + + + object/view + True + True + + + + False + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/Discussion_Item.xml b/profiles/photo/types/Discussion_Item.xml new file mode 100644 index 0000000..57b3007 --- /dev/null +++ b/profiles/photo/types/Discussion_Item.xml @@ -0,0 +1,36 @@ + + + Discussion Item + Discussion Items are documents which reply to other content. + They should *not* be addable through the standard 'folder_factories' interface. + string:${portal_url}/discussionitem_icon.gif + Discussion Item + + + + + + True + True + + False + + + + + + + + + + + + diff --git a/profiles/photo/types/Document.xml b/profiles/photo/types/Document.xml new file mode 100644 index 0000000..dedc32f --- /dev/null +++ b/profiles/photo/types/Document.xml @@ -0,0 +1,42 @@ + + + Document + Contain text that can be formatted using 'Structured Text.' It may also contain HTML, or "plain" text. + string:${portal_url}/text.gif + Document + CMFDefault + addDocument + + + object/edit + True + True + + False + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/Event.xml b/profiles/photo/types/Event.xml new file mode 100644 index 0000000..293f8be --- /dev/null +++ b/profiles/photo/types/Event.xml @@ -0,0 +1,46 @@ + + + Event + Events are objects for use in Calendar topical queries on the catalog. + string:${portal_url}/event_icon.gif + CMF Event + CMFCalendar + addEvent + + + object/edit + True + True + + False + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/Favorite.xml b/profiles/photo/types/Favorite.xml new file mode 100644 index 0000000..f93a817 --- /dev/null +++ b/profiles/photo/types/Favorite.xml @@ -0,0 +1,29 @@ + + + Favorite + Link to an intra-portal resource. + string:${portal_url}/link_icon.gif + Favorite + CMFDefault + addFavorite + + + object/edit + True + True + + False + + + + + + + + + diff --git a/profiles/photo/types/File.xml b/profiles/photo/types/File.xml new file mode 100644 index 0000000..1cc4cec --- /dev/null +++ b/profiles/photo/types/File.xml @@ -0,0 +1,51 @@ + + + File + Contain arbitrary downloadable files. + string:${portal_url}/application.png + Plinn File + Plinn + addFile + + + object/edit + True + True + + False + + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/File_Slot.xml b/profiles/photo/types/File_Slot.xml new file mode 100644 index 0000000..f5800c4 --- /dev/null +++ b/profiles/photo/types/File_Slot.xml @@ -0,0 +1,29 @@ + + + File Slot + File Slot for Mosaic Document + string:${portal_url}/mosaic_tool/bin_icon.gif + File Slot + MosaicDocument + addFileSlot + + + view + True + True + + False + + + + + + + + + diff --git a/profiles/photo/types/Huge_Plinn_Folder.xml b/profiles/photo/types/Huge_Plinn_Folder.xml new file mode 100644 index 0000000..49c99af --- /dev/null +++ b/profiles/photo/types/Huge_Plinn_Folder.xml @@ -0,0 +1,58 @@ + + + Huge Folder + Container to put content in categories. + string:${portal_url}/folder_icon.gif + Huge Plinn Folder + + plinn.folder.huge + + + object/folderContents + True + True + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/Image_Slot.xml b/profiles/photo/types/Image_Slot.xml new file mode 100644 index 0000000..13a4af6 --- /dev/null +++ b/profiles/photo/types/Image_Slot.xml @@ -0,0 +1,29 @@ + + + Image Slot + Image Slot for Mosaic Document + string:${portal_url}/mosaic_tool/photo_icon.gif + Image Slot + MosaicDocument + addImageSlot + + + view + True + True + + False + + + + + + + + + diff --git a/profiles/photo/types/Lightbox.xml b/profiles/photo/types/Lightbox.xml new file mode 100644 index 0000000..def8f7e --- /dev/null +++ b/profiles/photo/types/Lightbox.xml @@ -0,0 +1,24 @@ + + + Lightbox + lightbox holds references to photos + string:${portal_url}/lightbox_icon.png + Lightbox + + portfolio.lightbox + + + object/view + True + True + + False + + + + + + diff --git a/profiles/photo/types/Link.xml b/profiles/photo/types/Link.xml new file mode 100644 index 0000000..0172f76 --- /dev/null +++ b/profiles/photo/types/Link.xml @@ -0,0 +1,41 @@ + + + Link + Annotated URL. + string:${portal_url}/link_icon.gif + Link + CMFDefault + addLink + + + object/edit + True + True + + False + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/List_Slot.xml b/profiles/photo/types/List_Slot.xml new file mode 100644 index 0000000..1da28ad --- /dev/null +++ b/profiles/photo/types/List_Slot.xml @@ -0,0 +1,29 @@ + + + List Slot + List Slot for Mosaic Document + string:${portal_url}/mosaic_tool/str_icon.gif + List Slot + MosaicDocument + addStringSlot + + + view + True + True + + False + + + + + + + + + diff --git a/profiles/photo/types/Mosaic_Document.xml b/profiles/photo/types/Mosaic_Document.xml new file mode 100644 index 0000000..23bc637 --- /dev/null +++ b/profiles/photo/types/Mosaic_Document.xml @@ -0,0 +1,41 @@ + + + Mosaic Document + + string:${portal_url}/mosaic_icon.gif + Mosaic Document + MosaicDocument + addMosaicDocument + + + object/edit + True + False + + False + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/News_Item.xml b/profiles/photo/types/News_Item.xml new file mode 100644 index 0000000..68f1717 --- /dev/null +++ b/profiles/photo/types/News_Item.xml @@ -0,0 +1,43 @@ + + + News Item + Short text article with a title and an optional lead-in. + string:${portal_url}/newsitem_icon.gif + News Item + CMFDefault + addNewsItem + + + object/edit + True + True + + False + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/Order.xml b/profiles/photo/types/Order.xml new file mode 100644 index 0000000..c5c021d --- /dev/null +++ b/profiles/photo/types/Order.xml @@ -0,0 +1,23 @@ + + + Order + + string:${portal_url}/text.gif + Print order + + photoprint.order + + + object/edit + True + True + + False + + + + + diff --git a/profiles/photo/types/Order_Folder.xml b/profiles/photo/types/Order_Folder.xml new file mode 100644 index 0000000..4378dbb --- /dev/null +++ b/profiles/photo/types/Order_Folder.xml @@ -0,0 +1,48 @@ + + + Order Folder + + string:${portal_url}/folder_icon.gif + Huge Plinn Folder + + plinn.folder.huge + + + object/folderContents + True + True + + + + + False + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/Photo.xml b/profiles/photo/types/Photo.xml new file mode 100644 index 0000000..9ab28d1 --- /dev/null +++ b/profiles/photo/types/Photo.xml @@ -0,0 +1,41 @@ + + + Photo + Photo + string:${portal_url}/photo_icon.gif + Photo + + portfolio.photo + + + object/edit + True + True + + False + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/Plinn_Document.xml b/profiles/photo/types/Plinn_Document.xml new file mode 100644 index 0000000..ff2f692 --- /dev/null +++ b/profiles/photo/types/Plinn_Document.xml @@ -0,0 +1,43 @@ + + + Plinn Document + Plinn Documents contain text and images that can be layout with WYSIWYG and drag&drop editor. + string:${portal_url}/plinn_doc.gif + Plinn Document + + plinndocument + + + object/edit + True + True + + False + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/Plinn_Folder.xml b/profiles/photo/types/Plinn_Folder.xml new file mode 100644 index 0000000..41663ff --- /dev/null +++ b/profiles/photo/types/Plinn_Folder.xml @@ -0,0 +1,60 @@ + + + Folder + Container to put content in categories. + string:${portal_url}/folder_icon.gif + Plinn Folder + + plinn.folder.normal + + + object/folderContents + True + True + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/Portfolio.xml b/profiles/photo/types/Portfolio.xml new file mode 100644 index 0000000..15fee88 --- /dev/null +++ b/profiles/photo/types/Portfolio.xml @@ -0,0 +1,81 @@ + + + Collection + Folder for photo storage + string:${portal_url}/portfolio_icon.gif + Portfolio + + portfolio.portfolio + + + object/import + True + True + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/types/Spacer_Slot.xml b/profiles/photo/types/Spacer_Slot.xml new file mode 100644 index 0000000..f34dccb --- /dev/null +++ b/profiles/photo/types/Spacer_Slot.xml @@ -0,0 +1,29 @@ + + + Spacer Slot + Spacer Slot for Mosaic Document + string:${portal_url}/mosaic_tool/spacer_icon.gif + Spacer Slot + MosaicDocument + addSpacerSlot + + + view + True + True + + False + + + + + + + + + diff --git a/profiles/photo/types/String_Slot.xml b/profiles/photo/types/String_Slot.xml new file mode 100644 index 0000000..428e4f9 --- /dev/null +++ b/profiles/photo/types/String_Slot.xml @@ -0,0 +1,29 @@ + + + String Slot + String Slot for Mosaic Document + string:${portal_url}/mosaic_tool/str_icon.gif + String Slot + MosaicDocument + addStringSlot + + + view + True + True + + False + + + + + + + + + diff --git a/profiles/photo/types/Text_Slot.xml b/profiles/photo/types/Text_Slot.xml new file mode 100644 index 0000000..b15e189 --- /dev/null +++ b/profiles/photo/types/Text_Slot.xml @@ -0,0 +1,29 @@ + + + Text Slot + Text Slot for Mosaic Document + string:${portal_url}/mosaic_tool/txt_icon.gif + Text Slot + MosaicDocument + addStringSlot + + + view + True + True + + False + + + + + + + + + diff --git a/profiles/photo/types/Topic.xml b/profiles/photo/types/Topic.xml new file mode 100644 index 0000000..8c62c8d --- /dev/null +++ b/profiles/photo/types/Topic.xml @@ -0,0 +1,53 @@ + + + + Topics are canned queries for organizing content with up to date queries into the catalog. + string:${portal_url}/topic_icon.gif + Plinn Topic + + plinn.topic + + + object/edit + True + True + + + + False + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/typestool.xml b/profiles/photo/typestool.xml new file mode 100644 index 0000000..dcedfbf --- /dev/null +++ b/profiles/photo/typestool.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/various.py b/profiles/photo/various.py new file mode 100644 index 0000000..2932d81 --- /dev/null +++ b/profiles/photo/various.py @@ -0,0 +1,112 @@ +## Script (Python) "various.py" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=site +##title=Import various Plinn setting +## +from Products.CMFCore.utils import getToolByName +from Products.CMFCore.exceptions import BadRequest +from Products.Plinn.exceptions import WorkflowException +# TODO : CMF-2.1 compat +#from Products.PlacelessTranslationService.MessageID import MessageIDFactory +#_ = MessageIDFactory('plinn') +translate = lambda msg : msg +#--- + + +# constructs misc objects +# (productName, factory, id) +misc=(('StandardCacheManagers', 'manage_addAcceleratedHTTPCacheManager', 'HTTPCache'), + ('StandardCacheManagers', 'manage_addRAMCacheManager', 'rcm'), + ('GroupUserFolder', 'manage_addGroupUserFolder', 'acl_users')) + + +dispatcher = site.manage_addProduct +for m in misc : + try : getattr(dispatcher[m[0]], m[1])(m[2]) + except : pass + +if site.acl_users.Users.acl_users.encrypt_passwords : + site.acl_users.Users.acl_users.manage_setUserFolderProperties(encrypt_passwords=False) + + +# configure mosaicTool +blockTypes = ('Action Box Block', 'Container Block', 'File Block', 'Image Block', 'Mosaic Document', + 'Section Block', 'Spacer Block', 'Text Block', 'Tree Box Block') + +mostool = getToolByName(site, 'mosaic_tool') +addBI = mostool.manage_addProduct['MosaicDocument'].addMosaicBlockInformation +for bt in blockTypes : + try : addBI(blockType=bt) + except BadRequest : pass + +# contents +ttool = getToolByName(site, 'portal_types') +wtool = getToolByName(site, 'portal_workflow') + +def constructOrSkip(*args, **kw) : + try : ttool.constructContent(*args, **kw) + except BadRequest : pass + +def addBlockOrSkip(container, *args, **kw) : + try : container.addBlock(*args, **kw) + except BadRequest : pass + +def doActionForOrSkip(*args, **kw) : + try : wtool.doActionFor(*args, **kw) + except WorkflowException : pass + +# home page +constructOrSkip( 'Document', site, 'index_html' + , title = translate('Home') + , text_format='html' + , text=site.default_home_page_content()) +doActionForOrSkip(site.index_html, 'direct_publish') + +# default folders +constructOrSkip('Plinn Folder', site, 'Members', title = translate('Members')) +#constructOrSkip('Plinn Folder', site, 'global_settings', title = translate('Portlets')) +if not hasattr(site, 'global_settings') : + site.manage_addProduct['OFSP'].manage_addFolder('global_settings') +if not site.global_settings.hasProperty('noIndex'): + site.global_settings.manage_addProperty('noIndex', True, 'boolean') + +# left boxes +constructOrSkip('Mosaic Document', site.global_settings, 'left_boxes', title=translate('Left boxes')) +lb = site.global_settings.left_boxes +addBlockOrSkip(lb, 'Tree Box Block', 0, id='nav_tree') +lb.nav_tree.saveBlock(filteredMetaTypes={'text' : ['Plinn Folder', 'Portfolio', 'Topic']}) +doActionForOrSkip(lb, 'direct_publish') + +# right boxes +constructOrSkip('Mosaic Document', site.global_settings, 'right_boxes', title=translate('Right boxes')) +rb = site.global_settings.right_boxes +addBlockOrSkip(rb, 'Action Box Block', 0, id='global_actions') +rb.global_actions.saveBlock(boxTitle={'text' : translate('Global actions')}, categories={'text' : ['global']}) +addBlockOrSkip(rb, 'Action Box Block', 0, id='workflow_actions') +#rb.workflow_actions.saveBlock(boxTitle={'text' : translate('Workflow')}, categories={'text' : ['workflow']}) +#doActionForOrSkip(rb, 'direct_publish') + +# tools settings +mtool = getToolByName(site, 'portal_membership') +mtool.setMemberAreaPortalType('Plinn Folder') + +gtool = getToolByName(site, 'portal_groups') +gtool.setGroupWorkspaceContainerType('Plinn Folder') +gtool.setGroupWorkspaceType('Plinn Folder') + +caltool = getToolByName(site, 'portal_calendar') +caltool.configureTool(['created', 'modified', 'DateTimeOriginal'], [9, 18]) + +# Caches +HTTPCache = site.HTTPCache +HTTPCache.manage_editProps(title='Accelerated HTTP Cache', + settings={'anonymous_only' : False, 'interval' : 3600,'notify_urls' : []}) + +gtool = getToolByName(site, 'portal_groups') +gtool.ZCacheable_setManagerId('rcm') + +return 'Various Plinn settings imported' \ No newline at end of file diff --git a/profiles/photo/workflows.xml b/profiles/photo/workflows.xml new file mode 100644 index 0000000..cf8ec47 --- /dev/null +++ b/profiles/photo/workflows.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/profiles/photo/workflows/default_workflow/definition.xml b/profiles/photo/workflows/default_workflow/definition.xml new file mode 100644 index 0000000..a8373a3 --- /dev/null +++ b/profiles/photo/workflows/default_workflow/definition.xml @@ -0,0 +1,256 @@ + + + + Access contents information + Change portal events + Change portal topics + Delete Owned Objects + Manage properties + Modify portal content + View + + + + + + Manager + + + Manager + Reviewer + + + Manager + Reviewer + + + Manager + + + Manager + Reviewer + + + Manager + Reviewer + + + Contributor + Manager + Owner + Reader + Reviewer + + + + + + + Contributor + Manager + Owner + + + Contributor + Manager + Owner + + + Contributor + Manager + Owner + + + Manager + Owner + + + Contributor + Manager + Owner + + + Contributor + Manager + Owner + + + Contributor + Manager + Owner + Reader + + + + + + + Manager + + + Manager + + + Manager + + + Manager + + + Manager + + + Manager + + + Anonymous + Manager + + + + Reviewer can directly publish content if he have de Owner role (not necessarily ownership) + Publish + + Review portal content + python:user.allowed(here, ['Owner']) + + + + Publish + + Review portal content + + + + Reject + + Review portal content + + + + Retract + + Request review + python:not(here.portal_membership.checkPermission('Review portal content', here)) + + + + Submit + + Request review + + + + Reviewer tasks + Pending (%(count)d) + + here/havePendingContents + + + + + The last transition + + + transition/getId|nothing + + + + + + The ID of the user who performed the last transition + + + user/getId + + + + + + Comments about the last transition + + + python:state_change.kwargs.get('comment', '') + + + + + + + + python:scripts.sendNotificationEmail(state_change) or state_change.kwargs.get('email_sent', []) + + + + + + Provides access to workflow history + + + state_change/getHistory + + + Request review + Review portal content + + + + Time of the last transition + + + state_change/getDateTime + + + + + + + + + diff --git a/skins/control/getRecipients.py b/skins/control/getRecipients.py index 7977f15..d225f32 100644 --- a/skins/control/getRecipients.py +++ b/skins/control/getRecipients.py @@ -12,7 +12,7 @@ for role in roles : for member in object.getAllMembersInRole(role) : if (member.id not in recipientIds) and member.getProperty('email') : membersInRole.append(member) - recipientIds.append(member.id) + recipientIds.append(member.getId()) if membersInRole : rolesAndMembers.append( (role, membersInRole) ) diff --git a/skins/control/send_email.py b/skins/control/send_email.py index 35b3d82..93c573f 100644 --- a/skins/control/send_email.py +++ b/skins/control/send_email.py @@ -38,8 +38,6 @@ def encodeAdr(member) : sender = mtool.getAuthenticatedMember() sender = encodeAdr(sender) -if other_adr : - recipients['to'].extend(other_adr) recipientsFormated = {'to':'', 'cc':'', 'bcc':''} for field, b in recipients.items() : @@ -47,6 +45,13 @@ for field, b in recipients.items() : formated = filter(None, formated) formated = ', '.join(formated) recipientsFormated[field] = formated + +if other_adr : + recipients['to'].extend(other_adr) + formated = ', '.join(other_adr) + to = ', '.join([recipientsFormated['to'], formated]) + to = to.strip(', ') + recipientsFormated['to'] = to recipientsHeader = [] for field in ['to', 'cc', 'bcc'] : @@ -68,7 +73,6 @@ MailHost.send( message.encode('utf-8') ) if wfid is not None : wtool = portal.portal_workflow email_sent = reduce(lambda a, b : a+b, recipients.values()) - email_sent.extend(other_adr) wtool.doActionFor(context, 'send_email', wf_id=wfid, email_sent=email_sent, comment=text_body) diff --git a/skins/custom_control/folder_rename_control.py b/skins/custom_control/folder_rename_control.py new file mode 100755 index 0000000..4fc1163 --- /dev/null +++ b/skins/custom_control/folder_rename_control.py @@ -0,0 +1,26 @@ +##parameters=ids, new_ids, **kw +##title=Rename objects in a folder +## +from Products.CMFDefault.exceptions import CopyError +from Products.Plinn.utils import translate +_ = lambda msg : translate(msg, context) + +if not ids == new_ids: + try: + skiped = context.manage_renameObjects(ids, new_ids) + if not skiped : + if len(ids) == 1: + return context.setStatus(True, _(u'Item renamed.')) + else: + return context.setStatus(True, _(u'Items renamed.')) + else : + if len(skiped) == 1 : + return context.setStatus(True, _( u'This item has not been renamed: "%s"') % ids[0] ) + else : + return context.setStatus(True + , _( u'These items have not been renamed: %s') % \ + ', '.join(['"%s"' % id for id in ids]) ) + except CopyError: + return context.setStatus(False, _(u'Rename failed.')) +else: + return context.setStatus(False, _(u'Nothing to change.')) diff --git a/skins/custom_generic/expanded_title.py b/skins/custom_generic/expanded_title.py index 8fce45f..7c8301d 100644 --- a/skins/custom_generic/expanded_title.py +++ b/skins/custom_generic/expanded_title.py @@ -3,7 +3,7 @@ ##title=Build title which includes site title ## site_title = context.portal_url.getPortalObject().title_or_id() -page_title = context.title_or_id() +page_title = context.Title() or context.getId() if page_title != site_title: page_title = site_title + ": " + page_title diff --git a/skins/generic/batch_macros.pt b/skins/generic/batch_macros.pt index f5dedc1..78fd9f7 100644 --- a/skins/generic/batch_macros.pt +++ b/skins/generic/batch_macros.pt @@ -8,12 +8,12 @@
- You are here: ID / + You are here: ID /
diff --git a/skins/generic/plinn_style.css.dtml b/skins/generic/plinn_style.css.dtml index 91ffb14..efa3f70 100644 --- a/skins/generic/plinn_style.css.dtml +++ b/skins/generic/plinn_style.css.dtml @@ -103,22 +103,19 @@ table.assign_global_roles { color : &dtml-specialLinkHoverColor;; } -.config .tabs a { - color : &dtml-tabsFontColor;; - text-decoration: none } - +.config .tabs a, +.config .tabs a:link, +.config .tabs a:visited, .config .tabs a:active { - color: &dtml-tabsFontColor;; } + color : &dtml-tabsFontColor;; + text-decoration: none -.config .tabs a:hover { - color: #59c } - -.config .tabs a:link { - color: &dtml-tabsFontColor;; } - -.config .tabs a:visited { - color: &dtml-tabsFontColor;; } +} +.config .tabs a:hover { + color: #59c +} + .config .tabs td { padding-right: 5px; padding-left: 5px; @@ -136,9 +133,13 @@ table.assign_global_roles { border: solid 1px #669; } -.config .tabs td.selected a { +.config .tabs td.selected a, +.config .tabs td.selected a:link, +.config .tabs td.selected a:visited, +.config .tabs td.selected a:active { color: #000; - font-weight: bold } + font-weight: bold +} .twins_list { vertical-align: middle } diff --git a/skins/generic/send_email_form.pt b/skins/generic/send_email_form.pt index 4e52520..baa0b3f 100644 --- a/skins/generic/send_email_form.pt +++ b/skins/generic/send_email_form.pt @@ -40,9 +40,9 @@
@@ -73,7 +73,7 @@

(not required) -- 2.20.1