2011-04-08 7 views
0

J'écris une vue personnalisée pour contourner le bogue qui affiche les heures de début et de fin erronées pour les événements dans la vue de table dans Plone 4. Cependant, quand j'appelle ma vue j'obtiens l'erreur suivante :Plone 4 Vue de table Travailler autour

Traceback (innermost last):
Module ZPublisher.Publish, line 116, in publish
Module ZPublisher.BaseRequest, line 498, in traverse
Module ZPublisher.BaseRequest, line 343, in traverseName
Module ZPublisher.BaseRequest, line 110, in publishTraverse
Module zope.component._api, line 122, in queryMultiAdapter
Module zope.component.registry, line 240, in queryMultiAdapter
Module zope.interface.adapter, line 522, in queryMultiAdapter
TypeError: __init__() takes exactly 2 arguments (3 given)

Il a été un certain temps depuis que je l'ai créé une vue, mais je pensais que (selon this) que __init__() ne prend 3 arguments (auto, contexte, demande). En tout cas, voici ce que ma classe BrowserView ressemble au moment:

class NewEventsView(BrowserView): 
    """Custom View for displaying events in a table with correct times""" 

    implements(INewEventsView) 

    def getCurrentEvents(self): 
     """Method to return all active events in order""" 
     current_events = [] 
     cat = getToolByName(self.context, 'portal_catalog') 
     brains = cat(portal_type='Event', review_state='published', sort_on='start') 
     for x in brains: 
      event = x.getObject() 
      if event.startDate > DateTime(): 
       current_events.append(event) 
     return current_events 

J'ai essayé différentes variations de ce en ajoutant une __init__ comme dans les salons de page mentionnés ci-dessus, et juste pour le plaisir de le faire en lui donnant une __init__(self, context): juste pour voir si 2 arguments changeraient vraiment quelque chose et il donne exactement la même erreur.

Je teste cela dans un site Plone 4.0.2 sous Mac OS X Snow Leopard (dans un python 2.6.6 virtualenv)

Enregistrement de BrowersView du navigateur/configure.zcml (j'ai jeté cela dans un thème Je travaillais aussi avec). J'appelle http://localhost:8080/plone/events/new_events_view pour voir à quoi ressemble la vue et obtenir l'erreur ci-dessus. J'ai également essayé d'enregistrer l'affichage dans portal_types pour le sujet et il me donnera cette erreur en naviguant à http://localhost:8080/plone/events jusqu'à ce que je supprime la vue.

<browser:page 
     for="*" 
     name="new_events_view" 
     class=".newEventsView.NewEventsView" 
     template="newEventsView.pt" 
     permission="zope.Public" 
     allowed_interface=".interfaces.INewEventsView" 
     /> 

Toute aide serait grandement appréciée.

En outre, je sais que c'est un petit bloc de code, mais déchirer si vous pensez que cela pourrait être fait d'une meilleure façon, je suis un étudiant toujours à la recherche de moyens d'améliorer.

Merci

+0

Pour mémoire: le retraçage indique que la méthode '__init__' trouvée ne prend que 2 arguments alors que l'appelant a essayé de passer 3. Marque ce que tu veux. –

+0

Ouais j'ai attrapé ça, je ne suis pas sûr où est ce '__init__ 'parce que, comme je l'ai dit plus haut, peu importe comment je change le' __init__' pour ma vue, je reçois le même résultat. – keiththomps

+0

Pouvez-vous fournir plus de détails sur l'enregistrement ZCML pour cette vue et sur l'endroit où vous avez importé BrowserView? Aussi, quelle URL utilisez-vous pour accéder à la vue? –

Répondre

1

Vous ne devez en aucun cas mettre de code dans la méthode __init__ d'une vue de navigateur. Si vous souhaitez avoir du code personnalisé, placez-le dans les méthodes de la classe view ou remplacez la méthode __call__. La vue est instanciée avant qu'un contexte de sécurité ne soit disponible et peut être instancié plusieurs fois par requête. Cela peut conduire à beaucoup d'effets surprenants si vous y faites un travail non trivial - mieux vaut juste éviter de faire quoi que ce soit là-dedans.

En vous 4 Plone écrire une coutume __call__ comme:

from zope.publisher.browser import BrowserView 

class MyView(BrowserView): 

    def __call__(self): 
     # do some work 
     return super(MyView, self).__call__() 
+0

Vous m'avez conduit à une réponse, même si je n'ai pas besoin du '__call__'. J'avais apparemment utilisé le mauvais BrowserView apparemment (de Products.Five import BrowserView). Dès que j'ai changé que mon travail autour du bug Plone a fonctionné comme un charme, merci – keiththomps

-1

Mais il est python!

La définition d'une méthode de classe est:

def __init__(context, request): 

self est compris par défaut (parce que la méthode est appelée Class.__init__(context,request)) (ou encore raccourci à Class()).

+0

Reviens? '__init__' n'est pas un classmethod, et prend très certainement un paramètre self! –

+0

Aussi, voir http://docs.python.org/tutorial/classes.html#class-objects :-) –

+0

Vous avez raison, je l'ai écrit à l'envers. Le ** def ** prend un paramètre self, mais vous ne passez pas le paramètre ** self **, car il est implicite. – Auspex

1

Une meilleure solution consiste à personnaliser le script d'habillage formatCatalogMetadata.py à partir de la couche d'habillage ATContentTypes.

Remplacer la lecture de la ligne:

if same_type(value, '') and value[4:-1:3] == '-- ::': 

avec:

if same_type(value, '') and (value[4:-1:3] == '-- ::' or value[4:19:3] == '--T::'): 

et les tables de vue de l'événement fonctionnent à nouveau pour les événements.

+0

Cela fonctionne pour corriger la mise en forme de la date d'entrée en vigueur d'un événement, mais les dates de début et de fin restent 4 heures de désactivation. Dans le portal_catalog pour un événement de test, la date de début indique "2011/04/09 11:00:00 GMT-4" mais dans la vue de table pour les événements, elle se lit "09 avril 2011 07:00 AM" – keiththomps

+0

Le script en question semble ignorer les fuseaux horaires; cela pourrait certainement faire avec une certaine amélioration. –

Questions connexes