Switch to unified view

a/scripts/allura_import.py b/scripts/allura_import.py
...
...
13
#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
13
#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
#       KIND, either express or implied.  See the License for the
14
#       KIND, either express or implied.  See the License for the
15
#       specific language governing permissions and limitations
15
#       specific language governing permissions and limitations
16
#       under the License.
16
#       under the License.
17
17
18
import os
19
import sys
20
import urllib
21
import urllib2
22
import urlparse
23
import hmac
24
import hashlib
25
import json
18
import json
26
from optparse import OptionParser
19
from optparse import OptionParser
27
from pprint import pprint
28
from datetime import datetime
20
from datetime import datetime
29
21
30
from allura.lib.import_api import AlluraImportApiClient
22
from allura.lib.import_api import AlluraImportApiClient
23
from forgetracker.scripts.import_tracker import import_tracker
31
24
32
25
33
def main():
26
def main():
34
    optparser, options, args = parse_options()
27
    optparser, options, args = parse_options()
35
28
...
...
67
                       validate=options.validate,
60
                       validate=options.validate,
68
                       verbose=options.verbose)
61
                       verbose=options.verbose)
69
    elif options.forum:
62
    elif options.forum:
70
        import_forum(cli, options.project, options.forum, user_map, doc_txt, validate=options.validate)
63
        import_forum(cli, options.project, options.forum, user_map, doc_txt, validate=options.validate)
71
64
72
def import_tracker(cli, project, tool, import_options, options, doc_txt, validate=True, verbose=False):
73
    url = '/rest/p/' + project + '/' + tool
74
    if validate:
75
        url += '/validate_import'
76
    else:
77
        url += '/perform_import'
78
79
    existing_map = {}
80
    if options.cont:
81
        existing_tickets = cli.call('/rest/p/' + options.project + '/' + options.tracker + '/')['tickets']
82
        for t in existing_tickets:
83
            existing_map[t['ticket_num']] = t['summary']
84
85
    doc = json.loads(doc_txt)
86
87
    if 'trackers' in doc and 'default' in doc['trackers'] and 'artifacts' in doc['trackers']['default']:
88
        tickets_in = doc['trackers']['default']['artifacts']
89
        doc['trackers']['default']['artifacts'] = []
90
    else:
91
        tickets_in = doc
92
        
93
    if options.verbose:
94
        print "Processing %d tickets" % len(tickets_in)
95
96
    for cnt, ticket_in in enumerate(tickets_in):
97
            if ticket_in['id'] in existing_map:
98
                if options.verbose:
99
                    print 'Ticket id %d already exists, skipping' % ticket_in['id']
100
                continue
101
            doc_import={}
102
            doc_import['trackers'] = {}
103
            doc_import['trackers']['default'] = {}
104
            doc_import['trackers']['default']['artifacts'] = [ticket_in]
105
            res = cli.call(url, doc=json.dumps(doc_import), options=json.dumps(import_options))
106
            assert res['status'] and not res['errors']
107
            if options.validate:
108
                if res['warnings']:
109
                    print "Ticket id %s warnings: %s" % (ticket_in['id'], res['warnings'])
110
            else:
111
                print "Imported ticket id %s" % (ticket_in['id'])
112
65
113
def import_forum(cli, project, tool, user_map, doc_txt, validate=True):
66
def import_forum(cli, project, tool, user_map, doc_txt, validate=True):
114
    url = '/rest/p/' + project + '/' + tool
67
    url = '/rest/p/' + project + '/' + tool
115
    if validate:
68
    if validate:
116
        url += '/validate_import'
69
        url += '/validate_import'
117
        print cli.call(url, doc=doc_txt, user_map=json.dumps(user_map))
70
        print cli.call(url, doc=doc_txt, user_map=json.dumps(user_map))
118
    else:
71
    else:
119
        url += '/perform_import'
72
        url += '/perform_import'
120
        print cli.call(url, doc=doc_txt, user_map=json.dumps(user_map))
73
        print cli.call(url, doc=doc_txt, user_map=json.dumps(user_map))
74
121
75
122
def parse_options():
76
def parse_options():
123
    optparser = OptionParser(usage='''%prog [options] <JSON dump>
77
    optparser = OptionParser(usage='''%prog [options] <JSON dump>
124
78
125
Import project data dump in JSON format into an Allura project.''')
79
Import project data dump in JSON format into an Allura project.''')