You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2013/09/09 22:29:12 UTC

[1/9] git commit: [#6541] Refactored import_id and ImportIdConverter

Updated Branches:
  refs/heads/master f19076913 -> 815ef4fbf


[#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/44866429
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/44866429
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/44866429

Branch: refs/heads/master
Commit: 448664290746b2c16fb99c8df1b04434f0296e37
Parents: c3d8491
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Wed Aug 28 16:31:26 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Mon Sep 9 20:27:29 2013 +0000

----------------------------------------------------------------------
 Allura/allura/lib/plugin.py                     | 32 ++++++++++++++++++++
 Allura/allura/model/artifact.py                 |  7 +++--
 ForgeImporters/forgeimporters/google/tracker.py | 11 +++++--
 .../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, 75 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/44866429/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/44866429/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/44866429/ForgeImporters/forgeimporters/google/tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/tracker.py b/ForgeImporters/forgeimporters/google/tracker.py
index eebdae0..58f28d2 100644
--- a/ForgeImporters/forgeimporters/google/tracker.py
+++ b/ForgeImporters/forgeimporters/google/tracker.py
@@ -40,11 +40,12 @@ from tg.decorators import (
 
 from allura.controllers import BaseController
 from allura.lib import helpers as h
+from allura.lib.plugin import ImportIdConverter
 from allura.lib.decorators import require_post, task
 
 from forgetracker.tracker_main import ForgeTrackerApp
 from forgetracker import model as TM
-from . import GoogleCodeProjectExtractor
+from forgeimporters.google import GoogleCodeProjectExtractor
 from forgeimporters.base import (
         ToolImporter,
         ToolImportForm,
@@ -112,11 +113,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:
@@ -128,7 +133,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/44866429/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 0bd97ab..7f504a5 100644
--- a/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
@@ -142,9 +142,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/44866429/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 d2cedc6..05b33ae 100644
--- a/ForgeImporters/forgeimporters/tests/google/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/google/test_tracker.py
@@ -42,6 +42,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()]
 
@@ -52,7 +58,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/44866429/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/44866429/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/44866429/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 0ba4f0b..86ef522 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/44866429/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 8aa29f6..3afdb15 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__)
 
@@ -1196,11 +1196,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/44866429/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


[6/9] git commit: [#6541] Added import_id and AuditLog to Trac ticket importer

Posted by br...@apache.org.
[#6541] Added import_id and AuditLog to Trac ticket 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/4a4ee8f3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/4a4ee8f3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/4a4ee8f3

Branch: refs/heads/master
Commit: 4a4ee8f37b510309d6b62c37424c97a043d37d1a
Parents: 99a09b4
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Wed Aug 28 20:32:05 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Mon Sep 9 20:27:30 2013 +0000

----------------------------------------------------------------------
 .../forgeimporters/trac/tests/test_tickets.py       | 16 ++++++++++++++--
 ForgeImporters/forgeimporters/trac/tickets.py       | 15 +++++++++++++--
 2 files changed, 27 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4a4ee8f3/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 74e1049..2e0c199 100644
--- a/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
+++ b/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
@@ -19,6 +19,8 @@ import json
 from unittest import TestCase
 from mock import Mock, patch
 
+from tg import config
+
 from allura.tests import TestController
 from allura.tests.decorators import with_tracker
 
@@ -31,18 +33,21 @@ from forgeimporters.trac.tickets import (
 class TestTracTicketImporter(TestCase):
     @patch('forgeimporters.trac.tickets.session')
     @patch('forgeimporters.trac.tickets.g')
+    @patch('forgeimporters.trac.tickets.AuditLog')
     @patch('forgeimporters.trac.tickets.import_tracker')
     @patch('forgeimporters.trac.tickets.AlluraImportApiClient')
     @patch('forgeimporters.trac.tickets.datetime')
     @patch('forgeimporters.trac.tickets.ApiTicket')
     @patch('forgeimporters.trac.tickets.TracExport')
-    def test_import_tool(self, TracExport, ApiTicket, dt, ApiClient, import_tracker, g, session):
+    def test_import_tool(self, TracExport, ApiTicket, dt, ApiClient, import_tracker, AuditLog, g, session):
         from datetime import datetime, timedelta
         now = datetime.utcnow()
         dt.utcnow.return_value = now
         user_map = {"orig_user":"new_user"}
         importer = TracTicketImporter()
         app = Mock(name='ForgeTrackerApp')
+        app.config.options.mount_point = 'bugs'
+        app.config.options.get = lambda *a: getattr(app.config.options, *a)
         project = Mock(name='Project', shortname='myproject')
         project.install_app.return_value = app
         user = Mock(name='User', _id='id')
@@ -55,7 +60,11 @@ class TestTracTicketImporter(TestCase):
                     )
         self.assertEqual(res, app)
         project.install_app.assert_called_once_with(
-                'Tickets', mount_point='bugs', mount_label='Bugs')
+                'Tickets', mount_point='bugs', mount_label='Bugs',
+                import_id={
+                        'source': 'Trac',
+                        'trac_url': 'http://example.com/trac/url/',
+                    })
         TracExport.return_value = []
         TracExport.assert_called_once_with('http://example.com/trac/url/')
         ApiTicket.assert_called_once_with(
@@ -67,6 +76,9 @@ class TestTracTicketImporter(TestCase):
                 api_client, 'myproject', 'bugs',
                 {"user_map": user_map}, '[]',
                 validate=False)
+        AuditLog.log.assert_called_once_with(
+                'import tool bugs from http://example.com/trac/url/',
+                project=project, user=user)
         g.post_event.assert_called_once_with('project_updated')
 
     @patch('forgeimporters.trac.tickets.session')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4a4ee8f3/ForgeImporters/forgeimporters/trac/tickets.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/trac/tickets.py b/ForgeImporters/forgeimporters/trac/tickets.py
index 3063d71..e5238e3 100644
--- a/ForgeImporters/forgeimporters/trac/tickets.py
+++ b/ForgeImporters/forgeimporters/trac/tickets.py
@@ -43,7 +43,7 @@ from allura.lib.decorators import require_post, task
 from allura.lib.import_api import AlluraImportApiClient
 from allura.lib import validators as v
 from allura.lib import helpers as h
-from allura.model import ApiTicket
+from allura.model import ApiTicket, AuditLog
 from allura.scripts.trac_export import (
         TracExport,
         DateJSONEncoder,
@@ -117,7 +117,11 @@ class TracTicketImporter(ToolImporter):
                 'Tickets',
                 mount_point=mount_point,
                 mount_label=mount_label or 'Tickets',
-                )
+                import_id={
+                        'source': self.source,
+                        'trac_url': trac_url,
+                    },
+            )
         session(app.config).flush(app.config)
         session(app.globals).flush(app.globals)
         try:
@@ -132,6 +136,13 @@ class TracTicketImporter(ToolImporter):
             import_tracker(cli, project.shortname, mount_point,
                     {'user_map': json.loads(user_map) if user_map else {}},
                     export_string, validate=False)
+            AuditLog.log(
+                'import tool %s from %s' % (
+                        app.config.options.mount_point, 
+                        trac_url, 
+                    ), 
+                project=project, user=user, 
+            ) 
             g.post_event('project_updated')
             return app
         except Exception as e:


[3/9] git commit: [#6541] Revert to exact match on import_id and fix ImportIdConverter docstring

Posted by br...@apache.org.
[#6541] Revert to exact match on import_id and fix ImportIdConverter docstring

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/44b2a366
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/44b2a366
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/44b2a366

Branch: refs/heads/master
Commit: 44b2a36672d086a9175806a91622edcbe231ae1c
Parents: 59a395d
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Fri Sep 6 17:56:55 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Mon Sep 9 20:27:30 2013 +0000

----------------------------------------------------------------------
 Allura/allura/lib/plugin.py               | 4 ++--
 ForgeTracker/forgetracker/tracker_main.py | 9 ++++-----
 2 files changed, 6 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/44b2a366/Allura/allura/lib/plugin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index 3376034..8e24cb2 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -955,10 +955,10 @@ class ImportIdConverter(object):
 
     To provide a new converter, expose an entry point in setup.py:
 
-        [allura.tickets.import_id_converter]
+        [allura.import_id_converter]
         mysource = foo.bar:SourceIdConverter
 
-    Then in your .ini file, set tickets.import_id_converter=mysource
+    Then in your .ini file, set import_id_converter=mysource
     '''
 
     @classmethod

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/44b2a366/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 3afdb15..61f7a99 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -1196,11 +1196,10 @@ 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:
-                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)
+                self.ticket = TM.Ticket.query.get(
+                        app_config_id = c.app.config._id,
+                        import_id = ImportIdConverter.get().expand(ticket_num, c.app),
+                    )
                 if self.ticket is not None:
                     utils.permanent_redirect(self.ticket.url())
                 else:


[5/9] git commit: [#6541] Added audit log on project import

Posted by br...@apache.org.
[#6541] Added audit log on project import

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/99a09b45
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/99a09b45
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/99a09b45

Branch: refs/heads/master
Commit: 99a09b45530617a4668b3f296bc599dda4eb1536
Parents: ad81824
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Wed Aug 28 20:19:13 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Mon Sep 9 20:27:30 2013 +0000

----------------------------------------------------------------------
 ForgeImporters/forgeimporters/base.py           |  2 ++
 .../forgeimporters/tests/test_base.py           | 24 ++++++++++++++++++++
 2 files changed, 26 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/99a09b45/ForgeImporters/forgeimporters/base.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/base.py b/ForgeImporters/forgeimporters/base.py
index e0e9d6f..ffb1650 100644
--- a/ForgeImporters/forgeimporters/base.py
+++ b/ForgeImporters/forgeimporters/base.py
@@ -37,6 +37,7 @@ from allura.lib import helpers as h
 from allura.lib import exceptions
 from allura.lib import validators as v
 from allura.app import SitemapEntry
+from allura import model as M
 
 from paste.deploy.converters import aslist
 
@@ -245,6 +246,7 @@ class ProjectImporter(BaseController):
         self.after_project_create(c.project, **kw)
         for importer_name in kw['tools']:
             import_tool.post(importer_name, **kw)
+        M.AuditLog.log('import project from %s' % self.source)
 
         flash('Welcome to the %s Project System! '
               'Your project data will be imported and should show up here shortly.' % config['site_name'])

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/99a09b45/ForgeImporters/forgeimporters/tests/test_base.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/tests/test_base.py b/ForgeImporters/forgeimporters/tests/test_base.py
index 7de0625..4aefc35 100644
--- a/ForgeImporters/forgeimporters/tests/test_base.py
+++ b/ForgeImporters/forgeimporters/tests/test_base.py
@@ -99,6 +99,30 @@ class TestProjectImporter(TestCase):
         self.assertEqual(pi.tool_importers, {'ep1': eps[0].lv, 'ep3': eps[2].lv})
         iep.assert_called_once_with('allura.importers')
 
+    @mock.patch.object(base, 'redirect')
+    @mock.patch.object(base, 'flash')
+    @mock.patch.object(base, 'import_tool')
+    @mock.patch.object(base, 'M')
+    @mock.patch.object(base, 'c')
+    def test_process(self, c, M, import_tool, flash, redirect):
+        pi = base.ProjectImporter(mock.Mock())
+        pi.source = 'Source'
+        pi.after_project_create = mock.Mock()
+        pi.neighborhood.register_project.return_value.script_name = 'script_name/'
+        kw = {
+                'project_name': 'project_name',
+                'project_shortname': 'shortname',
+                'tools': ['tool'],
+            }
+        with mock.patch.dict(base.config, {'site_name': 'foo'}):
+            pi.process(**kw)
+        pi.neighborhood.register_project.assert_called_once_with('shortname', project_name='project_name')
+        pi.after_project_create.assert_called_once_with(c.project, **kw)
+        import_tool.post.assert_called_once_with('tool', **kw)
+        M.AuditLog.log.assert_called_once_with('import project from Source')
+        self.assertEqual(flash.call_count, 1)
+        redirect.assert_called_once_with('script_name/admin/overview')
+
 
 
 TA1 = mock.Mock(tool_label='foo', tool_description='foo_desc')


[4/9] git commit: [#6541] Added AuditLog on GC tracker import

Posted by br...@apache.org.
[#6541] Added AuditLog on GC tracker import

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/ad81824e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/ad81824e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/ad81824e

Branch: refs/heads/master
Commit: ad81824eb88349296e5c5baa810b42923003d8e6
Parents: 4486642
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Wed Aug 28 19:38:10 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Mon Sep 9 20:27:30 2013 +0000

----------------------------------------------------------------------
 ForgeImporters/forgeimporters/google/tracker.py        | 12 +++++++++---
 .../tests/google/functional/test_tracker.py            |  1 +
 .../forgeimporters/tests/google/test_tracker.py        | 13 ++++++++-----
 3 files changed, 18 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/ad81824e/ForgeImporters/forgeimporters/google/tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/tracker.py b/ForgeImporters/forgeimporters/google/tracker.py
index 58f28d2..cf6067e 100644
--- a/ForgeImporters/forgeimporters/google/tracker.py
+++ b/ForgeImporters/forgeimporters/google/tracker.py
@@ -24,9 +24,6 @@ from pylons import tmpl_context as c
 from pylons import app_globals as g
 from ming.orm import session, ThreadLocalORMSession
 
-from allura import model as M
-#import gdata
-gdata = None
 from tg import (
         expose,
         flash,
@@ -42,6 +39,7 @@ from allura.controllers import BaseController
 from allura.lib import helpers as h
 from allura.lib.plugin import ImportIdConverter
 from allura.lib.decorators import require_post, task
+from allura import model as M
 
 from forgetracker.tracker_main import ForgeTrackerApp
 from forgetracker import model as TM
@@ -142,6 +140,14 @@ class GoogleCodeTrackerImporter(ToolImporter):
                 app.globals.custom_fields = self.postprocess_custom_fields()
                 app.globals.last_ticket_num = self.max_ticket_num
                 ThreadLocalORMSession.flush_all()
+            M.AuditLog.log(
+                    'import tool %s from %s on %s' % (
+                            app.config.options.mount_point,
+                            project_name, self.source,
+                        ),
+                    project=project,
+                    user=user,
+                )
             g.post_event('project_updated')
             app.globals.invalidate_bin_counts()
             return app

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/ad81824e/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 7f504a5..9f48257 100644
--- a/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
@@ -50,6 +50,7 @@ class TestGCTrackerImporter(TestCase):
         self.assertIsNone(self.project.app_instance('test-issue'))
         with mock.patch.object(base.h, 'urlopen') as urlopen,\
              mock.patch.object(google.tracker, 'GoogleCodeProjectExtractor') as GPE,\
+             mock.patch.object(google.tracker.M, 'AuditLog') as AL,\
              mock.patch('forgetracker.tasks.update_bin_counts') as ubc:
             urlopen.side_effect = lambda req, **kw: mock.Mock(read=req.get_full_url, info=lambda:{'content-type': 'text/plain'})
             GPE.iter_issues.return_value = [(issue_id, issue)]

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/ad81824e/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 05b33ae..8f434df 100644
--- a/ForgeImporters/forgeimporters/tests/google/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/google/test_tracker.py
@@ -42,12 +42,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',
-                    },
+        app.config.options.mount_point = 'mount_point'
+        app.config.options.import_id = {
+                'source': 'Google Code',
+                'project_name': 'project_name',
             }
+        app.config.options.get = lambda *a: getattr(app.config.options, *a)
         issues = gpe.iter_issues.return_value = [(50, mock.Mock()), (100, mock.Mock())]
         tickets = TM.Ticket.side_effect = [mock.Mock(), mock.Mock()]
 
@@ -89,6 +89,9 @@ class TestTrackerImporter(TestCase):
                 mock.call(tickets[1]),
             ])
         self.assertEqual(app.globals.last_ticket_num, 100)
+        M.AuditLog.log.assert_called_once_with(
+                'import tool mount_point from project_name on Google Code',
+                project=project, user=user)
         g.post_event.assert_called_once_with('project_updated')
         app.globals.invalidate_bin_counts.assert_called_once_with()
 


[9/9] git commit: [#6541] bump trac & GC wiki importers, for their audit log addition

Posted by br...@apache.org.
[#6541] bump trac & GC wiki importers, for their audit log addition


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

Branch: refs/heads/master
Commit: 815ef4fbf2d0021f6263b39f3943ecbbbc9c9cd4
Parents: 89cfb5a
Author: Dave Brondsema <db...@slashdotmedia.com>
Authored: Mon Sep 9 20:29:00 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Mon Sep 9 20:29:00 2013 +0000

----------------------------------------------------------------------
 requirements-sf.txt | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/815ef4fb/requirements-sf.txt
----------------------------------------------------------------------
diff --git a/requirements-sf.txt b/requirements-sf.txt
index 286c95a..ecad4a2 100644
--- a/requirements-sf.txt
+++ b/requirements-sf.txt
@@ -6,7 +6,7 @@ kombu==1.0.4
 coverage==3.5a1-20110413
 ForgeHg==0.1.16
 ForgePastebin==0.2.7
-GoogleCodeWikiImporter==0.3.1
+GoogleCodeWikiImporter==0.3.3
 mechanize==0.2.4
 mercurial==1.4.3
 MySQL-python==1.2.3c1
@@ -20,7 +20,7 @@ wsgipreload==1.2
 pyzmq==2.1.7
 html2text==3.200.3dev-20121112
 PyMollom==0.1
-TracWikiImporter==0.2.1
+TracWikiImporter==0.2.2
 
 # use version built from https://github.com/johnsca/GitPython/commits/tv/6000
 # for unmerged fixes for [#5411], [#6000], and [#6078]


[2/9] git commit: [#6541] Added import_id for GC tracker importer

Posted by br...@apache.org.
[#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/c3d8491e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/c3d8491e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/c3d8491e

Branch: refs/heads/master
Commit: c3d8491eaca5562414ae42a4fd2819b671920b6d
Parents: f190769
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Mon Aug 26 21:48:36 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Mon Sep 9 20:27:29 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/c3d8491e/ForgeImporters/forgeimporters/google/tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/tracker.py b/ForgeImporters/forgeimporters/google/tracker.py
index 40dd939..eebdae0 100644
--- a/ForgeImporters/forgeimporters/google/tracker.py
+++ b/ForgeImporters/forgeimporters/google/tracker.py
@@ -116,6 +116,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:
@@ -126,7 +127,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/c3d8491e/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 24081d9..0bd97ab 100644
--- a/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/google/functional/test_tracker.py
@@ -140,6 +140,12 @@ class TestGCTrackerImporter(TestCase):
         self.assertEqual(ticket.votes_up, 1)
         self.assertEqual(ticket.votes, 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/c3d8491e/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 5bbf836..d2cedc6 100644
--- a/ForgeImporters/forgeimporters/tests/google/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/google/test_tracker.py
@@ -52,6 +52,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, [


[8/9] git commit: [#6541] Added import_id and AuditLog to GC repo importer

Posted by br...@apache.org.
[#6541] Added import_id and AuditLog to GC repo 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/59a395df
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/59a395df
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/59a395df

Branch: refs/heads/master
Commit: 59a395dfcccf6829162fb2c9ff2f4c02737c97ff
Parents: 4a4ee8f
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Wed Aug 28 20:42:33 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Mon Sep 9 20:27:30 2013 +0000

----------------------------------------------------------------------
 ForgeImporters/forgeimporters/google/code.py      | 12 +++++++++++-
 .../forgeimporters/google/tests/test_code.py      | 18 ++++++++++++++----
 2 files changed, 25 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/59a395df/ForgeImporters/forgeimporters/google/code.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/code.py b/ForgeImporters/forgeimporters/google/code.py
index 4cf752d..c5f34cd 100644
--- a/ForgeImporters/forgeimporters/google/code.py
+++ b/ForgeImporters/forgeimporters/google/code.py
@@ -36,6 +36,7 @@ from tg.decorators import (
 from allura.controllers import BaseController
 from allura.lib import validators as v
 from allura.lib.decorators import require_post, task
+from allura import model as M
 
 from forgeimporters.base import (
         ToolImporter,
@@ -168,6 +169,15 @@ class GoogleRepoImporter(ToolImporter):
                 mount_point=mount_point or 'code',
                 mount_label=mount_label or 'Code',
                 init_from_url=repo_url,
-                )
+                import_id={
+                        'source': self.source,
+                        'project_name': project_name,
+                    }
+            )
+        M.AuditLog.log(
+                'import tool %s from %s on %s' % (
+                    app.config.options.mount_point,
+                    project_name, self.source,
+                ), project=project, user=user)
         g.post_event('project_updated')
         return app

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/59a395df/ForgeImporters/forgeimporters/google/tests/test_code.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/tests/test_code.py b/ForgeImporters/forgeimporters/google/tests/test_code.py
index c6874ad..4028076 100644
--- a/ForgeImporters/forgeimporters/google/tests/test_code.py
+++ b/ForgeImporters/forgeimporters/google/tests/test_code.py
@@ -57,20 +57,30 @@ class TestGoogleRepoImporter(TestCase):
         return project
 
     @patch('forgeimporters.google.code.g')
+    @patch('forgeimporters.google.code.M')
     @patch('forgeimporters.google.code.GoogleCodeProjectExtractor')
     @patch('forgeimporters.google.code.get_repo_url')
-    def test_import_tool_happy_path(self, get_repo_url, gcpe, g):
+    def test_import_tool_happy_path(self, get_repo_url, gcpe, M, g):
         gcpe.return_value.get_repo_type.return_value = 'git'
         get_repo_url.return_value = 'http://remote/clone/url/'
         p = self._make_project(gc_proj_name='myproject')
-        GoogleRepoImporter().import_tool(p, Mock(name='c.user'),
-                project_name='project_name')
+        u = Mock(name='c.user')
+        app = p.install_app.return_value
+        app.config.options.mount_point = 'code'
+        GoogleRepoImporter().import_tool(p, u, project_name='project_name')
         get_repo_url.assert_called_once_with('project_name', 'git')
         p.install_app.assert_called_once_with('Git',
                 mount_point='code',
                 mount_label='Code',
                 init_from_url='http://remote/clone/url/',
-                )
+                import_id={
+                        'source': 'Google Code',
+                        'project_name': 'project_name',
+                    },
+            )
+        M.AuditLog.log.assert_called_once_with(
+                'import tool code from project_name on Google Code',
+                project=p, user=u)
         g.post_event.assert_called_once_with('project_updated')
 
 


[7/9] git commit: [#6541] Override url in AuditLog on tool import

Posted by br...@apache.org.
[#6541] Override url in AuditLog on tool import

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/89cfb5ab
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/89cfb5ab
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/89cfb5ab

Branch: refs/heads/master
Commit: 89cfb5abd76efb0e8ae999621dc377d222b0c8a1
Parents: 44b2a36
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Fri Sep 6 18:17:05 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Mon Sep 9 20:27:30 2013 +0000

----------------------------------------------------------------------
 ForgeImporters/forgeimporters/google/code.py               | 2 +-
 ForgeImporters/forgeimporters/google/tests/test_code.py    | 3 ++-
 ForgeImporters/forgeimporters/google/tracker.py            | 1 +
 ForgeImporters/forgeimporters/tests/google/test_tracker.py | 3 ++-
 ForgeImporters/forgeimporters/trac/tests/test_tickets.py   | 3 ++-
 ForgeImporters/forgeimporters/trac/tickets.py              | 2 +-
 6 files changed, 9 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/89cfb5ab/ForgeImporters/forgeimporters/google/code.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/code.py b/ForgeImporters/forgeimporters/google/code.py
index c5f34cd..134ecb6 100644
--- a/ForgeImporters/forgeimporters/google/code.py
+++ b/ForgeImporters/forgeimporters/google/code.py
@@ -178,6 +178,6 @@ class GoogleRepoImporter(ToolImporter):
                 'import tool %s from %s on %s' % (
                     app.config.options.mount_point,
                     project_name, self.source,
-                ), project=project, user=user)
+                ), project=project, user=user, url=app.url)
         g.post_event('project_updated')
         return app

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/89cfb5ab/ForgeImporters/forgeimporters/google/tests/test_code.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/tests/test_code.py b/ForgeImporters/forgeimporters/google/tests/test_code.py
index 4028076..806a004 100644
--- a/ForgeImporters/forgeimporters/google/tests/test_code.py
+++ b/ForgeImporters/forgeimporters/google/tests/test_code.py
@@ -67,6 +67,7 @@ class TestGoogleRepoImporter(TestCase):
         u = Mock(name='c.user')
         app = p.install_app.return_value
         app.config.options.mount_point = 'code'
+        app.url = 'foo'
         GoogleRepoImporter().import_tool(p, u, project_name='project_name')
         get_repo_url.assert_called_once_with('project_name', 'git')
         p.install_app.assert_called_once_with('Git',
@@ -80,7 +81,7 @@ class TestGoogleRepoImporter(TestCase):
             )
         M.AuditLog.log.assert_called_once_with(
                 'import tool code from project_name on Google Code',
-                project=p, user=u)
+                project=p, user=u, url='foo')
         g.post_event.assert_called_once_with('project_updated')
 
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/89cfb5ab/ForgeImporters/forgeimporters/google/tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/tracker.py b/ForgeImporters/forgeimporters/google/tracker.py
index cf6067e..9c259dd 100644
--- a/ForgeImporters/forgeimporters/google/tracker.py
+++ b/ForgeImporters/forgeimporters/google/tracker.py
@@ -147,6 +147,7 @@ class GoogleCodeTrackerImporter(ToolImporter):
                         ),
                     project=project,
                     user=user,
+                    url=app.url,
                 )
             g.post_event('project_updated')
             app.globals.invalidate_bin_counts()

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/89cfb5ab/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 8f434df..d795bab 100644
--- a/ForgeImporters/forgeimporters/tests/google/test_tracker.py
+++ b/ForgeImporters/forgeimporters/tests/google/test_tracker.py
@@ -48,6 +48,7 @@ class TestTrackerImporter(TestCase):
                 'project_name': 'project_name',
             }
         app.config.options.get = lambda *a: getattr(app.config.options, *a)
+        app.url = 'foo'
         issues = gpe.iter_issues.return_value = [(50, mock.Mock()), (100, mock.Mock())]
         tickets = TM.Ticket.side_effect = [mock.Mock(), mock.Mock()]
 
@@ -91,7 +92,7 @@ class TestTrackerImporter(TestCase):
         self.assertEqual(app.globals.last_ticket_num, 100)
         M.AuditLog.log.assert_called_once_with(
                 'import tool mount_point from project_name on Google Code',
-                project=project, user=user)
+                project=project, user=user, url='foo')
         g.post_event.assert_called_once_with('project_updated')
         app.globals.invalidate_bin_counts.assert_called_once_with()
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/89cfb5ab/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 2e0c199..92e7854 100644
--- a/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
+++ b/ForgeImporters/forgeimporters/trac/tests/test_tickets.py
@@ -48,6 +48,7 @@ class TestTracTicketImporter(TestCase):
         app = Mock(name='ForgeTrackerApp')
         app.config.options.mount_point = 'bugs'
         app.config.options.get = lambda *a: getattr(app.config.options, *a)
+        app.url = 'foo'
         project = Mock(name='Project', shortname='myproject')
         project.install_app.return_value = app
         user = Mock(name='User', _id='id')
@@ -78,7 +79,7 @@ class TestTracTicketImporter(TestCase):
                 validate=False)
         AuditLog.log.assert_called_once_with(
                 'import tool bugs from http://example.com/trac/url/',
-                project=project, user=user)
+                project=project, user=user, url='foo')
         g.post_event.assert_called_once_with('project_updated')
 
     @patch('forgeimporters.trac.tickets.session')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/89cfb5ab/ForgeImporters/forgeimporters/trac/tickets.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/trac/tickets.py b/ForgeImporters/forgeimporters/trac/tickets.py
index e5238e3..9e4f493 100644
--- a/ForgeImporters/forgeimporters/trac/tickets.py
+++ b/ForgeImporters/forgeimporters/trac/tickets.py
@@ -141,7 +141,7 @@ class TracTicketImporter(ToolImporter):
                         app.config.options.mount_point, 
                         trac_url, 
                     ), 
-                project=project, user=user, 
+                project=project, user=user, url=app.url,
             ) 
             g.post_event('project_updated')
             return app