示例#1
0
文件: bugs.py 项目: rutral/intranet
    def get_project(self, project, resolved=False, credentials=None):
        """
        Get bugs for given project
        """
        start = time()
        bugs = []
        tracker = project.tracker
        credentials = credentials or self._get_credentials(tracker.id)

        if not credentials:
            return []

        login_mapping = TrackerCredentials.get_logins_mapping(tracker)
        fetcher = get_fetcher(tracker, credentials, login_mapping)
        (fetcher.fetch_resolved_bugs_for_query if resolved else fetcher.fetch_bugs_for_query)(*project.get_selector_tuple())

        while True:
            if fetcher.isReady():
                if fetcher.error:
                    WARN(u"Could not fetch bugs from tracker %s: %s" % (tracker.name, fetcher.error))
                    flash(u"Could not fetch bugs from tracker %s" % (tracker.name, ))
                else:
                    for bug in fetcher:
                        bug.project = project
                        bugs.append(bug)
                break
            elif time() - start > MAX_TIMEOUT:
                WARN(u"Fetchers for tracker %s timed-out" % (tracker.name, ))
                flash(u"Getting bugs from tracker %s timed out" % (tracker.name, ))
            else:
                sleep(0.1)

        bugs = self.add_time(bugs)
        return bugs
示例#2
0
 def fetch_scrum(self, sprint_name, project_id=None):
     if not self._custom_fields:
         url = '/api/v1/projects/%s/custom_field_values.json' % project_id
         url = str(make_path(self.tracker.url, url))
         self.request(
             url,
             self.get_headers(),
             partial(self.responded, on_success=partial(self.parse_custom_fields, partial(self.fetch_scrum, sprint_name, project_id))),
         )
     elif not self._milestones:
         url = '/api/v1/milestones.json'
         url = str(make_path(self.tracker.url, url))
         self.request(
             url,
             self.get_headers(),
             partial(self.responded, on_success=partial(self.parse_milestones, partial(self.fetch_scrum, sprint_name, project_id))),
         )
     else:
         url = self.api_url() + '?'
         milestone_id = self._milestones.get(sprint_name)
         if not milestone_id:
             flash('Wrong sprint name')
             self.fail('Wrong sprint name')
         else:
             conditions_string = 'milestone-eq-%s' % self._milestones[sprint_name]
             full_url = serialize_url(url, conditions_string=conditions_string)
             self.fetch(full_url)
示例#3
0
    def get_project(self, project, resolved=False, credentials=None):
        """
        Get bugs for given project
        """
        start = time()
        bugs = []
        tracker = project.tracker
        credentials = credentials or self._get_credentials(tracker.id)

        if not credentials:
            return []

        login_mapping = TrackerCredentials.get_logins_mapping(tracker)
        fetcher = get_fetcher(tracker, credentials, login_mapping)
        (fetcher.fetch_resolved_bugs_for_query if resolved else fetcher.fetch_bugs_for_query)(*project.get_selector_tuple())

        while True:
            if fetcher.isReady():
                if fetcher.error:
                    WARN(u"Could not fetch bugs from tracker %s: %s" % (tracker.name, fetcher.error))
                    flash(u"Could not fetch bugs from tracker %s" % (tracker.name, ))
                else:
                    for bug in fetcher:
                        bug.project = project
                        bugs.append(bug)
                break
            elif time() - start > MAX_TIMEOUT:
                WARN(u"Fetchers for tracker %s timed-out" % (tracker.name, ))
                flash(u"Getting bugs from tracker %s timed out" % (tracker.name, ))
            else:
                sleep(0.1)

        bugs = self.add_time(bugs)
        return bugs
示例#4
0
    def get_sprint(self, sprint):
        bugs = memcache.get(SCRUM_BUG_CACHE_KEY % sprint.id)
        if bugs:
            return bugs
        query = self.request.db_session.query

        project_ids = sprint.bugs_project_ids

        entries = query(Project, Tracker, TrackerCredentials) \
                   .filter(Project.id.in_(project_ids)) \
                   .filter(Project.tracker_id==Tracker.id) \
                   .filter(TrackerCredentials.tracker_id==Project.tracker_id) \
                   .filter(TrackerCredentials.user_id==self.user.id).all()

        fetchers = []
        for project, tracker, creds in entries:
            fetcher = get_fetcher(tracker, creds, tracker.logins_mapping)
            fetcher.fetch_scrum(sprint.name, project.project_selector, project.component_selector)
            fetchers.append(fetcher)
            if tracker.type in ('bugzilla', 'rockzilla', 'igozilla'):
                break

        start = time()
        bugs = []
        while fetchers:
            for i, fetcher in enumerate(fetchers):
                if fetcher.isReady():
                    fetchers.pop(i)
                    if fetcher.error:
                        WARN(u"Could not fetch bugs from tracker %s: %s" % (fetcher.tracker.name, fetcher.error))
                        flash(u"Could not fetch bugs from tracker %s" % (fetcher.tracker.name, ))
                    else:
                        for bug in fetcher:
                            bugs.append(bug)
                    break
            else:
                # no fetcher is yet ready, give them time
                if time() - start > MAX_TIMEOUT:
                    WARN(u"Fetchers for trackers %s timed-out" % (u', '.join(fetcher.tracker.name for fetcher in fetchers)))
                    for fetcher in fetchers:
                        pass
                        flash(u"Getting bugs from tracker %s timed out" % (fetcher.tracker.name, ))
                    fetchers = []
                else:
                    sleep(0.1)
                    # all bugs were fetched, time to resolve their projects

        projects = [bug.project_id for bug in bugs]
        projects = dict((project.id, project) for project in Project.query.filter(Project.id.in_(projects)))

        # now assign projects to bugs
        for bug in bugs:
            bug.project = projects.get(bug.project_id)

        bugs = self.add_time(bugs, sprint=sprint)
        memcache.set(SCRUM_BUG_CACHE_KEY % sprint.id, bugs, SCRUM_BUG_CACHE_TIMEOUT)
        return bugs
示例#5
0
 def _get_bugs(self, fetcher_callback, full_mapping=True):
     start = time()
     fetchers = []
     creds_q = DBSession.query(Tracker, TrackerCredentials)\
                        .filter(Tracker.id==TrackerCredentials.tracker_id)\
                        .filter(TrackerCredentials.user_id==self.user.id)
     for tracker, credentials in creds_q:
         if full_mapping:
             mapping = TrackerCredentials.get_logins_mapping(tracker)
         else:
             mapping = {credentials.login.lower(): self.user}
         fetcher = get_fetcher(tracker, credentials, mapping)
         fetchers.append(fetcher)
         fetcher_callback(fetcher)  # initialize query
     bugs = []
     while fetchers:
         for i, fetcher in enumerate(fetchers):
             if fetcher.isReady():
                 fetchers.pop(i)
                 if fetcher.error:
                     WARN(u"Could not fetch bugs from tracker %s: %s" %
                          (fetcher.tracker.name, fetcher.error))
                     flash(u"Could not fetch bugs from tracker %s" %
                           (fetcher.tracker.name, ))
                 else:
                     for bug in fetcher:
                         bugs.append(bug)
                 break
         else:
             # no fetcher is yet ready, give them time
             if time() - start > MAX_TIMEOUT:
                 WARN(u"Fetchers for trackers %s timed-out" %
                      (u', '.join(fetcher.tracker.name
                                  for fetcher in fetchers)))
                 for fetcher in fetchers:
                     pass
                     flash(u"Getting bugs from tracker %s timed out" %
                           (fetcher.tracker.name, ))
                 fetchers = []
             else:
                 sleep(0.1)
                 # all bugs were fetched, time to resolve their projects
     projects = {}
     for bug in bugs:
         projects[bug.project_id] = None
         # query for all project id's
     projects = dict((project.id, project)
                     for project in Project.query.filter(
                         Project.id.in_(projects.keys())))
     # now assign projects to bugs
     for bug in bugs:
         bug.project = projects.get(bug.project_id)
     return bugs
示例#6
0
 def fetch_scrum(self, sprint_name, project_id=None):
     if not self.unfuddle_data:
         self.get_data(partial(self.fetch_scrum, sprint_name, project_id=project_id))
     else:
         projects_reversed = dict((v, k) for k, v in self.unfuddle_data["projects"].iteritems())
         project_id = projects_reversed[project_id]
         url = self.api_url() + "?"
         milestone_id = self.unfuddle_data["milestones"].get((str(project_id), sprint_name))
         if not milestone_id:
             flash("Wrong sprint name")
             self.fail("Wrong sprint name")
         else:
             conditions_string = "milestone-eq-%s" % milestone_id
             full_url = serialize_url(url, conditions_string=conditions_string)
             self.fetch(full_url)
示例#7
0
文件: bugs.py 项目: rutral/intranet
 def _get_bugs(self, fetcher_callback, full_mapping=True):
     start = time()
     fetchers = []
     creds_q = DBSession.query(Tracker, TrackerCredentials)\
                        .filter(Tracker.id==TrackerCredentials.tracker_id)\
                        .filter(TrackerCredentials.user_id==self.user.id)
     for tracker, credentials in creds_q:
         if full_mapping:
             mapping = TrackerCredentials.get_logins_mapping(tracker)
         else:
             mapping = {credentials.login.lower(): self.user}
         fetcher = get_fetcher(tracker, credentials, mapping)
         fetchers.append(fetcher)
         fetcher_callback(fetcher) # initialize query
     bugs = []
     while fetchers:
         for i, fetcher in enumerate(fetchers):
             if fetcher.isReady():
                 fetchers.pop(i)
                 if fetcher.error:
                     WARN(u"Could not fetch bugs from tracker %s: %s" % (fetcher.tracker.name, fetcher.error))
                     flash(u"Could not fetch bugs from tracker %s" % (fetcher.tracker.name, ))
                 else:
                     for bug in fetcher:
                         bugs.append(bug)
                 break
         else:
             # no fetcher is yet ready, give them time
             if time() - start > MAX_TIMEOUT:
                 WARN(u"Fetchers for trackers %s timed-out" % (u', '.join(fetcher.tracker.name for fetcher in fetchers)))
                 for fetcher in fetchers:
                     pass
                     flash(u"Getting bugs from tracker %s timed out" % (fetcher.tracker.name, ))
                 fetchers = []
             else:
                 sleep(0.1)
                 # all bugs were fetched, time to resolve their projects
     projects = {}
     for bug in bugs:
         projects[bug.project_id] = None
         # query for all project id's
     projects = dict((project.id, project) for project in Project.query.filter(Project.id.in_(projects.keys())))
     # now assign projects to bugs
     for bug in bugs:
         bug.project = projects.get(bug.project_id)
     return bugs
示例#8
0
 def fetch_scrum(self, sprint_name, project_id=None, component_id=None):
     if not self.unfuddle_data:
         self.get_data(partial(self.fetch_scrum, sprint_name, project_id=project_id))
     else:
         projects_reversed = dict((v,k) for k, v in self.unfuddle_data['projects'].iteritems())
         _project_id = projects_reversed.get(project_id)
         if not _project_id:
             error = 'Wrong project name %s' % project_id
             flash('Could match project selector "%s" to Unfuddle project names' % project_id)
             self.fail(error)
             return
         url = self.api_url() + '?'
         milestone_id = self.unfuddle_data['milestones'].get((str(_project_id), sprint_name))
         if not milestone_id:
             flash('Wrong sprint name')
             self.fail('Wrong sprint name')
         else:
             conditions_string = 'milestone-eq-%s' % milestone_id
             full_url = serialize_url(url, conditions_string=conditions_string)
             self.fetch(full_url)
示例#9
0
    def __init__(self, sprint, real_bugs, allowed_colors=None):
        # we have to copy bugs, because each section is removing their bugs
        # from the list

        self._resolve_blocked_and_dependson(real_bugs)
        self.bugs = real_bugs[:]
        bugs = real_bugs[:]

        self._sprint = sprint
        self._board_schema = sprint.get_board()

        namespace = self.create_base_namespace()

        for color in self._board_schema['colors']:
            namespace['bugs'] = self.bugs

            query_colors = self.TMPL_COLORS % color['cond'].strip()

            try:
                colored_bug = pyflwor.execute(query_colors, namespace)
            except PyFlworException as e:
                flash(str(e))
                colored_bug = []

            for cbug in colored_bug:
                cbug.scrum.color = color['color']
                self.bugs.remove(cbug)

        if allowed_colors:
            bugs = [
                bug for bug in bugs if bug.scrum.color in allowed_colors
            ]

        self.columns = [
            Column(column, bugs)
            for column in reversed(self._board_schema['board'])
        ]

        self.columns = list(reversed(self.columns))
示例#10
0
 def fetch_scrum(self, sprint_name, project_id=None):
     if not self._custom_fields:
         url = '/api/v1/projects/%s/custom_field_values.json' % project_id
         url = str(make_path(self.tracker.url, url))
         self.request(
             url,
             self.get_headers(),
             partial(self.responded,
                     on_success=partial(
                         self.parse_custom_fields,
                         partial(self.fetch_scrum, sprint_name,
                                 project_id))),
         )
     elif not self._milestones:
         url = '/api/v1/milestones.json'
         url = str(make_path(self.tracker.url, url))
         self.request(
             url,
             self.get_headers(),
             partial(self.responded,
                     on_success=partial(
                         self.parse_milestones,
                         partial(self.fetch_scrum, sprint_name,
                                 project_id))),
         )
     else:
         url = self.api_url() + '?'
         milestone_id = self._milestones.get(sprint_name)
         if not milestone_id:
             flash('Wrong sprint name')
             self.fail('Wrong sprint name')
         else:
             conditions_string = 'milestone-eq-%s' % self._milestones[
                 sprint_name]
             full_url = serialize_url(url,
                                      conditions_string=conditions_string)
             self.fetch(full_url)
示例#11
0
    def get_sprint(self, sprint):
        project_ids = sprint.bugs_project_ids

        entries = DBSession.query(Project, Tracker, TrackerCredentials, User) \
                   .filter(Project.id.in_(project_ids)) \
                   .filter(Project.tracker_id==Tracker.id) \
                   .filter(TrackerCredentials.tracker_id==Project.tracker_id) \
                   .filter(TrackerCredentials.user_id==User.id)\
                   .filter(TrackerCredentials.user_id==self.user.id).all()

        fetchers = []
        for project, tracker, creds, user in entries:
            fetcher = get_fetcher(tracker, creds, user, tracker.logins_mapping)
            fetcher.fetch_scrum(sprint.name, project.project_selector,
                                project.component_selector)
            fetchers.append(fetcher)
            if tracker.type in ('bugzilla', 'rockzilla', 'igozilla'):
                break

        start = time()
        bugs = []

        for fetcher in fetchers:
            try:
                fbugs = fetcher.get_result()
            except FetcherTimeout as e:
                flash(
                    'Fetchers for trackers %s timed-out' %
                    fetcher.tracker.name,
                    klass='error',
                )
                continue
            except FetcherBadDataError as e:
                flash(e, klass='error')
                continue
            except FetcherBaseException as e:
                flash(
                    'Could not fetch bugs from tracker %s' %
                    fetcher.tracker.name,
                    klass='error',
                )
                continue
            bugs.extend(fbugs)

        projects = [bug.project_id for bug in bugs]
        projects = dict(
            (project.id, project)
            for project in Project.query.filter(Project.id.in_(projects)))

        # now assign projects to bugs
        for bug in bugs:
            bug.project = projects.get(bug.project_id)

        bugs = self.add_time(bugs, sprint=sprint)
        return bugs
示例#12
0
    def get_sprint(self, sprint):
        project_ids = sprint.bugs_project_ids

        entries = DBSession.query(Project, Tracker, TrackerCredentials, User) \
                   .filter(Project.id.in_(project_ids)) \
                   .filter(Project.tracker_id==Tracker.id) \
                   .filter(TrackerCredentials.tracker_id==Project.tracker_id) \
                   .filter(TrackerCredentials.user_id==User.id)\
                   .filter(TrackerCredentials.user_id==self.user.id).all()

        fetchers = []
        for project, tracker, creds, user in entries:
            fetcher = get_fetcher(tracker, creds, user, tracker.logins_mapping)
            fetcher.fetch_scrum(sprint.name, project.project_selector, project.component_selector)
            fetchers.append(fetcher)
            if tracker.type in ('bugzilla', 'rockzilla', 'igozilla'):
                break

        start = time()
        bugs = []

        for fetcher in fetchers:
            try:
                fbugs = fetcher.get_result()
            except FetcherTimeout as e:
                flash(
                    'Fetchers for trackers %s timed-out' % fetcher.tracker.name,
                    klass='error',
                    )
                continue
            except FetcherBadDataError as e:
                flash(e, klass='error')
                continue
            except FetcherBaseException as e:
                flash(
                    'Could not fetch bugs from tracker %s' % fetcher.tracker.name,
                    klass='error',
                    )
                continue
            bugs.extend(fbugs)


        projects = [bug.project_id for bug in bugs]
        projects = dict((project.id, project) for project in Project.query.filter(Project.id.in_(projects)))

        # now assign projects to bugs
        for bug in bugs:
            bug.project = projects.get(bug.project_id)

        bugs = self.add_time(bugs, sprint=sprint)
        return bugs
示例#13
0
    def _get_bugs(self, fetcher_callback, full_mapping=True):
        fetchers = []
        creds_q = DBSession.query(Tracker, TrackerCredentials, User)\
                           .filter(Tracker.id==TrackerCredentials.tracker_id) \
                           .filter(User.id==TrackerCredentials.user_id)\
                           .filter(TrackerCredentials.user_id==self.user.id).all()

        for tracker, credentials, user in creds_q:
            if full_mapping:
                mapping = TrackerCredentials.get_logins_mapping(tracker)
            else:
                mapping = {credentials.login.lower(): self.user}
            fetcher = get_fetcher(tracker, credentials, user, mapping)
            fetchers.append(fetcher)
            fetcher_callback(fetcher)  # initialize query
        bugs = []

        for fetcher in fetchers:
            try:
                fbugs = fetcher.get_result()
                bugs.extend(fbugs)
            except FetcherTimeout as e:
                flash(
                    'Fetchers for trackers %s timed-out' %
                    fetcher.tracker.name,
                    klass='error',
                )
            except FetcherBadDataError as e:
                flash(e, klass='error')
            except FetcherBaseException as e:
                flash(
                    'Could not fetch bugs from tracker %s' %
                    fetcher.tracker.name,
                    klass='error',
                )

        projects = {}
        for bug in bugs:
            projects[bug.project_id] = None
            # query for all project id's
        projects = dict((project.id, project)
                        for project in Project.query.filter(
                            Project.id.in_(projects.keys())))
        # now assign projects to bugs
        for bug in bugs:
            bug.project = projects.get(bug.project_id)
        return bugs
示例#14
0
    def _get_bugs(self, fetcher_callback, full_mapping=True):
        fetchers = []
        creds_q = DBSession.query(Tracker, TrackerCredentials, User)\
                           .filter(Tracker.id==TrackerCredentials.tracker_id) \
                           .filter(User.id==TrackerCredentials.user_id)\
                           .filter(TrackerCredentials.user_id==self.user.id).all()

        for tracker, credentials, user in creds_q:
            if full_mapping:
                mapping = TrackerCredentials.get_logins_mapping(tracker)
            else:
                mapping = {credentials.login.lower(): self.user}
            fetcher = get_fetcher(tracker, credentials, user, mapping)
            fetchers.append(fetcher)
            fetcher_callback(fetcher) # initialize query
        bugs = []

        for fetcher in fetchers:
            try:
                fbugs = fetcher.get_result()
                bugs.extend(fbugs)
            except FetcherTimeout as e:
                flash(
                    'Fetchers for trackers %s timed-out' % fetcher.tracker.name,
                    klass='error',
                )
            except FetcherBadDataError as e:
                flash(e, klass='error')
            except FetcherBaseException as e:
                flash(
                    'Could not fetch bugs from tracker %s' % fetcher.tracker.name,
                    klass='error',
                )


        projects = {}
        for bug in bugs:
            projects[bug.project_id] = None
            # query for all project id's
        projects = dict((project.id, project) for project in Project.query.filter(Project.id.in_(projects.keys())))
        # now assign projects to bugs
        for bug in bugs:
            bug.project = projects.get(bug.project_id)
        return bugs
示例#15
0
    def get_project(self, project, resolved=False, credentials=None):
        """
        Get bugs for given project
        """
        start = time()
        bugs = []
        tracker = project.tracker
        credentials = credentials or self._get_credentials(tracker.id)

        if not credentials:
            return []

        login_mapping = TrackerCredentials.get_logins_mapping(tracker)
        fetcher = get_fetcher(tracker, credentials, self.user, login_mapping)
        fetcher.fetch_bugs_for_query(*project.get_selector_tuple(),
                                     resolved=resolved)

        bugs = []

        try:
            for bug in fetcher.get_result():
                bug.project = project
                bugs.append(bug)
        except FetcherTimeout as e:
            flash(
                'Fetchers for trackers %s timed-out' % fetcher.tracker.name,
                klass='error',
            )
        except FetcherBadDataError as e:
            flash(e, klass='error')
        except FetcherBaseException as e:
            flash(
                'Could not fetch bugs from tracker %s' % fetcher.tracker.name,
                klass='error',
            )

        bugs = self.add_time(bugs)
        return bugs
示例#16
0
    def __init__(self, section, bugs):
        self.name = section['name']

        namespace = Board.create_base_namespace()
        namespace['bugs'] = bugs

        condition = section['cond'].strip()

        if condition:
            query = self.TMPL % section['cond']

            try:
                self.bugs = pyflwor.execute(query, namespace)
            except PyflworSyntaxError as e:
                flash("Syntax error in query: %s" % section['cond'])
                self.bugs = []
            except KeyError as e:
                msg = "Unexpected token %s in query: '%s'" % (
                    e,
                    section['cond'],
                )
                flash(msg)
                self.bugs = []
            except PyFlworException as e:
                flash(str(e))
                self.bugs = []
            except Exception as e:
                err = "Problem with query %s, namespace %s" % (query, namespace)
                EXCEPTION(err)
                self.bugs = []
        else:
            # no condition == all bugs
            self.bugs = bugs[:]

        #those bugs that was taken should be removed from global bug list
        for bug in self.bugs:
            bugs.remove(bug)
示例#17
0
    def get_project(self, project, resolved=False, credentials=None):
        """
        Get bugs for given project
        """
        start = time()
        bugs = []
        tracker = project.tracker
        credentials = credentials or self._get_credentials(tracker.id)

        if not credentials:
            return []

        login_mapping = TrackerCredentials.get_logins_mapping(tracker)
        fetcher = get_fetcher(tracker, credentials, self.user, login_mapping)
        fetcher.fetch_bugs_for_query(*project.get_selector_tuple(), resolved=resolved)

        bugs = []

        try:
            for bug in fetcher.get_result():
                bug.project = project
                bugs.append(bug)
        except FetcherTimeout as e:
            flash(
                'Fetchers for trackers %s timed-out' % fetcher.tracker.name,
                klass='error',
            )
        except FetcherBadDataError as e:
            flash(e, klass='error')
        except FetcherBaseException as e:
            flash(
                'Could not fetch bugs from tracker %s' % fetcher.tracker.name,
                klass='error',
            )

        bugs = self.add_time(bugs)
        return bugs