Trac Plugin, Referenz zur Python-Datei funktioniert nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ini
User
Beiträge: 6
Registriert: Montag 1. Juli 2013, 08:40

Hallo zusammen,
ich bin neu hier im Forum und ebenfalls ein Anfänger was Python und Trac angeht. Ich hoffe das mir jemand mit meinem Problem helfen kann, da ich schon alles mögliche dazu gesucht, gelesen und auspropbiert habe, leider ohne Erfolg.

Ich muss für die Arbeit ein Plugin für das Trac-System programmieren, nach gründlichem Einarbeiten in das Thema, habe ich anhand des Helloworld-Plugins (das funktionierte alles) angefangen mein eigenes Plugin zu schreiben. Und zwar soll nach dem Betätigen der Taste im mainnav eine Seite mit zwei Links angeboten werden:

Code: Alles auswählen

<body>
    <div id="content" class="support">
      <h1>Support</h1>
      <ul>
        <li><a href="${href.support('designflow')}">Design Flow Support</a></li>
        <li><a href="http://www.google.de">Tool Support</a></li>
      </ul>
    </div>
  </body>
So weit funktioniert es, wenn ich aber den ersten Link auswähle, müsste/sollte die Datei designflow.py den request bearbeiten und die nächste html seite ausgeben. Das plugin habe ich anhand des tracdeveloperplugins erweitert bzw so soll es im Prinzip funktionieren: http://trac-hacks.org/browser/tracdeveloperplugin/trunk/tracdeveloper. D.h. meine designflow.py ist wie die plugins.py des tracdeveloper aufgebaut. Was mir dabei auffiel ist, dass nur in der main.py der ITemplateProvider implementiert wurde. Ich habe es mit beiden Varianten versucht.

Code: Alles auswählen

class DesignFlowModule(Component):
    implements(IRequestHandler, ITemplateProvider)

    # IRequestHandler methods
    def match_request(self, req):
        return re.match(r'/support/designöööflow/?$', req.path_info) #nicht einmal "no handler match request to /designflow" wird von Trac ausgegeben, wenn ich den ööö Fehler einbaue.

    def process_request(self, req):
		 data = {}
		 add_stylesheet(req, 'ht/css/designflow.css')
		 return 'designflow.html', data, None

# ITemplateProvider methods
    def get_templates_dirs(self):
        from pkg_resources import resource_filename
        return [resource_filename(__name__, 'templates')]
    
    def get_htdocs_dirs(self):
        from pkg_resources import resource_filename
        return [('ht', resource_filename(__name__, 'htdocs'))] 


Leider passiert nichts, lediglich die URL wird richtig angezeigt im browser.
Die debug log Datei zeigt auch keine Fehler seitens Trac an.
Hat jemand eine Idee warum das nicht funktioniert?
Ich hoffe ich habe alles verständlich beschrieben und jemand kann mir behilflich sein.
Grüße
Ini
Zuletzt geändert von Anonymous am Montag 1. Juli 2013, 09:26, insgesamt 2-mal geändert.
Grund: Quelltext in entsprechende Code-Tags gesetzt.
BlackJack

@ini: Schreib doch mal ein paar `self.log.debug()`-Aufrufe in den Code, damit Du siehst was ausgeführt wird, und mit welchen Werten vielleicht auch.
ini
User
Beiträge: 6
Registriert: Montag 1. Juli 2013, 08:40

Danke für die schnelle Antwort und den Hinweis, das habe ich versucht, leider weiß ich nicht genau wie ich diese Aufrufe einbauen muss. Hab es mal so probiert:
in main.py (wird aufgerufen nach dem der Button im mainnav angecklickt wird)
def match_request(self, req):
self.log.debug("Supportdebug")
return re.match(r'/support(?:_trac)?(?:/.*)?$', req.path_info)
in designflow.py (soll aufgerufen werden wenn der Link der ersten Seite angecklickt wird)
def match_request(self, req):
self.log.debug("Flowdebug")
return re.match(r'/support/designöööflow/?$', req.path_info)

In meiner log Datei wird für die Aufrufe (abgekürzt) folgendes ausgegeben:
2013-07-01 14:22:44,520 Trac[main] DEBUG: Dispatching <RequestWithSession "GET '/support'">
2013-07-01 14:22:44,522 Trac[web_ui] WARNING: ResetPwStore is disabled, therefor password reset won't work.
2013-07-01 14:22:44,539 Trac[main] DEBUG: Supportdebug
2013-07-01 14:22:44,542 Trac[api] WARNING: Unable to find repository '(default)' for synchronization
.....
2013-07-01 14:22:44,707 Trac[main] WARNING: [127.0.0.1] HTTPNotFound: 404 Not Found (File style.css not found)
2013-07-01 14:22:44,732 Trac[chrome] DEBUG: Prepare chrome data for request
2013-07-01 14:25:05,204 Trac[main] DEBUG: Dispatching <RequestWithSession "GET '/support/designflow'">
2013-07-01 14:25:05,204 Trac[main] DEBUG: Supportdebug

Beim anklicken des Links müsste doch designflow.py aufgerufen und Flowdebug ausgegeben werden, oder? Wie kann ich das jetzt deuten?
Zuletzt geändert von ini am Montag 1. Juli 2013, 13:36, insgesamt 1-mal geändert.
BlackJack

@ini: Dann wird die Methode offenbar gar nicht erst aufgerufen.

Ich würde an Deiner Stelle mit einem „leeren” Plugin anfangen und dort dann Stück für Stück das vorhandene Plugin drin „entwickeln” und immer wieder testen ob es soweit läuft. Dann siehst Du ja woran es hängt.
ini
User
Beiträge: 6
Registriert: Montag 1. Juli 2013, 08:40

Sorry, hab meine Antwort gerade schnell geändert (siehe oben). Habe eigentlich mit einem leeren Plugin angefangen und nach und nach wie bei HElloworld meine Komponenten und Dateien ergänzt. Und eben an dieser Stelle hackts jetzt. :(
BlackJack

@ini: Dir ist schon klar, dass der reguläre Ausdruck in der `main.py` auch auf ``/support/designflow`` passt und damit „gewinnt” wenn er vor dem anderen geprüft wird‽
ini
User
Beiträge: 6
Registriert: Montag 1. Juli 2013, 08:40

Ne, der Gedanke kam mir zwar auch schon, da es aber im tracdeveloperplugin ebenfalls so geprüft wird, einmal für die main.py:
return re.match(r'/developer/?$', req.path_info)
und so in der zweiten py:
return re.match(r'/developer/plugins?$', req.path_info)
bin ich davon ausgegangen das es so richtig sei.
Wie kann ich das dann richtig prüfen?
ini
User
Beiträge: 6
Registriert: Montag 1. Juli 2013, 08:40

DANKE!!! Hab den Fehler entdeckt, der reguläre Ausdruck in der main.py war:
r'/support(?:_trac)?(?:/.*)?$'
anders als im tracdeveloper Beispiel
geändert auf:
r'/support/?$'
und es funktioniert.
Hab mir schon gedacht dass es was simples sein muss was ich übersehe. Danke für die Hilfe:)
ini
User
Beiträge: 6
Registriert: Montag 1. Juli 2013, 08:40

Nur noch eine Frage zu dem tracdeveloperplugin [1], dort wird nur in der main.py der ITemplateProvider implementiert, bei meinem Plugin muss ich es in jeder Klasse machen, sonst funktionierts nicht. Wieso funktioniert es beim tracdeveloper?

[1] http://trac-hacks.org/browser/tracdevel ... cdeveloper
Antworten