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/01/21 22:53:16 UTC

[11/16] git commit: [#4339] ticket:237 move ticket improvements

[#4339] ticket:237 move ticket improvements

* restrict user field values to project members when moving
* minor fixes and tests


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

Branch: refs/heads/tv/5336
Commit: f602a5cff41d2be6452ff5c069db051fbeaafc09
Parents: 3eefd5d
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Dec 18 14:08:09 2012 +0000
Committer: Cory Johns <jo...@geek.net>
Committed: Fri Jan 18 21:53:18 2013 +0000

----------------------------------------------------------------------
 ForgeTracker/forgetracker/model/ticket.py          |   31 +++++++++---
 .../forgetracker/tests/unit/test_ticket_model.py   |   39 ++++++++++++++-
 2 files changed, 62 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/f602a5cf/ForgeTracker/forgetracker/model/ticket.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/model/ticket.py b/ForgeTracker/forgetracker/model/ticket.py
index b1919b6..b33cd45 100644
--- a/ForgeTracker/forgetracker/model/ticket.py
+++ b/ForgeTracker/forgetracker/model/ticket.py
@@ -552,16 +552,33 @@ class Ticket(VersionedArtifact, ActivityObject, VotableArtifact):
             (cf['name'], cf['type'], cf['label'])
             for cf in app.globals.custom_fields or []]
         skipped_fields = []
+        user_fields = []
         for cf in prior_cfs:
-            if cf not in new_cfs:
+            if cf not in new_cfs:  # can't convert
                 skipped_fields.append(cf)
-
+            elif cf[1] == 'user':  # can convert and field type == user
+                user_fields.append(cf)
+
+        messages = []
+        for cf in skipped_fields:
+            name = cf[0]
+            messages.append('- **%s**: %s' % (name, self.custom_fields[name]))
+        for cf in user_fields:
+            name = cf[0]
+            username = self.custom_fields[name]
+            user = app_config.project.user_in_project(username)
+            if not user or user == User.anonymous():
+                messages.append('- **%s**: %s (user not in project)' % (name, username))
+                self.custom_fields[name] = ''
+        # special case: not custom user field (assigned_to_id)
+        user = self.assigned_to
+        if user and not app_config.project.user_in_project(user.username):
+            messages.append('- **assigned_to**: %s (user not in project)' % user.username)
+            self.assigned_to_id = None
         message = 'Ticket moved from %s' % prior_url
-        if skipped_fields:
-            message += '\n\nCan\'t be converted:\n'
-            for cf in skipped_fields:
-                name = cf[0]
-                message += '\n- **%s**: %s' % (name, self.custom_fields[name])
+        if messages:
+            message += '\n\nCan\'t be converted:\n\n'
+        message += '\n'.join(messages)
         self.discussion_thread.post(text=message)
 
         # need this to reset app_config RelationProperty on ticket to a new one

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/f602a5cf/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py b/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
index 95c4d5e..b6afa91 100644
--- a/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
+++ b/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
@@ -7,7 +7,7 @@ from nose.tools import raises, assert_raises, assert_equal
 
 from forgetracker.model import Ticket
 from forgetracker.tests.unit import TrackerTestWithModel
-from allura.model import Feed, Post
+from allura.model import Feed, Post, User
 from allura.lib import helpers as h
 from allura.tests import decorators as td
 
@@ -141,6 +141,7 @@ class TestTicketModel(TrackerTestWithModel):
             ticket = Ticket.new()
             ticket.summary = 'test ticket'
             ticket.description = 'test description'
+            ticket.assigned_to_id = User.by_username('test-user')._id
 
         assert_equal(Ticket.query.find({'app_config_id': app1.config._id}).count(), 1)
         assert_equal(Ticket.query.find({'app_config_id': app2.config._id}).count(), 0)
@@ -150,6 +151,7 @@ class TestTicketModel(TrackerTestWithModel):
         assert_equal(Ticket.query.find({'app_config_id': app2.config._id}).count(), 1)
         assert_equal(t.summary, 'test ticket')
         assert_equal(t.description, 'test description')
+        assert_equal(t.assigned_to.username, 'test-user')
         assert_equal(t.url(), '/p/test/bugs2/1/')
 
         post = Post.query.find(dict(thread_id=ticket.discussion_thread._id)).first()
@@ -186,3 +188,38 @@ class TestTicketModel(TrackerTestWithModel):
         message += '\n\nCan\'t be converted:\n'
         message += '\n- **_test2**: test val 2'
         assert_equal(post.text, message)
+
+    @td.with_tool('test', 'Tickets', 'bugs', username='test-user')
+    @td.with_tool('test', 'Tickets', 'bugs2', username='test-user')
+    def test_ticket_move_with_users_not_in_project(self):
+        app1 = c.project.app_instance('bugs')
+        app2 = c.project.app_instance('bugs2')
+        app1.globals.custom_fields.extend([
+            {'name': '_user_field', 'type': 'user', 'label': 'User field'},
+            {'name': '_user_field_2', 'type': 'user', 'label': 'User field 2'}])
+        app2.globals.custom_fields.extend([
+            {'name': '_user_field', 'type': 'user', 'label': 'User field'},
+            {'name': '_user_field_2', 'type': 'user', 'label': 'User field 2'}])
+        ThreadLocalORMSession.flush_all()
+        ThreadLocalORMSession.close_all()
+        from allura.websetup import bootstrap
+        bootstrap.create_user('test-user-0')
+        with h.push_context(c.project._id, app_config_id=app1.config._id):
+            ticket = Ticket.new()
+            ticket.summary = 'test ticket'
+            ticket.description = 'test description'
+            ticket.custom_fields['_user_field'] = 'test-user'  # in project
+            ticket.custom_fields['_user_field_2'] = 'test-user-0'  # not in project
+            ticket.assigned_to_id = User.by_username('test-user-0')._id  # not in project
+
+        t = ticket.move(app2.config)
+        assert_equal(t.assigned_to_id, None)
+        assert_equal(t.custom_fields['_user_field'], 'test-user')
+        assert_equal(t.custom_fields['_user_field_2'], '')
+        post = Post.query.find(dict(thread_id=ticket.discussion_thread._id)).first()
+        assert post is not None, 'No comment about ticket moving'
+        message = 'Ticket moved from /p/test/bugs/1/'
+        message += '\n\nCan\'t be converted:\n'
+        message += '\n- **_user_field_2**: test-user-0 (user not in project)'
+        message += '\n- **assigned_to**: test-user-0 (user not in project)'
+        assert_equal(post.text, message)