Пример #1
0
    def get_users_stats(self, users_per_id):
        entity_length = len(users_per_id)
        if not entity_length:
            return

        # retrieve today's squad off members
        today = datetime.now()
        today_off = []
        today_requests = []
        requests = Request.get_active(self.session)
        for req in requests:
            if req.user.id not in users_per_id:
                continue
            today_requests.append(req)
            if req.user not in today_off:
                today_off.append(req.user)

        # retrieve active requests since 15 days ago
        date_from = today - relativedelta(days=15)

        all_reqs = []
        for user_id, user in list(users_per_id.items()):
            user_req = Request.by_user_future_approved(self.session, user,
                                                       date_from=date_from)
            all_reqs.extend(user_req)

        # compute current month squad presence percentages
        data_months = {}
        for req in all_reqs:
            for dt in req.dates:
                if dt.month not in data_months:
                    data_months[dt.month] = {}
                if dt.day not in data_months[dt.month]:
                    data_months[dt.month][dt.day] = []
                if req.user.login not in data_months[dt.month][dt.day]:
                    data_months[dt.month][dt.day].append(req.user.login)

        data_days_current = []
        labels = []
        start_date = today - timedelta(days=15)
        stop_date = today + timedelta(days=15)
        for x in daterange(start_date, stop_date):
            labels.append("'%s'" % x.strftime('%d/%m'))
            perc = ((entity_length - len(data_months.get(x.month, {}).get(x.day, []))) / float(entity_length) * 100)  # noqa
            perc = round(perc, 2)
            if x.isoweekday() in [6, 7]:
                perc = 0.0
            data_days_current.append(perc)

        labels = '[%s]' % ','.join(labels)
        return {'users_per_id': users_per_id,
                'data_days_current': data_days_current,
                'today_requests': today_requests,
                'labels': labels,
                'today': today,
                'today_off': today_off,
                'today_off_length': len(today_off),
                'entity_length': entity_length,
                }
Пример #2
0
    def render(self):
        def fmt_req_type(req):
            label = ' %s' % req.label if req.label else ''
            return '%s%s' % (req.type, label)

        filter_nick = self.request.params.get('nick')
        filter_name = self.request.params.get('name')
        filter_date = self.request.params.get('date')
        # strict if provided will disable partial search for nicknames
        strict = self.request.params.get('strict')

        # remove unwanted chars from filter_date
        if filter_date:
            filter_date = re.sub('[^\d+]', '', filter_date)

        if filter_nick:
            # retrieve all availables nicknames
            all_nick = [nick.lower()
                        for nick in User.get_all_nicknames(self.session)]
            if strict:
                match = filter_nick.lower() in all_nick
            else:
                match = set([nick for nick in all_nick
                             if filter_nick.lower() in nick.lower()])
            if not match:
                # filter_nick does not match any known uid, stop here
                return JsonHTTPNotFound({'message': ('%s not found'
                                                     % filter_nick)})

        requests = Request.get_active(self.session, filter_date)
        data_name = dict([(req.user.name.lower(), fmt_req_type(req))
                          for req in requests])
        data_nick = dict([(req.user.nickname, fmt_req_type(req))
                          for req in requests])

        ret = val = None
        if filter_nick:
            val = data_nick.get(filter_nick.lower())
            if val:
                ret = {filter_nick: val}
            elif not strict:
                val = dict([(k, v) for k, v in data_nick.items()
                            if filter_nick.lower() in k])
                return val
            else:
                return {}

        if filter_name:
            val = data_name.get(filter_name.lower())
            if val:
                ret = {filter_name: val}
            else:
                val = dict([(k, v) for k, v in data_name.items()
                            if filter_name.lower() in k])
                return val

        return ret if ret else data_name
Пример #3
0
    def render(self):
        duration = self.request.params.get('duration')

        def fmt_req_type(req):
            label = ' %s' % req.label if req.label else ''
            if duration and req.days > 1:
                label = '%s (until %s)' % (label,
                                           req.date_to.strftime('%d/%m/%Y'))
            return '%s%s' % (req.type, label)

        filter_nick = self.request.params.get('nick')
        filter_name = self.request.params.get('name')
        filter_date = self.request.params.get('date')
        # strict if provided will disable partial search for nicknames
        strict = self.request.params.get('strict')

        # remove unwanted chars from filter_date
        if filter_date:
            filter_date = re.sub('[^\d+]', '', filter_date)

        if filter_nick:
            # retrieve all availables nicknames
            all_nick = [
                nick.lower() for nick in User.get_all_nicknames(self.session)
            ]
            if strict:
                match = filter_nick.lower() in all_nick
            else:
                match = set([
                    nick for nick in all_nick
                    if filter_nick.lower() in nick.lower()
                ])
            if not match:
                # filter_nick does not match any known uid, stop here
                return JsonHTTPNotFound(
                    {'message': ('%s not found' % filter_nick)})

        requests = Request.get_active(self.session, filter_date)
        data_name = dict([(req.user.name.lower(), fmt_req_type(req))
                          for req in requests])
        data_nick = dict([(req.user.nickname, fmt_req_type(req))
                          for req in requests])

        ret = val = None
        if filter_nick:
            val = data_nick.get(filter_nick.lower())
            if val:
                ret = {filter_nick: val}
            elif not strict:
                val = dict([(k, v) for k, v in data_nick.items()
                            if filter_nick.lower() in k])
                return val
            else:
                return {}

        if filter_name:
            val = data_name.get(filter_name.lower())
            if val:
                ret = {filter_name: val}
            else:
                val = dict([(k, v) for k, v in data_name.items()
                            if filter_name.lower() in k])
                return val

        data_name = OrderedDict(sorted(data_name.items(), key=lambda t: t[0]))
        return ret if ret else data_name
Пример #4
0
    def render(self):
        duration = 1

        def fmt_req_type(req):
            label = ' %s' % req.label if req.label else ''
            if duration and req.days > 1:
                label = '%s (until %s)' % (label,
                                           req.date_to.strftime('%d/%m/%Y'))
            return '%s%s' % (req.type, label)

        order_by = (User.country_id.asc(), User.id)
        users = User.find(self.session, order_by=order_by)

        users = [user for user in users if user.login not in self.ignore_users]

        requests = Request.get_active(self.session)
        data_off = dict([(req.user.login, fmt_req_type(req))
                         for req in requests])

        data = {
            'users': [],
        }

        users_teams = {}
        settings = self.request.registry.settings
        use_ldap = False
        if 'pyvac.use_ldap' in settings:
            use_ldap = asbool(settings.get('pyvac.use_ldap'))

        if use_ldap:
            ldap_users = {}
            # synchronise user groups/roles
            # User.sync_ldap_info(self.session)
            ldap = LdapCache()
            ldap_users = ldap.list_users()

            # discard users which should be deleted
            users = [user for user in users if user.dn in ldap_users]

            teams = ldap.list_teams()
            data['teams'] = teams.keys()
            for team, members in teams.iteritems():
                for member in members:
                    users_teams.setdefault(member, []).append(team)

        for user in users:
            uteams = users_teams.get(user.dn, [])
            item = {
                'name': user.name,
                'email': user.email,
                'bu': user.country,
                'nickname': user.nickname or '-',
                'teams': ', '.join(uteams) if uteams else '-',
            }
            item['vacation'] = data_off.get(user.login)
            item['status'] = 'off' if item['vacation'] else 'on'
            if use_ldap:
                ldap_user = ldap_users[user.dn]
                jpeg = ldap_user.get('jpegPhoto')
                photo = None
                if jpeg:
                    photo = base64.b64encode(jpeg)
                item['photo'] = photo
                item['mobile'] = ldap_user.get('mobile', '-')

            data['users'].append(item)

        return {'data': data}