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

Hi mitch!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?
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 []
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>
Hi mitch!mitch hat geschrieben:Sorry wollte dein Forum nicht zu Spamen!
Hi mitch!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!
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)
Hi mitch!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.