Hi Steffen Hoffmann,
Thanks for you reply. It gives me a starting pont.
I followed your suggestion. What I did is:
1. Create MyTicketChangeScriptCaller.py (chmod 755) in my <env>/plugins
folder. Below is its content:
> from subprocess import Popen
> from trac.core import *
> from trac.config import Option
> from trac.ticket import ITicketChangeListener
> class TicketChangeScript(Component):
> """ Calling a script file on ticket changes."""
> implements(ITicketChangeListener)
> script = Option('ticket_change_script', 'call', '',
> doc="/usr/local/bin/test.sh")
> # ITicketChangeListener Interface
> def ticket_created(self, ticket):
> self._call(ticket, 'created')
> def ticket_changed(self, ticket, comment, author, old_values):
> self._call(ticket, 'modified')
> # def ticket_deleted(self, ticket):
> # # Beware: We may not have all ticket properties here,
> # # just ticket number.
> # self._call(ticket, 'deleted')
> def _call(self, tkt, tkt_change):
> Popen([' '.join([script, tkt.id, tkt['summary'], tkt_change])],
> shell=True)
2. Add these lines in my trac.ini file
> [ticket_change_script]
> call = /usr/local/bin/test.sh
>
3. Create a test shell script /usr/local/bin/test.sh (chmod 755), which
doesn't need a common arguments. Below is its content:
> #!/bin/sh
> tkt_id=$1
> tkt_summary=$2
> tkt_status=$3
> echo $tkt_id > /tmp/test
> echo $tkt_summary >> /tmp/test
> echo $tkt_status >> /tmp/test
For my understanding when I create/modify a ticket in Trac , I should
get something in /tmp/test file. But there is nothing, even the file
(/tmp/test) wasn't created.
What I missed from your explanation?
Thank you for your patience and help
On Sat, Sep 29, 2012 at 4:02 PM, Steffen Hoffmann <[email protected]> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> On 29.09.2012 07:36, radelphe wrote:
> > Hi all,
> >
> > I'm new in Trac system, but I like it.
> >
> > I would like to call an external script when a ticket is created or
> > closed or reopened.
> > On that script I'd like to use ticket summary, status, and reporter
> > (maybe other field too) as arguments.
> > I searched on the archive, and I found this topic (snip)
>
> > Anyone can help me please?
>
> Well writing entire plugins is a bit over the top, even more as you seem
> to rely on ready-made solutions.
>
> In fact, the linked mailing-list thread contains plenty of valuable
> hints, and building the solution is merely copy-paste and combine the
> pieces. Look at the bare-bone ITicketChangeListener implementation
> written by Chris Heller:
>
>
> from trac.core import *
> from trac.ticket import ITicketChangeListener
>
> class TicketListenerPluginExample(Component):
> """ The 'Hello World' of using the ITicketChangeListener interface
> """
>
> implements(ITicketChangeListener)
>
> # ITicketChangeListener Interface
>
> def ticket_created(self, ticket):
> self.log.info('Ticket created: %r' % ticket)
>
> def ticket_changed(self, ticket, comment, author, old_values):
> self.log.info('Ticket modified: %r' % ticket)
>
> def ticket_deleted(self, ticket):
> self.log.info('Ticket deleted: %r' % ticket)
>
>
> Put this into a file, and save the file as
> <env>/plugins/MyTicketChangeScriptCaller.py
> to get it recognized by Trac. It's that simple.
>
> Instead of logging you want to call out to a script. Fine, yoheeb's code
> is right above:
>
> Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
>
> Putting it all together:
>
>
> from subprocess import Popen
>
> from trac.core import *
> from trac.config import Option
> from trac.ticket import ITicketChangeListener
>
> class TicketChangeScript(Component):
> """ Calling a script file on ticket changes."""
>
> implements(ITicketChangeListener)
>
> script = Option('ticket_change_script', 'call', '',
> doc="File with path and common arguments")
>
> # ITicketChangeListener Interface
>
> def ticket_created(self, ticket):
> self._call(ticket, 'created')
>
> def ticket_changed(self, ticket, comment, author, old_values):
> self._call(ticket, 'modified')
>
> # def ticket_deleted(self, ticket):
> # # Beware: We may not have all ticket properties here,
> # # just ticket number.
> # self._call(ticket, 'deleted')
>
> def _call(self, tkt, tkt_change):
> Popen([' '.join([script, tkt.id,
> tkt['summary'], tkt_change])],
> shell=True)
>
>
> Additional pieces are
> * additional option to read script from configruation instead of
> hard-coding into the plugin
> * factor general call out into a private method to prevent code
> duplication
> * signal Popen to use the shell, note some differences between Unix and
> Windows here: http://stackoverflow.com/questions/1253122
> * extracting properties from Ticket object, that is given to each
> change listener in the ticket argument, see other available properties
> in the source: Ticket class in trac/ticket/model.py
>
> In your `trac.ini` create a new section:
>
>
> [ticket_change_script]
> call = /usr/local/bin/my_script.sh -my_common_args
>
>
> Your (BASH) script will get called effectively like so:
> $> /bin/sh /usr/local/bin/my_script.sh -my_common_args <ticket.id>
> <summary> <created|modified|deleted>
>
> This is completely untested, but I hope it's clearer now.?
>
> Steffen Hoffmann
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.10 (GNU/Linux)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
>
> iEYEARECAAYFAlBm8XQACgkQ31DJeiZFuHf60ACgqPcRtCZdr1gCEXkNKQbpt3wT
> k+IAnA9JC4LQjmSpsHS/H1oWfR03ylP5
> =M0Ke
> -----END PGP SIGNATURE-----
>
> --
> You received this message because you are subscribed to the Google Groups
> "Trac Users" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/trac-users?hl=en.
>
>
--
Adelphe Rafanambinana
--
You received this message because you are subscribed to the Google Groups "Trac
Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/trac-users?hl=en.