You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2013/08/28 19:12:45 UTC
[1/2] git commit: [#6541] Added import_id for GC tracker importer
Updated Branches:
refs/heads/cj/6541 [created] 5aed1036c
[#6541] Added import_id for GC tracker importer
Signed-off-by: Cory Johns <cj...@slashdotmedia.com>
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/1c3c72cd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/1c3c72cd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/1c3c72cd
Branch: refs/heads/cj/6541
Commit: 1c3c72cd513c43654571b0da4342ddfe84b2def2
Parents: 09f0290
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Mon Aug 26 21:48:36 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Aug 28 17:11:11 2013 +0000
----------------------------------------------------------------------
ForgeImporters/forgeimporters/google/tracker.py | 4 +++-
.../forgeimporters/tests/google/functional/test_tracker.py | 6 ++++++
ForgeImporters/forgeimporters/tests/google/test_tracker.py | 1 +
3 files changed, 10 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1c3c72cd/ForgeImporters/forgeimporters/google/tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/tracker.py b/ForgeImporters/forgeimporters/google/tracker.py
index 8b1747f..1059ec7 100644
--- a/ForgeImporters/forgeimporters/google/tracker.py
+++ b/ForgeImporters/forgeimporters/google/tracker.py
@@ -55,6 +55,7 @@ class GoogleCodeTrackerImporter(ToolImporter):
EnableVoting=True,
open_status_names='New Accepted Started',
closed_status_names='Fixed Verified Invalid Duplicate WontFix Done',
+ import_id='%s/%s/issues' % (self.source, project_name),
)
ThreadLocalORMSession.flush_all()
try:
@@ -65,7 +66,8 @@ class GoogleCodeTrackerImporter(ToolImporter):
ticket = TM.Ticket(
app_config_id=app.config._id,
custom_fields=dict(),
- ticket_num=ticket_num)
+ ticket_num=ticket_num,
+ import_id='%s/%s' % (app.config.options.import_id, ticket_num))
self.process_fields(ticket, issue)
self.process_labels(ticket, issue)
self.process_comments(ticket, issue)
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1c3c72cd/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py b/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
index 2e5f542..6ab612e 100644
--- a/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
@@ -139,6 +139,12 @@ class TestGCTrackerImporter(TestCase):
self.assertEqual(ticket.labels, ['Performance', 'Security'])
self.assertEqual(ticket.votes_up, 1)
+ def test_import_id(self):
+ ticket = self._make_ticket(self.test_issue, issue_id=6)
+ self.assertEqual(ticket.app.config.options.import_id, 'Google Code/test-issue-project/issues')
+ self.assertEqual(ticket.ticket_num, 6)
+ self.assertEqual(ticket.import_id, 'Google Code/test-issue-project/issues/6')
+
@skipif(module_not_available('html2text'))
def test_html2text_escaping(self):
ticket = self._make_ticket(self.test_issue)
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1c3c72cd/ForgeImporters/forgeimporters/tests/google/test_tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/tests/google/test_tracker.py b/ForgeImporters/forgeimporters/tests/google/test_tracker.py
index 4a7c28f..9431fe3 100644
--- a/ForgeImporters/forgeimporters/tests/google/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/google/test_tracker.py
@@ -49,6 +49,7 @@ class TestTrackerImporter(TestCase):
EnableVoting=True,
open_status_names='New Accepted Started',
closed_status_names='Fixed Verified Invalid Duplicate WontFix Done',
+ import_id='Google Code/project_name/issues',
)
gpe.iter_issues.assert_called_once_with('project_name')
self.assertEqual(importer.process_fields.call_args_list, [
[2/2] git commit: [#6541] Refactored import_id and ImportIdConverter
Posted by jo...@apache.org.
[#6541] Refactored import_id and ImportIdConverter
Made default import_id implementation use a dict to
record source and other info for use with multiple importers.
Requires Ming 0.3.9 (from 0.3.x branch) for MIM bug fixes for
tests to pass.
Signed-off-by: Cory Johns <cj...@slashdotmedia.com>
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/5aed1036
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/5aed1036
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/5aed1036
Branch: refs/heads/cj/6541
Commit: 5aed1036c1efe7bf11b15f910a449c65b7cbd419
Parents: 1c3c72c
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Wed Aug 28 16:31:26 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Aug 28 17:11:12 2013 +0000
----------------------------------------------------------------------
Allura/allura/lib/plugin.py | 32 ++++++++++++++++++++
Allura/allura/model/artifact.py | 7 +++--
ForgeImporters/forgeimporters/google/tracker.py | 13 +++++---
.../tests/google/functional/test_tracker.py | 11 +++++--
.../forgeimporters/tests/google/test_tracker.py | 11 ++++++-
ForgeTracker/forgetracker/model/ticket.py | 2 +-
ForgeTracker/forgetracker/plugins.py | 25 ---------------
.../forgetracker/tests/functional/test_root.py | 2 +-
ForgeTracker/forgetracker/tracker_main.py | 12 +++++---
requirements-common.txt | 2 +-
10 files changed, 76 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5aed1036/Allura/allura/lib/plugin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index f600363..3376034 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -947,3 +947,35 @@ class AdminExtension(object):
:rtype: ``None``
"""
pass
+
+class ImportIdConverter(object):
+ '''
+ An interface to convert to and from import_id values for indexing,
+ searching, or displaying.
+
+ To provide a new converter, expose an entry point in setup.py:
+
+ [allura.tickets.import_id_converter]
+ mysource = foo.bar:SourceIdConverter
+
+ Then in your .ini file, set tickets.import_id_converter=mysource
+ '''
+
+ @classmethod
+ def get(cls):
+ converter = config.get('import_id_converter')
+ if converter:
+ return g.entry_points['allura.import_id_converter'][converter]()
+ return cls()
+
+ def simplify(self, import_id):
+ if hasattr(import_id, 'get'):
+ return import_id.get('source_id')
+ return None
+
+ def expand(self, source_id, app_instance):
+ import_id = {
+ 'source_id': source_id,
+ }
+ import_id.update(app_instance.config.options.get('import_id', {}))
+ return import_id
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5aed1036/Allura/allura/model/artifact.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/artifact.py b/Allura/allura/model/artifact.py
index 294c3d0..46c4b01 100644
--- a/Allura/allura/model/artifact.py
+++ b/Allura/allura/model/artifact.py
@@ -83,8 +83,11 @@ class Artifact(MappedClass):
references = FieldProperty(S.Deprecated)
backreferences = FieldProperty(S.Deprecated)
app_config = RelationProperty('AppConfig')
- # Not null if artifact originated from external import, then API ticket id
- import_id = FieldProperty(str, if_missing=None)
+ # Not null if artifact originated from external import. The import ID is
+ # implementation specific, but should probably be an object indicating
+ # the source, original ID, and any other info needed to identify where
+ # the artifact came from. But if you only have one source, a str might do.
+ import_id = FieldProperty(None, if_missing=None)
deleted=FieldProperty(bool, if_missing=False)
def __json__(self):
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5aed1036/ForgeImporters/forgeimporters/google/tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/tracker.py b/ForgeImporters/forgeimporters/google/tracker.py
index 1059ec7..5ead4b0 100644
--- a/ForgeImporters/forgeimporters/google/tracker.py
+++ b/ForgeImporters/forgeimporters/google/tracker.py
@@ -24,11 +24,12 @@ from ming.orm import session, ThreadLocalORMSession
from allura import model as M
from allura.lib import helpers as h
+from allura.lib.plugin import ImportIdConverter
from forgetracker.tracker_main import ForgeTrackerApp
from forgetracker import model as TM
-from ..base import ToolImporter
-from . import GoogleCodeProjectExtractor
+from forgeimporters.base import ToolImporter
+from forgeimporters.google import GoogleCodeProjectExtractor
class GoogleCodeTrackerImporter(ToolImporter):
@@ -51,11 +52,15 @@ class GoogleCodeTrackerImporter(ToolImporter):
def import_tool(self, project, user, project_name, mount_point=None,
mount_label=None, **kw):
+ import_id_converter = ImportIdConverter.get()
app = project.install_app('tickets', mount_point, mount_label,
EnableVoting=True,
open_status_names='New Accepted Started',
closed_status_names='Fixed Verified Invalid Duplicate WontFix Done',
- import_id='%s/%s/issues' % (self.source, project_name),
+ import_id={
+ 'source': self.source,
+ 'project_name': project_name,
+ },
)
ThreadLocalORMSession.flush_all()
try:
@@ -67,7 +72,7 @@ class GoogleCodeTrackerImporter(ToolImporter):
app_config_id=app.config._id,
custom_fields=dict(),
ticket_num=ticket_num,
- import_id='%s/%s' % (app.config.options.import_id, ticket_num))
+ import_id=import_id_converter.expand(ticket_num, app))
self.process_fields(ticket, issue)
self.process_labels(ticket, issue)
self.process_comments(ticket, issue)
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5aed1036/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py b/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
index 6ab612e..d77f92d 100644
--- a/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
@@ -141,9 +141,16 @@ class TestGCTrackerImporter(TestCase):
def test_import_id(self):
ticket = self._make_ticket(self.test_issue, issue_id=6)
- self.assertEqual(ticket.app.config.options.import_id, 'Google Code/test-issue-project/issues')
+ self.assertEqual(ticket.app.config.options.import_id, {
+ 'source': 'Google Code',
+ 'project_name': 'test-issue-project',
+ })
self.assertEqual(ticket.ticket_num, 6)
- self.assertEqual(ticket.import_id, 'Google Code/test-issue-project/issues/6')
+ self.assertEqual(ticket.import_id, {
+ 'source': 'Google Code',
+ 'project_name': 'test-issue-project',
+ 'source_id': 6,
+ })
@skipif(module_not_available('html2text'))
def test_html2text_escaping(self):
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5aed1036/ForgeImporters/forgeimporters/tests/google/test_tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/tests/google/test_tracker.py b/ForgeImporters/forgeimporters/tests/google/test_tracker.py
index 9431fe3..484e5fa 100644
--- a/ForgeImporters/forgeimporters/tests/google/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/google/test_tracker.py
@@ -39,6 +39,12 @@ class TestTrackerImporter(TestCase):
importer.postprocess_custom_fields = mock.Mock()
project, user = mock.Mock(), mock.Mock()
app = project.install_app.return_value
+ app.config.options = {
+ 'import_id': {
+ 'source': 'Google Code',
+ 'project_name': 'project_name',
+ },
+ }
issues = gpe.iter_issues.return_value = [(50, mock.Mock()), (100, mock.Mock())]
tickets = TM.Ticket.side_effect = [mock.Mock(), mock.Mock()]
@@ -49,7 +55,10 @@ class TestTrackerImporter(TestCase):
EnableVoting=True,
open_status_names='New Accepted Started',
closed_status_names='Fixed Verified Invalid Duplicate WontFix Done',
- import_id='Google Code/project_name/issues',
+ import_id={
+ 'source': 'Google Code',
+ 'project_name': 'project_name',
+ }
)
gpe.iter_issues.assert_called_once_with('project_name')
self.assertEqual(importer.process_fields.call_args_list, [
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5aed1036/ForgeTracker/forgetracker/model/ticket.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/model/ticket.py b/ForgeTracker/forgetracker/model/ticket.py
index d16039e..1d4aeb2 100644
--- a/ForgeTracker/forgetracker/model/ticket.py
+++ b/ForgeTracker/forgetracker/model/ticket.py
@@ -47,9 +47,9 @@ from allura.lib import security
from allura.lib.search import search_artifact, SearchError
from allura.lib import utils
from allura.lib import helpers as h
+from allura.lib.plugin import ImportIdConverter
from allura.tasks import mail_tasks
-from forgetracker.plugins import ImportIdConverter
log = logging.getLogger(__name__)
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5aed1036/ForgeTracker/forgetracker/plugins.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/plugins.py b/ForgeTracker/forgetracker/plugins.py
index a32dcfc..3afbca2 100644
--- a/ForgeTracker/forgetracker/plugins.py
+++ b/ForgeTracker/forgetracker/plugins.py
@@ -22,28 +22,3 @@ from pylons import app_globals as g
log = logging.getLogger(__name__)
-
-class ImportIdConverter(object):
- '''
- An interface to provide authentication services for Allura.
-
- To provide a new converter, expose an entry point in setup.py:
-
- [allura.tickets.import_id_converter]
- mylegacy = foo.bar:LegacyConverter
-
- Then in your .ini file, set tickets.import_id_converter=mylegacy
- '''
-
- @classmethod
- def get(cls):
- converter = config.get('tickets.import_id_converter')
- if converter:
- return g.entry_points['allura.tickets.import_id_converter'][converter]()
- return cls()
-
- def simplify(self, import_id):
- return import_id
-
- def expand(self, url_part, app_instance):
- return url_part
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5aed1036/ForgeTracker/forgetracker/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tests/functional/test_root.py b/ForgeTracker/forgetracker/tests/functional/test_root.py
index a78abd9..4a78c29 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1573,7 +1573,7 @@ class TestFunctionalController(TrackerTestController):
def test_imported_tickets_redirect(self):
self.new_ticket(summary='Imported ticket')
ticket = tm.Ticket.query.get(ticket_num=1)
- ticket.import_id = '42000'
+ ticket.import_id = {'source_id': '42000'}
ThreadLocalORMSession.flush_all()
# expect permanent redirect to /p/test/bugs/1/
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5aed1036/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index c8e728c..ed30c59 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -58,6 +58,7 @@ from allura.lib import validators as V
from allura.lib.widgets import form_fields as ffw
from allura.lib.widgets.subscriptions import SubscribeForm
from allura.lib.zarkov_helpers import zero_fill_zarkov_result
+from allura.lib.plugin import ImportIdConverter
from allura.controllers import AppDiscussionController, AppDiscussionRestController
from allura.controllers import attachments as ac
from allura.controllers import BaseController
@@ -75,7 +76,6 @@ from forgetracker.widgets.bin_form import BinForm
from forgetracker.widgets.ticket_search import TicketSearchResults, MassEdit, MassEditForm, MassMoveForm, SearchHelp
from forgetracker.widgets.admin_custom_fields import TrackerFieldAdmin, TrackerFieldDisplay
from forgetracker.import_support import ImportSupport
-from forgetracker.plugins import ImportIdConverter
log = logging.getLogger(__name__)
@@ -1195,11 +1195,15 @@ class TicketController(BaseController, FeedController):
self.ticket = TM.Ticket.query.get(app_config_id=c.app.config._id,
ticket_num=self.ticket_num)
if self.ticket is None:
- self.ticket = TM.Ticket.query.get(
- app_config_id=c.app.config._id,
- import_id=str(ImportIdConverter.get().expand(ticket_num, c.app)))
+ query = {'app_config_id': c.app.config._id}
+ import_id = ImportIdConverter.get().expand(ticket_num, c.app)
+ if import_id:
+ query.update({'import_id.%s' % k: v for k,v in import_id.iteritems()})
+ self.ticket = TM.Ticket.query.get(**query)
if self.ticket is not None:
utils.permanent_redirect(self.ticket.url())
+ else:
+ raise exc.HTTPNotFound('Ticket #%s does not exist.' % ticket_num)
self.attachment = AttachmentsController(self.ticket)
# self.comments = CommentController(self.ticket)
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5aed1036/requirements-common.txt
----------------------------------------------------------------------
diff --git a/requirements-common.txt b/requirements-common.txt
index 5e261a0..5e4d6cc 100644
--- a/requirements-common.txt
+++ b/requirements-common.txt
@@ -21,7 +21,7 @@ httplib2==0.7.4
iso8601==0.1.4
Jinja2==2.6
Markdown==2.2.0
-Ming==0.3.7
+Ming==0.3.9
oauth2==1.5.170
# tg2 dep PasteDeploy must specified before TurboGears2, to avoid a version/allow-hosts problem
Paste==1.7.5.1