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/09/17 15:49:17 UTC
git commit: [#6612] Allow direct user-mapping for SF Trac imports
Updated Branches:
refs/heads/tv/6612 [created] ea582e6df
[#6612] Allow direct user-mapping for SF Trac imports
Signed-off-by: Tim Van Steenburgh <tv...@gmail.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/ea582e6d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/ea582e6d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/ea582e6d
Branch: refs/heads/tv/6612
Commit: ea582e6dfaa0edacc8efe255e26890d64eae802c
Parents: a1779fa
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Tue Sep 17 13:48:57 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Tue Sep 17 13:48:57 2013 +0000
----------------------------------------------------------------------
.../forgeimporters/trac/tests/test_tickets.py | 19 ++++++-----
ForgeImporters/forgeimporters/trac/tickets.py | 35 +++++++++++++++-----
ForgeTracker/forgetracker/import_support.py | 21 ++++++++----
3 files changed, 51 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/ea582e6d/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/trac/tests/test_tickets.py b/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
index b3d2fcb..1f5a8e7 100644
--- a/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
+++ b/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
@@ -76,8 +76,10 @@ class TestTracTicketImporter(TestCase):
expires=now + timedelta(minutes=60))
api_client = ApiClient.return_value
import_tracker.assert_called_once_with(
- api_client, 'myproject', 'bugs',
- {"user_map": user_map}, '[]',
+ api_client, 'myproject', 'bugs', {
+ "user_map": user_map,
+ "usernames_match": False,
+ }, '[]',
validate=False)
AuditLog.log.assert_called_once_with(
'import tool bugs from http://example.com/trac/url/',
@@ -106,11 +108,12 @@ class TestTracTicketImporter(TestCase):
class TestTracTicketImportController(TestController, TestCase):
- def setUp(self):
+ @patch('forgeimporters.trac.tickets.import_tool')
+ def setUp(self, import_tool):
"""Mount Trac import controller on the Tracker admin controller"""
super(TestTracTicketImportController, self).setUp()
from forgetracker.tracker_main import TrackerAdminController
- TrackerAdminController._importer = TracTicketImportController()
+ self.importer = TrackerAdminController._importer = TracTicketImportController()
@with_tracker
def test_index(self):
@@ -120,8 +123,8 @@ class TestTracTicketImportController(TestController, TestCase):
self.assertIsNotNone(r.html.find(attrs=dict(name="mount_point")))
@with_tracker
- @patch('forgeimporters.trac.tickets.import_tool')
- def test_create(self, import_tool):
+ def test_create(self):
+ import_tool = self.importer.task
params = dict(trac_url='http://example.com/trac/url',
mount_label='mylabel',
mount_point='mymount',
@@ -136,8 +139,8 @@ class TestTracTicketImportController(TestController, TestCase):
self.assertEqual(u'http://example.com/trac/url', import_tool.post.call_args[1]['trac_url'])
@with_tracker
- @patch('forgeimporters.trac.tickets.import_tool')
- def test_create_limit(self, import_tool):
+ def test_create_limit(self):
+ import_tool = self.importer.task
project = M.Project.query.get(shortname='test')
project.set_tool_data('TracTicketImporter', pending=1)
ThreadLocalORMSession.flush_all()
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/ea582e6d/ForgeImporters/forgeimporters/trac/tickets.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/trac/tickets.py b/ForgeImporters/forgeimporters/trac/tickets.py
index cafd403..fadcf14 100644
--- a/ForgeImporters/forgeimporters/trac/tickets.py
+++ b/ForgeImporters/forgeimporters/trac/tickets.py
@@ -73,6 +73,7 @@ class TracTicketImportForm(ToolImportForm):
class TracTicketImportController(BaseController):
def __init__(self):
self.importer = TracTicketImporter()
+ self.task = import_tool
@property
def target_app(self):
@@ -89,8 +90,8 @@ class TracTicketImportController(BaseController):
@require_post()
@validate(TracTicketImportForm(ForgeTrackerApp), error_handler=index)
def create(self, trac_url, mount_point, mount_label, user_map=None, **kw):
- if TracTicketImporter().enforce_limit(c.project):
- import_tool.post(
+ if self.importer.enforce_limit(c.project):
+ self.task.post(
mount_point=mount_point,
mount_label=mount_label,
trac_url=trac_url,
@@ -136,18 +137,34 @@ class TracTicketImporter(ToolImporter):
session(api_ticket).flush(api_ticket)
cli = AlluraImportApiClient(config['base_url'], api_ticket.api_key,
api_ticket.secret_key, verbose=True)
- import_tracker(cli, project.shortname, mount_point,
- {'user_map': json.loads(user_map) if user_map else {}},
+ import_tracker(cli, project.shortname, mount_point, {
+ 'user_map': json.loads(user_map) if user_map else {},
+ 'usernames_match': self.usernames_match(trac_url),
+ },
export_string, validate=False)
AuditLog.log(
'import tool %s from %s' % (
- app.config.options.mount_point,
- trac_url,
- ),
+ app.config.options.mount_point,
+ trac_url,
+ ),
project=project, user=user, url=app.url,
- )
+ )
g.post_event('project_updated')
return app
- except Exception as e:
+ except Exception:
h.make_app_admin_only(app)
raise
+
+ def usernames_match(self, trac_url):
+ """Return True if the usernames in the source Trac match the usernames
+ in the destination Allura instance.
+
+ If this is True, Trac usernames will be mapped to their Allura
+ counterparts regardless of whether a user_map file is supplied.
+
+ If this is False, any Trac username not present in the user_map file
+ (or if no file is supplied) will be assumed an unknown or non-existent
+ user in the Allura instance.
+
+ """
+ return False
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/ea582e6d/ForgeTracker/forgetracker/import_support.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/import_support.py b/ForgeTracker/forgetracker/import_support.py
index 9637ebc..92a3d51 100644
--- a/ForgeTracker/forgetracker/import_support.py
+++ b/ForgeTracker/forgetracker/import_support.py
@@ -107,7 +107,7 @@ class ImportSupport(object):
self.FIELD_MAP = {
'assigned_to': ('assigned_to_id', self.get_user_id),
'class': None,
- 'date': ('created_date', self.parse_date),
+ 'date': ('created_date', self.parse_date),
'date_updated': ('mod_date', self.parse_date),
'description': True,
'id': None,
@@ -142,11 +142,18 @@ class ImportSupport(object):
return datetime.strptime(date_string, '%Y-%m-%dT%H:%M:%SZ')
def get_user_id(self, username):
- username = self.options['user_map'].get(username)
- if not username:
- return None
- u = M.User.by_username(username)
- return u._id if u else None
+ def _get_user_id(username):
+ u = M.User.by_username(username)
+ return u._id if u else None
+
+ if self.options.get('usernames_match'):
+ return _get_user_id(username)
+
+ mapped_username = self.options['user_map'].get(username)
+ if mapped_username:
+ return _get_user_id(mapped_username)
+
+ return None
def check_custom_field(self, field, value):
field = c.app.globals.get_custom_field(field)
@@ -349,7 +356,7 @@ class ImportSupport(object):
unknown_users = self.find_unknown_users(users)
unknown_users = sorted(list(unknown_users))
if unknown_users:
- self.warnings.append('''Document references unknown users. You should provide
+ self.warnings.append('''Document references unknown users. You should provide
option user_map to avoid losing username information. Unknown users: %s''' % unknown_users)
return {'status': True, 'errors': self.errors, 'warnings': self.warnings}