You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by tv...@apache.org on 2013/08/08 15:34:28 UTC

[09/50] git commit: [#6441] ticket:398 fixed hyperlinks in tickets imported from trac

[#6441]  ticket:398 fixed hyperlinks in tickets imported from trac


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/b3fea697
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/b3fea697
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/b3fea697

Branch: refs/heads/tv/6458
Commit: b3fea697bf281649e6dc8cd63a878f9cb45859f3
Parents: fff526f
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Fri Jul 19 14:39:19 2013 +0400
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Wed Jul 31 12:21:13 2013 +0000

----------------------------------------------------------------------
 ForgeTracker/forgetracker/import_support.py     | 37 +++++++++++-
 .../forgetracker/tests/functional/data/sf.json  |  6 ++
 .../tests/functional/test_import.py             | 59 ++++++++++++++++++++
 3 files changed, 101 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b3fea697/ForgeTracker/forgetracker/import_support.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/import_support.py b/ForgeTracker/forgetracker/import_support.py
index a94e70c..268f727 100644
--- a/ForgeTracker/forgetracker/import_support.py
+++ b/ForgeTracker/forgetracker/import_support.py
@@ -18,6 +18,7 @@
 #-*- python -*-
 import logging
 import json
+import re
 from datetime import datetime
 from cStringIO import StringIO
 
@@ -211,9 +212,43 @@ class ImportSupport(object):
         ticket.update(remapped)
         return ticket
 
+    def ticket_link(self, m):
+        return '(%s)' % m.groups()[0]
+
+    def get_slug_by_id(self, ticket, comment):
+        comment = int(comment)
+        ticket = TM.Ticket.query.get(app_config_id=c.app.config._id,
+                                     ticket_num=int(ticket))
+        if not ticket:
+            return ''
+        comments = ticket.discussion_thread.post_class().query.find(dict(
+            discussion_id=ticket.discussion_thread.discussion_id,
+            thread_id=ticket.discussion_thread._id,
+            status={'$in': ['ok', 'pending']})).sort('timestamp')
+
+        if comment <= comments.count():
+            return comments.all()[comment-1].slug
+
+    def comment_link(self, m):
+        ticket, comment = m.groups()
+        return '(%s#%s)' % (ticket, self.get_slug_by_id(ticket, comment))
+
+    def brackets_escaping(self, m):
+        return '[%s]' % m.groups()[0]
+
+    def link_processing(self, text):
+        comment_pattern = re.compile('\(\S*/(\d+)#comment:(\d+)\)')
+        ticket_pattern = re.compile('(?<=\])\(\S*ticket/(\d+)\)')
+        brackets_pattern = re.compile('\[\[(.*)\]\]')
+
+        text = comment_pattern.sub(self.comment_link, text.replace('\n', ''))
+        text = ticket_pattern.sub(self.ticket_link, text)
+        text = brackets_pattern.sub(self.brackets_escaping, text)
+        return text
+
     def make_comment(self, thread, comment_dict):
         ts = self.parse_date(comment_dict['date'])
-        comment = thread.post(text=comment_dict['comment'], timestamp=ts)
+        comment = thread.post(text=self.link_processing(comment_dict['comment']), timestamp=ts)
         comment.author_id = self.get_user_id(comment_dict['submitter'])
         comment.import_id = c.api_token.api_key
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b3fea697/ForgeTracker/forgetracker/tests/functional/data/sf.json
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tests/functional/data/sf.json b/ForgeTracker/forgetracker/tests/functional/data/sf.json
index 58e322c..5a11379 100644
--- a/ForgeTracker/forgetracker/tests/functional/data/sf.json
+++ b/ForgeTracker/forgetracker/tests/functional/data/sf.json
@@ -41,6 +41,12 @@
               "comment": "  * **status** changed from _accepted_ to _closed_\n\n  * **resolution** set to _fixed_\n\nHello,\n\nThis issue is should be resolved with the site redesign.\n\nRegards, Chris Tsai, SourceForge.net Support\n\n", 
               "date": "2009-07-20T15:44:32Z", 
               "submitter": "ctsai"
+            },
+            {
+              "class": "COMMENT",
+              "comment": "test link [[2496]](http://testlink.com)  test ticket ([#201](http://sourceforge.net/apps/trac/sourceforge/ticket/201)) \n [test comment](http://sourceforge.net/apps/trac/sourceforge/ticket/204#comment:1)",
+              "date": "2009-07-21T15:44:32Z",
+              "submitter": "ctsai"
             }
           ], 
           "date": "2009-04-13T08:49:13Z", 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b3fea697/ForgeTracker/forgetracker/tests/functional/test_import.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tests/functional/test_import.py b/ForgeTracker/forgetracker/tests/functional/test_import.py
index 06fde25..202c757 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_import.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_import.py
@@ -24,10 +24,13 @@ from nose.tools import assert_equal
 
 import ming
 from pylons import app_globals as g
+from pylons import tmpl_context as c
 
 from allura import model as M
 from alluratest.controller import TestRestApiBase
 from allura.tests import decorators as td
+from forgetracker import model as TM
+from forgetracker.import_support import ImportSupport
 
 class TestImportController(TestRestApiBase):
 
@@ -164,3 +167,59 @@ class TestImportController(TestRestApiBase):
         assert ticket_json['summary'] in r
         r = self.app.get('/p/test/bugs/')
         assert ticket_json['summary'] in r
+
+    @td.with_tracker
+    def test_link_processing(self):
+        import_support = ImportSupport()
+        result = import_support.link_processing('''test link [[2496]](http://testlink.com)
+                                       test ticket ([#201](http://sourceforge.net/apps/trac/sourceforge/ticket/201))
+                                       [test comment](http://sourceforge.net/apps/trac/sourceforge/ticket/204#comment:1)''')
+
+        assert "test link [2496](http://testlink.com)" in result
+        assert '[test comment](204#)' in result
+        assert 'test link [2496](http://testlink.com)' in result
+        assert 'test ticket ([#201](201))' in result
+
+    @td.with_tracker
+    def test_links(self):
+        api_ticket = M.ApiTicket(user_id=self.user._id, capabilities={'import': ['Projects','test']},
+                                 expires=datetime.utcnow() + timedelta(days=1))
+        ming.orm.session(api_ticket).flush()
+        self.set_api_token(api_ticket)
+
+        doc_text = open(os.path.dirname(__file__) + '/data/sf.json').read()
+        self.api_post('/rest/p/test/bugs/perform_import',
+                      doc=doc_text, options='{"user_map": {"hinojosa4": "test-admin", "ma_boehm": "test-user"}}')
+
+        r = self.app.get('/p/test/bugs/204/')
+        ticket = TM.Ticket.query.get(app_config_id=c.app.config._id,
+                                    ticket_num=204)
+        slug = ticket.discussion_thread.post_class().query.find(dict(
+            discussion_id=ticket.discussion_thread.discussion_id,
+            thread_id=ticket.discussion_thread._id,
+            status={'$in': ['ok', 'pending']})).sort('timestamp').all()[0].slug
+
+        assert '[test comment](204#%s)' % slug in r
+        assert 'test link [2496](http://testlink.com)' in r
+        assert 'test ticket ([#201](201))' in r
+
+    @td.with_tracker
+    def test_slug(self):
+        api_ticket = M.ApiTicket(user_id=self.user._id, capabilities={'import': ['Projects','test']},
+                                 expires=datetime.utcnow() + timedelta(days=1))
+        ming.orm.session(api_ticket).flush()
+        self.set_api_token(api_ticket)
+
+        doc_text = open(os.path.dirname(__file__) + '/data/sf.json').read()
+        self.api_post('/rest/p/test/bugs/perform_import',
+                      doc=doc_text, options='{"user_map": {"hinojosa4": "test-admin", "ma_boehm": "test-user"}}')
+        ticket = TM.Ticket.query.get(app_config_id=c.app.config._id,
+                                    ticket_num=204)
+        comments = ticket.discussion_thread.post_class().query.find(dict(
+            discussion_id=ticket.discussion_thread.discussion_id,
+            thread_id=ticket.discussion_thread._id,
+            status={'$in': ['ok', 'pending']})).sort('timestamp').all()
+
+        import_support = ImportSupport()
+        assert_equal(import_support.get_slug_by_id('204', '1'), comments[0].slug)
+        assert_equal(import_support.get_slug_by_id('204', '2'), comments[1].slug)