Edgewall Software

1.0 | 1.4

Documenting API changes in 1.2

These notes reflect the cumulative changes that occurred during the 1.1.x development cycle, and therefore the current status for 1.2.

No API changes are expected to occur on the branches/1.2-stable branch.


  1. Prerequisites
    1. Modified Dependencies
      1. jQuery and jQuery UI (bundled)
      2. Babel (optional)
      3. Genshi (mandatory)
      4. Databases
      5. Other
    2. Deprecated Modules Removed
    3. New Dependencies
  2. Detailed List of Developer Visible Changes
    1. In Trac 1.1.1
    2. In Trac 1.1.2
    3. In Trac 1.1.3
    4. In Trac 1.1.4
    5. In Trac 1.1.5
    6. In Trac 1.1.6
  3. Other Modifications made to the 1.0 API
    1. Modified Interfaces
      1. IWikiChangeListener (1.1.3)​ (1.0)​
      2. IPreferencePanelProvider (1.1.3)​ (1.0)​
    2. New Interfaces
      1. trac.notification.api.INotificationDistributor (1.1.3)​
      2. trac.notification.api.INotificationFormatter (1.1.3)​
      3. trac.notification.api.INotificationSubscriber (1.1.3)​
      4. trac.notification.api.IEmailAddressResolver (1.1.3)​
      5. trac.notification.api.IEmailDecorator (1.1.3)​
    3. Notification API Changes
    4. Database API Changes
      1. Environment.get_db_cnx has been removed in Trac 1.1.2
      2. db parameters removed from function and method signatures in Trac 1.1.2
      3. ConnectionBase class in Trac 1.1.2
    5. Template and CSS changes in Trac 1.1.2
    6. Uncategorized Changes
  4. New in the 1.2 API


Only Python versions 2.6 and 2.7 are supported.

Modified Dependencies

jQuery and jQuery UI (bundled)

The bundled version of jQuery was updated from 1.7.2 in Trac 1.0-stable to:

The bundled version of jQuery UI was updated from 1.9.2 in 1.0-stable to 1.11.4 in Trac 1.2.

The bundled version of the full minified jQuery UI package was upgraded from 1.8.21 in Trac 1.0-stable to:

Babel (optional)

The internationalization support (i18) for Trac is depending on Babel, ≥ 0.9.5 is supported.

Genshi (mandatory)

Genshi 0.6 and 0.7 are supported.


SQLite ≥ 3.0
PostgreSQL ≥ 8.0
MySQL / MariaDB ≥ 5.0
Database Bindings
pysqlite ≥ 2.4.1 (version provided by Python 2.6), avoid 2.5.2 - 2.5.4
psycopg2 ≥ 2.0
MySQLdb ≥ 1.2.2


Package Req or Opt? Version supported
SetupTools Required ≥ 0.6, 5.4 - 5.6 are not recommended.
Git Optional ≥ 1.5.6
Subversion Optional ≥ 1.6
DocUtils Optional ≥ 0.3.9
Textile Optional ≥ 2.0
Pygments Optional ≥ 0.6. Let's consider bumping the requirement to at least 1.0, released in 2008

Please add any dependencies overlooked.

ConfigObj is no longer a required dependency for the AuthzPolicy permission policy (tracopt.perm.authz_policy) since Trac 1.1.5.

Deprecated Modules Removed

Removed Enscript, SilverCity and PHP renderers in Trac 1.1.3. (#11795)

New Dependencies

passlib is needed to decode some htpasswd formats on Windows, replacing the fcrypt package.

Detailed List of Developer Visible Changes

In Trac 1.1.1

Component: report system (1 match)

Ticket Summary
#10979 Allow dynamic variables to be used in a report title and description
API Changes

New function sub_vars in trac.util.text for substituting $XYZ-style variables in a string.

Component: ticket system (1 match)

Ticket Summary
#1942 [patch] Add support for date type in custom ticket fields
API Changes

new TicketFieldList class for efficiently accessing fields by name (r11330).

Component: web frontend (1 match)

Ticket Summary
#10976 Compatibility issue between jQuery UI < 1.8.22 and jQuery 1.8
API Changes

jQuery upgraded to 1.8.3, jQuery UI upgraded to 1.9.2 and jQuery UI Timepicker upgraded to 1.1.1.

In Trac 1.1.2

Component: admin/web (2 matches)

Ticket Summary
#10994 Add drag and drop and other dynamic behavior to the admin panels containing enum lists
API Changes

The function addSelectAllCheckboxes adds a Select All checkbox to the heading of a table, when executed on jQuery object that wraps a table. The tds containing the checkboxes must have the sel class.

#11519 Allow default_handler to be set from the Basic Settings admin page
API Changes

The IRequestHandler class attribute is_valid_default_handler determines if the class can be used as a default handler, and defaults to True when not present. The function is_valid_default_hanlder should be used to determine whether an IRequestHandler object is a valid default handler.

Component: database backend (1 match)

Ticket Summary
#11581 Add an abstract base class for connection classes
API Changes

Added an abstract base class ConnectionBase for database connection classes.

Component: general (10 matches)

Ticket Summary
#11056 Disable submit buttons if required items are not selected
API Changes

To add a datepicker or datetimepicker to an element, add the trac-datepicker and trac-datetimepicker classes respectively, and add jQuery UI and add-ons to the page using Chrome(self.env).add_jquery_ui(req) in process_request.

To disable a submit button associated with a set of checkboxes or a file selector, add the trac-disable class to the submit button and add the trac-disable-determinant class to each checkbox or the file element.

In both cases there is no need to add any specific JavaScript code to the page.

#11129 Handle CSS as text/css type
API Changes

The rendering method may be specified by the request handler as a fourth parameter in its response. The method is passed to post_process_request when the parameter is in the implementation's signature, and can be modified by the IRequestFilter. When not explicitly specified, the rendering method is still inferred from the content type when rendering the template.

#11406 diff.css is added twice on the diff_view page
API Changes

Plugins using diff_view.html will need to use add_stylesheet to add diff.css before rendering the template.

#11494 Remove deprecated functions and methods from 0.10 and earlier
API Changes

Removed functions and methods that have been deprecated since Trac 0.11 or earlier.

  • trac.mimeview.api:Mimeview.get_max_preview_size
  • trac.mimeview.api:Mimeview.to_utf8
  • trac.perm:PermissionCache.permissions
  • trac.ticket.ReportModule.execute_report
  • trac.util:pairwise
  • trac.versioncontrol.diff:hdf_diff
  • trac.web.chrome:add_javascript
  • trac.wiki.api:IWikiMacroProvider.render_macro
  • trac.wiki.web_ui:InvalidWikiPage
  • addEvent, addHeadingLinks, enableControl and getAncestorByTagName from trac.js

Removed functions and methods that were deprecated and scheduled for removal in Trac 1.0 or earlier:

  • Removed macros.html and macros.rss, which have been deprecated since Trac 0.12.
  • Removed accessor for default_ attributes in TicketModule. The options were moved to TicketSystem in Trac 0.12.
#11565 Reduce code duplication in about and error pages
API Changes
  • New template environment_info.html renders the System Information, Installed Plugins and Configuration Information.
  • Added get_config_info method to the Environment class.
  • Merged the about.css stylesheet into trac.css.
#11568 All Trac exceptions should inherit from a base class in Trac
API Changes

All exceptions defined in Trac inherit from TracBaseError.

#11587 Implement ISystemInfoProvider in git connector and database connection classes
API Changes

The db, web server and git version info are not directly appended to Environment.systeminfo. The version is instead provided through the ISystemInfoProvider interface. Environment.systeminfo might be made a private attribute in a future release of Trac.

#11600 Remove Python 2.5 compatibility
API Changes

Removed Python 2.5 compatibility:

  • statements from __future__ import with_statement.
  • trac.util.presentation.to_json for the case that json can't be imported.
  • cleandoc definition in trac.util.compat.

Utilized Python 2.6 features:

  • PEP 3110 style exception catching, except X as e.
  • Print function (from __future__ import print_function) (PEP 3105).
  • Absolute imports (from __future__ import absolute_import).

The function terminate in trac.util will accept either a subprocess.Popen object or integer process id as an input.

#11605 Remove deprecated db parameters
API Changes
  • The deprecated db parameters have been removed from the signatures of all public methods and functions.
  • Added public method insert_changeset to CachedRepository and deprecated _insert_changeset.
  • The db parameter in the signature of ReportModule.execute_paginated_report is deprecated and may be omitted.
  • The db parameters in the signatures of IEnvironmentSetupParticipant.environment_needs_upgrade and IEnvironmentSetupParticipant.upgrade_environment are deprecated and may be omitted.
  • Environment.get_read_db and the decorators @with_transaction(env) and env.with_transaction() are scheduled for removal in Trac 1.3.1.
  • Environment.get_db_cnx has been removed.
#11609 Add realm attribute to Model classes
API Changes

Added realm attribute to model classes: Attachment, Milestone, Repository, Changeset, Node, Ticket and WikiPage.

Component: notification (1 match)

Ticket Summary
#11636 Refactoring of trac.notification
API Changes

ListOption and Configuration.getlist support multiple separators, specified in a tuple or list.

Component: rendering (2 matches)

Ticket Summary
#11126 Some templates could override layout (and theme) stylesheets with own stylesheets
API Changes

trac.web.chrome:add_stylesheet accepts arbitrary link attributes as trailing keyword arguments, and media is no longer a positional argument.

#11169 `render_resource_link` should add the "missing" class if the resource doesn't exist
API Changes

When get_resource_description doesn't return an Element (e.g. when the IResourceManager doesn't implement get_resource_description), render_resource_link adds the missing class and the rel=nofollow attribute if the resource has a ResourceManager and the resource doesn't exist. The realm is always added as a class.

Added assertion with error message to check that the first argument to ComponentMeta is a ComponentManager.

Component: report system (2 matches)

Ticket Summary
#11246 Having keywords in reports be followable
API Changes

parse_arg_list strips the leading ? from the query_string argument.

#11697 ReportModule uses magic number -1 where None should be used
API Changes

Added class attribute REPORT_LIST_ID to the ReportModule class, containing the resource id of the Report List page.

Component: ticket system (2 matches)

Ticket Summary
#11145 wrap author information for ticket change comments in a span to make them stylable
API Changes
  • The authorinfo and authorinfo_short methods of the Chrome class in trac.web.chrome return the author wrapped in a span with class trac-author.
  • Added author_email method of the Chrome class which returns the author email from the email_map dictionary if author doesn't already look like an email address.
  • author_email is passed to templates in the Chrome data dictionary after partial evaluation with the email_map as a parameter, resulting in the signature author_email(author).
  • The template author_or_creator.rss was refactored so that email_map doesn't need to be passed as a parameter.
#11499 Eliminate redundant code in milestone and admin milestone templates / modules
API Changes

Added methods to MilestoneModule class:

  • get_default_due
  • save_milestone

Added function get_num_tickets_for_milestone (since 1.2; the similar method Milestone.get_num_tickets was added in 1.1.2, but replaced with get_num_tickets_for_milestone in 1.2).

New template milestone_edit_form.html for editing a milestone is used on the milestone_edit.html and admin_milestone.html pages. The MilestoneModule is used in trac.ticket.admin.MilestoneAdminPanel to eliminate redundant code.

Component: version control (1 match)

Ticket Summary
#11610 Move Changeset, Node and Repository classes to model.py
API Changes
  • Abstract base classes have abc.ABCMeta metaclass and use abstractmethod decorator on abstract methods.
  • Mock has support for abstract base classes defined using abc.ABCMeta.
  • A CachedChangeset instance rather than an instance of the abstract Changeset class is passed to the repository change listeners.
  • Added EmptyChangeset class, an instance of which is returned by get_changes (in trac.versioncontrol.web_ui.util) when a NoSuchChangeset error is raised by the repository.

Component: wiki system (3 matches)

Ticket Summary
#10834 Option to add line numbers to code blocks
API Changes

The WikiProcessor argument parser supports dashes in the argument value.

#11244 Permissions: setting a Wiki page "read-only" does not restrict adding attachments
API Changes

Added methods get_config, remove_config and set_config to the FunctionalTestEnvironment class.

#11544 Version argument in Resource object is ignored when initializing a WikiPage
API Changes

WikiPage __init__ method uses resource.version when version parameter is None. An invalid version or Resource.version is coerced to None.

In Trac 1.1.3

Component: database backend (3 matches)

Ticket Summary
#11859 Add get_database_version and set_database_version methods to DatabaseManager class
API Changes

The database version for Trac and plugins can be retrieved using the get_database_version and set_database_version methods of the DatabaseManager class.

#11893 Add reset_tables method to ConnectionBase class
API Changes

Added reset_tables method to the ConnectionBase class and each class implementing the ABC. Added reset_tables and insert_into_tables methods to the DatabaseManager class.

#11894 _parse_db_str should not be a protected member of module
API Changes

Renamed _parse_db_str in the trac.db.api module to parse_connection_uri. The latter is aliased to the former for backwards compatibility.

Component: general (4 matches)

Ticket Summary
#11648 Model classes should have a resource property
API Changes

Every model class has a resource property and the Resource objects are created on access, replacing several cases in which resource was an attribute and the Resource object was created in the initializer and other class methods.

#11707 Module and other classes should have a realm attribute
API Changes

The IResourceManager implementation defines the realm through a class attribute, which is then assigned to model and module classes (classes implementing IResourceHandler). This allows the singly-defined realm attribute to be used throughout the package and avoids the repeated use of static strings.

#11815 Test failures due to enabled unit test components in functional tests
API Changes

Environment.is_component_enabled returns None if passing a component in the trac.tests package.

#11824 Remove //Since// version information from TracIni documentation
API Changes

Leading and trailing whitespace is stripped from translatable string (plugin developers should use cleandoc from trac.util.text). Previously only uniform indentation was removed.

Component: notification (5 matches)

Ticket Summary
#3517 Notification plugin
API Changes

Added new API for notification distribution and extension points:

#4056 Notification Preferences
API Changes

Added new extension point INotificationSubscriber.

#11853 Modular preference pages with child panels
API Changes

IPreferencePanelProvider.get_preference_panels() can now return (panel, label, parent_panel) triples to make child panels appear as part of the indicated parent panel.

#11854 Split up notification module
API Changes

Added mail notification helper functions create_charset, create_mime_text, create_header, create_message_id, and class RecipientMatcher (matches recipients taking into account admit_domains, ignore_domains, use_short_addr and smtp_default_domain config options).

#11869 Add DB table for notification subscribers watching individual resources
API Changes

Added new trac.notification.model.Watch class for managing watch preferences in the new notify_watch DB table.

Component: rendering (1 match)

Ticket Summary
#11873 Return a NamedTuple from Mimeview.get_supported_conversions
API Changes

Mimeview.get_supported_conversions(...) returns a namedtuple MimeConversion, with the entries retaining the same ordering as the previous tuple.

Component: ticket system (6 matches)

Ticket Summary
#10833 ConfigurableTicketWorkflow's "Reassign To" ignores fine-grained permissions with restrict_owner=True
API Changes

EnvironmentStub has an insert_known_users method for populating the session table with known users.

#11699 Use Chrome.authorinfo in render_ticket_action_controller
API Changes
  • The final character in the string returned from separated() in trac.util.presentation can be specified through the last parameter, which defaults to None.
  • Chrome.authorinfo() returns a span with class trac-author-anonymous and trac-author-none when the author input is anonymous and None, respectively.
  • Chrome.format_author() returns (none) for any author input that is falsy.
#11717 Highlight the whole referenced comment
API Changes

On the ticket page the id #comment:%s was moved from the comment span to the enclosing h3.

#11794 Rename 'Comments only' label in #prefs on the ticket page
API Changes

On the ticket prefs form the id of the Show property changes (formerly Comments only) checkbox was renamed from trac-comments-only-toggle to trac-show-property-changes-toggle.

#11839 Allow groups to be specified in the set_owner workflow attribute
API Changes

The PermissionSystem method get_groups_dict returns a dictionary of groups and group members. The method get_users_dict returns a dictionary of users and user permissions.

#11892 Move group_milestones from trac.ticket.model to trac.ticket.roadmap
API Changes

Moved group_milestones function from trac.ticket.model to trac.ticket.roadmap. Compatibility function has been left in trac.ticket.model and will be removed in 1.3.1.

Component: version control (1 match)

Ticket Summary
#11703 Remove deprecated [trac] repository_dir option for configuring repository
API Changes

Removed deprecated authname parameter from Environment.get_repository().

Component: wiki system (1 match)

Ticket Summary
#6573 Allow change comment edit after commit.
API Changes

Added new optional method wiki_page_comment_modified() in IWikiChangeListener.

In Trac 1.1.4

Component: general (1 match)

Ticket Summary
#11437 Configuration sections from plugins should be written to trac.ini
API Changes

The EnvironmentStub contains a ConfigurationStub object rather than a Configuration object. The ConfigurationStub stores written data in the file_content attribute rather than writing to disk.

Component: notification (2 matches)

Ticket Summary
#11926 Missing X-Trac-Ticket-URL header in ticket notification mail since 1.1.3
API Changes

Add Ticket.get_comment_number(cdate) which returns a comment number by its date.

#11941 Allow to reorder subscription rules using drag-and-drop and submit in bulk in notifications of preferences
API Changes
  • Added $.setWarningUnsavedChanges, which shows a warning if leaving the page.
  • Added .trac-button class styling regular button for button elements.

Component: rendering (1 match)

Ticket Summary
#10841 Less broad CSS rules for styling ticket #properties table
API Changes

On the ticket page, the CSS selectors descending from the #properties table are more precise.

Component: ticket system (1 match)

Ticket Summary
#11931 On BatchModify form workflow controls should be disabled until action is selected
API Changes

The ticket_workflow.html template is used in the ticket.html and batch_modify.html pages.

Component: version control (1 match)

Ticket Summary
#11849 Move some repository-related configuration options
API Changes

Renamed RepositoryManager.repository_type to RepositoryManager.default_repository_type.

In Trac 1.1.5

Component: contrib (1 match)

Ticket Summary
#10975 Enhancement for the contrib/htpasswd.py script
API Changes
  • trac.util.compat provides an import of the crypt.crypt method that will fallback to fcrypt module when crypt module is not available. None is returned if fcrypt is not available.
  • trac.util provides the salt function for use with cryptographic hash functions.

Component: database backend (1 match)

Ticket Summary
#11978 Add drop_schema method to ConnectionBase class
API Changes
  • Added destroy_db method to the DatabaseManager class, the IDatabaseConnector interface and implementations of the IDatabaseConnector interface.
  • The keyword parameters of EnvironmentStub's destroy_db method are deprecated.

Component: general (4 matches)

Ticket Summary
#6551 IntOption and BoolOption values saved even when not differing from default
API Changes
  • Configuration.get always returns a string, as documented.
  • Configuration values are normalized before writing to file.
  • Moved get_configinfo (added in 1.1.2) from Environment class to a function of the config module.
#8172 Plugin db upgrade infrastructure
API Changes

Added needs_upgrade() and upgrade() methods to the DatabaseManager class.

#11982 Remove dependency on ConfigObj
API Changes

Added OrderedDict to trac.util.compat module for Python 2.6 compatibility.

#12008 Deleting unevaluated `@lazy` attribute raises KeyError
API Changes

Changed trac.util.lazy: for x decorated @lazy and not yet evaluated, del x does not raise KeyError anymore.

Component: notification (1 match)

Ticket Summary
#11875 Notification subscriber config section
API Changes

Added trac.notification.api.parse_subscriber_config(), NotificationSystem.notification_subscriber_section, NotificationSystem.subscriber_defaults and NotificationSystem.default_subscriptions().

Component: rendering (1 match)

Ticket Summary
#12010 Pygments preferences template should be located in mimeview package
API Changes

prefs_pygments.html moved from trac/prefs/templates to trac/mimeview/templates.

Component: timeline (1 match)

Ticket Summary
#12048 [PATCH] Add scope to CSS rules in timeline.css
API Changes

Timeline CSS rules are scoped to the .timeline class.

Component: version control (1 match)

Ticket Summary
#11995 Versioncontrol API for changeset bookmarks
API Changes

Add new Changeset.get_bookmarks() API.

In Trac 1.1.6

Component: database backend (1 match)

Ticket Summary
#12105 Add get_table_names method to DatabaseManager
API Changes

New method for retrieving database table names: DatabaseManager.get_table_names().

Component: web frontend (2 matches)

Ticket Summary
#11474 Fine grained permission checks for EMAIL_VIEW are skipped when formatting author
API Changes
  • The EMAIL_VIEW permission is defined in the Chrome class rather than the PermissionSystem class.
  • Chrome.format_author and Chrome.authorinfo perform fine-grained permission checks when passed an optional Resource object.
  • show_email_addresses is deprecated in the Chrome data dictionary that is used to render templates.
#12095 Add is_xhr property to Request class
API Changes

Added is_xhr property to the Request class. The property is True if the request header contains X-Requested-With: XMLHttpRequest.

Other Modifications made to the 1.0 API

Modified Interfaces

IWikiChangeListener (1.1.3) (1.0)

Wiki page version comments can now be edited, so wiki_page_comment_modified(page, old_comment) has been added to allow plugins to be notified of this.

IPreferencePanelProvider (1.1.3) (1.0)

IPreferencePanelProvider implementations can now provide child panels that appear as sections appended to other panels (proposal). This allows plugins to extend existing preference panels.

New Interfaces

trac.notification.api.INotificationDistributor (1.1.3)

A new INotificationDistributor interface was added (proposal). It allows plugins to distribute notifications on different channels (e.g. over XMPP).

trac.notification.api.INotificationFormatter (1.1.3)

A new INotificationFormatter interface was added (proposal). It allows plugins to format notifications (e.g. to HTML).

trac.notification.api.INotificationSubscriber (1.1.3)

A new INotificationSubscriber interface was added (proposal). It allows plugins to provide more subscription preferences (e.g. to send or suppress notifications under special conditions).

trac.notification.api.IEmailAddressResolver (1.1.3)

A new IEmailAddressResolver interface was added (proposal). It allows plugins to retrieve email addresses from users (e.g. from LDAP).

trac.notification.api.IEmailDecorator (1.1.3)

A new IEmailDecorator interface was added (proposal). It allows plugins to add or tweak email headers.

Notification API Changes

To take advantage of the new notification related interfaces, code that sends notifications must use the new Notification API instead of the NotifyEmail class hierarchy since Trac 1.1.3. (See proposal)

Database API Changes

In Trac 1.1.3 methods have been added to the DatabaseManager class for settings and retrieving the database version for Trac and plugins: set_database_version and get_database_version (#11859).

In Trac 1.1.5 methods have been added to the DatabaseManagerclass for upgrading the database: needs_upgrade and upgrade.

Environment.get_db_cnx has been removed in Trac 1.1.2

Following the deprecation made in 0.12, the method Environment.get_db_cnx has been removed (#11605).

One should now only use the context managers for retrieving a database Connection in read or write mode.

  • a read-only Connection can be used to form queries:
    with env.db_query as db:
    a db instance obtained the above way should only be used for executing SELECT queries
  • a writable Connection can be used to modify the database content in a transaction:
    with env.db_transaction as db:
    a db instance obtained the above way can be used to execute INSERT/UPDATE/DELETE queries; they will be committed when the last such automatic transaction in the control flow completes successfully. See DatabaseApi for the full details.

Environment.get_read_db and the decorators @with_transaction(env) and env.with_transaction() have been deprecated since Trac 1.0 and will be removed in Trac 1.3.1.

db parameters removed from function and method signatures in Trac 1.1.2

With the introduction of @with_transaction(env) decorators in 0.12 and continuing with the introduction of the database connection context managers in 1.0, the db parameters passed as function and method arguments became deprecated.

The db parameters have been removed from nearly all function and method signatures. The db arguments are still present on methods of IEnvironmentParticipant implementations, but are deprecated and should no longer be used. They will be removed in 1.3.1.

ConnectionBase class in Trac 1.1.2

The ConnectionBase class defines an abstract interface that database backends must adhere to when implementing a Connection class.

Template and CSS changes in Trac 1.1.2

tt tags are not supported in HTML5 and have been replaced with code tags in Trac (#11094). The styling of tt and code tags is the same in Trac, but code tags should be used, since the styling for tt tags will be removed in a future version of Trac.

The about.css stylesheet has been removed and the rules contained in that stylesheet have been moved to trac.css. The table of environment information on the Error and About pages have been extracted to a new template environment_info.html and the markup and associated rules in the stylesheet have been significantly changed.

Uncategorized Changes

Removed deprecated compatibility code for InterTrac links in Trac 1.1.4: trunk/trac/wiki/formatter.py@13050:703-712#L696, and remove documentation:

Removed the deprecated authname parameter from Environment.get_repository() in Trac 1.1.3.

Removed Since info from docstrings for Trac < 0.12.

New in the 1.2 API

Be sure to have a look at the new ApiDocs (for latest trunk).

Last modified 3 years ago Last modified on Apr 25, 2020, 10:52:13 PM
Note: See TracWiki for help on using the wiki.