Is it possible to add a Ticket Report to the Available Reports via a plugin, so that after installing the plugin it becomes automatically available? Or would one have to manually save a custom query with the intended columns and filters?
If it is possible to do this via python code, what is the Trac interface to be implemented?
You can insert the reports through an implementation of IEnvironmentSetupParticipant. Example usage in env.py. In env.py
the reports are inserted in environment_created
. You'll want to insert reports in upgrade_environment
. Example code for inserting the report can be found in report.py. needs_upgrade
determines whether upgrade_environment
is called on Environment startup so you'll need to provide the logic that determines whether your reports are already present, returning False
if they are present and True
if they are not. If True
is returned, then upgrade_environment
will get called (for your case environment_created
can just be pass
, or it can directly call upgrade_environment
, the latter being a minor optimization discussed in #8172). See the Database Schema for information on the report
table.
In Trac 1.2 (not yet released) we've tried to make it easier to work with the database by adding methods to the DatabaseManager class. DatabaseManager for Trac 1.1.6 includes methods set_database_version
and get_database_version
. This is useful for reducing the amount of code needed in IEnvironmentSetupParticipant.needs_upgrade
when checking whether the database tables need to be upgraded (even simpler would be to just call DatabaseManager.needs_upgrade). There's also an insert_into_tables
method that you could use to insert reports.
That said, I'm not sure you need to put an entry for your plugin in the system
table using set_database_version
. You can probably just query the report
table and check if your report is present, use that check to return a boolean from IEnvironmentSetupParticipant.needs_upgrade
, which will determine whether IEnvironmentSetupParticipant.upgrade_environment
gets called. If you are developing for Trac 1.0.x, you can copy code from the DatabaseManager class in Trac 1.1.6. Another approach can be seen with CodeReviewerPlugin, for which I made a compat.py module that adds the methods I needed. The advantage of the compat.py
approach is that the methods can be copied from the DatabaseManager
class without polluting the main modules of your codebase. In the future when your plugin drops support for Trac < 1.2 you can just delete the compat.py
module and modify the imports in your plugin code, but not have to change any of your primary plugin logic.