Probleme mit Pfad

Django, Flask, Bottle, WSGI, CGI…
Benutzeravatar
mitch
User
Beiträge: 78
Registriert: Dienstag 1. August 2006, 09:07
Kontaktdaten:

Probleme mit Pfad

Beitragvon mitch » Dienstag 15. August 2006, 12:47

hi, es ist eine etwas einfachere Frage, ich will den User abfragen wie im :

Code: Alles auswählen

<html>
  <head>
    <title tal:content="template/title">The title</title>
  </head>
  <body>
   

     <b> -- Benutzerinformationen -- </b>

<div
  tal:omit-tag=""
  tal:define="
    userName request/userName|nothing;
    userObj python: here.portal_membership.getMemberById(userName);
    getPortrait nocall: here/../../portal_membership/getPersonalPortrait;
    getFolder nocall: here/../../portal_membership/getHomeFolder">
 
<p tal:condition="not: userName">
   kein Benutzername gewählt.
</p>
<p tal:condition="not: userObj">
   Dieser Benutzer existiert nicht.
</p>

<table tal:condition="userObj">
  <tr>
    <td>
     <img src=""
     tal:replace="structure python: getPortrait(userName)" />
<li
   tal:define="home python: getFolder(userName)"
   tal:condition="home">
   <a href=""
       tal:attributes="href home/absolute_url"
       >Home Ordner</a>
</li>
    </td>
   </tr>
</table>
</div>
  </body>
</html>


Das Problem ist bloß, dass ich mich ja in meinem plone/portal_skins/costum Ordner befinde und die "portal_memberships" in der Struktur "plone/" liegen aber wie komme ich wieder den Pfad nach oben? Mit "here" gibt er halt den aktuellen Platz aus "container" aus wo er sich gerade befindet! Gibts da auch was wie bei html? So eine einfach Lösung wie "../" um ein Ordner höher zu gehen?!

edit: okay das mit dem Pfad in den Tags hab ich herraus gefunden .. "here/../" um Ordner höher zu gehen aber wie mache ich das im Python bei "here.portal_membership.getMemberById(userName);"

Sorry für die unanehmlichkeiten ... bin noch am lernen


mfg mitch...[

Edit by Gerold: Code-Tag gesetzt
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Probleme mit Pfad

Beitragvon gerold » Dienstag 15. August 2006, 13:32

mitch hat geschrieben:Das Problem ist bloß, dass ich mich ja in meinem plone/portal_skins/costum Ordner befinde und die "portal_memberships" in der Struktur "plone/" liegen aber wie komme ich wieder den Pfad nach oben?

Hi Mitch!

Zope beherrst "Aquisition". Dh. es sucht ein Objekt vom aufrufenden Ordner ausgehend bis zum Root-Ordner zurück, bis es das Objekt gefunden hat. Du brauchst dich also nicht darum kümmern, den absoluten Pfad zu einem Objekt angeben zu müssen.

``here/portal_membership`` genügt.

Code: Alles auswählen

<p tal:content="here/portal_membership/getHomeFolder" />
<p tal:define="home here/portal_membership/getHomeFolder"
   tal:content="home/absolute_url"
/>


In einem "Python-Script" sieht das dann so aus:

Code: Alles auswählen

print context.portal_membership.getHomeFolder()
print context.portal_membership.getHomeFolder().absolute_url()

return printed


Willst du innerhalb eines "Python-Scriptes" wirklich einmal ganz gezielt auf den übergeordneten Ordner zugreifen, dann machst du das mit ``aq_parent``.

Code: Alles auswählen

print context.aq_parent.absolute_url()
print context.aq_parent.aq_parent.absolute_url()


mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 15. August 2006, 13:38

Da gibt es noch etwas...

Code: Alles auswählen

<div tal:omit-tag=""
     tal:define="userName request/userName | nothing;
                 userObj python: context.portal_membership.getMemberById(userName);
                 membershipObj context/portal_membership;
                 getPortrait nocall: membershipObj/getPersonalPortrait;
                 getFolder nocall: membershipObj/getHomeFolder"
>

Wenn du mehrmals auf ein entferntes Objekt zugreifen musst, dann ist es besser, wenn du es vorher einmal in eine Variable legst. Dann muss Zope nicht jedes mal neu nach dem Objekt suchen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
mitch
User
Beiträge: 78
Registriert: Dienstag 1. August 2006, 09:07
Kontaktdaten:

Beitragvon mitch » Dienstag 15. August 2006, 14:26

hallo gerold,

danke für deine Antwort, ich habe es jetzt mal so:

<html>
<head>
<title tal:content="template/title">The title</title>
</head>
<body>


<b> -- Benutzerinformationen -- </b>

<div
tal:omit-tag=""
tal:define="
userName string:mitch;
userObj python: here.portal_membership.getMemberById(userName);
membershipObj context/portal_membership;
getPortrait nocall: membershipObj/getPersonalPortrait;
getFolder nocall: membershipObj/getHomeFolder">

<p tal:condition="not: userName">
kein Benutzername gewählt.
</p>
<p tal:condition="not: userObj">
Dieser Benutzer existiert nicht.
</p>

<table tal:condition="userObj">
<tr>
<td>
<img src=""
tal:replace="structure python: getPortrait(userName)" />
<li
tal:define="home python: getFolder(userName)"
tal:condition="home">
<a href=""
tal:attributes="href home/absolute_url"
>Home Ordner</a>
</li>
</td>
</tr>
</table>
</div>
</body>
</html>


aber er gibt mir immer aus, dass der Benutzer nicht existiert obwohl er das tut! Was mache ich falsch? Ich habe das Beispiel aus einem Plonehandbuch was schon älter ist und ich arbeite mit der Version 2.5.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 15. August 2006, 18:32

mitch hat geschrieben:ich arbeite mit der Version 2.5.

Hi Mitch!

Da musste ich jetzt auch ein wenig herumexperimentiert um da drauf zu kommen. ``string:tester`` liefert nicht unbedingt ein String-Objekt zurück. Mit ``str()`` umwandeln, dann funktioniert es.

Code: Alles auswählen

<p tal:define="userName string:tester;
               membershipObj context/portal_membership;
               userObj python: membershipObj.getMemberById(str(userName));"
   tal:content="userObj"
/>

mfg
Gerold
:-)

PS: Bitte stell deinen Code zwischen zwei Code-Tags, damit man ihn besser lesen kann.
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
mitch
User
Beiträge: 78
Registriert: Dienstag 1. August 2006, 09:07
Kontaktdaten:

Beitragvon mitch » Mittwoch 16. August 2006, 07:27

Danke gerold für deine Hilfe es funktioniert jetzt...
Ich werd mich bestimmt noch öfters hier melden, dass mit code zeilen merk ich mir, sorry!
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Beitragvon JR » Donnerstag 17. August 2006, 19:35

Halli hallo!

Das mit dem aq_parent habe ich schon immer vermisst.
Nun habe ich mal wieder ein merkwürdiges Verhalten.
Im Customordner liegt ein Pythonscript:

Code: Alles auswählen

return context.aq_parent.aq_parent.km_manager.script_par_read('list', 'Programm', 'Vollmacht', 0)

Es lässt sich prima testen und gibt eine Liste zurück.

Ebenfalls im Ordner habe ich das Template prefs_groups_overview customized.
Es enthält in den ersten Zeilen folgenden tag:

Code: Alles auswählen

<tal:variable tal:omit-tag=""
   tal:define="KMMRoles python: context.script_KMM_vollmachten()">
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Beitragvon JR » Donnerstag 17. August 2006, 19:38

AAA

Ich habe eben versehens auf Absenden und nicht Vorschau geklickt :-(

Also jedenfalls bekomme ich eine Fehlermeldung in Plone:
Fehlertyp
AttributeError

Fehlerwert
km_manager

In der Ordnerstruktur liegt ein Ploneordner hier:
portal-root/km_manager

Cutom liegt ja unter portal-root/portal_skins/custom

Rätsel: Warum mag Plone den Ordner nicht??

Ich grüße alle
Jamil
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Beitragvon JR » Donnerstag 17. August 2006, 19:41

Nochmal ich.

Ich habe eine Vermutung. Wenn ich das Script script_par_read in den Ordner custom lege geht es. Kann es sein, dass Plone oder Zope es nicht mag, wenn ein Ordner den string "manage" enthält?

Grüße
Jamil
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 17. August 2006, 20:00

JR hat geschrieben:

Code: Alles auswählen

return context.aq_parent.aq_parent.km_manager.script_par_read('list', 'Programm', 'Vollmacht', 0)

Hi JR!

Unabhängig von deinem Problem:

Es sollte aber ohne die ``aq_parent`` genauso, wenn nicht besser funktionieren. Absolute Angaben sollte man vermeiden.

Code: Alles auswählen

return context.km_manager.script_par_read('list', 'Programm', 'Vollmacht', 0)

Zope geht somit automatisch so weit nach oben, bis es das Objekt "km_manager" findet und führt dann das Skript ``script_par_read`` mit dem aktuellen Ordner, von dem aus gesucht wurde, als Context aus.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Beitragvon JR » Donnerstag 17. August 2006, 20:10

Gerold, du bist unglaublich schnell :-)

Ich möchte aus

portal/portal_skins/custom

ein Script benutzen, welches unter

portal/km_manager

liegt. Somit geht der Pfad nicht nur um Ebenen nach oben, sondern nach zwei Schritten hoch wieder einen Schritt von portal nach km_manager runter. Ich habe jetzt dieses Script, welches ich in den o.g. Verzeichnissen benötige einfach in den Portalrootordner gelegt. Ist allerdings keine gute Lösung, da es nicht so performant ist. Das Script rufe ich nämlich nur in wenigen Fällen aus dem custom-Ordner heraus auf. Viel häufiger werde ich es im Ordner km_manager benötigen.
Das Traversieren kostet glaube ich etwas Zeit und verlangsamt den Seitenaufbau nicht unerheblich.

Was sagt der Profi dazu?

Jamil
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 17. August 2006, 20:21

JR hat geschrieben:Fehlertyp
AttributeError

Fehlerwert
km_manager

In der Ordnerstruktur liegt ein Ploneordner hier:
portal-root/km_manager

Cutom liegt ja unter portal-root/portal_skins/custom

Hi JR!

**AttributeError** --> Attribut wurde nicht gefunden.
**Fehlerwert: km_manager** --> Dieses Objekt wurde nicht gefunden.

[code=]<portal_root>/km_manager
<portal_root>/portal_skins/custom[/code]

VORSICHT! Diese Beiden Ordner sind in Plone **virtuell** auf gleicher Höhe. Deshalb solltest du in diesen Ordnern auch keine Objekte mit gleichen IDs erstellen.

Hier ein paar Beispiele zum Veranschaulichen:
[code=]<portal_root>/meine_seitenvorlage
<portal_root>/portal_skins/custom/meine_seitenvorlage[/code]
Zwei Seitenvorlagen (meine_seitenvorlage). Eine davon in den <portal_root>-Ordner und eine davon in den <custom>-Ordner.

Gibst du den URL http://localhost:8080/<portal_root>/meine_seitenvorlage ein, dann wird dir immer die Seitenvorlage im <portal_root> angezeigt. Es gibt aber keine Möglichkeit, auf die Seitenvorlage im <custom>-Ordner zuzugreifen. --> Beide liegen virtuell auf gleicher Höhe und Plone versucht es zuerst im <portal_root>. Findet Plone dort die Seite, wird die Suche abgebrochen und die Seite angezeigt.
Löscht du nun die Seite im <portal_root>, dann sucht Plone in den Skins nach der Seite. Dazu sieht Plone in den Properties des Objektes ``<portal_root>/portal_skins`` nach, in welchem Ordner zuerst nachgesehen werden soll. --> das ist normalerweise der Ordner ``<portal_root>/portal_skins/custom``. Findet Plone dort die Seite, dann bricht es die Suche ab und gibt die Seite zurück. Findet Plone im <custom>-Ordner die Seite nicht, dann sieht es wieder in den Properties des Objektes ``<portal_root>/portal_skins`` nach, in welchem Ordner es weiter suchen soll. So "grast" Plone alle möglichen Ordner nach dem Objekt ab.

Dieses Verhalten ist auch der Grund, weshalb man, wenn man eine Plone-System-Seitenvorlage wie z.B. "main_template" ändern möchte, einfach eine Kopie der "main_template" in den <custom>-Ordner legt. So wird jetzt nicht mehr die "main_template" aus dem Ordner ``<portal_root>/portal_skins/plone_templates`` verwendet, da Plone die "main_template" zuerst im <custom>-Ordner findet und dann nicht mehr weiter sucht.

Fazit 1: Nichts direkt in den <portal_root>-Ordner legen, da das den Zugriff auf ein Objekt, mit gleichem Namen, im <custom>-Ordner versperren kann.

Fazit 2: ``aq_parent`` nur dann einsetzen, wenn ich unbedingt und gezielt auf den darunterliegenden Ordner zugreifen muss. Ansonsten ist es besser, die Acquisition von Zope arbeiten zu lassen.

lg
Gerold
:-)
Zuletzt geändert von gerold am Donnerstag 17. August 2006, 20:33, insgesamt 3-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 17. August 2006, 20:30

JR hat geschrieben:portal/portal_skins/custom
ein Script benutzen, welches unter
portal/km_manager
[...]
Das Traversieren kostet glaube ich etwas Zeit und verlangsamt den Seitenaufbau nicht unerheblich.

Hi Jamil!

[code=]portal/km_manager
portal/portal_skins/custom[/code]
Um aus dem Skript im <custom>-Ordner heraus, das Skript im ``<portal_root>/km_manager``-Ordner aufzurufen, nimmst du diesen Befehl:

Code: Alles auswählen

container.km_manager.mein_skript()


Traversieren (Akquisition) ist für Zope das Natürlichste der Welt. Wenn irgendwo alles getan wurde um Geschwindigkeit raus zu holen, dann hier. --> Nutze es!

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Beitragvon JR » Donnerstag 17. August 2006, 20:33

Hi Gerold, vielen Dank für die ausführliche Beschreibung, aber dieses Prinzip habe ich verstanden und eingehalten. Vielleicht ist dies falsch rüber gekommen.

Es ist ganz einfach so:
Ich habe ein Script namens script_par_read, welches ich im ersten Versuch nur unter

Code: Alles auswählen

<portal-root>/km_manager

abgelegt habe.
Dieses Script verwende ich häufig in anderen Scripten welche im selben Ordner liegen mit

Code: Alles auswählen

context.script_par_read(...)


Das geht sehr schnell, da die Traversierung das Script schnell entdeckt.
Nun wollte ich aus

Code: Alles auswählen

<portal-root>/portal_skins/custom/prefs_groups_overview

heraus auf dieses Script

Code: Alles auswählen

<portal-root>/km_manager/script_par_read

zugreifen.
Dazu habe ich dann in der Seite

Code: Alles auswählen

<tal:variable tal:omit-tag=""
    tal:define="KMMRoles python: context.aq_parent.aq_parent.km_manager.script_par_read(...)">

eingebaut und es kam zu dem besagten Fehler.
Derselbe Pythonbefehl

Code: Alles auswählen

context.aq_parent.aq_parent.km_manager.script_par_read(...)
funktionierte aber in einem Testscript, welches in demselben Ordner wie die Seite liegt !?

Grüße
Jamil
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Beitragvon JR » Donnerstag 17. August 2006, 20:34

Hi Gerold,

während ich getippt habe, kam deine Nachricht. Ich versuche es mal so, wie du es beschrieben hast mit dem container und gebe gleich Feedback

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], dfint