= Field Refactoring = This is a development scratch pad to outline a few of the requirements and ideas about how to better handle the ticket fields. For now, this puts aside the generalization of such fields to other objects/resources than Tickets (see GenericTrac for that, [milestone:0.12] material). == Goals == Get an "adapted" rendering of standard and custom fields, in the following situations: 1. Display of the field's value in the ''Ticket Box'' and other similar places (e.g. query and report results) 2. Display of the field's value changes, in the ''Change History'' and other similar places (e.g. timeline, notification) 3. Display of a field editor in the "Properties" fieldset and other similar places (e.g. bulk editor) 4. Display of a field selector in the Query view Some points to consider: - the distinction between regular and custom types should become fairly transparent at the web UI level (leave the door open for unification later in GenericTrac) -- this is (was, even) already the case - a rendering flexibility similar to the one of "Browser" properties should be reached (see source:trunk/trac/versioncontrol/web_ui/browser.py and source:trunk/trac/versioncontrol/web_ui/changeset.py) - there should be some forward thinking for #2464. Possibly #3281 and the functionality of TH:SimpleTicketPlugin could be implemented. - other simple additional features: field hints, wiki labels (#925), wiki fields (#1791)... == Proposal == A new API for dealing with fields according to the 4 points detailed above should be introduced. The ''old'' 0.9 - 0.11 API should be preserved, as there's a bunch of scripts all over the Trac world that probably depend on it, so ideally no existing method should be modified (I'm thinking in particular to `TicketSystem.get_ticket_fields`). Instead, a new set of methods and objects should be introduced. In order to avoid any confusion between the old and new ways, I propose to use the term ''property'' instead of ''field''. This matches the user-visible ''Properties'' label displayed in the ticket UI. There will be a Property class and a set of basic subclasses that correspond to the main types of fields. A resource (tickets only for now) will define the set of properties that it provides (first in `TicketSystem.get_ticket_properties()`, but preferably later in `TicketDescriptor.get_properties()`, with `TicketDescriptor` a subclass of `ResourceDescriptor`, the generic handle for resources). A Property subclass will have methods and attributes for ''answering'' the needs enumerated above. 1. `render(context, name, mode, value)` - similar to the `render_property` of the `trac.versioncontrol.browser.IPropertyRenderer` (probably some kind of unification is in order) - multiple other methods checking for the 'visibility' status of the field, 'row' display mode, etc. Each time with a given 'mode', which would be one of: `'ticket'`, `'ticket_preview'`, `'query'` 2. `render_change(old_context, new_context, name, mode, old_value, new_value)` - similar to the `render_property_diff` of the `trac.versioncontrol.changeset.IPropertyDiffRenderer` 3. `render_editor(context, name, mode, value)`. There could also be a validation method supporting validation requests that would be handled by a generic property module. 4. `render_selector(context, name, mode, values)`, for e.g. the query module. == Related Tickets == [[TicketQuery(status!=closed&keywords~=field)]] ---- See: log:sandbox/field-refactoring-tmp