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, }
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
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
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}