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/07/08 18:50:21 UTC

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

Updated Branches:
  refs/heads/master 3ae3c3666 -> 584a72854


[#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/master
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


[6/7] git commit: [#4213] ticket:347 Import from trac: ScriptTask to run import

Posted by tv...@apache.org.
[#4213]  ticket:347 Import from trac: ScriptTask to run import


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

Branch: refs/heads/master
Commit: 98cec9044dbed1fa4db3aac256110feecfaed136
Parents: 964c3d1
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Mon Jun 10 14:55:24 2013 +0400
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Sun Jul 7 06:09:58 2013 +0000

----------------------------------------------------------------------
 ForgeTracker/forgetracker/import_support.py     |   1 -
 ForgeTracker/forgetracker/scripts/__init__.py   |  16 +++
 .../forgetracker/scripts/import_tracker.py      | 120 +++++++++++++++++++
 scripts/allura_import.py                        |  50 +-------
 4 files changed, 138 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/98cec904/ForgeTracker/forgetracker/import_support.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/import_support.py b/ForgeTracker/forgetracker/import_support.py
index d23cf94..a94e70c 100644
--- a/ForgeTracker/forgetracker/import_support.py
+++ b/ForgeTracker/forgetracker/import_support.py
@@ -316,7 +316,6 @@ option user_map to avoid losing username information. Unknown users: %s''' % unk
         for a in artifacts:
             comments = a.pop('comments', [])
             attachments = a.pop('attachments', [])
-#            log.info(a)
             t = self.make_artifact(a)
             for c_entry in comments:
                 self.make_comment(t.discussion_thread, c_entry)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/98cec904/ForgeTracker/forgetracker/scripts/__init__.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/scripts/__init__.py b/ForgeTracker/forgetracker/scripts/__init__.py
new file mode 100644
index 0000000..144e298
--- /dev/null
+++ b/ForgeTracker/forgetracker/scripts/__init__.py
@@ -0,0 +1,16 @@
+#       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
+#       regarding copyright ownership.  The ASF licenses this file
+#       to you under the Apache License, Version 2.0 (the
+#       "License"); you may not use this file except in compliance
+#       with the License.  You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#       Unless required by applicable law or agreed to in writing,
+#       software distributed under the License is distributed on an
+#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#       KIND, either express or implied.  See the License for the
+#       specific language governing permissions and limitations
+#       under the License.

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/98cec904/ForgeTracker/forgetracker/scripts/import_tracker.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/scripts/import_tracker.py b/ForgeTracker/forgetracker/scripts/import_tracker.py
new file mode 100644
index 0000000..a84bede
--- /dev/null
+++ b/ForgeTracker/forgetracker/scripts/import_tracker.py
@@ -0,0 +1,120 @@
+#       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
+#       regarding copyright ownership.  The ASF licenses this file
+#       to you under the Apache License, Version 2.0 (the
+#       "License"); you may not use this file except in compliance
+#       with the License.  You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#       Unless required by applicable law or agreed to in writing,
+#       software distributed under the License is distributed on an
+#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#       KIND, either express or implied.  See the License for the
+#       specific language governing permissions and limitations
+#       under the License.
+
+
+import argparse
+import json
+import logging
+
+from allura.scripts import ScriptTask
+from allura.lib.import_api import AlluraImportApiClient
+
+log = logging.getLogger(__name__)
+
+def import_tracker(cli, project, tool, import_options, options, doc_txt, validate=True, verbose=False):
+    url = '/rest/p/' + project + '/' + tool
+    if validate:
+        url += '/validate_import'
+    else:
+        url += '/perform_import'
+
+    existing_map = {}
+    if options.cont:
+        existing_tickets = cli.call('/rest/p/' + options.project + '/' + options.tracker + '/')['tickets']
+        for t in existing_tickets:
+            existing_map[t['ticket_num']] = t['summary']
+
+    doc = json.loads(doc_txt)
+
+    if 'trackers' in doc and 'default' in doc['trackers'] and 'artifacts' in doc['trackers']['default']:
+        tickets_in = doc['trackers']['default']['artifacts']
+        doc['trackers']['default']['artifacts'] = []
+    else:
+        tickets_in = doc
+
+    if options.verbose:
+        print "Processing %d tickets" % len(tickets_in)
+
+    for cnt, ticket_in in enumerate(tickets_in):
+        if ticket_in['id'] in existing_map:
+            if options.verbose:
+                print 'Ticket id %d already exists, skipping' % ticket_in['id']
+            continue
+        doc_import={}
+        doc_import['trackers'] = {}
+        doc_import['trackers']['default'] = {}
+        doc_import['trackers']['default']['artifacts'] = [ticket_in]
+        res = cli.call(url, doc=json.dumps(doc_import), options=json.dumps(import_options))
+        assert res['status'] and not res['errors']
+        if options.validate:
+            if res['warnings']:
+                print "Ticket id %s warnings: %s" % (ticket_in['id'], res['warnings'])
+        else:
+            print "Imported ticket id %s" % (ticket_in['id'])
+
+class ImportTracker(ScriptTask):
+    @classmethod
+    def execute(cls, options):
+        user_map = {}
+        import_options = {}
+        for s in options.import_opts:
+            k, v = s.split('=', 1)
+            if v == 'false':
+                v = False
+            import_options[k] = v
+
+        if options.user_map_file:
+            f = open(options.user_map_file)
+            try:
+                user_map = json.load(f)
+                if type(user_map) is not type({}):
+                    raise ValueError
+                for k, v in user_map.iteritems():
+                    if not isinstance(k, basestring) or not isinstance(v, basestring):
+                        raise ValueError
+            except ValueError:
+                raise '--user-map should specify JSON file with format {"original_user": "sf_user", ...}'
+            finally:
+                f.close()
+        import_options['user_map'] = user_map
+        cli = AlluraImportApiClient(options.base_url, options.api_key, options.secret_key, options.verbose)
+        doc_txt = open(options.file_data).read()
+        import_tracker(cli, options.project, options.tracker, import_options, options, doc_txt,
+                       validate=options.validate,
+                       verbose=options.verbose)
+
+    @classmethod
+    def parser(cls):
+        parser = argparse.ArgumentParser(description='import tickets from json')
+        parser.add_argument('--nbhd', action='store', default='', dest='nbhd',
+                help='Restrict update to a particular neighborhood, e.g. /p/.')
+        parser.add_argument('-a', '--api-ticket', action='store', dest='api_key', help='API ticket')
+        parser.add_argument('-s', '--secret-key', action='store', dest='secret_key', help='Secret key')
+        parser.add_argument('-p', '--project', action='store', dest='project', help='Project to import to')
+        parser.add_argument('-t', '--tracker', action='store', dest='tracker', help='Tracker to import to')
+        parser.add_argument('-u', '--base-url', dest='base_url', default='https://sourceforge.net', help='Base Allura URL (%default)')
+        parser.add_argument('-o', dest='import_opts', default=[], action='store',  help='Specify import option(s)', metavar='opt=val')
+        parser.add_argument('--user-map', dest='user_map_file', help='Map original users to SF.net users', metavar='JSON_FILE')
+        parser.add_argument('--file_data', dest='file_data', help='json file', metavar='JSON_FILE')
+        parser.add_argument('--validate', dest='validate', action='store_true', help='Validate import data')
+        parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', help='Verbose operation')
+        parser.add_argument('-c', '--continue', dest='cont', action='store_true', help='Continue import into existing tracker')
+        return parser
+
+
+if __name__ == '__main__':
+    ImportTracker.main()

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/98cec904/scripts/allura_import.py
----------------------------------------------------------------------
diff --git a/scripts/allura_import.py b/scripts/allura_import.py
index ba250e3..ddcd588 100644
--- a/scripts/allura_import.py
+++ b/scripts/allura_import.py
@@ -15,19 +15,12 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import os
-import sys
-import urllib
-import urllib2
-import urlparse
-import hmac
-import hashlib
 import json
 from optparse import OptionParser
-from pprint import pprint
 from datetime import datetime
 
 from allura.lib.import_api import AlluraImportApiClient
+from forgetracker.scripts.import_tracker import import_tracker
 
 
 def main():
@@ -69,46 +62,6 @@ def main():
     elif options.forum:
         import_forum(cli, options.project, options.forum, user_map, doc_txt, validate=options.validate)
 
-def import_tracker(cli, project, tool, import_options, options, doc_txt, validate=True, verbose=False):
-    url = '/rest/p/' + project + '/' + tool
-    if validate:
-        url += '/validate_import'
-    else:
-        url += '/perform_import'
-
-    existing_map = {}
-    if options.cont:
-        existing_tickets = cli.call('/rest/p/' + options.project + '/' + options.tracker + '/')['tickets']
-        for t in existing_tickets:
-            existing_map[t['ticket_num']] = t['summary']
-
-    doc = json.loads(doc_txt)
-
-    if 'trackers' in doc and 'default' in doc['trackers'] and 'artifacts' in doc['trackers']['default']:
-        tickets_in = doc['trackers']['default']['artifacts']
-        doc['trackers']['default']['artifacts'] = []
-    else:
-        tickets_in = doc
-        
-    if options.verbose:
-        print "Processing %d tickets" % len(tickets_in)
-
-    for cnt, ticket_in in enumerate(tickets_in):
-            if ticket_in['id'] in existing_map:
-                if options.verbose:
-                    print 'Ticket id %d already exists, skipping' % ticket_in['id']
-                continue
-            doc_import={}
-            doc_import['trackers'] = {}
-            doc_import['trackers']['default'] = {}
-            doc_import['trackers']['default']['artifacts'] = [ticket_in]
-            res = cli.call(url, doc=json.dumps(doc_import), options=json.dumps(import_options))
-            assert res['status'] and not res['errors']
-            if options.validate:
-                if res['warnings']:
-                    print "Ticket id %s warnings: %s" % (ticket_in['id'], res['warnings'])
-            else:
-                print "Imported ticket id %s" % (ticket_in['id'])
 
 def import_forum(cli, project, tool, user_map, doc_txt, validate=True):
     url = '/rest/p/' + project + '/' + tool
@@ -119,6 +72,7 @@ def import_forum(cli, project, tool, user_map, doc_txt, validate=True):
         url += '/perform_import'
         print cli.call(url, doc=doc_txt, user_map=json.dumps(user_map))
 
+
 def parse_options():
     optparser = OptionParser(usage='''%prog [options] <JSON dump>
 


[3/7] git commit: [#4213] ticket:344 set buf_len for ResettableStream().seek

Posted by tv...@apache.org.
[#4213]  ticket:344 set buf_len for ResettableStream().seek


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

Branch: refs/heads/master
Commit: 34394746fdf7d6fa324c8987f2d5c9938e897118
Parents: 3ae3c36
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Wed May 22 15:38:03 2013 +0400
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Sun Jul 7 06:08:00 2013 +0000

----------------------------------------------------------------------
 ForgeTracker/forgetracker/import_support.py       |  9 +++++++--
 .../forgetracker/tests/unit/test_ticket_model.py  | 18 +++++++++++++++++-
 2 files changed, 24 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/34394746/ForgeTracker/forgetracker/import_support.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/import_support.py b/ForgeTracker/forgetracker/import_support.py
index 4c0f72f..1ea391b 100644
--- a/ForgeTracker/forgetracker/import_support.py
+++ b/ForgeTracker/forgetracker/import_support.py
@@ -69,13 +69,18 @@ class ResettableStream(object):
         data += self.fp.read(size)
         self.stream_pos += len(data)
         return data
-        
+
     def seek(self, pos):
+        if self.buf is None:
+            data = self.fp.read(self.buf_size)
+            self.buf = StringIO(data)
+            self.buf_len = len(data)
+
         if self.stream_pos > self.buf_len:
             assert False, 'Started reading stream body, cannot reset pos'
         self.buf.seek(pos)
         self.buf_pos = pos
-        
+
     def tell(self):
         if self.buf_pos < self.stream_pos:
             return self.buf_pos

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/34394746/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 9cca6df..c53afad 100644
--- a/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
+++ b/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
@@ -17,13 +17,15 @@
 
 from pylons import tmpl_context as c
 from datetime import datetime
+import urllib2
 
 from ming.orm.ormsession import ThreadLocalORMSession
 from ming import schema
 from nose.tools import raises, assert_raises, assert_equal
 
-from forgetracker.model import Ticket
+from forgetracker.model import Ticket, TicketAttachment
 from forgetracker.tests.unit import TrackerTestWithModel
+from forgetracker.import_support import ResettableStream
 from allura.model import Feed, Post, User
 from allura.lib import helpers as h
 from allura.tests import decorators as td
@@ -261,3 +263,17 @@ class TestTicketModel(TrackerTestWithModel):
         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)
+
+    @td.with_tool('test', 'Tickets', 'bugs', username='test-user')
+    def test_attach_with_resettable_stream(self):
+        with h.push_context(c.project._id, app_config_id=c.app.config._id):
+            ticket = Ticket.new()
+            ticket.summary = 'test ticket'
+            ticket.description = 'test description'
+        assert_equal(len(ticket.attachments), 0)
+        f = urllib2.urlopen('http://sourceforge.net/apps/trac/sourceforge/raw-attachment/ticket/204/SF%20display%20error.JPG')
+        TicketAttachment.save_attachment('filename.txt', ResettableStream(f),
+                                            artifact_id=ticket._id)
+        ThreadLocalORMSession.flush_all()
+        assert_equal(len(ticket.attachments), 1)
+        assert_equal(ticket.attachments.first().filename, 'filename.txt')


[5/7] git commit: [#4213] ticket:345 fixed grammar errors and refactored

Posted by tv...@apache.org.
[#4213]  ticket:345 fixed grammar errors and refactored


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

Branch: refs/heads/master
Commit: 8993951a56adb9e0374a4d9765d6285ab0735d4a
Parents: 0efd308
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Tue Jun 4 18:03:22 2013 +0400
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Sun Jul 7 06:09:58 2013 +0000

----------------------------------------------------------------------
 Allura/allura/lib/helpers.py                     | 18 ++++++++++++++++++
 Allura/allura/tests/test_helpers.py              |  5 +++++
 ForgeTracker/forgetracker/import_support.py      | 17 +++++------------
 ForgeTracker/forgetracker/widgets/ticket_form.py | 18 ++----------------
 4 files changed, 30 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/8993951a/Allura/allura/lib/helpers.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/helpers.py b/Allura/allura/lib/helpers.py
index 144bef3..1604aa9 100644
--- a/Allura/allura/lib/helpers.py
+++ b/Allura/allura/lib/helpers.py
@@ -29,6 +29,7 @@ import cPickle as pickle
 from hashlib import sha1
 from datetime import datetime, timedelta
 from collections import defaultdict
+import shlex
 
 import tg
 import genshi.template
@@ -839,3 +840,20 @@ def ming_config_from_ini(ini_path):
     conf = appconfig('config:%s' % os.path.join(root, ini_path))
     with ming_config(**conf):
         yield
+
+
+def split_select_field_options(field_options):
+    try:
+        # shlex have problems with parsing unicode,
+        # it's better to pass properly encoded byte-string
+        field_options = shlex.split(field_options.encode('utf-8'))
+        # convert splitted string back to unicode
+        field_options = map(really_unicode, field_options)
+    except ValueError:
+        field_options = field_options.split()
+        # After regular split field_options might contain a " characters,
+        # which would break html when rendered inside tag's value attr.
+        # Escaping doesn't help here, 'cause it breaks EasyWidgets' validation,
+        # so we're getting rid of those.
+        field_options = [o.replace('"', '') for o in field_options]
+    return field_options

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/8993951a/Allura/allura/tests/test_helpers.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_helpers.py b/Allura/allura/tests/test_helpers.py
index 904d188..42fb963 100644
--- a/Allura/allura/tests/test_helpers.py
+++ b/Allura/allura/tests/test_helpers.py
@@ -249,3 +249,8 @@ def test_inject_user(context):
 def test_datetimeformat():
     from datetime import date
     assert h.datetimeformat(date(2013, 01, 01)) == '2013-01-01 00:00:00'
+
+
+def test_split_select_field_options():
+    assert_equals(h.split_select_field_options('"test message" test2'), ['test message', 'test2'])
+    assert_equals(h.split_select_field_options('"test message test2'), ['test', 'message', 'test2'])

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/8993951a/ForgeTracker/forgetracker/import_support.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/import_support.py b/ForgeTracker/forgetracker/import_support.py
index 56c6947..d23cf94 100644
--- a/ForgeTracker/forgetracker/import_support.py
+++ b/ForgeTracker/forgetracker/import_support.py
@@ -18,7 +18,6 @@
 #-*- python -*-
 import logging
 import json
-import shlex
 from datetime import datetime
 from cStringIO import StringIO
 
@@ -142,19 +141,13 @@ class ImportSupport(object):
             return u._id
         return None
 
-    def check_suctom_field(self, field, value):
+    def check_custom_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 (field['type'] == 'select') and value:
+            field_options = h.split_select_field_options(h.really_unicode(field['options']))
             if value not in field_options:
                 field['options'] = ' '.join([field['options'], value])
-        elif (field['type'] == 'milestone') and (value != ''):
+        elif (field['type'] == 'milestone') and value:
             milestones = field['milestones']
             is_exists = False
             for milestone in milestones:
@@ -177,7 +170,7 @@ class ImportSupport(object):
             ThreadLocalORMSession.flush_all()
         if 'custom_fields' not in ticket:
             ticket['custom_fields'] = {}
-        self.check_suctom_field(field, value)
+        self.check_custom_field(field, value)
         ticket['custom_fields'][field] = value
 
     #

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/8993951a/ForgeTracker/forgetracker/widgets/ticket_form.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/widgets/ticket_form.py b/ForgeTracker/forgetracker/widgets/ticket_form.py
index 9139cda..cb05085 100644
--- a/ForgeTracker/forgetracker/widgets/ticket_form.py
+++ b/ForgeTracker/forgetracker/widgets/ticket_form.py
@@ -15,8 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import shlex
-
 from pylons import tmpl_context as c
 from formencode import validators as fev
 
@@ -164,20 +162,8 @@ class TicketCustomField(object):
 
     def _select(field):
         options = []
-        field_options = h.really_unicode(field.options)
-        try:
-            # shlex have problems with parsing unicode,
-            # it's better to pass properly encoded byte-string
-            field_options = shlex.split(field_options.encode('utf-8'))
-            # convert splitted string back to unicode
-            field_options = map(h.really_unicode, field_options)
-        except ValueError:
-            field_options = field_options.split()
-            # After regular split field_options might contain a " characters,
-            # which would break html when rendered inside tag's value attr.
-            # Escaping doesn't help here, 'cause it breaks EasyWidgets' validation,
-            # so we're getting rid of those.
-            field_options = [o.replace('"', '') for o in field_options]
+        field_options = h.split_select_field_options(h.really_unicode(field.options))
+
         for opt in field_options:
             selected = False
             if opt.startswith('*'):


[7/7] git commit: [#4213] Don't stop export after first 100 tickets

Posted by tv...@apache.org.
[#4213] Don't stop export after first 100 tickets

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

Branch: refs/heads/master
Commit: 584a728545c233ce5e36b3a59f20bdb77adacce7
Parents: 98cec90
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Mon Jul 8 16:49:33 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Mon Jul 8 16:49:33 2013 +0000

----------------------------------------------------------------------
 scripts/trac_export.py | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/584a7285/scripts/trac_export.py
----------------------------------------------------------------------
diff --git a/scripts/trac_export.py b/scripts/trac_export.py
index 4fcb27a..002a1e8 100755
--- a/scripts/trac_export.py
+++ b/scripts/trac_export.py
@@ -237,6 +237,10 @@ class TracExport(object):
 
     def next(self):
         while True:
+            # queue empty, try to fetch more
+            if len(self.ticket_queue) == 0:
+                self.ticket_queue = self.next_ticket_ids()
+            # there aren't any more, we're really done
             if len(self.ticket_queue) == 0:
                 raise StopIteration
             id, extra = self.ticket_queue.pop(0)


[2/7] git commit: [#4213] ticket:344 refactored and fixed tests

Posted by tv...@apache.org.
[#4213]  ticket:344 refactored and fixed 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/d8ed95c4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/d8ed95c4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/d8ed95c4

Branch: refs/heads/master
Commit: d8ed95c4df193ee74e288140749ac785916f0a55
Parents: 3439474
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Fri May 31 14:23:40 2013 +0400
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Sun Jul 7 06:08:00 2013 +0000

----------------------------------------------------------------------
 ForgeTracker/forgetracker/import_support.py           | 14 ++++++--------
 .../forgetracker/tests/unit/test_ticket_model.py      |  6 +++---
 2 files changed, 9 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d8ed95c4/ForgeTracker/forgetracker/import_support.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/import_support.py b/ForgeTracker/forgetracker/import_support.py
index 1ea391b..6970004 100644
--- a/ForgeTracker/forgetracker/import_support.py
+++ b/ForgeTracker/forgetracker/import_support.py
@@ -50,14 +50,16 @@ class ResettableStream(object):
         self.buf_size = header_size if header_size >= 0 else self.HEADER_BUF_SIZE
         self.buf_pos = 0
         self.stream_pos = 0
-        
-    def read(self, size=-1):
+
+    def _read_header(self):
         if self.buf is None:
             data = self.fp.read(self.buf_size)
             self.buf = StringIO(data)
             self.buf_len = len(data)
             self.stream_pos = self.buf_len
-        
+
+    def read(self, size=-1):
+        self._read_header()
         data = ''
         if self.buf_pos < self.stream_pos:
             data = self.buf.read(size)
@@ -71,11 +73,7 @@ class ResettableStream(object):
         return data
 
     def seek(self, pos):
-        if self.buf is None:
-            data = self.fp.read(self.buf_size)
-            self.buf = StringIO(data)
-            self.buf_len = len(data)
-
+        self._read_header()
         if self.stream_pos > self.buf_len:
             assert False, 'Started reading stream body, cannot reset pos'
         self.buf.seek(pos)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d8ed95c4/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 c53afad..145bc7c 100644
--- a/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
+++ b/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
@@ -271,9 +271,9 @@ class TestTicketModel(TrackerTestWithModel):
             ticket.summary = 'test ticket'
             ticket.description = 'test description'
         assert_equal(len(ticket.attachments), 0)
-        f = urllib2.urlopen('http://sourceforge.net/apps/trac/sourceforge/raw-attachment/ticket/204/SF%20display%20error.JPG')
-        TicketAttachment.save_attachment('filename.txt', ResettableStream(f),
+        f = urllib2.urlopen('file://%s' % __file__)
+        TicketAttachment.save_attachment('test_ticket_model.py', ResettableStream(f),
                                             artifact_id=ticket._id)
         ThreadLocalORMSession.flush_all()
         assert_equal(len(ticket.attachments), 1)
-        assert_equal(ticket.attachments.first().filename, 'filename.txt')
+        assert_equal(ticket.attachments.first().filename, 'test_ticket_model.py')


[4/7] git commit: [#4213] ticket:346 small refactoring for trac export

Posted by tv...@apache.org.
[#4213]  ticket:346 small refactoring  for trac export


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

Branch: refs/heads/master
Commit: 964c3d1803292f87a1f30391c22b0f744bb7e26f
Parents: 8993951
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Thu Jun 6 15:48:32 2013 +0400
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Sun Jul 7 06:09:58 2013 +0000

----------------------------------------------------------------------
 scripts/trac_export.py | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/964c3d18/scripts/trac_export.py
----------------------------------------------------------------------
diff --git a/scripts/trac_export.py b/scripts/trac_export.py
index fcff048..4fcb27a 100755
--- a/scripts/trac_export.py
+++ b/scripts/trac_export.py
@@ -19,7 +19,6 @@
 
 
 import sys
-from pprint import pprint
 import csv
 import urlparse
 import urllib2
@@ -77,9 +76,9 @@ class TracExport(object):
         # be get with single-ticket export (create/mod times is
         # and example).
         self.ticket_map = {}
-        self.ticket_queue = []
         self.start_id = start_id
         self.page = (start_id - 1) / self.PAGE_SIZE + 1
+        self.ticket_queue = self.next_ticket_ids()
 
     def remap_fields(self, dict):
         "Remap fields to adhere to standard taxonomy."
@@ -238,8 +237,8 @@ class TracExport(object):
 
     def next(self):
         while True:
-            if not self.ticket_queue:
-                self.ticket_queue = self.next_ticket_ids()
+            if len(self.ticket_queue) == 0:
+                raise StopIteration
             id, extra = self.ticket_queue.pop(0)
             if id >= self.start_id:
                 break