Author: andrej Date: Thu Apr 18 09:13:37 2013 New Revision: 1469232 URL: http://svn.apache.org/r1469232 Log: patching trac with a new method ITicketFieldProvider.get_raw_fields - the change is required by bhrelations plugin
Modified: bloodhound/trunk/trac/trac/ticket/api.py bloodhound/trunk/trac/trac/ticket/tests/api.py Modified: bloodhound/trunk/trac/trac/ticket/api.py URL: http://svn.apache.org/viewvc/bloodhound/trunk/trac/trac/ticket/api.py?rev=1469232&r1=1469231&r2=1469232&view=diff ============================================================================== --- bloodhound/trunk/trac/trac/ticket/api.py (original) +++ bloodhound/trunk/trac/trac/ticket/api.py Thu Apr 18 09:13:37 2013 @@ -187,6 +187,16 @@ class ITicketFieldProvider(Interface): specified as optional. """ + def get_raw_fields(): + """Returns a list of fields, each represents ticket field + dictionary. For example: + * name: field name + * type: field type + * label: the label to display, preferably wrapped with N_() + * format: field format + * other appropriate field properties + """ + class TicketSystem(Component): implements(IPermissionRequestor, IWikiSyntaxProvider, IResourceManager, ITicketFieldProvider) @@ -386,12 +396,33 @@ class TicketSystem(Component): field['custom'] = True fields.append(field) + #TODO: this is Bloodhound specific patch to the Trac. Contact Trac + # community about possibility to apply the change to the Trac codebase + self._add_raw_fields_from_field_providers(fields) + return fields reserved_field_names = ['report', 'order', 'desc', 'group', 'groupdesc', 'col', 'row', 'format', 'max', 'page', 'verbose', 'comment', 'or'] + def _add_raw_fields_from_field_providers(self, fields): + for field_provider in self.ticket_field_providers: + if hasattr(field_provider, 'get_raw_fields'): + raw_fields = field_provider.get_raw_fields() + if raw_fields: + for raw_field in raw_fields: + self._add_raw_field( + raw_field, fields) + + def _add_raw_field(self, raw_field, fields): + if raw_field["name"] in [f['name'] for f in fields]: + self.log.warning( + 'Duplicate field name "%s" (ignoring)', raw_field["name"]) + else: + fields.append(raw_field) + + def get_custom_fields(self): return copy.deepcopy(self.custom_fields) Modified: bloodhound/trunk/trac/trac/ticket/tests/api.py URL: http://svn.apache.org/viewvc/bloodhound/trunk/trac/trac/ticket/tests/api.py?rev=1469232&r1=1469231&r2=1469232&view=diff ============================================================================== --- bloodhound/trunk/trac/trac/ticket/tests/api.py (original) +++ bloodhound/trunk/trac/trac/ticket/tests/api.py Thu Apr 18 09:13:37 2013 @@ -1,10 +1,26 @@ from trac.perm import PermissionCache, PermissionSystem -from trac.ticket.api import TicketSystem +from trac.ticket.api import TicketSystem, ITicketFieldProvider from trac.ticket.model import Ticket from trac.test import EnvironmentStub, Mock +from trac.core import implements, Component import unittest +class TestFieldProvider(Component): + implements(ITicketFieldProvider) + + def __init__(self): + self.raw_fields = [] + + def get_select_fields(self): + return [] + + def get_radio_fields(self): + return [] + + def get_raw_fields(self): + return self.raw_fields + class TicketSystemTestCase(unittest.TestCase): @@ -121,6 +137,41 @@ class TicketSystemTestCase(unittest.Test self.assertEqual(['leave'], self._get_actions({'status': 'reopened'})) self.assertEqual(['leave'], self._get_actions({'status': 'closed'})) + def test_can_add_raw_fields_from_field_providers(self): + testFieldProvider = self.env[TestFieldProvider] + self.assertIsNotNone(testFieldProvider) + testFieldProvider.raw_fields = [ + { + 'name': "test_name", + 'type': 'some_type', + 'label': "some_label", + }, + ] + fields = TicketSystem(self.env).get_ticket_fields() + row_added_fields = [ + field for field in fields if field["name"] == "test_name"] + self.assertEqual(1, len(row_added_fields)) + + def test_does_not_add_duplicated_raw_fields_from_field_providers(self): + testFieldProvider = self.env[TestFieldProvider] + self.assertIsNotNone(testFieldProvider) + testFieldProvider.raw_fields = [ + { + 'name': "test_name", + 'type': 'some_type1', + 'label': "some_label1", + }, + { + 'name': "test_name", + 'type': 'some_type2', + 'label': "some_label2", + }, + ] + fields = TicketSystem(self.env).get_ticket_fields() + row_added_fields = [ + field for field in fields if field["name"] == "test_name"] + self.assertEqual(1, len(row_added_fields)) + def suite(): return unittest.makeSuite(TicketSystemTestCase, 'test')