template vorlage für "dokument"

Django, Flask, Bottle, WSGI, CGI…
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 10. Oktober 2006, 20:01

mitch hat geschrieben:das mit dem Benutzer hatte ich mir auch schon so gedacht wie du das gemacht hast aber ich wusste halt null wo und wie ich da anfangen sollte!

Hi Mitch!

Das kann ich dir erklären.

Ich suche mir im ZMI oder im Plone die Stelle, an der die Information die ich suche (oder ähnliche Informationen) bereits angezeigt werden. In diesem Fall ist das so, dass alle Mitglieder aufgelistet werden, wenn man im Plone auf den Tab "members" klickt und dann, ohne einen Suchbegriff einzugeben, auf die Schaltfläche ``suche`` klickt.

Wenn man sich den "Members"-Ordner im ZMI ansieht, dann findet man die Seite ``index_html``. In dieser Seite wird das Objekt ``member_search_form`` aufgerufen. Dieses Objekt findet man im ZMI unter ``portal_skins/plone_forms/member_search_form``.

Wenn man sich ``member_search_form`` ansieht, dann findet man die Formular-Aktion (action) ``member_search_results``. Also wird das was im Formular eingegeben wird, an ``member_search_results`` weitergereicht. Also suche ich nach ``member_search_results``. (Im Karteikartenreiter ``find`` findest du die Suche. ;-) )

Im Objekt ``member_search_results`` findet man die Zeile

Code: Alles auswählen

tal:define="results python:mtool.searchForMembers(request);

Jetzt muss man nur noch herausfinden was für ein Objekt mit ``mtool`` gemeint ist. Also suche ich im Dateisystem im CMFPlone-Ordner nach dem Wort ``mtool`` oder dem Wort ``searchForMembers``. Seit ich auf meinem Computer Windows XP installiert habe, kann man die Suche total vergessen. Zum Glück liegt Zope und die installierten Produkte auf einem Linux-Server. Dort suche ich mit ``findstring``, einem kleinen Shellskript. (http://gerold.bcom.at/codeschnipsel/textsuche_findstring/)

Wie auch immer... So bin ich drauf gekommen, dass sich hinter der Variable ``mtool`` das Modul ``MembershipTool.py`` befindet. Dieses ist in Plone über ``portal_membership`` eingebunden. In einem Python-Skript kommt man mit ``context.portal_membership`` oder ``container.portal_membership`` zu diesem Tool. Der Rest war einfach.

lg
Gerold
:-)
Zuletzt geändert von gerold am Sonntag 15. Oktober 2006, 11:46, insgesamt 1-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 » Dienstag 10. Oktober 2006, 20:15

mitch hat geschrieben:Bsp.: Titel = Projekt SEK 3
Kurz Beschreibung = Personalmanagement Tool
Lange Beschreibung = bla bla bla bla
Mitarbeiter1 = mike brune
Mitarbeiter2 = adriano blasa

Wenn ich das so abspeichern will drücke ich ja einfach nur auf den "speichern" Button. Ich will den Button aber jetzt so bearbeiten, dass er den Titel und die beiden Mitarbeiter ausließt und bei den Persönlichen Einstellungen der Mitarbeiter das Feld "Projektbeteiligung" mit dem "Title" des Projektes füllt!

Hi mitch!

In meinem Beispielcode habe ich den Hinweis gegeben, dass die zugewiesenen Mitarbeiter in einem Index, also im ``portal_catalog`` abgelegt werden. Somit ist eine Suche danach möglich. Wenn z.B. das Feld den namen "member1" hat, dann wird im ``portal_catalog`` der Index ``getMember1`` erzeugt. Du kannst also mit der normalen Katalogsuche

Code: Alles auswählen

container.portal_catalog.searchResults(getMember1 = "ein_benutzername")
nach allen Objekten suchen, bei denen der Index ``getMember1`` den Wert ``ein_benutzername`` hat. Du brauchst die Mitglieder der Projekte also nirgends mehr abzuspeichern. Führe dort wo du die Projekte, an denen der Mitarbeiter beteiligt ist, anzeigen möchtest, einfach die (wirklich schnelle) Indexsuche aus und zeige das Ergebnis an.

Die Projekte des Mitarbeiters noch einmal irgendwo abzuspeichern ist doppelt gemoppelt und bringt keinen Vorteil.

Die Suche, die ich im Beispiel "get_projects" aufzeige, sucht genau so in den Indizes ``getMember1`` und ``getMember2`` nach den Projekten des übergebenen Mitarbeiters ``username``.

Such dir das Formular, mit dem ein Benutzer bearbeitet wird und arbeite dort den XHTML-Code ein, den ich weiter oben in einem anderen Beitrag schon aufgezeigt habe.
Das Formular, das zum Bearbeiten eines Benutzers verwendet wird ist wahrscheinlich ``portal_skins/plone_prefs/prefs_user_details``.

lg
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 » Mittwoch 11. Oktober 2006, 15:20

Hi,

ein riesengroßes DANKE gerold, jetzt funktionieren zumdinest mal alle Funktionen die für eine Prototypen gebraucht werden, denke ich mal, wenn mein chef nicht schon wieder noch mehr will ! :roll:

Bloß das mit dem getMember1 in den index schreiben hat irgendwie nicht funktioniert! Ich hab dann die dann selber in den Index eingetragen bei portal_catalog, ich hoffe das ist auch möglich, zumindest funktioniert es!

Code: Alles auswählen

StringField(
                "member2",
                required = False,
                vocabulary = "get_members",
                enforceVocabulary = True,
                index = "KeywordIndex", # erstellt autom. einen Index mit diesem Feld
                widget = SelectionWidget(
                    label = "Zweiter Mitarbeiter",
                    description = "Zweiter Mitarbeiter",
                    format = "select",
                ),
            ),


Tja und das hat irgendwie doch keinen Index autom. erzeugt, weißt du wieso?

Ach ja und nun soll es so sein, dass ein Mitarbeiter nicht in mehr als 5 Projekten gleichzeitig sein darf!
Kann ich mir da eine Methode in dem Archetype (neuesProjekt.py hab ich es mal genannt) erzeugen, welche beim Speichern abfragt in wievielen Projekten der Mitarbeiter zur Zeit arbeitet und sobald er in schon 5 Projekten ist und das 6. dazu kommt, soll die Seite neu aufgebaut werden und daruf hingewießen werden, dass der Mitarbeit schon ausgeplant ist.
Soll ungefähr so aussehen wie mit diesem:
"required = True"
wo doch das Feld zum "Mussfeld" wird und wenn nix eingetragen wird, es einen Fehler bringt.

mfg mitch
:)[/code]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 11. Oktober 2006, 18:26

mitch hat geschrieben:Bloß das mit dem getMember1 in den index schreiben hat irgendwie nicht funktioniert! Ich hab dann die dann selber in den Index eingetragen bei portal_catalog,

Hi mitch!

Was bringt es dir, wenn es sich nicht selber einträgt???

Gründe, warum es evt. nicht funktioniert haben könnte:
- Zope nicht neu gestartet
- Produkt nicht neu registriert
- Es wurden Projekte angelegt, noch bevor es den Schemaeintrag ``index = "KeywordIndex",`` gab.

Wie auch immer. Man kann den Katalog neu aufbauen lassen.
Im ``archetype_tool`` kannst du über den Reiter ``Catalogs`` die zugehörigen Kataloge auswählen und auch "Updaten". Dann
kannst du noch Template-Bindings neu aufbauen lassen, UID´s neu indizieren und alte Schemadefinitionen auf den neuesten Stand bringen.

Beim Entwickeln von Archetypes -- wenn irgendetwas nicht so wie gewünscht funktioniert, dann sollte man es mit dem ``archetype_tool`` versuchen.

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 » Donnerstag 12. Oktober 2006, 08:25

Hi,

ich glaube wir haben gerade aneinander vorbei geredet gerold.

Ich dachte, diese Methode "getMember1" automatisch in Index erzeugt wird aber dem war ja nicht so. Als hab ich die beiden Methoden getMember1 und getMember2 als Index erzeugt im portal_catalog.
Jetzt kann ich mit Hilfe der beiden Methoden auch auf die Member zugreifen die ich beim erstellen des Dokumentes gespeichert hab.

Nur ich hab halt gedacht, dass auch "getMember" dirket mit im Index erzeugt wurde! :P

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

Beitragvon gerold » Donnerstag 12. Oktober 2006, 08:41

mitch hat geschrieben:Ich dachte, diese Methode "getMember1" automatisch in Index erzeugt wird aber dem war ja nicht so. Als hab ich die beiden Methoden getMember1 und getMember2 als Index erzeugt im portal_catalog.
Jetzt kann ich mit Hilfe der beiden Methoden auch auf die Member zugreifen die ich beim erstellen des Dokumentes gespeichert hab.

Hi mitch!

``getMember1`` und ``getMember2`` sind Methoden, die automatisch von Archetypes erstellt werden und sind somit reservierte Namen. ``getMember1`` liest den Wert des Feldes ``member1`` aus. Will man den Wert des Feldes ``member1`` ändern, dann geht das über die Methode ``setMember1``, welche natürlich auch automatisch erstellt wird.

Das ist auch der Grund, weshalb der **automatisch erstellte** Index den seltsamen Namen ``getMember1`` bekommt. Es werden also keine Methoden im Katalog angelegt, sondern Indizes mit den Namen der Accessor-Methoden.

Selber würde ich keine dieser Methoden erstellen, denn dann werden diese Spezialmethoden (=Accessor) überschrieben und das zieht unerwünschte Effekte nach sich. -- außer man weiß was man tut.

http://www.derstappen-it.de/dokumentati ... 2/ch13.rst

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 » Donnerstag 12. Oktober 2006, 09:42

Also...

ich bin bei plone/portal_catalog im Reiter "Indexes" hin gegangen und hab geschaut ob da etwas von einer getMember1 Methode steht... nur stand da nix und da hab ich kurzer hand den index getMember1 selber erzeugt und da stehen nun die Mitglieder drin die ich auslesen kann!

Soll das nun so sein oder nicht ? :P Ich glaube eher nicht..

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

Beitragvon gerold » Donnerstag 12. Oktober 2006, 13:10

mitch hat geschrieben:und da hab ich kurzer hand den index getMember1 selber erzeugt und da stehen nun die Mitglieder drin die ich auslesen kann!

Hi Mitch!

Ich glaube nicht, dass es deshalb Probeleme geben wird.

Um herauszufinden, wann der Index erstellt wird, habe ich ins Schema noch das Feld "member3" hinzugefügt.

Nach dem Neustart von Zope war der Index "getMember3" noch nicht im Katalog.

Nach einer "Reinstallation" des Produktes in welches ich den Content-Typ "Member5" zum Testen eingebunden habe, war der Index "getMember3" im Katalog. Es wird also nicht gewartet, bis das Produkt verwendet wird. Gleich beim Installieren über den QuickInstaller ("portal_quickinstaller") wird der Index erzeugt.

Das ist zumindest der Sollzustand. -- Jetzt weiß ich das auch. ;-)

Ich habe das Testprojekt in ein Trac/SVN hochgeladen:
http://gelb.bcom.at/trac/misc/browser/ATTest

lg
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 » Montag 30. Oktober 2006, 15:55

Hi,

so dann möchte ich hier gleich mal weiter machen!

Ich versuche grad zu einem Projekt die ganzen Mitarbeiter auszulesen aber das klappt irgendwie nicht so! :P

Also ich mach das in etwas so:

[code=]
<div tal:define="project project/getObject">
<p tal:content="project/getMember1"></p>
</div>
[/code]

In "project" steht das gewünschte Projekt drin!
So müsste ich doch eigentlich den ersten Benutzer auslesen können aber das funzt irgendwie nicht!

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

Beitragvon gerold » Montag 30. Oktober 2006, 17:03

mitch hat geschrieben:So müsste ich doch eigentlich den ersten Benutzer auslesen können aber das funzt irgendwie nicht!

Hi mitch!

Zu wenig Informationen... :K

lg
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 31. Oktober 2006, 08:46

hi,

:D ok! Ich hab ja mit Archtypes so eine Vorlage für neue Projekte erstellt. Das war ja so, dass an einem Projekt 5 leute arbeiten können und jetzt hab ich mal zu test zwecken 4 Projekte so erstellt.
Jetzt hab ich mein Formular "member_serach_form" so angepasst, dass ich nach namen, kenntnissen, interessen und auch den Projekten suchen kann. Auf der Auswertungsseite "member_search_result" hab ich das dann so gemacht, dass sobald das Feld "Projekt" leer ist im Suche Formular, wird nach den anderen 3 Feldern gesucht! Das klappt auch soweit. Wenn aber jetzt nach einem Projekt gesucht wird, dann will ich zu diesem Projekt Object die 5 Mitarbeiter, die daran arbeiten!

Hier mal der Quelltext von member_search_result:

Code: Alles auswählen

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      lang="en"
      metal:use-macro="here/main_template/macros/master"
      i18n:domain="plone">

<metal:block fill-slot="top_slot"
             tal:define="dummy python:request.set('disable_border',1)" />

<div metal:fill-slot="main"
       tal:define="results python:mtool.searchForMembers(request);
                   project python:request.get('projektbeteiligungen');
                   Batch python:modules['Products.CMFPlone'].Batch;
                   DateTime python:modules['DateTime'].DateTime;
                   b_size python:12;b_start python:0;b_start request/b_start | b_start;">

    <h1 i18n:translate="heading_search_results">Search results</h1>
 <!--<div tal:content="request"></div>-->
 <div tal:condition="python: ' ' not in project">
     <div tal:condition="results"
          tal:define="batch python:Batch(results, b_size, int(b_start), orphan=1)">

        <strong i18n:translate="batch_x_items_matching_your_criteria">
            <span i18n:name="number" tal:omit-tag="" tal:content="python:len(results)">234</span> items matching your criteria.
        </strong>

        <!-- Navigation -->
        <div metal:use-macro="here/batch_macros/macros/navigation" />

        <div>
        <metal:block tal:repeat="result batch">
            <div class="card" tal:define="name result/getUserName;
                                           home python:container.portal_membership.getHomeUrl(name, verifyPermission=1);
                                           portrait python: here.portal_membership.getPersonalPortrait(name);
                                           settings string:prefs_user_details?userid=;
                                           settings python:settings + name">
               
                  <a href="#" tal:attributes="href home">
                    <img src="defaultUser.gif"
                         alt=""
                         border="0"
                         width="75"
                         height="100"
                         tal:attributes="src portrait/absolute_url" />
                    <br />
                    <span tal:content="name">user id</span>
                </a>
                <br />
               <a href="#" tal:attributes="href settings">
                   <span>Persönliche Einstellungen</span>
                </a>
                <br />
            </div>
        </metal:block>
        </div>

        <!-- Navigation -->
        <div class="visualClear"><!-- --></div>

        <div metal:use-macro="here/batch_macros/macros/navigation" />

        <div class="visualClear"><!-- --></div>

    </div>

    <div tal:condition="not: results">
        <p><strong i18n:translate="description_no_results_found">No results were found.</strong></p>
    </div>

</div>

  <div tal:define="project project/getObject">
    <p tal:content="project/getMember1"></p>
 </div>
</div>



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

Beitragvon gerold » Dienstag 31. Oktober 2006, 09:03

Hi mitch!

Keine Fehlermeldung!!! Kein Hinweis auf das was schief läuft!!!

Deshalb kann ich nur raten.

Code: Alles auswählen

project python:request.get('projektbeteiligungen');

Kann es sein, dass du hier kein Suchergebnis, sondern einfach nur den Inhalt des Textfeldes "projektbeteiligungen" übermittelt bekommst?

Was gibt

Code: Alles auswählen

<p tal:content="project" />
aus?

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 31. Oktober 2006, 11:56

Wenn ich z.B. nur content="project" ausgeben lasse, dann gibt er mir den Namen des Projektes wieder nach dem ich gesucht habe.

Code: Alles auswählen

project python: request.get('projektbeteiligungen');


Das liest ja meinen Request aus und da steht halt das Projekt drin, nach dem ich suche. Also das was ich im member_search_form aus meinem Dropdown Feld (projektbeteiligungen) ausgewählt habe!

Da hab ich jetzt den Namen des Projektes...jetzt hab ich mal dein python script bearbeitet und mit Hilfe dieses namens mal mir die speicher Adresse des Projektes ausgeben lassen:

Code: Alles auswählen

##parameters=project
cat = container.portal_catalog

return (
    cat.searchResults(Title = project)
)


Das hab ich einfach mal get_member genannt.

Code: Alles auswählen

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      lang="en"
      metal:use-macro="here/main_template/macros/master"
      i18n:domain="plone">

<metal:block fill-slot="top_slot"
             tal:define="dummy python:request.set('disable_border',1)" />

<div metal:fill-slot="main"
       tal:define="results python:mtool.searchForMembers(request);
                   projectName python:request.get('projektbeteiligungen');
                   projectObject python:here.get_member(project = projectName);
                   Batch python:modules['Products.CMFPlone'].Batch;
                   DateTime python:modules['DateTime'].DateTime;
                   b_size python:12;b_start python:0;b_start request/b_start | b_start;">

    <h1 i18n:translate="heading_search_results">Search results</h1>
<!--<div tal:content="request"></div>
<div tal:content="projectName"></div>-->
 
 <div tal:condition="python: 'Kein Projekt' in projectName">
     <div tal:condition="results"
          tal:define="batch python:Batch(results, b_size, int(b_start), orphan=1)">

        <strong i18n:translate="batch_x_items_matching_your_criteria">
            <span i18n:name="number" tal:omit-tag="" tal:content="python:len(results)">234</span> items matching your criteria.
        </strong>

        <!-- Navigation -->
        <div metal:use-macro="here/batch_macros/macros/navigation" />

        <div>
        <metal:block tal:repeat="result batch">
            <div class="card" tal:define="name result/getUserName;
                                           home python:container.portal_membership.getHomeUrl(name, verifyPermission=1);
                                           portrait python: here.portal_membership.getPersonalPortrait(name);
                                           settings string:prefs_user_details?userid=;
                                           settings python:settings + name">
               
                  <a href="#" tal:attributes="href home">
                    <img src="defaultUser.gif"
                         alt=""
                         border="0"
                         width="75"
                         height="100"
                         tal:attributes="src portrait/absolute_url" />
                    <br />
                    <span tal:content="name">user id</span>
                </a>
                <br />
               <a href="#" tal:attributes="href settings">
                   <span>Persönliche Einstellungen</span>
                </a>
                <br />
            </div>
        </metal:block>
        </div>

        <!-- Navigation -->
        <div class="visualClear"><!-- --></div>

        <div metal:use-macro="here/batch_macros/macros/navigation" />

        <div class="visualClear"><!-- --></div>

    </div>

    <div tal:condition="not: results">
        <p><strong i18n:translate="description_no_results_found">No results were found.</strong></p>
    </div>

</div>

    <div tal:content="projectObject">
    </div>   

<!--<div tal:define="project_object projectObject/getObject">
<p tal:content="project_object/getMember1"> </p>
</div>-->

</div>
</html>


So und wenn ich nur ein Projekt auswähle, auf der member_search_form Seite, dann wird mir jetzt auf der Result Seite der Speicherort Angezeigt.
Da ich jetzt die Speicheradresse kenne, müsste ich doch auch irgendwie die Attribute des Objectes abfragen können oder ?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 31. Oktober 2006, 13:48

Hi mitch!

Ich habe mir meine Plone-Testinstanz zerschossen. Kann erst antworten, wenn ich Zeit gefunden habe, diese zu reparieren.

lg
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 31. Oktober 2006, 14:07

Oha ...


Na ja ich komm schon langsam vorwärts aber das alles mehr oder weniger durch rum probieren.

Ich bräuchte mal eine Seite wo steht, wie alle eigenschaften von solchen Dokummenten aufgerufen werden können und vor allem mit was für einer Vorraussetzung das geschehen muss!

mfg mitch

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder