source: trunk/plugins/tickettypedsystem/ticketsystem/web_ui.py @ 651

Revision 651, 5.2 KB checked in by aculapov, 5 years ago (diff)
  • cleaned up the unused files and the ones not related to the plugin
Line 
1# -*- coding: utf-8 -*-
2#
3# Copyright 2008 Optaros, Inc
4
5import re
6import pkg_resources
7
8from trac.core import Component, implements, ExtensionPoint
9from trac.ticket.api import ITicketChangeListener, ITicketManipulator
10from trac.web.api import IRequestFilter
11from trac.web.chrome import ITemplateProvider
12
13from ticketsystem.api import IOperationsProvider, ITicketRelationshipProvider, ITicketUIWrapper, TypedTicket
14
15class TypedTicketModule(Component):
16
17    implements(ITicketChangeListener, ITicketManipulator, 
18               ITemplateProvider, IRequestFilter)
19    operations = ExtensionPoint(IOperationsProvider)
20    ticket_relationships = ExtensionPoint(ITicketRelationshipProvider)
21    action_listener_map = {'create': [], 'change': [], 'delete': []}
22    renderers = ExtensionPoint(ITicketUIWrapper)
23
24    typed_ticket_re = re.compile(r'/ticket/(.*)')
25    typed_newticket_re = re.compile(r'/newticket(.*)')
26   
27    def __init__(self, *args, **kwargs):
28        # call the parent
29        super(TypedTicketModule, self).__init__(*args, **kwargs)
30        # make the operations map
31        for operation in self.operations :
32            for op_name in operation.register_for_events() :
33                if op_name in self.action_listener_map.keys() :
34                    self.action_listener_map[op_name].append(operation)
35
36
37    # ITemplateProvider methods
38    def get_htdocs_dirs(self):
39        return [('ticketsystem', pkg_resources.resource_filename(__name__, 'htdocs'))]
40
41    def get_templates_dirs(self):
42        return [pkg_resources.resource_filename(__name__, 'templates')]
43
44    # ITicketChangeListener methods
45    def ticket_changed(self, ticket, comment, author, old_values) :
46        for ticket_renderer in [ r for r in self.renderers if r.match_for_render(ticket['type'])]:
47            ticket_renderer.process_changes(None, ticket)
48   
49    def ticket_created(self, ticket):
50        for ticket_renderer in [ r for r in self.renderers if r.match_for_render(ticket['type'])]:
51            ticket_renderer.process_changes(None, ticket)
52   
53    def ticket_deleted(self, ticket):
54        pass
55
56    # ITicketManipulator methods
57    def validate_ticket(self, req, ticket):
58        for ticket_renderer in [ r for r in self.renderers if r.match_for_render(ticket['type'])]:
59                ticket_renderer.process_changes(req, ticket)
60       
61        return list()
62
63    # IRequestFilter methods
64    def post_process_request(self, req, template, data, content_type):       
65        if template in ["ticket.html" ]:
66            new_template = None   
67            if not data.has_key('fields_key') :
68                data['fields_dict'] ={}
69                for field in data['fields'] :
70                    data['fields_dict'][field['name']] = field
71
72            for field in data['fields_dict']:
73                data['fields_dict'][field]['datefield'] = \
74                    self.config.getbool('ticket-custom',field+'.date')
75           
76            type = None
77            if data.has_key('ticket') :
78                data['ticket'] = TypedTicket(self.env, data['ticket'])
79                type = data['ticket']['type']
80            if 'type' in req.args and req.args['type'] is not None:
81                type = req.args['type']
82            for render_handle in [ rh for rh in self.renderers if rh.match_for_render(type)] :
83                data.update(render_handle.get_content_to_inject(req, data))
84                   
85            for render_handle in self.renderers :
86                if render_handle.match_for_render(type) and 'oldpage' not in req.args:
87                    page = render_handle.handle_request(req, data, content_type)
88                    if page :
89                        new_template, new_data, new_content_type = page
90                        if new_template and new_data and new_content_type :
91                            return new_template, new_data, new_content_type
92                        if new_data :
93                            data = new_data
94                        if new_content_type :
95                            content_type = new_content_type
96       
97            # hook the new template
98            if new_template :
99                data['ticket_template'] = new_template
100            else :
101                data['ticket_template'] = self.env.config.get('ticket-system', 
102                                                              'ticket.template', 
103                                                              'ticket.html')
104            return "typedticket.html", data, content_type
105       
106        return template, data, content_type
107   
108    def pre_process_request(self, req, handler) :
109        match = self.typed_ticket_re.match( req.path_info )
110        if match and req.method=='POST':
111           
112            type = None
113            if 'id' in req.args and req.args['id'] is not None:
114                type = TypedTicket(self.env, int(req.args['id']))['type']
115            if 'field_type' in req.args and req.args['field_type'] is not None:
116                type = req.args['field_type']
117            try :
118                for ticket_renderer in [ rh for rh in self.renderers if rh.match_for_render(type)] :
119                    ticket_renderer.process_changes(req, None)
120            except Exception, e:
121                self.log.error(e)
122        return handler
Note: See TracBrowser for help on using the repository browser.