template vorlage für "dokument" --> Fortsetzung

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

Hi mitch!

Ich setze hier mit dem Thread template vorlage für "dokument" fort, da der alte Thread nicht noch mehr Beiträge mit Code verträgt.

lg
Gerold
:-)
Zuletzt geändert von gerold am Montag 6. November 2006, 13:14, 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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

mitch hat geschrieben:Wie du sehen kannst hab ich ja eine Post über dir die Methode mal versucht auseinander zu nehmen und zu durchleuchten. Kannst du mir sagen wo ich richtig lag oder wo ich falsch gedacht habe?
Hi mitch!

Ich habe den Code mit Kommentaren versehen. Vielleicht wird es jetzt ein wenig klarer:

Code: Alles auswählen

## Script (Python) "extended_member_search"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=searchparams = None
##title=
##

# Wenn der Parameter ``searchparams`` nicht übergeben wurde, dann wird das
# Request-Objekt verwendet.
searchparams = searchparams or context.REQUEST

# Referenz zum ``portal_membership``
mtool = context.portal_membership

# Referenz zum ``portal_catalog``
catalog = context.portal_catalog

# Suche nach Member
found_members = mtool.searchForMembers(searchparams)
if found_members:
    # Wenn mindestens ein Member gefunden wurde, dann geht es hier weiter.
    
    # Aus den übergebenen Suchparametern den Suchparameter ``projectmembership``
    # heraus holen. Dieser darf nur ein Pfad zu einem Projekt sein. Kein 
    # Suchstring! Im Suchformular werden aus dem Katalog alle Projekte ausgelesen
    # und in eine Combo-Box geschrieben. Angezeigt wird der Titel der Projekte und
    # als Wert (bei einer Auswahl) wird der Pfad zum Projekt eingetragen.
    #
    # So wird im Suchformular jedes Projekt angezeigt:
    #   <select size="1"
    #           id="projectmembership"
    #           name="projectmembership"
    #           tabindex=""
    #           tal:attributes="tabindex tabindex/next;"
    #   >
    #     <option selected=selected></option>
    #     <option tal:repeat="project_brain python:context.portal_catalog({'Type': 'Member5'})"
    #             tal:content="project_brain/Title"
    #             tal:attributes="value project_brain/getPath"
    #     >
    #       [Projekt]
    #     </option>
    #   </select>
    projectmembership = searchparams.get("projectmembership", None)
    
    if not projectmembership:
        # Wenn die Variable ``projectmembership`` nicht gesetzt wurde oder wenn 
        # einfach nichts drinnen steht...
        return found_members
    else:
        # Es steht etwas in der Variable ``projektmembership``.
        
        # Zum Vergleichen brauchen wir nur die Benutzernamen und nicht die
        # Benutzer-Objekte. Deshalb werden diese hier in eine Liste geschrieben.
        membernames = [ member.getUserName() for member in found_members ]
        
        # Diese Liste wird dann mit den Benutzern befüllt, die von der Benutzersuche
        # gefunden wurden UND auch etwas mit dem ausgewählten Projekt zu tun haben.
        ret_list = []
        
        # Da in der Variable ``projectmembership`` der exakte Pfad zum Projekt
        # steht, können wir mit ``restrictedTraverse`` direkt eine Referenz zum
        # Projekt herstellen. Das Ergebnis von ``restrictedTraverse`` ist das 
        # Projekt-Objekt selbst.
        project = context.restrictedTraverse(projectmembership)
        
        # Hier werden alle Mitglieder aus dem Projekt ausgelesen, die im Projekt
        # Eingetragen wurden. Damit leere Felder nicht mit in die Liste kommen,
        # wird als Bedingung ``if item`` angegeben.
        projectmembers = [ 
            item for item in (
                project.getMember1(), project.getMember2(), project.getMember3()
            ) if item 
        ]
        
        # Jetzt wird jeder Benutzer, der von der normalen Benutzersuche gefunden 
        # wurde, durchlaufen. Die Reihenfolge der Benutzernamen (membernames) 
        # und die Reihenfolge der gefundenen Benutzerobjekte (found_members) stimmt
        # überein.
        # Wenn also ein Benutzername jeweils in der Liste ``membernames`` und in 
        # der Liste ``projectmembers`` steht, dann kann das Benutzerobjekt zur
        # Retour-Liste (ret_list) hinzugefügt werden, da man ja den Index kennt unter 
        # dem das Benutzerobjekt in der Liste ``found_members`` zu finden ist.
        for index, membername in enumerate(membernames):
            if membername in projectmembers:
                ret_list.append(found_members[index])
        return ret_list
else:
    
    # Wenn kein Member mit den Angaben gefunden wurde, dann wird eine leere Liste
    # zurück gegeben
    return []
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:

Ja jetzt geht es, ich habs noch ein bisschen angepasst auf meine bedürfnisse.. :P DANKE

Sorry wollte dein Forum nicht zu Spamen!

Ich bleib jetzt auch gleich mal in dem Thread...

Wenn ich jetzt so ein neues Projekt erstellt habe, kann ich mir das ja anzeigen lassen.. Ich gehe einfach auf den Ordner Projekte und klicke so ein Projekt an... Dann wird mir halt alles angezeigt aber es wird halt auch angezeigt z. B. Mitarbert3 und Mitarbeiter 4 aber nichts dazu, weil halt einfach kein nur 2 Member für das Projekt eingeteilt sind.
Nun wollte ich daran was ändern, also die Zeilen ausblenden, die halt nicht beschrieben sind.
Da dachte ich, dass muss ich hier editieren in dem Ordner:
C:\Programme\Plone 2\Data\Products\Projektverwaltung\skins\projektverwaltung\neuesprojekt_view.pt ... das wird mir auch im Zope angezeigt, jetzt hab ich da mal was dran geändert aber nichts ändert sich in der template Ansicht! :shock:

Code: Alles auswählen

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US"
      lang="en-US"
      metal:use-macro="here/main_template/macros/master">
  <body>
    <div metal:fill-slot="main">
      <div metal:define-macro="main"
	tal:omit-tag="">
	<h1 tal:content="here/title_or_id" />

	  <!-- do as you will -->
	  <div tal:repeat="field python: here.Schema().filterFields(isMetadata=0)">
            <span tal:condition="python:field.getName() not in ['title']">
              	       <span metal:use-macro="python: here.widget(field.getName(), mode='view')"/>
  	       
              </span>
		<span tal:content="python: here.widget(field.getName(title), mode='view')"> </span>
	  </div>
	  

	<span tal:content="structure python: here.getBody(mimetype='text/html')"/>

      </div>
    </div>
  </body>
</html>
Wenn ich da was ändere passiert irgendwie nix... Muss man Plone dafür jedes mal neu Starten oder müsste es reichen, wenn ich es im Zope im costum ordner bearbeite?

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

mitch hat geschrieben:Sorry wollte dein Forum nicht zu Spamen!
Hi mitch!

Das ist **unser** Python-Forum und es gibt mehrere Admins, mehrere Moderatoren und viele aktive Mitglieder. 8)

Es handelt sich um ein rein technisches Problem. Dieses Problem werden wir aber nicht mehr lösen bevor dieses Board auf Pocoo umgestellt wird.

lg
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:

mitch hat geschrieben:Products\Projektverwaltung\skins\projektverwaltung\neuesprojekt_view.pt ... das wird mir auch im Zope angezeigt, jetzt hab ich da mal was dran geändert aber nichts ändert sich in der template Ansicht!
Hi mitch!

Wenn Zope im Debug-Modus ist (über die ``etc/zope.conf`` einstellbar), dann erkennt es die Änderung an Seitenvorlagen automatisch.

Allerdings ist dein Problem eher, dass du das "body"-Makro nicht definiert hast.

Siehe: Die Anzeige eines "Neugeborenen Baby´s" anpassen.

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:

hi,

also die anzeige konnte ich ein bisschen anpassen aber na ja!

Ich hab schon wieder 2 Probleme.
1. Die Seite die ich mit Archetypes erstellt bzw. abgeändert habe, ist ja so aufgebaut, dass meine Mitarbeiter Auswahl untereinander steht (Mitarbeiter 1-5 die jeweils ein Dropdown Feld sind und wie gesagt untereinander stehen). Jetzt soll ich daneben noch ein Feld machen (neben jeden Mitarbeiter) wo ich eintragen kann zu wieviel Prozent er an dem Projekt beteiligt ist. Nur wie bekomme ich Felder mit Archtypes nebeneinander ?

2. Natürlich kann ein Mitarbeiter nicht mehr als 100 % oder nicht weniger als 0% in einem Projekt arbeiten.

Das ist mein Versuch:

Code: Alles auswählen

class neuesProjekt(BaseContent):
    """Projekt"""

    portal_type = "neuesProjekt"
    meta_type = "neuesProjekt"
    archetype_name = "neuesProjekt"
    schema = BaseContent.schema.copy() + Schema(
        (
           StringField(
                'projektAll',
             	default = "1",
                widget = TextAreaWidget( label="ProjektAll",
                                        visible = { 'edit' :'hidden', 'view' : 'invisible' }),
        ),
            StringField(
                "member1",
                searchable = 1,
                required = True,
                vocabulary = "get_members",
                enforceVocabulary = True,
                index = "KeywordIndex", # erstellt autom. einen Index mit diesem Feld
                widget = SelectionWidget(
                    label = "1. Mitarbeiter",
                    description = "Erster Mitarbeiter",
                    format = "select",
                ),
            ),
             IntegerField(
                "partOfMember1",
                required = True,
                searchable = False,
                widget = IntegerWidget(
                    label = "Projektbeteiligung des 1. Mitarbeiters",
                    description = (
                        "Geben Sie hier die Projektbeteilung des Mitgliedes in % ein."
                    ),
                    size = 10,
                ),
            ),
            #StringField(
            #	"group",
            #    vocabulary=ARTICLE_GROUPS,
            #    widget=SelectionWidget(),
            #    ),
            StringField(
             	"shortDescription",
                searchable=1,
                widget=TextAreaWidget(
                	label = "Kurz Beschreibung des Projektes"),

            ),
    		TextField(
    			"projectContent",
              	searchable=1,
              	required=1,
              	primary=1,
              	default_output_type='text/html',
              	allowable_content_types=('text/plain',
                                       'text/structured',
                                       'text/restructured',
                                       'text/html',
                                       'application/msword'),
              widget=RichWidget(label='Projektinhalt'),
              							),
    					),
                              marshall=PrimaryFieldMarshaller(),
         )

    def get_members(self):
        ms = self.portal_membership

        retlist = []
        retlist.append("")
        members = ms.searchForMembers()
        if members:
            for member in members:
                retlist.append(
                    (
                        member.getUserName()
                    )
                )

        return retlist


    def validate_partOfMember1(self, new_value):
        """
        Testet ob die Projektbeteiligung korrekt eigegeben wurde. (=Validator)
        """

        #new_value = int(new_value)
        if (new_value < 100 and new_value > 0):
                      return None
        return "Die Projektbeteiligung darf nicht geringer als 0 und nicht hößher als 100 Prozent sein."+new_value

# Klasse registrieren
registerType(neuesProjekt, PROJECTNAME)
Mal am beispiel von nur dem ersten Mitarbeiter...hier ist es so, dass das integer Feld drunter steht...
Und bei der Valedierungsmethode, ist es glaube so das die Zahl als String umgewandelt wird und ich sie deshalb nicht mit der "If- Anweisung" auswerten kann!

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

mitch hat geschrieben:Jetzt soll ich daneben noch ein Feld machen (neben jeden Mitarbeiter) wo ich eintragen kann zu wieviel Prozent er an dem Projekt beteiligt ist.
Hi mitch!

Die Felder untereinander zu setzen ist mit Archetypes eine Sache von ein paar Codezeilen.

Einzelne Felder in der Edit-Seite (im HTML-Code) nebeneinander zu stellen, bedeutet auf Archetypes verzichten zu müssen oder so viel an der Edit-Seite ändern zu müssen, dass die Vorteile von Archetypes komplett umsonst sind.

Kurze Antwort:
- Untereinander = super
- Teilweise nebeneinander = Arbeit von vielen Tagen und Nächten (und das nur, weil ein Feld neben dem Anderen stehen soll...)

Alternative:
Man müsste sich den generierten Quellcode mal ansehen, aber vielleicht lässt sich mit CSS etwas machen. Vielleicht haben die generierten Felder eine CSS-ID, die man im CSS-File ansprechen kann.

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:

Hi,

hm das ist schlecht, dass man die Felder nicht mit Archetypes zurecht rücken kann.
Na ja ich hab mir da mal eine andere Darstellungsart überlegt.
Als Beispiel:
Ich nehme ein ListenFeld, darunt ein dorpdown menue wo ich alle mitarbeiter ein lese und darunt ein button "add" und "delete".
So das wenn ich einen Mitarbeiter im Dropdown auswähle, er automatisch beim klicken auf add bzw. delete in das listenfeld eingefügt bzw. gelöscht wird. Aber ist es überhaupt möglich buttons zu erstellen mit Archetypes?

mfg mitch
Antworten