source: tagsplugin/tags/0.3rc1/tractags/ticket.py

Last change on this file was 1788, checked in by muness, 17 years ago

Get it to work on Python 2.3 on Trac 0.9.4

File size: 3.4 KB
Line 
1from trac.core import *
2from tractags.api import ITaggingSystemProvider, TaggingSystem
3from trac.ticket.query import Query
4from trac.ticket import model
5import re
6
7try:
8    sorted = sorted
9except NameError:
10    def sorted(iterable, cmp=None, key=str, reverse=False):
11        lst = [(key(i), i) for i in iterable]
12        lst.sort()
13        if reverse:
14            lst = reversed(lst)
15        return [i for __, i in lst]
16
17try:
18    set = set
19except:
20    from sets import Set as set
21
22class TicketTaggingSystem(TaggingSystem):
23    _keyword_split = re.compile(r'''[\w.-]+''')
24
25    def __init__(self, env):
26        self.env = env
27
28    def _ticket_tags(self, ticket):
29        return set(self._keyword_split.findall(ticket['keywords']))
30
31    def walk_tagged_names(self, names, tags, predicate):
32        db = self.env.get_db_cnx()
33        cursor = db.cursor()
34        tags = set(tags)
35        names = set(names)
36        args = []
37        sql = "SELECT id, keywords FROM ticket WHERE keywords IS NOT NULL AND keywords != ''"
38        if names:
39            sql += " AND id IN (" + ', '.join(['%s' for n in names]) + ")"
40            args += [unicode(n) for n in names]
41        if tags:
42            sql += " AND (" + ' OR '.join(["keywords LIKE %s" for t in tags]) + ")"
43            args += ['%' + t + '%' for t in tags]
44        sql += " ORDER BY id"
45        cursor.execute(sql, args)
46        for id, ttags in cursor:
47            ticket_tags = set(self._keyword_split.findall(ttags))
48            if not tags or ticket_tags.intersection(tags):
49                if predicate(id, ticket_tags):
50                    yield (id, ticket_tags)
51               
52    def get_name_tags(self, name):
53        db = self.env.get_db_cnx()
54        cursor = db.cursor()
55        cursor.execute("SELECT keywords FROM ticket WHERE id=%s AND keywords IS NOT NULL AND keywords != ''", (name,))
56        for row in cursor:
57            return set(self._keyword_split.findall(row[0]))
58
59    def add_tags(self, req, name, tags):
60        ticket = model.Ticket(self.env, name)
61        ticket_tags = self._ticket_tags(ticket)
62        ticket_tags.update(tags)
63        ticket['keywords'] = ' '.join(sorted(ticket_tags))
64        ticket.save_changes(req.authname, None)
65
66    def replace_tags(self, req, name, tags):
67        ticket = model.Ticket(self.env, name)
68        ticket['keywords'] = ' '.join(sorted(tags))
69        ticket.save_changes(req.authname, None)
70
71    def remove_tags(self, req, name, tags):
72        ticket = model.Ticket(self.env, name)
73        ticket_tags = self._ticket_tags(ticket)
74        ticket_tags.symmetric_difference_update(tags)
75        ticket['keywords'] = ' '.join(sorted(ticket_tags))
76        ticket.save_changes(req.authname, None)
77
78    def remove_all_tags(self, req, name):
79        ticket = model.Ticket(self.env, name)
80        ticket['keywords'] = ''
81        ticket.save_changes(req.authname, None)
82
83    def name_details(self, name):
84        ticket = model.Ticket(self.env, name)
85        href = self.env.href.ticket(name)
86        from trac.wiki.formatter import wiki_to_oneliner
87        return (href, wiki_to_oneliner('#%s' % name, self.env),
88                ticket.exists and ticket['summary'] or '')
89
90class TicketTags(Component):
91    """ Export a ticket tag interface, using the "keywords" field of tickets. """
92    implements(ITaggingSystemProvider)
93
94    def get_tagspaces_provided(self):
95        yield 'ticket'
96
97    def get_tagging_system(self, tagspace):
98        return TicketTaggingSystem(self.env)
99
Note: See TracBrowser for help on using the repository browser.