Changeset 16171


Ignore:
Timestamp:
Dec 30, 2016, 1:24:52 AM (7 years ago)
Author:
Jun Omae
Message:

WikiCreateTicketPlugin: support Trac 1.2 and add unit tests (closes #13019)

Location:
wikicreateticketplugin/0.12
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • wikicreateticketplugin/0.12/setup.py

    r9349 r16171  
     1#!/usr/bin/env python
     2# -*- coding: utf-8 -*-
     3
    14from setuptools import setup
    25
    36setup(
    47    name='WikiCreateTicket',
    5     version='0.1',
     8    version='0.1.1',
    69    packages=['wikicreateticket'],
    7     package_data={'wikicreateticket' : [] },
     10    package_data={'wikicreateticket' : []},
     11    test_suite='wikicreateticket.tests.suite',
    812    author='Yoshiyuki Sugimoto',
    9     maintainer = 'Yoshiyuki Sugimoto',
    10     maintainer_email = 's.yosiyuki@gmail.com',
     13    maintainer='Yoshiyuki Sugimoto',
     14    maintainer_email='s.yosiyuki@gmail.com',
    1115    license='BSD',
    12     url='http://trac-hacks.org/wiki/WikiCreateTicketPlugin',
     16    url='https://trac-hacks.org/wiki/WikiCreateTicketPlugin',
    1317    description='A plugin to assign new markup to create ticket.',
    1418    entry_points = {'trac.plugins': ['wikicreateticket = wikicreateticket']},
  • wikicreateticketplugin/0.12/wikicreateticket/__init__.py

    r10641 r16171  
     1# -*- coding: utf-8 -*-
     2
    13import re
    2 from trac.core import *
     4from trac.core import Component, implements
    35from trac.wiki import IWikiChangeListener, WikiPage
    46from trac.ticket import Ticket
     
    911    implements(IWikiChangeListener)
    1012
    11     _new_ticket_tag = '#new '
    12     _new_ticket_re = re.compile(r'#new (.*)$')
    13 
    14     def match_request(self, req):
    15         return 'WIKI_MODIFY' in req.perm and 'TICKET_CREATE' in req.perm
     13    _new_ticket_re = re.compile(r'(?P<id>#new)\s+(?P<summary>.+?)\s*$',
     14                                re.UNICODE)
     15    _space_re = re.compile(r'\s', re.UNICODE)
    1616
    1717    def wiki_page_added(self, page):
    18         self.__parse_wiki_and_create_ticket(page, 1)
     18        self._parse_wiki_and_create_ticket(page, 1)
    1919
    2020    def wiki_page_changed(self, page, version, t, comment, author, ipnr):
    21         self.__parse_wiki_and_create_ticket(page, version)
     21        self._parse_wiki_and_create_ticket(page, version)
    2222
    2323    def wiki_page_deleted(self, page):
     
    2727        pass
    2828
    29     def wiki_page_renamed(self, page, old_name): 
     29    def wiki_page_renamed(self, page, old_name):
    3030        pass
    3131
    32     def __parse_wiki_and_create_ticket(self, page, version):
     32    def _parse_wiki_and_create_ticket(self, page, version):
    3333        page = WikiPage(self.env, page.name, version)
    3434
    35         lines = page.text.splitlines()
    36         new_lines = []
     35        lines = page.text.splitlines(True)
     36        for idx, line in enumerate(lines):
     37            match = self._new_ticket_re.search(line)
     38            if match:
     39                tktid = self.__create_new_ticket(page, match.group('summary'))
     40                if tktid:
     41                    lines[idx] = '%s#%d%s' % (line[:match.start('id')],
     42                                              tktid, line[match.end('id'):])
     43                else:
     44                    self.log.error("failed to create ticket from wiki: %s",
     45                                   page.name)
    3746
    38         for line in page.text.splitlines():
    39             matched = self._new_ticket_re.search(line)
    40             if matched:
    41                 ticket_id = self.__create_new_ticket(page, matched.group(1), page.author)
    42                 if ticket_id:
    43                     self.env.log.debug("create ticket from wiki: %s, ticket: %s" % (page.name, ticket_id))
    44                     new_line = line.replace(self._new_ticket_tag, '#%s ' % ticket_id, 1)
    45                 else:
    46                     self.env.log.error("failed to create ticket from wiki: %s" % page.name)
    47                     new_line = line
     47        self._update_wiki(page, ''.join(lines))
    4848
    49             else:
    50                 new_line = line
     49    def _update_wiki(self, page, text):
     50        @self.env.with_transaction()
     51        def fn(db):
     52            cursor = db.cursor()
     53            cursor.execute(
     54                "UPDATE wiki SET text=%s WHERE name=%s AND version=%s",
     55                (text, page.name, page.version))
    5156
    52             new_lines.append(new_line)
    53 
    54         page.text = "\n".join(new_lines)
    55         self.__update_wiki(page)
    56 
    57     def __update_wiki(self, page):
    58         db = self.env.get_db_cnx()
    59         cursor = db.cursor()
    60         page.save
    61         cursor.execute("UPDATE wiki SET text=%s WHERE name=%s AND version=%s",
    62                     (page.text, page.name, page.version))
    63         db.commit()
    64 
    65     def __create_new_ticket(self, page, title, owner):
    66         matched = re.compile(r'^\[(.*)\](.*)').search(title)
    67         if matched:
    68             summary = matched.group(2)
    69             owner = matched.group(1)
     57    def __create_new_ticket(self, page, title):
     58        match = re.match(r'\[(\S+)\]\s*(.*?)\s*\Z', title)
     59        if match:
     60            summary = match.group(2)
     61            owner = match.group(1)
    7062        else:
    7163            summary = title
    7264            owner = None
    73 
    7465        ticket = Ticket(self.env)
    75         ticket.values = {
    76             'status': 'new',
    77             'reporter': page.author,
    78             'summary': summary,
    79             'owner': owner,
    80             'description': "wiki:%s" % page.name,
    81         }
     66        ticket['status'] = 'new'
     67        ticket['reporter'] = page.author
     68        ticket['summary'] = summary
     69        ticket['owner'] = owner
     70        if self._space_re.search(page.name):
     71            description = 'wiki:"%s"' % page.name
     72        else:
     73            description = 'wiki:%s' % page.name
     74        ticket['description'] = description
    8275        return ticket.insert()
Note: See TracChangeset for help on using the changeset viewer.