source: worklogplugin/trunk/worklog/ticket_filter.py

Last change on this file was 15698, checked in by Ryan J Ollos, 7 years ago

1.0dev: Add file headers

Refs #12845.

  • Property svn:eol-style set to native
File size: 6.4 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# Copyright (c) 2007-2012 Colin Guthrie <trac@colin.guthr.ie>
4# Copyright (c) 2011-2016 Ryan J Ollos <ryan.j.ollos@gmail.com>
5# All rights reserved.
6#
7# This software is licensed as described in the file COPYING, which
8# you should have received as part of this distribution.
9
10import re
11from datetime import datetime
12
13from genshi import XML
14from genshi.filters.transform import Transformer
15from trac.core import Component, implements
16from trac.util.datefmt import pretty_timedelta
17from trac.web.api import ITemplateStreamFilter
18from trac.web.chrome import Chrome, add_stylesheet, add_script
19from trac.wiki.formatter import wiki_to_oneliner
20
21from manager import WorkLogManager
22
23
24class WorkLogTicketAddon(Component):
25    implements(ITemplateStreamFilter)
26
27    def __init__(self):
28        pass
29
30    def get_task_markup(self, req, ticket, task):
31        if not task:
32            return ''
33
34        ticket_text = 'ticket #' + str(task['ticket'])
35        if task['ticket'] == ticket:
36            ticket_text = 'this ticket'
37        dt = datetime.fromtimestamp(task['starttime'])
38        timedelta = pretty_timedelta(dt, None)
39
40        return '<li>%s</li>' \
41               % wiki_to_oneliner('You have been working on %s for %s'
42                                  % (ticket_text, timedelta),
43                                  self.env, req=req)
44
45    def get_ticket_markup(self, who, since):
46        dt = datetime.fromtimestamp(since)
47        timedelta = pretty_timedelta(dt, None)
48        return '<li>%s has been working on this ticket for %s</li>' \
49               % (who, timedelta)
50
51    def get_ticket_markup_noone(self):
52        return '<li>Nobody is working on this ticket</li>'
53
54    def get_button_markup(self, req, ticket, stop=False):
55        if stop:
56            action = 'stop'
57            label = 'Stop Work'
58        else:
59            action = 'start'
60            label = 'Start Work'
61
62        return '''
63            <form id="worklogTicketForm" method="post" action="%s" class="inlinebuttons" onsubmit="return tracWorklog.%s();">
64              <input type="hidden" name="source_url" value="%s" />
65              <input type="hidden" name="ticket" value="%s" />
66              <input type="submit" name="%swork" value="%s" />
67            </form>
68            <div id="worklogPopup" class="jqmWindow">
69              <div style="text-align: right;">
70                <span style="text-decoration: underline; color: blue; cursor: pointer;" class="jqmClose">close</span>
71              </div>
72              <form method="post" action="%s" class="inlinebuttons">
73                <input type="hidden" name="source_url" value="%s" />
74                <input type="hidden" name="ticket" value="%s" />
75                <input id="worklogStoptime" type="hidden" name="stoptime" value="" />
76                <fieldset>
77                  <legend>Stop work</legend>
78                  <div class="field">
79                    <fieldset class="iefix">
80                      <label for="worklogComment">Optional: Leave a comment about the work you have done...</label>
81                      <p><textarea id="worklogComment" name="comment" class="wikitext" rows="6" cols="60"></textarea></p>
82                    </fieldset>
83                  </div>
84                  <div class="field">
85                    <label>Override end time</label>
86                    <div align="center">
87                      <div style="width: 185px;">
88                        <div id="worklogStopDate"></div>
89                        <br clear="all" />
90                        <div style="text-align: right;">
91                          &nbsp;&nbsp;@&nbsp;<input id="worklogStopTime" type="text" size="6" />
92                        </div>
93                      </div>
94                    </div>
95                  </div>
96                  <div style="text-align: right;"><input id="worklogSubmit" type="submit" name="%swork" value="%s" /></div>
97                </fieldset>
98              </form>
99            </div>
100            ''' % (req.href.worklog(), action,
101                   req.href.ticket(ticket),
102                   ticket,
103                   action, label,
104                   req.href.worklog(),
105                   req.href.ticket(ticket),
106                   ticket,
107                   action, label)
108
109    # ITemplateStreamFilter methods
110
111    def filter_stream(self, req, method, filename, stream, data):
112        match = re.match(r'/ticket/([0-9]+)$', req.path_info)
113        if match and req.perm.has_permission('WORK_LOG'):
114            ticket = int(match.group(1))
115            add_stylesheet(req, "worklog/worklogplugin.css")
116
117            add_script(req, 'worklog/jqModal.js')
118            add_stylesheet(req, 'worklog/jqModal.css')
119
120            Chrome(self.env).add_jquery_ui(req)
121
122            add_script(req, 'worklog/jquery.mousewheel.pack.js')
123            add_script(req, 'worklog/jquery.timeentry.pack.js')
124
125            add_script(req, 'worklog/tracWorklog.js')
126
127            mgr = WorkLogManager(self.env, self.config, req.authname)
128            task_markup = ''
129            if req.authname != 'anonymous':
130                task = mgr.get_active_task()
131                if task:
132                    task_markup = self.get_task_markup(req, ticket, task)
133
134            who, since = mgr.who_is_working_on(ticket)
135            ticket_markup = ''
136            if who:
137                # If who == req.authname then we will have text from above.
138                if who != req.authname:
139                    ticket_markup = self.get_ticket_markup(who, since)
140            else:
141                ticket_markup = self.get_ticket_markup_noone()
142
143            button_markup = ''
144            if req.authname != 'anonymous':
145                if mgr.can_work_on(ticket):
146                    # Display a "Work on Link" button.
147                    button_markup = self.get_button_markup(req, ticket)
148                elif task and task['ticket'] == ticket:
149                    # We are currently working on this, display stop button
150                    button_markup = self.get_button_markup(req, ticket, True)
151
152            # User's current task information
153            html = XML('''
154              <fieldset class="workloginfo">
155                <legend>Work Log</legend>
156                %s
157                <ul>
158                  %s
159                  %s
160                </ul>
161              </fieldset>
162              ''' % (button_markup, task_markup, ticket_markup))
163            stream |= Transformer('.//div[@id="ticket"]').before(html)
164        return stream
Note: See TracBrowser for help on using the repository browser.