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/07/08 21:28:27 UTC

[15/25] git commit: [#4213] ticket:345 import from trac: set milestone options

[#4213]  ticket:345 import from trac: set milestone options


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

Branch: refs/heads/cj/4656
Commit: 0efd308af702c9b0f0b39511a0db093d8aa9060c
Parents: d8ed95c
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Mon May 27 10:55:43 2013 +0400
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Sun Jul 7 06:08:00 2013 +0000

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


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/0efd308a/ForgeTracker/forgetracker/import_support.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/import_support.py b/ForgeTracker/forgetracker/import_support.py
index 6970004..56c6947 100644
--- a/ForgeTracker/forgetracker/import_support.py
+++ b/ForgeTracker/forgetracker/import_support.py
@@ -18,11 +18,13 @@
 #-*- python -*-
 import logging
 import json
+import shlex
 from datetime import datetime
 from cStringIO import StringIO
 
 # Non-stdlib imports
 from pylons import tmpl_context as c
+from allura.lib import helpers as h
 
 from ming.orm.ormsession import ThreadLocalORMSession
 
@@ -140,6 +142,33 @@ class ImportSupport(object):
             return u._id
         return None
 
+    def check_suctom_field(self, field, value):
+        field = c.app.globals.get_custom_field(field)
+        if (field['type'] == 'select') and (value != ''):
+            field_options = h.really_unicode(field['options'])
+            try:
+                field_options = shlex.split(field_options.encode('utf-8'))
+                field_options = map(h.really_unicode, field_options)
+            except ValueError:
+                field_options = field_options.split()
+            field_options = [o.replace('"', '') for o in field_options]
+            if value not in field_options:
+                field['options'] = ' '.join([field['options'], value])
+        elif (field['type'] == 'milestone') and (value != ''):
+            milestones = field['milestones']
+            is_exists = False
+            for milestone in milestones:
+                if milestone['name'] == value:
+                    is_exists = True
+            if not is_exists:
+                milestone = {'due_date': '',
+                             'complete': False,
+                             'description': '',
+                             'name': value,
+                             'old_name': value}
+                field['milestones'].append(milestone)
+        ThreadLocalORMSession.flush_all()
+
     def custom(self, ticket, field, value):
         field = '_' + field
         if not c.app.has_custom_field(field):
@@ -148,6 +177,7 @@ class ImportSupport(object):
             ThreadLocalORMSession.flush_all()
         if 'custom_fields' not in ticket:
             ticket['custom_fields'] = {}
+        self.check_suctom_field(field, value)
         ticket['custom_fields'][field] = value
 
     #

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/0efd308a/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 93632fd..58e322c 100644
--- a/ForgeTracker/forgetracker/tests/functional/data/sf.json
+++ b/ForgeTracker/forgetracker/tests/functional/data/sf.json
@@ -47,7 +47,8 @@
           "date_updated": "2009-07-20T15:44:32Z", 
           "description": "This problem occurs with IE 7, Windows Vista:\r\nOn the project's public info page (for example:\r\nhttps://sourceforge.net/project/admin/public_info.php?group_id=258655), the text boxes next to \"Descriptive Name\" and \"Project Description\" are not aligned properly; see the screenshot attached. ", 
           "id": 204, 
-          "keywords": "ENGR", 
+          "keywords": "ENGR",
+          "milestone": "test_milestone",
           "private": false, 
           "resolution": "fixed", 
           "status": "open", 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/0efd308a/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 7df19f7..06fde25 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_import.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_import.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -17,6 +18,7 @@
 
 import os
 import json
+from formencode.variabledecode import variable_encode
 from datetime import datetime, timedelta
 from nose.tools import assert_equal
 
@@ -89,6 +91,39 @@ class TestImportController(TestRestApiBase):
         assert not r.json['errors']
 
     @td.with_tracker
+    def test_import_custom_field(self):
+        params = dict(
+            custom_fields=[
+                dict(name='_resolution', label='Resolution', type='select',
+                     options='oné "one and á half" two'),
+               ],
+            open_status_names='aa bb',
+            closed_status_names='cc',
+            )
+        self.app.post(
+            '/admin/bugs/set_custom_fields',
+            params=variable_encode(params))
+        here_dir = os.path.dirname(__file__)
+        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(here_dir + '/data/sf.json').read()
+        doc_json = json.loads(doc_text)
+        ticket_json = doc_json['trackers']['default']['artifacts'][0]
+        self.api_post('/rest/p/test/bugs/perform_import',
+            doc=doc_text, options='{"user_map": {"hinojosa4": "test-admin", "ma_boehm": "test-user"}}')
+
+        ming.orm.ThreadLocalORMSession.flush_all()
+        M.MonQTask.run_ready()
+        ming.orm.ThreadLocalORMSession.flush_all()
+
+        r = self.app.get('/p/test/bugs/204/')
+        assert '<option selected value="fixed">fixed</option>' in r
+        assert '<option value="one and á half">one and á half</option>' in r
+
+    @td.with_tracker
     def test_import(self):
         here_dir = os.path.dirname(__file__)
         api_ticket = M.ApiTicket(user_id=self.user._id, capabilities={'import': ['Projects','test']},
@@ -124,6 +159,8 @@ class TestImportController(TestRestApiBase):
         assert_equal(r.json['tickets'][0]['summary'], ticket_json['summary'])
 
         r = self.app.get('/p/test/bugs/204/')
+        assert '<option value="2.0">2.0</option>' in r
+        assert '<option selected value="test_milestone">test_milestone</option>' in r
         assert ticket_json['summary'] in r
         r = self.app.get('/p/test/bugs/')
         assert ticket_json['summary'] in r