Example #1
0
    def access_token(self):
        access_token = memcache.get(GOOGLE_ACCESS_TOKEN_MEMCACHE_KEY % self.id)
        if access_token:
            INFO('Found access token %s for user %s' % (
                access_token, self.name
            ))
        if not access_token:
            args = dict(
                client_id=config['GOOGLE_CLIENT_ID'],
                client_secret=config['GOOGLE_CLIENT_SECRET'],
                refresh_token=self.refresh_token,
                grant_type='refresh_token',
            )
            response = requests.post('https://accounts.google.com/o/oauth2/token', data=args, verify=False)
            if 'access_token' not in response.json:
                ERROR('There is no token in google response %s, status_code: %s, refresh_token: %s, user.email: %s' % (response.json, response.status_code, self.refresh_token, self.email))
                return None

            data = response.json
            INFO('Received response with access_token for user %s: %s' % (
                self.name, data
            ))
            access_token = data['access_token']
            expires = data['expires_in']
            expires = int(expires / 2)
            INFO('Saving access_token %s for user %s in memcached for %s s' % (
                access_token, self.name, expires,
            ))
            memcache.set(
                GOOGLE_ACCESS_TOKEN_MEMCACHE_KEY % self.id,
                access_token,
                expires
            )

        return access_token
Example #2
0
 def get_story_points_field_id(self):
     story_points_key = STORY_POINTS_KEY.format(self.tracker.id)
     story_points_field_id = memcache.get(story_points_key)
     if story_points_field_id is None:
         story_points_field_id = self.query_story_points_field_id()
         memcache.set(story_points_key, story_points_field_id)
     return story_points_field_id
Example #3
0
    def __init__(self, tracker):
        """
        Creates a selector mapping for given tracker
        None -> project_id
        project_name -> project_id
        (project_name, component_name) -> project_id
        """

        self.tracker = tracker
        self.by_ticket_id = {}

        self.default = None
        self.by_project = {}            # key: project_name
        self.by_component = {}          # key: project_name, component_name
        self.by_version = {}            # key: project_name, version
        self.by_component_version = {}  # key: project_name, component_name, version

        cache_key = SELECTOR_CACHE_KEY % tracker.id
        mapping = memcache.get(cache_key)
        if mapping:
            self.clone(mapping)
            return

        projects = Project.query.filter(Project.tracker_id == tracker.id) \
                                .filter(Project.turn_off_selectors == False) \
                                .filter(Project.active == True)
        self.projects = dict([(project.id, project.name) for project in projects])

        for project in projects:
            self._create_for_project(project)

        memcache.set(cache_key, self)
        DEBUG('Created selector mapping for tracker %s: %s, %s' % (
            tracker.id, pformat(self.by_ticket_id), pformat(self.by_component))
        )
Example #4
0
 def get_story_points_field_id(self):
     story_points_key = STORY_POINTS_KEY.format(self.tracker.id)
     story_points_field_id = memcache.get(story_points_key)
     if story_points_field_id is None:
         story_points_field_id = self.query_story_points_field_id()
         memcache.set(story_points_key, story_points_field_id)
     return story_points_field_id
Example #5
0
    def __init__(self, tracker):
        """
        Creates a selector mapping for given tracker
        None -> project_id
        project_name -> project_id
        (project_name, component_name) -> project_id
        """

        self.tracker = tracker
        self.by_ticket_id = {}

        self.default = None
        self.by_project = {}            # key: project_name
        self.by_component = {}          # key: project_name, component_name
        self.by_version = {}            # key: project_name, version
        self.by_component_version = {}  # key: project_name, component_name, version

        cache_key = SELECTOR_CACHE_KEY % tracker.id
        mapping = memcache.get(cache_key)
        if mapping:
            self.clone(mapping)
            return

        projects = Project.query.filter(Project.tracker_id == tracker.id) \
                                .filter(Project.turn_off_selectors == False) \
                                .filter(Project.active == True)
        self.projects = dict([(project.id, project.name) for project in projects])

        for project in projects:
            self._create_for_project(project)

        memcache.set(cache_key, self)
        DEBUG('Created selector mapping for tracker %s: %s, %s' % (
            tracker.id, pformat(self.by_ticket_id), pformat(self.by_component))
        )
Example #6
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
Example #7
0
 def get_office_ip(cls):
     office_ip = memcache.get(OFFICE_IP_MEMCACHE_KEY)
     if not office_ip:
         config = cls.get_current_config(allow_empty=True)
         if config is None:
             return
         office_ip = [c.strip() for c in config.office_ip.split(',')]
         memcache.set(OFFICE_IP_MEMCACHE_KEY, office_ip)
     return office_ip
Example #8
0
 def get_data(self, callback):
     if not self.unfuddle_data:
         data = memcache.get(self.UNFUDDLE_DATA_KEY)
         if not data:
             self.fetch_data(callback)
             return
         else:
             self.unfuddle_data = data
     callback()
Example #9
0
    def get(self):
        date = self.request.GET.get('date')
        if date:
            date = datetime.datetime.strptime(date, '%d.%m.%Y').date()
        else:
            date = datetime.date.today()
        current_data_late = memcache.get(MEMCACHED_NOTIFY_KEY % date)
        blacklist = self.request.user.notify_blacklist
        if current_data_late is not None:
            current_data_late['blacklist'] = blacklist
            return current_data_late

        late_query = DBSession.query(User.id, User.name, Late.id,
                                     Late.late_start, Late.late_end,
                                     Late.explanation, Late.work_from_home)
        late_query = late_query.filter(User.id == Late.user_id)\
                               .filter(Late.date == date)\
                               .filter(Late.deleted == False)\
                               .order_by(User.name)

        absences = DBSession.query(User.id, User.name, Absence.id,
                                   Absence.date_start, Absence.date_end,
                                   Absence.remarks)
        absences = absences.filter(User.id == Absence.user_id)\
                            .filter(Absence.deleted == False)\
                           .filter(Absence.date_start <= date)\
                           .filter(Absence.date_end >= date)\
                           .order_by(User.name)

        current_data_late = dict(
            lates=[
                dict(id=user_id,
                     name=user_name,
                     late_id=late_id,
                     start=start and start.isoformat()[:5] or None,
                     end=end and end.isoformat()[:5] or None,
                     explanation=explanation,
                     work_from_home=work_from_home) for user_id, user_name,
                late_id, start, end, explanation, work_from_home in late_query
            ],
            absences=[
                dict(id=user_id,
                     name=user_name,
                     absence_id=absence_id,
                     start=date_start and date_start.strftime('%d.%m.%y')
                     or None,
                     end=date_end and date_end.strftime('%d.%m.%y') or None,
                     remarks=remarks) for user_id, user_name, absence_id,
                date_start, date_end, remarks in absences
            ])
        memcache.add(
            MEMCACHED_NOTIFY_KEY % date,
            current_data_late,
            60 * 60 * 24,
        )
        current_data_late['blacklist'] = blacklist
        return current_data_late
Example #10
0
 def get_users(self, callback):
     if not self.unfuddle_login_mapping:
         login_mapping = memcache.get(self.UNFUDDLE_LOGIN_MAPPING_KEY)
         if not login_mapping:
             self.fetch_users(callback)
             return
         else:
             self.unfuddle_login_mapping = login_mapping
     callback()
Example #11
0
 def all(cls, cache=True):
     holidays = None
     if cache:
         holidays = memcache.get(HOLIDAYS_MEMCACHE_KEY)
     if holidays is None:
         holidays = dict([ (date[0], True) for date in DBSession.query(Holiday.date) ])
         memcache.set(HOLIDAYS_MEMCACHE_KEY, holidays, HOLIDAYS_MEMCACHE_TIME)
         DEBUG(u"Holidays cached")
     return holidays
Example #12
0
 def get_users(self, callback):
     if not self.unfuddle_login_mapping:
         login_mapping = memcache.get(self.UNFUDDLE_LOGIN_MAPPING_KEY)
         if not login_mapping:
             self.fetch_users(callback)
             return
         else:
             self.unfuddle_login_mapping = login_mapping
     callback()
Example #13
0
 def get_office_ip(cls):
     office_ip = memcache.get(OFFICE_IP_MEMCACHE_KEY)
     if not office_ip:
         config = cls.get_current_config(allow_empty=True)
         if config is None:
             return
         office_ip = [c.strip() for c in config.office_ip.split(',')]
         memcache.set(OFFICE_IP_MEMCACHE_KEY, office_ip)
     return office_ip
Example #14
0
 def get_token(self, callback):
     if not self._token:
         key =  self.TOKEN_MEMCACHE_KEY.format(tracker_type=self.tracker.type, tracker_id=self.tracker.id, user_id=self.user.id)
         token = memcache.get(key)
         if not token:
             self.fetch_token(callback)
         else:
             self._token = token
             callback()
     else:
         callback()
Example #15
0
 def fetcher(this, *args, **kwargs):
     query = self.key_generator(*args, **kwargs)
     key = u"BUGS_LOGIN-%s_TRACKERID-%s_QUERY-%s" % (this.login, this.tracker.id, query)
     bugs = memcache.get(key)
     if bugs is None: # fetch as usual
         DEBUG(u"Bugs not in cache for key %s" % (key, ))
         this.cache_key = key # mark where to cache results
         func(this, *args, **kwargs)
     else:  # bugs got from cache
         DEBUG(u"Bugs found in cache for key %s" % (key, ))
         this.bugs = bugs
         this.success()
Example #16
0
 def fetcher(this, *args, **kwargs):
     query = self.key_generator(*args, **kwargs)
     key = u"BUGS_LOGIN-%s_TRACKERID-%s_QUERY-%s" % (this.login, this.tracker.id, query)
     bugs = memcache.get(key)
     if bugs is None: # fetch as usual
         DEBUG(u"Bugs not in cache for key %s" % (key, ))
         this.cache_key = key.replace(' ', '') # mark where to cache results
         func(this, *args, **kwargs)
     else:  # bugs got from cache
         DEBUG(u"Bugs found in cache for key %s" % (key, ))
         this.bugs = bugs
         this.success()
Example #17
0
 def fetch_milestones(self, callback, url):
     if self.milestones is None:
         self.milestones = memcache.get(self.MILESTONES_KEY)
         if self.milestones is None:
             url = str(url)
             self.request(
                 url,
                 self.get_headers(),
                 partial(self.responded, on_success=partial(self.parse_milestones, callback)),
             )
             return
         else:
             callback()
Example #18
0
 def fetch_milestones(self, callback, url):
     if self.milestones is None:
         self.milestones = memcache.get(self.MILESTONES_KEY)
         if self.milestones is None:
             url = str(url)
             self.request(
                 url,
                 self.get_headers(),
                 partial(self.responded,
                         on_success=partial(self.parse_milestones,
                                            callback)),
             )
             return
         else:
             callback()
Example #19
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
        tracker, creds = query(Tracker, TrackerCredentials)\
                            .filter(TrackerCredentials.tracker_id==sprint.project.tracker_id)\
                            .filter(TrackerCredentials.tracker_id==Tracker.id)\
                            .filter(TrackerCredentials.user_id==self.user.id).one()
        mapping = TrackerCredentials.get_logins_mapping(tracker)
        fetcher = get_fetcher(tracker, creds, mapping)
        fetcher.fetch_scrum(sprint.name, sprint.project.project_selector)
        start = time()
        bugs = []
        while True:
            if fetcher.isReady():
                if fetcher.error:
                    ERROR(u"Fetcher for tracker %s failed with %r" %
                          (tracker.name, fetcher.error))
                    break
                bugs = [bug for bug in fetcher]
                break
            else:  # fetcher is not ready yet
                if time() - start > MAX_TIMEOUT:
                    ERROR(u'Request timed-out')
                    break
                else:
                    sleep(0.1)

        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)

        bugs = self.add_time(bugs, sprint=sprint)
        memcache.set(SCRUM_BUG_CACHE_KEY % sprint.id, bugs,
                     SCRUM_BUG_CACHE_TIMEOUT)
        return bugs
Example #20
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
        tracker, creds = query(Tracker, TrackerCredentials)\
                            .filter(TrackerCredentials.tracker_id==sprint.project.tracker_id)\
                            .filter(TrackerCredentials.tracker_id==Tracker.id)\
                            .filter(TrackerCredentials.user_id==self.user.id).one()
        mapping = TrackerCredentials.get_logins_mapping(tracker)
        fetcher = get_fetcher(tracker, creds, mapping)
        fetcher.fetch_scrum(sprint.name, sprint.project.project_selector)
        start = time()
        bugs = []
        while True:
            if fetcher.isReady():
                if fetcher.error:
                    ERROR(u"Fetcher for tracker %s failed with %r" % (tracker.name, fetcher.error))
                    break
                bugs = [ bug for bug in fetcher ]
                break
            else: # fetcher is not ready yet
                if time() - start > MAX_TIMEOUT:
                    ERROR(u'Request timed-out')
                    break
                else:
                    sleep(0.1)

        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:
            if bug.project_id:
                bug.project = projects.get(bug.project_id)
            else:
                bug.project_id = sprint.project_id
                bug.project = sprint.project

        bugs = self.add_time(bugs, sprint=sprint)
        memcache.set(SCRUM_BUG_CACHE_KEY % sprint.id, bugs, SCRUM_BUG_CACHE_TIMEOUT)
        return bugs
Example #21
0
        def func(*args, **kwargs):
            self = args[0]
            self._memcached_key = mcs._gen_memcached_key(
                self.tracker.id,
                self.login,
                f.func_name,
                args[1:],
                kwargs,
            )
            # clear fetcher
            self._parsed_data = []
            cached = memcache.get(self._memcached_key)

            if cached is not None:
                DEBUG(u"Bugs found in cache for key %s" % self._memcached_key)
                self._parsed_data = cached
            else:
                # start greenlet
                DEBUG(u"Bugs not in cache for key %s" % self._memcached_key)
                self.before_fetch()
                self._greenlet = Greenlet.spawn(f, *args, **kwargs)
Example #22
0
    def access_token(self):
        access_token = memcache.get(GOOGLE_ACCESS_TOKEN_MEMCACHE_KEY % self.id)
        if access_token:
            INFO('Found access token %s for user %s' %
                 (access_token, self.name))
        if not access_token:
            args = dict(
                client_id=config['GOOGLE_CLIENT_ID'],
                client_secret=config['GOOGLE_CLIENT_SECRET'],
                refresh_token=self.refresh_token,
                grant_type='refresh_token',
            )
            response = requests.post(
                'https://accounts.google.com/o/oauth2/token',
                data=args,
                verify=False)
            if 'access_token' not in response.json:
                ERROR(
                    'There is no token in google response %s, status_code: %s, refresh_token: %s, user.email: %s'
                    % (response.json, response.status_code, self.refresh_token,
                       self.email))
                return None

            data = response.json
            INFO('Received response with access_token for user %s: %s' %
                 (self.name, data))
            access_token = data['access_token']
            expires = data['expires_in']
            expires = int(expires / 2)
            INFO('Saving access_token %s for user %s in memcached for %s s' % (
                access_token,
                self.name,
                expires,
            ))
            memcache.set(GOOGLE_ACCESS_TOKEN_MEMCACHE_KEY % self.id,
                         access_token, expires)

        return access_token
Example #23
0
        def func(*args, **kwargs):
            self = args[0]
            self._memcached_key = mcs._gen_memcached_key(
                self.tracker.id,
                self.login,
                f.func_name,
                args[1:],
                kwargs,
            )
            # clear fetcher
            self._parsed_data = []
            cached = memcache.get(self._memcached_key)

            if cached is not None:
                DEBUG(u"Bugs found in cache for key %s" % self._memcached_key)
                self._parsed_data = cached
            else:
                # start greenlet
                DEBUG(u"Bugs not in cache for key %s" % self._memcached_key)
                self._greenlet = Greenlet.spawn(self.before_fetch)
                self._greenlet.join(self.MAX_TIMEOUT)
                if self._greenlet.successful():
                    self._greenlet = Greenlet.spawn(f, *args, **kwargs)
Example #24
0
    def get(self):
        date = self.request.GET.get('date')
        if date:
            date = datetime.datetime.strptime(date, '%d.%m.%Y').date()
        else:
            date = datetime.date.today()
        current_data_late = memcache.get(
            MEMCACHED_NOTIFY_KEY % date
        )
        blacklist = self.request.user.notify_blacklist
        if current_data_late is not None:
            current_data_late['blacklist'] = blacklist
            return current_data_late

        late_query = DBSession.query(
            User.id,
            User.name,
            Late.id,
            Late.late_start,
            Late.late_end,
            Late.explanation,
            Late.work_from_home
        )
        late_query = late_query.filter(User.id == Late.user_id)\
                               .filter(Late.date == date)\
                               .filter(Late.deleted == False)\
                               .order_by(User.name)

        absences = DBSession.query(
            User.id,
            User.name,
            Absence.id,
            Absence.date_start,
            Absence.date_end,
            Absence.remarks
        )
        absences = absences.filter(User.id == Absence.user_id)\
                            .filter(Absence.deleted == False)\
                           .filter(Absence.date_start <= date)\
                           .filter(Absence.date_end >= date)\
                           .order_by(User.name)

        current_data_late = dict(
            lates=[
                dict(
                    id=user_id,
                    name=user_name,
                    late_id=late_id,
                    start=start and start.isoformat()[:5] or None,
                    end=end and end.isoformat()[:5] or None,
                    explanation=explanation,
                    work_from_home=work_from_home
                )for user_id, user_name, late_id, start, end,
                        explanation, work_from_home in late_query
            ],
            absences=[
                dict(
                    id=user_id,
                    name=user_name,
                    absence_id=absence_id,
                    start=date_start and date_start.strftime('%d.%m.%y') or None,
                    end=date_end and date_end.strftime('%d.%m.%y') or None,
                    remarks=remarks
                )
                for user_id, user_name, absence_id, date_start, date_end, remarks in absences
            ]
        )
        memcache.add(
            MEMCACHED_NOTIFY_KEY % date,
            current_data_late,
            60 * 60 * 24,
        )
        current_data_late['blacklist'] = blacklist
        return current_data_late