Seite 1 von 1

bobobase_modification_time() problem

Verfasst: Donnerstag 17. August 2006, 09:12
von mitch
also ich hab folgendes Script:

Code: Alles auswählen

##title=recentlyChanged
##parameters=objects
from DateTime import DateTime

now=DateTime()
difference=5 # in Tagen
result=[]


for object in objects:
   diff = now - objects.bobobase_modification_time()
   if diff<difference:
     dct={"object":str(object),"diff":int(diff)}
     result.append(dct)

return result
als parameter übergebe ich z.B. "here"

und diese Fehlermeldung erhalte ich dabei:

Code: Alles auswählen

'str' object has no attribute 'bobobase_modification_time' 
[/code]

Verfasst: Donnerstag 17. August 2006, 09:32
von BlackJack
Dein Quelltext funktioniert nicht. Du kannst nicht auf Modulebene einfach ein ``return`` schreiben. Das gehört in Funktionen oder Methoden.

Und wo übergibst Du "here"? Wie gesagt, ich sehe da keine Funktion.

Falls `objects` an die Zeichenkette "here" gebunden ist, dann ist die Fehlermeldung irgendwie logisch.

Code: Alles auswählen

In [6]: 'here'.bobobase_modification_time()
---------------------------------------------------------------------------
exceptions.AttributeError     Traceback (most recent call last)

/home/marc/<ipython console>

AttributeError: 'str' object has no attribute 'bobobase_modification_time'

Re: bobobase_modification_time() problem

Verfasst: Donnerstag 17. August 2006, 09:57
von gerold
mitch hat geschrieben:

Code: Alles auswählen

##title=recentlyChanged
##parameters=objects
from DateTime import DateTime
[...] bobobase_modification_time()
Hi Mitch!

Das sieht mir doch sehr nach einem "Python-Script" für Zope aus.
Stimmts oder habe ich recht? ;-)

Deshalb habe ich dieses Thema in das Zope-Forum verschoben.

mfg
Gerold
:-)

Re: bobobase_modification_time() problem

Verfasst: Donnerstag 17. August 2006, 10:17
von gerold
mitch hat geschrieben:als parameter übergebe ich z.B. "here"
Hi Mitch!

Ich habe mir dein Skript mal angesehen. --> es würde funktionieren, wenn du dem Skript keine Zeichenfolge, sondern ein iterierbares Objekt (Liste, Tupel, ...) mit Zope-Objekten übergeben würdest.

Dieser Aufruf aus einer Seitenvorlage heraus würde funktionieren:

Code: Alles auswählen

<p tal:content="python: context.recentlyChanged(container.objectValues())"/>
Und so würde der Aufruf aus einem anderen "Python-Script" heraus aussehen:

Code: Alles auswählen

return context.recentlyChanged(container.objectValues())
mfg
Gerold
:-)

PS: ``context`` und ``here`` sind äquivalent.

Verfasst: Donnerstag 17. August 2006, 10:21
von mitch
Oha bin ich ein blutiger Anfänger sorry! Natürlich hat es mit Zope zu tun...das lässt mich ja jetzt erstmal eine Zeit lang nicht mehr los. Danke gerold!

So sieht es nämlich mit dem template aus:

Code: Alles auswählen

<html>
  <head>
    <title tal:content="template/title">The title</title>
  </head>
  <body>
 
   <ul>
    <li tal:repeat="updated python: context.updateScript(context.contentValues())">
   <a href="#"
         tal:attributes="href updated/object/absolute_url"
         tal:content="updated/object/title_or_id">
          Der Titel des Artikels</a>
      Vor <em tal:content="updated/diff" /> Tagen
    </li>
   </ul>

  </body>
</html>
dazu dann das python script:

Code: Alles auswählen

from DateTime import DateTime

now=DateTime()
difference=5 # in Tagen
result=[]


for object in objects:
   diff = now - object.bobobase_modification_time()
   if diff<difference:
     dct={"object":str(object),"diff":int(diff)}
     result.append(dct)

return result
Aber es wird einfach eine weiße Seite ausgegeben.

Verfasst: Donnerstag 17. August 2006, 10:53
von gerold
Ohne Worte:

Python-Script (recently_changed):

Code: Alles auswählen

## Script (Python) "recently_changed"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=objects
##title=recently_changed
##
from DateTime import DateTime

now = DateTime()
difference = 5 # in Tagen
result = []

for object in objects:
    diff = now - object.bobobase_modification_time()
    if diff < difference:
        dct = {"object": object,"diff": int(diff)}
        result.append(dct)

return result
Seitenvorlage (get_changed):

Code: Alles auswählen

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

  <ul>
    <li tal:repeat="updated python: context.recently_changed(context.objectValues())">
      <a href="#"
         tal:attributes="href updated/object/absolute_url"
         tal:content="updated/object/title_or_id"
      >Der Titel des Artikels</a>
      Vor <em tal:content="updated/diff" /> Tagen
    </li>
  </ul>

</body>
</html>
mfg
Gerold
:-)

Verfasst: Donnerstag 17. August 2006, 12:34
von mitch
Okay es funktioniert, danke.

Aber ich dachte ich muss diese Optionen wie container und context nicht mit "binden", da das schon standart Optionen sind! Deshalb hab ich auch nur den Übergabewert und den Titel festgelegt.

mfg mitch :D

Verfasst: Donnerstag 17. August 2006, 12:47
von gerold
mitch hat geschrieben:Aber ich dachte ich muss diese Optionen wie container und context nicht mit "binden", da das schon standart Optionen sind!
Hi Mitch!

Falls du auf das da anspielst:

Code: Alles auswählen

## Script (Python) "recently_changed"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=objects
##title=recently_changed
## 
...musst du auch nicht. Diese Kommentarzeilen werden dir angezeigt, wenn du dein "Python-Script" über einen "Externen Editor" http://www.dzug.org/dokumentation/werkzeuge/exteditor anzeigen lässt.

Es ist auch recht fein, wenn du den Code eines "Python-Scriptes" jemandem anderen zeigen möchtest, da man sofort sieht, wie das "Python-Script" heißt und welche Parameter übergeben wurden. Man kann die Parameter so auch über einen Externen Editor ändern -- was auch eine feine Sache ist.

lg
Gerold
:-)