bobobase_modification_time() problem

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
mitch
User
Beiträge: 78
Registriert: Dienstag 1. August 2006, 09:07
Kontaktdaten:

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]
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'
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
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: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.
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:

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten