[dzug-zope] Plone Workflow: Owner ändern

12 Messages Forum Options Options
Embed this topic
Permalink
Hendrik Bunke
[dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink
Hallo,

vorweg: ich habe wenig Ahnung von Python, Plone (und ein bisschen
Zope) lern ich fleißig, aber erst seit einigen Monaten. Nun hab
ich ein vermutlich simples, aber mich gerade ziemlich zur
Verzweiflung treibendes Problem.

Ich würde gerne innerhalb eines Workflows beim Übergang von
Status A nach Status B den 'Owner' des Objekts ändern, und zwar
soll der Nutzer, der den Übergang ausführt, der Besitzer werden.
Geht das und wenn ja wie? Ich vermute ja, dass bei den
transition-Eigenschaften der Punkt "Script (after)" der richtige
ist. Allerdings hab ich keine konkrete Vorstellung davon, was
genau ich in das betreffende Skript reinschreiben muss.

Bin für jede Hilfe dankbar!

gruß
hendrik

--
Dr. Hendrik Bunke
hbxt.de Bildung-IT-Wissenschaft
com: http://hbxt.de/
blog: http://hbxt.org/



_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope
Andreas Jung-5
Re: [dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink


--On 18. Oktober 2006 14:00:27 +0200 Hendrik Bunke <bunke@...> wrote:


>
> Ich würde gerne innerhalb eines Workflows beim Übergang von
> Status A nach Status B den 'Owner' des Objekts ändern, und zwar
> soll der Nutzer, der den Übergang ausführt, der Besitzer werden.
> Geht das und wenn ja wie? Ich vermute ja, dass bei den
> transition-Eigenschaften der Punkt "Script (after)" der richtige
> ist. Allerdings hab ich keine konkrete Vorstellung davon, was
> genau ich in das betreffende Skript reinschreiben muss.

In einem Workflowscript bekommst Du das Objekt über state_change.object.
Den Owner eines Objektes ändern geht über dessen Methode
changeOwnership(), siehe AccessControl/interfaces.py. Aber dafür
benötigst Du i.A. Manager-Rechte. Hierfür gibt es bei Scripten
Proxy-Rollen, die aber in Workflow-Skripten nicht funktionieren. Deswegen
muß Du den entsprechenden Code
in eine Externe Methode auslagern und diese dann vom Workflowscript
aufrufen.

-aj



_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope

attachment0 (193 bytes) Download Attachment
Hendrik Bunke
Re: Re: [dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink
--On Wed, 18 Oct 2006 16:34, Andreas Jung wrote:

> In einem Workflowscript bekommst Du das Objekt über state_change.object.
> Den Owner eines Objektes ändern geht über dessen Methode changeOwnership(),
> siehe AccessControl/interfaces.py. Aber dafür benötigst Du i.A.
> Manager-Rechte. Hierfür gibt es bei Scripten Proxy-Rollen, die aber in
> Workflow-Skripten nicht funktionieren. Deswegen muß Du den entsprechenden Code
> in eine Externe Methode auslagern und diese dann vom Workflowscript
> aufrufen.

Vielen Dank soweit. Leider bin ich doof (bzw. auch
Python-Anfänger) und komm noch nicht richtig weiter.

Also, ich hab ArchGenXML benutzt zur Generierung des Produkts
incl. Workflow. Im Tutorial
http://plone.org/documentation/tutorial/archgenxml-getting-started/workflow 
heißt es:

    "Actions are set using the effect field of a transition. The
    value given here gives the name of the action method to execute
    (and thus must be valid python method name). ArchGenXML will
    create or modify a script containing external methods for each
    workflow, in Extensions/<WorkflowName>_scripts.py in your
    product. You must fill in the method bodies for the actions in
    this script."

Das funktioniert auch. ArchGenXML produziert im genannten Skript
das hier:

#Workflow Scripts for: DL_Workflow

##code-section workflow-script-header #fill in your manual code here
##/code-section workflow-script-header


def changeOwner(self, state_change, **kw):
    pass

Daraus hab ich gemacht (Method body):

def changeOwner(self, state_change, **kw):
    ##parameters=state_change
    obj = state_change.object
    user = user.getId()
    obj.changeOwnership(user, recursive=0)

Soweit so gut, das Skript scheint immerhin ausgeführt zu werden
bei der transition. Allerdings mit dieser Fehlermeldung von
Plone:

    Error Type
        UnboundLocalError
     Error Value
        local variable 'user' referenced before assignment

Frage: wie komme ich in dem Skript an den aktuellen Nutzer, der
den Übergang ausführt?

vielen dank!
hendrik bunke


--
Dr. Hendrik Bunke
hbxt.de Bildung-IT-Wissenschaft
com: http://hbxt.de/
blog: http://hbxt.org/



_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope
Andreas Jung-5
Re: Re: [dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink


--On 19. Oktober 2006 16:46:22 +0200 Hendrik Bunke <bunke@...> wrote:

>
>     Error Type
>         UnboundLocalError
>      Error Value
>         local variable 'user' referenced before assignment
>
> Frage: wie komme ich in dem Skript an den aktuellen Nutzer, der
> den Übergang ausführt?

Siehe Code in:

<http://old.dzug.org/SchreibMit/ZopeFaq/Entwicklung/cookiecrumbler>

-aj



_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope

attachment0 (193 bytes) Download Attachment
Dieter Maurer
Re: [dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink
In reply to this post by Hendrik Bunke
Hendrik Bunke wrote at 2006-10-18 14:00 +0200:
> ...
>Ich würde gerne innerhalb eines Workflows beim Übergang von
>Status A nach Status B den 'Owner' des Objekts ändern, und zwar
>soll der Nutzer, der den Übergang ausführt, der Besitzer werden.
>Geht das?

Klar.

Ich nutze dafür folgenden Code:

  def _fixOwner(self):
    '''after an object has been copied, we must make sure, the
    'Owner' local role changes accordingly. Zopes ownership info
    seems to be handled automatically.

    ATT: it might become necessary in the future to fix the role for
    children, too.
    '''
    lr= self.__ac_local_roles__; c= self.Contributor; changed= 0
    for k,v in lr.items():
      if k == c: continue
      if 'Owner' in v:
        v.remove('Owner'); changed= 1
        if not v: del lr[k]
    v= lr.setdefault(c,[])
    if 'Owner' not in v: v.append('Owner'); changed= 1
    if changed: self.__ac_local_roles__= lr

"AccessControl.Role.RoleManager" hat Methoden, die eher
dem "Standard entsprechen". Auch diese erfordern verhältnismäßig
mächtige Rechte. Vermutlich wirst Du eine "External Method" benötigen.



--
Dieter


_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope
Dieter Maurer
Re: Re: [dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink
In reply to this post by Andreas Jung-5
Andreas Jung wrote at 2006-10-18 16:34 +0200:

> ...
>> Ich würde gerne innerhalb eines Workflows beim Übergang von
>> Status A nach Status B den 'Owner' des Objekts ändern, und zwar
>> soll der Nutzer, der den Übergang ausführt, der Besitzer werden.
>> Geht das und wenn ja wie? Ich vermute ja, dass bei den
>> transition-Eigenschaften der Punkt "Script (after)" der richtige
>> ist. Allerdings hab ich keine konkrete Vorstellung davon, was
>> genau ich in das betreffende Skript reinschreiben muss.
>
>In einem Workflowscript bekommst Du das Objekt über state_change.object.
>Den Owner eines Objektes ändern geht über dessen Methode
>changeOwnership()

Vorsicht Falle!

"changeOwnership" ändert die "executable ownership", die nur für
ausführbare Objekte und nicht für "Content"-Objekte interessant ist.

Fast sicher ist der Fragestelle an der lokalen Rolle "Owner" interessiert.



--
Dieter


_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope
Hendrik Bunke
Re: Re: Re: [dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink
In reply to this post by Andreas Jung-5
--On Thu, 19 Oct 2006 17:20, Andreas Jung wrote:

> > Frage: wie komme ich in dem Skript an den aktuellen Nutzer, der
> > den Übergang ausführt?
>
> Siehe Code in:
>
> <http://old.dzug.org/SchreibMit/ZopeFaq/Entwicklung/cookiecrumbler>

Danke. Funktioniert aber auch nicht:

    Error Type
        AttributeError
    Error Value
        'str' object has no attribute 'getId'

Ok, wahrscheinlich hab ich das einfach nicht verstanden, aber ich
bemühe mich ja. Ist obige Methode nicht eigentlich auch zu
kompliziert? In den Workflows kann man ja Variablen einrichten.
Einige gibt es auch schon, z.B. 'actor', der den Nutzer, der die
letzte Aktion ausgelöst hat, ausgibt. Also eigentlich genau das
was ich brauche. Aber wie binde ich - Entschuldigung für die
dumme Frage - diese Variable denn in das Skript ein?

Vielen Dank für die Geduld!
hendrik


--
Dr. Hendrik Bunke
hbxt.de Bildung-IT-Wissenschaft
com: http://hbxt.de/
blog: http://hbxt.org/



_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope
Andreas Jung-5
Re: Re: Re: [dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink


--On 19. Oktober 2006 21:30:30 +0200 Hendrik Bunke <bunke@...> wrote:

> --On Thu, 19 Oct 2006 17:20, Andreas Jung wrote:
>
>> > Frage: wie komme ich in dem Skript an den aktuellen Nutzer, der
>> > den Übergang ausführt?
>>
>> Siehe Code in:
>>
>> <http://old.dzug.org/SchreibMit/ZopeFaq/Entwicklung/cookiecrumbler>
>
> Danke. Funktioniert aber auch nicht:
>
>     Error Type
>         AttributeError
>     Error Value
>         'str' object has no attribute 'getId'
Naja, auch mal bischen mitdenken und nicht einfach nur via Cut&Paste Code
übernehmen. getUserName() liefert Dir bereits den Benutzernamen *als
String*. Dass User Objekte eine getId() Methode haben ist mir neu.

-aj



_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope

attachment0 (193 bytes) Download Attachment
Dieter Maurer
Re: Re: Re: Re: [dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink
Andreas Jung wrote at 2006-10-19 21:36 +0200:
> ...
>Dass User Objekte eine getId() Methode haben ist mir neu.

Sie haben, wie "AccessControl.User.BasicUser" zeigt.



--
Dieter



_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope
Andreas Jung-5
Re: Re: Re: Re: [dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink


--On 20. Oktober 2006 19:04:59 +0200 Dieter Maurer <dieter@...>
wrote:

> Andreas Jung wrote at 2006-10-19 21:36 +0200:
>> ...
>> Dass User Objekte eine getId() Methode haben ist mir neu.
>
> Sie haben, wie "AccessControl.User.BasicUser" zeigt.
>

Mag sein. Otto-Normalverbraucher benötigt getUserName().

-aj



_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope

attachment0 (193 bytes) Download Attachment
Jens Vagelpohl-2
Re: [dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


On 20 Oct 2006, at 13:19, Andreas Jung wrote:

>
>
> --On 20. Oktober 2006 19:04:59 +0200 Dieter Maurer  
> <dieter@...> wrote:
>
>> Andreas Jung wrote at 2006-10-19 21:36 +0200:
>>> ...
>>> Dass User Objekte eine getId() Methode haben ist mir neu.
>>
>> Sie haben, wie "AccessControl.User.BasicUser" zeigt.
>>
>
> Mag sein. Otto-Normalverbraucher benötigt getUserName().

Behalte immer im Auge, dass bessere userfolder-Implementierungen  
inzwischen einen Unterschied zwischen der ID (-> user.getId()) und  
dem Login (-> user.getUserName()) machen. Bei Dingen wie local roles  
wird z.B. immer die ID verwendet.

Es ist schon klar, dass viele user folder (und auch der normale  
AccessControl.User.UserFolder) sich darum nicht scheren und bei  
beiden Methoden ein und dasselbe zurückgeben, man sollte aber doch  
genau unterscheiden. Implementierungen wie z.B. PluggableAuthService  
oder auch LDAPUserFolder machen da einen Unterschied.

jens



-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (Darwin)

iD4DBQFFOQqbRAx5nvEhZLIRAteVAKCebdFZlPHCGvYg+jIJ1jfffkm8GQCYw31b
yYZ0XAAjzRUWldUtF76+/g==
=TzkQ
-----END PGP SIGNATURE-----


_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope
Dieter Maurer
Re: Re: Re: Re: Re: [dzug-zope] Plone Workflow: Owner ändern
Reply Threaded MoreMore options
Print post
Permalink
In reply to this post by Andreas Jung-5
Andreas Jung wrote at 2006-10-20 19:19 +0200:
> ...
>> Andreas Jung wrote at 2006-10-19 21:36 +0200:
>>> ...
>>> Dass User Objekte eine getId() Methode haben ist mir neu.
>>
>> Sie haben, wie "AccessControl.User.BasicUser" zeigt.
>>
>
>Mag sein. Otto-Normalverbraucher benötigt getUserName().

Es ist das gleiche wie "getId()" für "BasicUser"...



--
Dieter


_______________________________________________
zope mailing list
zope@...
https://mail.dzug.org/mailman/listinfo/zope