You probably have a python script (a .py file, not a .cpy file) that has
"##bind state=" in its header. grep -r --include=*.py "bind state" . My
guess is that somebody's been doing some cut-and-paste coding...
"J C Lawrence" <claw@...> wrote in message
news:4686.1089402730@......
> I've been attempting to add a feature to the PlonePortraitManager
> product so that a Manager can set/change/remove portraits for portal
> members and am running into trouble. I'm now getting the following
> traceback which has me stumped:
>
> Traceback (innermost last):
> Module ZPublisher.Publish, line 100, in publish
> Module ZPublisher.mapply, line 88, in mapply
> Module ZPublisher.Publish, line 40, in call_object
> Module Products.CMFFormController.FSControllerPageTemplate, line 81,
in __call__
> Module Products.CMFFormController.BaseControllerPageTemplate, line 39,
in _call
> Module Products.CMFFormController.ControllerBase, line 184, in getNext
> Module Products.CMFFormController.Actions.TraverseTo, line 23, in
__call__
> Module ZPublisher.mapply, line 88, in mapply
> Module ZPublisher.Publish, line 40, in call_object
> Module Products.CMFCore.FSPythonScript, line 103, in __call__
> Module Products.CMFCore.FSObject, line 115, in _updateFromFS
> Module Products.CMFCore.FSPythonScript, line 91, in _readFile
> Module Products.CMFCore.FSPythonScript, line 226, in _write
> Module Products.PythonScripts.PythonScript, line 398, in write
> KeyError: 'bind state'
>
> I've attached the relevant patch.
>
> NOTE: As we're also using LDAPUserFolder under GRUF, I've also touched
> portrait_manager_listMembers.py. This is because the normal
> mtool.listMembers() call under LDAPUserFolder will only return the
> members who are in the cache (ie recently logged in and active).
>
> Ideas? Pointers?
>
> --
> J C Lawrence
> ---------(*) Satan, oscillate my metallic sonatas.
> claw@... He lived as a devil, eh?
> http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live.
>
>
----------------------------------------------------------------------------
----
# Attempt to add portrait editing feature.
#
# To apply this patch:
# STEP 1: Chdir to the source directory.
# STEP 2: Run the 'applypatch' program with this patch file as input.
#
# If you do not have 'applypatch', it is part of the 'makepatch' package
# that you can fetch from the Comprehensive Perl Archive Network:
# http://www.perl.com/CPAN/authors/Johan_Vromans/makepatch-x.y.tar.gz
# In the above URL, 'x' should be 2 or higher.
#
# To apply this patch without the use of 'applypatch':
# STEP 1: Chdir to the source directory.
# If you have a decent Bourne-type shell:
# STEP 2: Run the shell with this file as input.
# If you don't have such a shell, you may need to manually create/delete
# the files as shown below.
# STEP 3: Run the 'patch' program with this file as input.
#
# These are the commands needed to create/delete files/directories:
#
rm -f 'CVS/Root'
rm -f 'CVS/Repository'
rm -f 'CVS/Entries'
touch 'portrait_manager_update.py'
chmod 0666 'portrait_manager_update.py'
touch 'portrait_manager_update.py.metadata'
chmod 0644 'portrait_manager_update.py.metadata'
#
# This command terminates the shell and need not be executed manually.
exit
#
#### End of Preamble ####
#### Patch data follows ####
diff -c
'/home/src/zope-products/products/collective/PlonePortraitManager/skins/port
rait_manager/portrait_manager_listMembers.py'
'portrait_manager/portrait_manager_listMembers.py'
Index: ./portrait_manager_listMembers.py
*** ./portrait_manager_listMembers.py Tue Mar 16 18:24:21 2004
--- ./portrait_manager_listMembers.py Thu Jul 8 16:52:54 2004
***************
*** 7,21 ****
##parameters ##title ##
! from Products.CMFCore.utils import getToolByName
mtool =etToolByName(context, 'portal_membership')
sp =etToolByName(context, 'portal_properties').site_properties
showempty =p.portrait_manager_showempty
defaultPortrait =tool.default_portrait
! members =tool.listMembers()
return [ member for member in members
if not (not showempty and
mtool.getPersonalPortrait(member.id).getId() =defaultPortrait)
! ]
\ No newline at end of file
--- 7,32 ----
##parameters ##title ##
! from Products.CMFCore.utils import getToolByName
mtool =etToolByName(context, 'portal_membership')
sp =etToolByName(context, 'portal_properties').site_properties
showempty =p.portrait_manager_showempty
defaultPortrait =tool.default_portrait
! #members =tool.listMembers()
! embers =tool.listMembers()
! members =]
! for entry in context.acl_users.Users.acl_users.getLocalUsers ():
! # entry =('uid=wrej01, ou=obal, ou=, o=izer.com',
! # ['Manager', 'group_Biomarkers', 'group_Discovery',
! # 'group_Pharmacogenomics'])
! dns =ntry[0].split (',')
! for spec in dns:
! if spec.startswith ('uid=:
! user =ontext.acl_users.Users.acl_users.getUser (spec[4:])
! members.append (user)
return [ member for member in members
if not (not showempty and
mtool.getPersonalPortrait(member.id).getId() =defaultPortrait)
! ]
diff -c
'/home/src/zope-products/products/collective/PlonePortraitManager/skins/port
rait_manager/portrait_manager_prefs_form.cpt'
'portrait_manager/portrait_manager_prefs_form.cpt'
Index: ./portrait_manager_prefs_form.cpt
*** ./portrait_manager_prefs_form.cpt Tue Mar 16 18:24:21 2004
--- ./portrait_manager_prefs_form.cpt Thu Jul 8 16:55:21 2004
***************
*** 2,65 ****
lang=n-US"
metal:use-macro=ere/prefs_main_template/macros/master"
i18n:domain=ortrait_manager">
-
<tal:block metal:fill-slot=ead_slot">
<tal:block tal:define=ummy python:request.set('disable_border',1)" />
</tal:block>
-
<body>
-
<div metal:fill-slot=refs_configlet_main"
tal:define=rrors options/state/getErrors;
! Batch python:modules['Products.CMFPlone'].Batch;
b_size python:10; b_start python:0; b_start
request/b_start | b_start">
-
<h1 i18n:translate=eading_portrait_manager">Portrait Manager</h1>
-
<p i18n:translate=escription_portrait_manager">
This is an overview over all member portraits
</p>
-
<form action=
name=emove"
method=ost"
tal:attributes=ction string:${template/getId}"
>
-
<fieldset>
<legend i18n:translate=ortrait_manager_remove_legend">Portrait
Manager</legend>
-
<div class=ield"
tal:define=ds request/ids | nothing;
error errors/ids | nothing;"
tal:attributes=lass python:test(error, 'field error',
'field')">
!
!
! <label i18n:translate=abel_remove_portrait_manager">Remove
member portrait</label>
!
<span class=ieldRequired" title=equired"
i18n:attributes=itle"
i18n:translate=abel_required">(Required)</span>
!
<div class=ormHelp"
i18n:translate=elp_remove_portrait_manager">
! Remove one or more member portraits.
! </div>
!
<div tal:content=rror"
i18n:translate=alidation_error_ids_portrait_manager">Validation error
output</div>
-
<tal:define
tal:define=istOfMembers
here/portrait_manager_listMembers;">
<tal:members
tal:condition=istOfMembers"
tal:define=atch python:Batch(listOfMembers, b_size,
int(b_start), orphan=;"
>
-
<table id=ortable"
class=isting"
summary=ontent listing"
cellpadding=" cellspacing="
tal:condition=istOfMembers">
-
<thead>
<tr>
<th class=osort"><input class=oborder"
--- 2,51 ----
lang=n-US"
metal:use-macro=ere/prefs_main_template/macros/master"
i18n:domain=ortrait_manager">
<tal:block metal:fill-slot=ead_slot">
<tal:block tal:define=ummy python:request.set('disable_border',1)" />
</tal:block>
<body>
<div metal:fill-slot=refs_configlet_main"
tal:define=rrors options/state/getErrors;
! Batch python:modules['Products.CMFPlone'].Batch;
b_size python:10; b_start python:0; b_start
request/b_start | b_start">
<h1 i18n:translate=eading_portrait_manager">Portrait Manager</h1>
<p i18n:translate=escription_portrait_manager">
This is an overview over all member portraits
</p>
<form action=
name=emove"
method=ost"
tal:attributes=ction string:${template/getId}"
>
<fieldset>
<legend i18n:translate=ortrait_manager_remove_legend">Portrait
Manager</legend>
<div class=ield"
tal:define=ds request/ids | nothing;
error errors/ids | nothing;"
tal:attributes=lass python:test(error, 'field error',
'field')">
! <label
! i18n:translate=abel_remove_portrait_manager">Remove or change member
portraits</label>
<span class=ieldRequired" title=equired"
i18n:attributes=itle"
i18n:translate=abel_required">(Required)</span>
!
<div class=ormHelp"
i18n:translate=elp_remove_portrait_manager">
! Remove or change one or more member portraits.
! </div>
<div tal:content=rror"
i18n:translate=alidation_error_ids_portrait_manager">Validation error
output</div>
<tal:define
tal:define=istOfMembers
here/portrait_manager_listMembers;">
<tal:members
tal:condition=istOfMembers"
tal:define=atch python:Batch(listOfMembers, b_size,
int(b_start), orphan=;"
>
<table id=ortable"
class=isting"
summary=ontent listing"
cellpadding=" cellspacing="
tal:condition=istOfMembers">
<thead>
<tr>
<th class=osort"><input class=oborder"
***************
*** 71,88 ****
tal:attributes=rc
string:$portal_url/select_all_icon.gif"
alt=elect all items"
i18n:attributes=itle alt"
! /></th>
<th> <span tal:omit-tag=
!
i18n:translate=mage_portrait_manager">Image</span> </th>
<th> <span tal:omit-tag=
!
i18n:translate=ogin_portrait_manager">Login</span> </th>
!
<th> <span tal:omit-tag=
!
i18n:translate=ember_portrait_manager">Member</span> </th>
</tr>
</thead>
<tbody>
-
<tal:members tal:repeat=Member batch">
<tr tal:define=ddrow repeat/aMember/odd;
memberId aMember/getId;
--- 57,72 ----
tal:attributes=rc
string:$portal_url/select_all_icon.gif"
alt=elect all items"
i18n:attributes=itle alt"
! /></th>
<th> <span tal:omit-tag=
!
i18n:translate=mage_portrait_manager">Image</span> </th>
<th> <span tal:omit-tag=
!
i18n:translate=ogin_portrait_manager">Login</span> </th>
<th> <span tal:omit-tag=
!
i18n:translate=ember_portrait_manager">Member</span> </th>
</tr>
</thead>
<tbody>
<tal:members tal:repeat=Member batch">
<tr tal:define=ddrow repeat/aMember/odd;
memberId aMember/getId;
***************
*** 91,97 ****
portrait
python:mtool.getPersonalPortrait(memberId);
isDefaultPortrait
python:portrait.getId() =defaultPortrait;"
tal:attributes=lass python:test(oddrow, 'even',
'odd')" >
-
<td>
<input type=heckbox" class=oborder"
name=ds:list" id="
value="
--- 75,80 ----
***************
*** 112,123 ****
alt string:Potrait of
${memberName};
title string:Potrait of
${memberName};"
/>
! <span tal:omit-tag=
tal:condition=sDefaultPortrait"
i18n:translate=mpty_portrait_portrait_manager">
no portrait
! </span>
!
</td>
<td>
<tal:content tal:content=emberId"/>
--- 95,113 ----
alt string:Potrait of
${memberName};
title string:Potrait of
${memberName};"
/>
! <div tal:omit-tag=
tal:condition=sDefaultPortrait"
i18n:translate=mpty_portrait_portrait_manager">
no portrait
! </div>
! <div>
! Change portrait to:
! <input type =file"
! name =portrait:list"
! id =portrait"
! size =20"
! tal:attributes=abindex
tabindex/next|nothing;" />
! </div>
</td>
<td>
<tal:content tal:content=emberId"/>
***************
*** 129,150 ****
</tal:members>
</tbody>
</table>
!
! <div metal:use-macro=ere/batch_macros/macros/navigation"
/>
</tal:members>
-
<tal:nomembers tal:condition=ot: listOfMembers">
<span i18n:translate=ortrait_manager_no_members">No
members to show</span>
</tal:nomembers>
-
</tal:define>
-
</div>
-
<div class=ormControls">
<input class=ontext"
tabindex=
type=ubmit"
name=orm.button.Remove"
value=emove"
i18n:attributes=alue"
--- 119,143 ----
</tal:members>
</tbody>
</table>
! <div metal:use-macro=ere/batch_macros/macros/navigation"
/>
</tal:members>
<tal:nomembers tal:condition=ot: listOfMembers">
<span i18n:translate=ortrait_manager_no_members">No
members to show</span>
</tal:nomembers>
</tal:define>
</div>
<div class=ormControls">
<input class=ontext"
tabindex=
type=ubmit"
+ name=orm.button.Update"
+ value=pdate"
+ i18n:attributes=alue"
+ tal:attributes=abindex tabindex/next;"
+ />
+ <input class=ontext"
+ tabindex=
+ type=ubmit"
name=orm.button.Remove"
value=emove"
i18n:attributes=alue"
***************
*** 159,190 ****
tal:attributes=abindex tabindex/next;"
/>
</div>
-
</fieldset>
-
<input type=idden" name=orm.submitted" value=" />
-
</form>
-
<form action=
name=emove"
method=ost"
tal:attributes=ction string:${template/getId}"
tal:condition=ython: int(b_start) =0"
>
-
<fieldset>
<legend
i18n:translate=ortrait_manager_config_legend">Configure Portrait
Manager</legend>
-
<div class=ield"
tal:define=howempty
site_properties/portrait_manager_showempty | nothing;">
-
<label i18n:translate=abel_config_portrait_manager">Show
members without portraits?</label>
-
<div class=ormHelp"
i18n:translate=elp_config_portrait_manager">
Show members without portraits
! </div>
!
<input type=adio"
class=oborder"
name=howempty"
--- 152,174 ----
tal:attributes=abindex tabindex/next;"
/>
</div>
</fieldset>
<input type=idden" name=orm.submitted" value=" />
</form>
<form action=
name=emove"
method=ost"
tal:attributes=ction string:${template/getId}"
tal:condition=ython: int(b_start) =0"
>
<fieldset>
<legend
i18n:translate=ortrait_manager_config_legend">Configure Portrait
Manager</legend>
<div class=ield"
tal:define=howempty
site_properties/portrait_manager_showempty | nothing;">
<label i18n:translate=abel_config_portrait_manager">Show
members without portraits?</label>
<div class=ormHelp"
i18n:translate=elp_config_portrait_manager">
Show members without portraits
! </div>
<input type=adio"
class=oborder"
name=howempty"
***************
*** 194,204 ****
tal:attributes=abindex tabindex;
checked showempty"
/>
-
<label for=b_showempty" i18n:translate=es">Yes</label>
-
<br />
-
<input type=adio"
class=oborder"
name=howempty"
--- 178,185 ----
***************
*** 208,216 ****
tal:attributes=abindex tabindex;
checked not:showempty"
/>
!
! <label for=b_noshowempty" i18n:translate=o">No</label>
!
</div>
<div class=ormControls">
<input class=ontext"
--- 189,195 ----
tal:attributes=abindex tabindex;
checked not:showempty"
/>
! <label for=b_noshowempty" i18n:translate=o">No</label>
</div>
<div class=ormControls">
<input class=ontext"
***************
*** 230,244 ****
tal:attributes=abindex tabindex/next;"
/>
</div>
-
</fieldset>
-
<input type=idden" name=orm.submitted" value=" />
-
</form>
-
</div>
-
</body>
</html>
-
--- 209,217 ----
diff -c
'/home/src/zope-products/products/collective/PlonePortraitManager/skins/port
rait_manager/portrait_manager_prefs_form.cpt.metadata'
'portrait_manager/portrait_manager_prefs_form.cpt.metadata'
Index: ./portrait_manager_prefs_form.cpt.metadata
*** ./portrait_manager_prefs_form.cpt.metadata Tue Mar 16 18:24:21 2004
--- ./portrait_manager_prefs_form.cpt.metadata Thu Jul 8 17:04:30 2004
***************
*** 5,15 ****
--- 5,17 ----
View=Authenticated
[validators]
+ validators..Update=rtrait_manager_validate
validators..Remove=rtrait_manager_validate
validators..Config validators..Cancel
[actions]
+ action.success..Update=averse_to:string:portrait_manager_update
action.success..Remove=averse_to:string:portrait_manager_delete
action.success..Config=averse_to:string:portrait_manager_config
action.success..Cancel=direct_to:string:portrait_manager_prefs_form
diff -c /dev/null 'portrait_manager/portrait_manager_update.py'
Index: ./portrait_manager_update.py
*** ./portrait_manager_update.py Wed Dec 31 19:00:00 1969
--- ./portrait_manager_update.py Fri Jul 9 15:15:41 2004
***************
*** 0 ****
--- 1,31 ----
+ ## Controller Python Script "portrait_manager_delete"
+ ##bind container=ntainer
+ ##bind context=ntext
+ ##bind namespace+ ##bind script=ript
+ ##bind state=ate
+ ##bind subpath=averse_subpath
+ ##parameters=s=
+ ##titleÞlete member portraits
+
+ from Products.CMFPlone import transaction_note
+ from Products.CMFCore.utils import getToolByName
+
+
+ tmsg=pdated portrait(s) of %s.' % ' '.join(ids)
+ transaction_note(tmsg)
+ return state.set(portal_status_message=sg)
+
+ membership =etToolByName(context, 'portal_membership')
+ members =ontext.portrait_manager_listMembers ()
+ members =embers[b_start:]
+ for member in ids:
+ pic =ortrait[members.index (member)]
+ if pic:
+ pic.seek(0)
+ portal_membership.changeMemberPortrait (pic, member)
+
+ tmsg=pdated portrait(s) of %s.' % ' '.join(ids)
+ transaction_note(tmsg)
+
+ return state.set(portal_status_message=sg)
diff -c /dev/null 'portrait_manager/portrait_manager_update.py.metadata'
Index: ./portrait_manager_update.py.metadata
*** ./portrait_manager_update.py.metadata Wed Dec 31 19:00:00 1969
--- ./portrait_manager_update.py.metadata Fri Jul 9 15:11:42 2004
***************
*** 0 ****
--- 1,6 ----
+ [validators]
+ validators =ortrait_manager_validate
+
+ [actions]
+ action.failure=averse_to:string:portrait_manager_prefs_form
+ action.success=direct_to:string:plone_control_panel
diff -c
'/home/src/zope-products/products/collective/PlonePortraitManager/skins/port
rait_manager/portrait_manager_validate.vpy'
'portrait_manager/portrait_manager_validate.vpy'
Index: ./portrait_manager_validate.vpy
*** ./portrait_manager_validate.vpy Tue Mar 16 18:24:21 2004
--- ./portrait_manager_validate.vpy Thu Jul 8 17:04:04 2004
***************
*** 9,17 ****
##title=lidates the member portraits
if not ids:
! state.setError('ids', 'Input is required but no input given.',
'input_required')
if state.getErrors():
return state.set(status=ailure', portal_status_message=lease correct
the indicated errors.')
else:
! return state.set(portal_status_message=ember portrait(s) removed.')
--- 9,17 ----
##title=lidates the member portraits
if not ids:
! state.setError('ids', 'Input is required but no input given.',
'input_required')
if state.getErrors():
return state.set(status=ailure', portal_status_message=lease correct
the indicated errors.')
else:
! return state.set(portal_status_message=ember portrait(s) changed.')
#### End of Patch data ####
#### ApplyPatch data follows ####
# Data version : 1.0
# Date generated : Fri Jul 9 15:48:52 2004
# Generated by : makepatch 2.00_07*
# Recurse directories : Yes
# Excluded files : (\A|/).*\~\Z
# (\A|/).*\.a\Z
# (\A|/).*\.bak\Z
# (\A|/).*\.BAK\Z
# (\A|/).*\.elc\Z
# (\A|/).*\.exe\Z
# (\A|/).*\.gz\Z
# (\A|/).*\.ln\Z
# (\A|/).*\.o\Z
# (\A|/).*\.obj\Z
# (\A|/).*\.olb\Z
# (\A|/).*\.old\Z
# (\A|/).*\.orig\Z
# (\A|/).*\.rej\Z
# (\A|/).*\.so\Z
# (\A|/).*\.Z\Z
# (\A|/)\.del\-.*\Z
# (\A|/)\.make\.state\Z
# (\A|/)\.nse_depinfo\Z
# (\A|/)core\Z
# (\A|/)tags\Z
# (\A|/)TAGS\Z
# r 'CVS/Root' 59 0
# r 'CVS/Repository' 44 0
# r 'CVS/Entries' 555 0
# p 'portrait_manager_listMembers.py' 626 1089319974 0100666
# p 'portrait_manager_prefs_form.cpt' 10139 1089320121 0100666
# p 'portrait_manager_prefs_form.cpt.metadata' 440 1089320670 0100666
# c 'portrait_manager_update.py' 0 1089400541 0100666
# c 'portrait_manager_update.py.metadata' 0 1089400302 0100644
# p 'portrait_manager_validate.vpy' 557 1089320644 0100666
#### End of ApplyPatch data ####
#### End of Patch kit [created: Fri Jul 9 15:48:52 2004] ####
#### Patch checksum: 548 22701 36020 ####
#### Checksum: 583 23937 10776 ####
|