Parameter weitergeben

Django, Flask, Bottle, WSGI, CGI…
Antworten
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hallo Allerseits!

Ich habe eine sehr einfache Frage, komme aber nicht auf die Antwort :-)

ich brauche so etwas wie ein

Code: Alles auswählen

userid = benutzername
request=context.REQUEST
return request.RESPONSE.traverse(context.portal_url() + '/personalize_form?username=userid)
Leider gibt es das nicht. Ein Redirect nach dem Motto

Code: Alles auswählen

return request.RESPONSE.redirect(context.portal_url() + '/personalize_form?username=userid)
hilft mir in meinem Fall leider nicht, weil die gesetzten Errorcodes zum Markieren entsprechender Eingabefelder des Formulars personalize_forms dann verloren sind.
Weiß jemand, wie der korrekte Befehl hier lauten könnte?

Kurze Erklärung wozu ich das brauche:
Ich ermögliche bestimmten Anwendern in Plone die Mitgliedsdaten anderer zu bearbeiten. Dazu übergebe ich dem Formular personalize_form die userid. Wenn sie jetzt aber zum Beispiel keinen Vornamen angeben, setzt ein Validierer den state auf "failure". Jetzt soll eine Action ausgelöst werden, die als Parameter die user id bekommt und zum Formular traversiert. Und zwar über die URL:

Code: Alles auswählen

context.portal_url() + '/personalize_form?username=userid 
Das Vorname-Feld wird dann plonetypisch orange hinterlegt. Das ganze klappt, solange ich dem Formular kein Argument übergeben muss tadellos.

Vielen vielen Dank im Voraus von
JR
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Moderiert von Gerold: Neues Thema erstellt.
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

Hallo Gerold,

war mir nicht sicher, ob die Frage da noch richtig platziert ist, da der Titel des Themas dort sehr allgemein gehalten ist.

Also dann viele Grüße
JR
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:ich brauche so etwas wie ein

Code: Alles auswählen

userid = benutzername
request=context.REQUEST
return request.RESPONSE.traverse(context.portal_url() + '/personalize_form?username=userid)
Hi JR!

Plone arbeitet bei diesem Formular mit "Validators" und "Actions". Die Actions legen exakt fest, was zu tun ist, wenn eine bestimmte Situation auftritt. Da kannst du nicht mit einem "normalen" Python Skript rein pfuschen. Leider! Du musst deinen Code in dieses System einpflanzen.

Der Karteikartenreiter "Validation" von "personalize_form" zeigt, dass zwei Validierer aufgerufen werden. Zuerst wird die Emailadresse gecheckt (das ist in unserem Fall unwichtig) und dann wird der Validator "validate_personalize" aufgerufen. Vielleicht könntest du deinen Code einfach in diesen Validierer einbringen. Da dieser Validator unbedingt ein "state"-Objekt zurück geben muss, kannst du aber auch hier nicht einfach so eine Umleitung setzen. Du könntest aber die Variable in das "request"-Objekt schreiben und damit weitergeben.

validate_personalize könnte dann so aussehen:

Code: Alles auswählen

request = container.REQUEST

if state.getErrors():
    request.set("username", "irgendein_benutzername")
    return state.set(status='failure', portal_status_message='Please correct the indicated errors.')
else:
    return state.set(portal_status_message='You have been registered.')
(Dieser Validierer ist aus Plone 2.1.2. Es kann also sein, dass deiner anders aussieht.)

In personalize_form kannst du die Variable dann zum Beispiel so auslesen:

Code: Alles auswählen

<p tal:content="request/username | string: no username" />
Vielleicht kannst du damit etwas anfangen.

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi JR!

Ich sehe soeben, dass das "Controller Page Template" prefs_user_details sich die userid direkt aus dem request holt. Es könnte also wirklich mit request.set() funktionieren.

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

Hi Gerold,

leider hilft mir das nicht. Es ist so: Ich habe ein Portal für unseren Flugverein germacht. Vorstandsmitglieder sollen über unsere Mitgliederliste die Möglichkeit haben, Mitgliederdaten zu bearbeiten. Ich möchte sie allerdings nicht zum Formular pref_user_details schicken, da sie dazu gar nicht die Berechtigung von mir bekommen. Sie haben "nur" die Rolle des Benutzers. Daher habe ich das Formular personalize_form so angepasst, dass es im Hauptdefine ein

Code: Alles auswählen

<div tal:define="benutzer python: context.request.get('username', context.REQUEST.AUTHENTICATED_USER.id)">
ein ermitteln ,der ggf. übergebenen Variable username gibt.

Wenn sie also auf "Meine Einstellungen -> Benutzereinstellungen" im Portal gehen, gelangen sie direkt zu ihren eigenen Einstellungen. Über unsere Mitgliederliste gelangen sie über die URL ...personalize_form?username=mitglied auf die Einstellungsseite zu einem beliebigen Mitglied. Das funktioniert wie gesagt auch super. Nur habe ich jetzt folgendes Problem:
Der selbst geschriebene Validator "validate_namens_angaben" setzt z.B., wenn kein Nachname angegeben worden ist einen Fehlerstatus
Auszug:

Code: Alles auswählen

def invalid(field):
    if field == 'nachname':
      state.setError('nachname', 'Du musst einen Nachnamen angeben!')
    elif field == 'vorname':
      state.setError(field, 'Du musst einen Vornamen angeben!')
 
    return 1

fehler=0

if not nachname:
   fehler = invalid('nachname')

if not vorname:
   fehler = invalid('vorname')

# wenn ein Fehler aufgetreten ist, Meldung bringen
if fehler:
   state.setStatus('failure')
Nun habe ich dem Formular eine Action gegeben, die bei einem Failure zum Formular traversiert, und dann im Beispiel das Namefeld orange hinterlegt. Blöderweise kann ich der Action als Argument nur folgendes eintragen:

Code: Alles auswählen

string:personalize_form
Damit landet das Vorstandsmitglied aber dummerweise auf dem Formular mit den eigenen Kontaktdaten und nicht denen, des vorher selektierten Vereinsmitglieds!
Ein Action-Argument nach dem Motto

Code: Alles auswählen

string:personalize_form?username=mitglied
geht leider nicht.
Daher dachte ich, die Action bei einem Fehler ruft einfach ein Script, welches die userid bekommt und dann einen Traverse zum Formular mit Übergabe des Mitglied-Benutzernamen macht. So würden dann korrekt die Daten desjenigen angezeigt, von dem die Daten geändert werden sollen und das Fehlerfeld wäre orange hinterlegt.

Hoffe die Beschreibung ist nicht zu konfus geraten :-)

Grüße
JR
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:

Code: Alles auswählen

<div tal:define="benutzer python: context.request.get('username', context.REQUEST.AUTHENTICATED_USER.id)">
Hi JR!

Erstens: Ich glaube, dass die Arbeit umsonst ist. Es wäre einfacher gewesen, einfach allen Vorstandsmitgliedern das Recht zum Verwalten der Benutzer zu geben. Eine tägliche Sicherung würde im Falle eines Misbrauchs jede Änderung aufdecken. Man kann meistens davon ausgehen, dass sowiso nur ein paar Mitglieder von diesem Mittel gebrauch machen werden. Diese kann man einschulen.

Zweitens: Ich glaube immer noch, dass du mit

Code: Alles auswählen

request.set("username", "irgendein_benutzername")
weiter kommen würdest. Allerdings sollte der "username" sowiso bis zum Schluss im Request-Objekt bleiben, also gar nicht erst neu gesetzt werden müssen.

Vielleicht bringt es dir etwas, wenn du die "userid" noch einmal setzt. So zum Beispiel:

Code: Alles auswählen

<div tal:define="benutzer python: context.request.get('username', context.REQUEST.AUTHENTICATED_USER.id);
                 dummy python: context.request.set('username', benutzer);
                 dummy python: context.request.set('benutzer', benutzer);"     
>
mfg
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

Hi Gerold,

danke für die Antwort!
Werde das heute abend mal ausprobieren.

Wünsche dir einen schönen Tag und werde Feedback geben!

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

Hi Gerold,

echt super dein Tipp

Code: Alles auswählen

request = container.REQUEST 
request.set("username", "irgendein_benutzername") 
for dem return im Validator hat geholfen!

Ich danke dir vielmals!

JR

P.S.: Schade, dass im Plonebuch nicht groß drinsteht, was man alles mit dem Request und state so machen kann :-(
Ich denke, dass Plone einem eigentlich viele Möglichkeiten bietet. Freue mich schon auf das Gallileobuch zu Plone. Soll die Tage erhältlich sein.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:echt super dein Tipp
[...]
P.S.: Schade, dass im Plonebuch nicht groß drinsteht, was man alles mit dem Request und state so machen kann
Hi JR!

Danke!

Solche Dinge stehen in ISBN 3-89842-403-0.

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

45 Euro :-(

Naja, auf Dauer komme ich nicht drum herum. Bisher haben sich die Investitionen in ein schickes Buch gelohnt. Und zum ZOPE-/ Ploneprofi wird man nicht für Umsonst :-)

Werd aber glaub ich erst mal in das bald erscheinende Buch von Peter Walerowski (3-89842-625-4) schauen. Und im Mai soll ein Buch (Plone 2.1 von einem Hans J Friedr. (3-540-28763-9)

(siehe http://www.springer.com/sgw/cda/frontpa ... -0,00.html)

raus kommen.

Grüße
JR
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:Werd aber glaub ich erst mal in das bald erscheinende Buch von Peter Walerowski (3-89842-625-4) schauen. Und im Mai soll ein Buch (Plone 2.1 von einem Hans J Friedr. (3-540-28763-9)
Hi JR!

Ich habe mir beide Bücher soeben bei Amazon bestellt. Bei beiden ist der wahrscheinliche Liefertermin 1. Juni.

Bis dahin bist du mit dem anderen Buch durch und hast sogar eine Ahnung wie schnell man eine Anwendung mit Zope programmieren kann. Wenn ich nicht unbedingt diese spezielle Art von CMS wie bei Plone brauche, bin ich oft ohne Plone viel schneller fertig. 8)
Man darf nur nicht den Fehler machen und aus allem ein eigenes Zope-Produkt machen wollen. Diesen Mehraufwand zahlt dir niemand. Viele, auch große, Anwendungen lassen sich in wenigen Stunden direkt im ZMI erstellen.

Ups! Bin schon wieder beim Schwärmen. :shock:

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

Hey Gerold!

Arbeitest du direkt beruflich ausschließlich bzw. sehr viel mit ZOPE und Plone?

Schwärme ruhig, mich begeistert es ja auch. Und ich freue mich bei jedem neuen Template darüber, dass ich immer besser werde und wieder was gelernt habe. Die TALES und TAL-Logik in den Tags kombiniert mit Python und Z SQL-Methoden macht sich echt gut ;-)

Bis denne
JR
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:Arbeitest du direkt beruflich ausschließlich bzw. sehr viel mit ZOPE und Plone?
Hi JR!

Nicht ausschließlich aber ziemlich viel. Das geht so weit, dass ich Auswertungen und Berichte für das Kassensystem SW3 mit Zope erstelle.

Es existieren Lösungen, in denen Transaktionen der Kassen fast in Echtzeit über das Internet verfolgt werden können.

Zope-Seiten lassen sich direkt aus der Warenwirtschaft heraus aufrufen. Damit habe ich eine einfache Art geschaffen, um meine Programme anpassbar zu machen, ohne dass man ständig am Programm selber herumprogrammieren und immer wieder ein neues Setup dafür erstellen muss.

Wenn ein Kunde eine spezielle Information haben möchte, dann erstelle ich eine Zope-Seite, in der die Informationen vom SQL-Server abgefragt und angezeigt werden. Diese HTML-Seite kann dann direkt aus der Warenwirtschaft heraus, über einen Menüpunkt, aufgerufen werden.

Ich setze ziemlich oft Zope in Verbindung mit SSH (Cygwin) ein um Computer fernzuwarten, Kassenaktionen anzustoßen oder um Informationen abzufragen.

Auch eine Anzeigentafel, die immer die aktuellsten Wettquoten anzeigt, habe ich einmal mit Zope realisiert. Eine Website, die sich selbst alle 15 sec. neu aufruft und immer die aktuellsten Informationen über den Browser im Vollbildmodus anzeigt. Natürlich geht das auch anders. Aber so etwas in zwei Stunden (inkl. Installation von Zope) muss man mit anderen Mitteln erst mal schaffen.

Das sind so meine Erfahrungen mit Zope. Dass man damit auch einfach nur Web-Sites machen kann, muss man wohl nicht erwähnen. :-)

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten