Exemple #1
0
    def make_artifact(self, ticket_dict):
        remapped = {}
        for f, v in ticket_dict.iteritems():
            transform = self.FIELD_MAP.get(f, ())
            if transform is None:
                continue
            elif transform is True:
                remapped[f] = v
            elif callable(transform):
                transform(remapped, f, v)
            elif transform is ():
                self.custom(remapped, f, v)
            else:
                new_f, conv = transform
                remapped[new_f] = conv(v)

        ticket_num = ticket_dict['id']
        existing_ticket = TM.Ticket.query.get(app_config_id=c.app.config._id,
                                          ticket_num=ticket_num)
        if existing_ticket:
            ticket_num = c.app.globals.next_ticket_num()
            self.warnings.append('Ticket #%s: Ticket with this id already exists, using next available id: %s' % (ticket_dict['id'], ticket_num))
        else:
            if c.app.globals.last_ticket_num < ticket_num:
                c.app.globals.last_ticket_num = ticket_num
                ThreadLocalORMSession.flush_all()

        ticket = TM.Ticket(
            app_config_id=c.app.config._id,
            custom_fields=dict(),
            ticket_num=ticket_num,
            import_id=c.api_token.api_key)
        ticket.update(remapped)
        return ticket
 def test_some_criteria(self, paged_search):
     q = 'labels:testing && status:open'
     paged_search.return_value = dict(
         tickets=[
             TM.Ticket(ticket_num=5, summary='our test ticket'),
         ],
         sort='status',
         limit=2,
         count=1,
         page=0,
         q=q,
     )
     r = self.api_get('/rest/p/test/bugs/search',
                      q=q,
                      sort='status',
                      limit='2')
     assert_equal(r.status_int, 200)
     assert_equal(
         r.json, {
             'limit': 2,
             'q': q,
             'sort': 'status',
             'count': 1,
             'page': 0,
             'tickets': [
                 {
                     'summary': 'our test ticket',
                     'ticket_num': 5
                 },
             ]
         })
 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={
             'source': self.source,
             'project_name': project_name,
         },
     )
     ThreadLocalORMSession.flush_all()
     try:
         M.session.artifact_orm_session._get().skip_mod_date = True
         with h.push_config(c, user=M.User.anonymous(), app=app):
             for ticket_num, issue in GoogleCodeProjectExtractor.iter_issues(
                     project_name):
                 self.max_ticket_num = max(ticket_num, self.max_ticket_num)
                 ticket = TM.Ticket(app_config_id=app.config._id,
                                    custom_fields=dict(),
                                    ticket_num=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)
                 session(ticket).flush(ticket)
                 session(ticket).expunge(ticket)
             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,
             url=app.url,
         )
         g.post_event('project_updated')
         app.globals.invalidate_bin_counts()
         return app
     except Exception as e:
         h.make_app_admin_only(app)
         raise
     finally:
         M.session.artifact_orm_session._get().skip_mod_date = False
Exemple #4
0
 def import_tool(self,
                 project,
                 user,
                 project_name,
                 mount_point=None,
                 mount_label=None,
                 **kw):
     import_id_converter = ImportIdConverter.get()
     project_name = '%s/%s' % (kw['user_name'], project_name)
     extractor = GitHubProjectExtractor(project_name, user=user)
     if not extractor.has_tracker():
         return
     app = project.install_app('tickets',
                               mount_point,
                               mount_label,
                               EnableVoting=False,
                               open_status_names='open',
                               closed_status_names='closed',
                               import_id={
                                   'source': self.source,
                                   'project_name': project_name,
                               })
     self.github_markdown_converter = GitHubMarkdownConverter(
         kw['user_name'], project_name)
     ThreadLocalORMSession.flush_all()
     try:
         M.session.artifact_orm_session._get().skip_mod_date = True
         with h.push_config(c, user=M.User.anonymous(), app=app):
             for ticket_num, issue in extractor.iter_issues():
                 self.max_ticket_num = max(ticket_num, self.max_ticket_num)
                 ticket = TM.Ticket(app_config_id=app.config._id,
                                    custom_fields=dict(),
                                    ticket_num=ticket_num,
                                    import_id=import_id_converter.expand(
                                        ticket_num, app))
                 self.process_fields(extractor, ticket, issue)
                 self.process_comments(extractor, ticket, issue)
                 self.process_events(extractor, ticket, issue)
                 self.process_milestones(ticket, issue)
                 session(ticket).flush(ticket)
                 session(ticket).expunge(ticket)
             app.globals.custom_fields = self.postprocess_milestones()
             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,
             url=app.url)
         g.post_event('project_updated')
         app.globals.invalidate_bin_counts()
         return app
     finally:
         M.session.artifact_orm_session._get().skip_mod_date = False
 def test_no_criteria(self, paged_search):
     paged_search.return_value = dict(tickets=[
         TM.Ticket(ticket_num=5, summary='our test ticket'),
     ])
     r = self.api_get('/rest/p/test/bugs/search')
     assert_equal(r.status_int, 200)
     assert_equal(
         r.json,
         {'tickets': [
             {
                 'summary': 'our test ticket',
                 'ticket_num': 5
             },
         ]})
Exemple #6
0
    def make_artifact(self, ticket_dict):
        remapped = {}
        for f, v in six.iteritems(ticket_dict):
            transform = self.FIELD_MAP.get(f, ())
            if transform is None:
                continue
            elif transform is True:
                remapped[f] = v
            elif callable(transform):
                transform(remapped, f, v)
            elif transform is ():
                self.custom(remapped, f, v, ticket_dict.get('status'))
            else:
                new_f, conv = transform
                remapped[new_f] = conv(v)

        description = h.really_unicode(
            self.description_processing(remapped['description']))
        creator = owner = ''
        if ticket_dict.get('submitter') and not remapped.get('reported_by_id'):
            creator = '*Originally created by:* {0}\n'.format(
                h.really_unicode(ticket_dict['submitter']))
        if ticket_dict.get(
                'assigned_to') and not remapped.get('assigned_to_id'):
            owner = '*Originally owned by:* {0}\n'.format(
                h.really_unicode(ticket_dict['assigned_to']))
        remapped['description'] = '{0}{1}{2}{3}'.format(
            creator, owner, '\n' if creator or owner else '', description)

        ticket_num = ticket_dict['id']
        existing_ticket = TM.Ticket.query.get(app_config_id=c.app.config._id,
                                              ticket_num=ticket_num)
        if existing_ticket:
            ticket_num = c.app.globals.next_ticket_num()
            self.warnings.append(
                'Ticket #%s: Ticket with this id already exists, using next available id: %s'
                % (ticket_dict['id'], ticket_num))
        else:
            if c.app.globals.last_ticket_num < ticket_num:
                c.app.globals.last_ticket_num = ticket_num
                ThreadLocalORMSession.flush_all()

        ticket = TM.Ticket(app_config_id=c.app.config._id,
                           custom_fields=dict(),
                           ticket_num=ticket_num,
                           import_id=ImportIdConverter.get().expand(
                               ticket_dict['id'], c.app))
        ticket.update(remapped)
        return ticket
Exemple #7
0
 def import_tool(self,
                 project,
                 user,
                 mount_point=None,
                 mount_label=None,
                 **kw):
     import_id_converter = ImportIdConverter.get()
     tracker_json = self._load_json(project)
     tracker_json['tracker_config']['options'].pop('ordinal', None)
     tracker_json['tracker_config']['options'].pop('mount_point', None)
     tracker_json['tracker_config']['options'].pop('mount_label', None)
     tracker_json['tracker_config']['options'].pop('import_id', None)
     app = project.install_app(
         'tickets',
         mount_point,
         mount_label,
         import_id={
             'source': self.source,
             'app_config_id': tracker_json['tracker_config']['_id'],
         },
         open_status_names=tracker_json['open_status_names'],
         closed_status_names=tracker_json['closed_status_names'],
         **tracker_json['tracker_config']['options'])
     ThreadLocalORMSession.flush_all()
     try:
         M.session.artifact_orm_session._get().skip_mod_date = True
         for ticket_json in tracker_json['tickets']:
             reporter = self.get_user(ticket_json['reported_by'])
             owner = self.get_user(ticket_json['assigned_to'])
             with h.push_config(c, user=reporter, app=app):
                 self.max_ticket_num = max(ticket_json['ticket_num'],
                                           self.max_ticket_num)
                 ticket = TM.Ticket(
                     app_config_id=app.config._id,
                     import_id=import_id_converter.expand(
                         ticket_json['ticket_num'], app),
                     description=self.annotate(self.annotate(
                         ticket_json['description'],
                         owner,
                         ticket_json['assigned_to'],
                         label=' owned'),
                                               reporter,
                                               ticket_json['reported_by'],
                                               label=' created'),
                     created_date=dateutil.parser.parse(
                         ticket_json['created_date']),
                     mod_date=dateutil.parser.parse(
                         ticket_json['mod_date']),
                     ticket_num=ticket_json['ticket_num'],
                     summary=ticket_json['summary'],
                     custom_fields=ticket_json['custom_fields'],
                     status=ticket_json['status'],
                     labels=ticket_json['labels'],
                     votes_down=ticket_json['votes_down'],
                     votes_up=ticket_json['votes_up'],
                     votes=ticket_json['votes_up'] -
                     ticket_json['votes_down'],
                     assigned_to_id=owner._id,
                 )
                 # add an attachment to the ticket
                 ticket.add_multiple_attachments(
                     [File(a['url']) for a in ticket_json['attachments']])
                 # trigger the private property
                 ticket.private = ticket_json['private']
                 self.process_comments(
                     ticket, ticket_json['discussion_thread']['posts'])
                 session(ticket).flush(ticket)
                 session(ticket).expunge(ticket)
         app.globals.custom_fields = tracker_json['custom_fields']
         self.process_bins(app, tracker_json['saved_bins'])
         app.globals.last_ticket_num = self.max_ticket_num
         M.AuditLog.log(
             'import tool %s from exported Allura JSON' %
             (app.config.options.mount_point, ),
             project=project,
             user=user,
             url=app.url,
         )
         g.post_event('project_updated')
         app.globals.invalidate_bin_counts()
         ThreadLocalORMSession.flush_all()
         return app
     except Exception:
         h.make_app_admin_only(app)
         raise
     finally:
         M.session.artifact_orm_session._get().skip_mod_date = False
Exemple #8
0
 def ticket(self):
     return TM.Ticket(ticket_num=5,
                      summary='our test ticket',
                      status='open',
                      labels=['tiny', 'minor'])