def _annually_report(self, year): year_start = datetime.date(year, 1, 1) year_end = datetime.date(year, 12, 31) excuses_error = None config_obj = ApplicationConfig.get_current_config() entries = DBSession.query('user_id', 'date').from_statement(""" SELECT date_trunc('day', s.date) as date, s.user_id as user_id FROM time_entry s WHERE DATE(s.modified_ts) > s.date AND s.date >= :year_start AND s.date <= :year_end GROUP BY date_trunc('day', s.date), s.user_id """).params(year_start=year_start, year_end=year_end) users = User.query.filter(User.is_active==True)\ .filter(User.is_not_client())\ .order_by(User.is_freelancer(), User.name) entries_grouped = {} _excuses = excuses.wrongtime() for user_id, date in entries: month = date.month - 1 entry = entries_grouped.setdefault(user_id, [0] * 12) if date.strftime('%Y-%m-%d') not in _excuses.get(user_id, {}).keys(): entry[month] += 1 stats = {} for user_id, entry in entries_grouped.iteritems(): stats_entry = stats.setdefault(user_id, [0]) stats_entry[0] = sum(entry) return dict( entries=entries_grouped, stats=stats, users=users, year_start=year_start, limit=config_obj.monthly_incorrect_time_record_limit, excuses_error=excuses_error, )
def _annually_report(self, year): year_start = datetime.date(year, 1, 1) year_end = datetime.date(year, 12, 31) excuses_error = None config_obj = ApplicationConfig.get_current_config() entries = DBSession.query('user_id', 'date').from_statement(""" SELECT date_trunc('day', s.date) as date, s.user_id as user_id FROM time_entry s WHERE DATE(s.modified_ts) > s.date AND s.date >= :year_start AND s.date <= :year_end GROUP BY date_trunc('day', s.date), s.user_id """).params(year_start=year_start, year_end=year_end) users = User.query.filter(User.is_active==True)\ .filter(User.is_not_client())\ .order_by(User.is_freelancer(), User.name) entries_grouped = {} _excuses = excuses.wrongtime() for user_id, date in entries: month = date.month - 1 entry = entries_grouped.setdefault(user_id, [0]*12) if date.strftime('%Y-%m-%d') not in _excuses.get(user_id, {}).keys(): entry[month] += 1 stats = {} for user_id, entry in entries_grouped.iteritems(): stats_entry = stats.setdefault(user_id, [0]) stats_entry[0] = sum(entry) return dict( entries=entries_grouped, stats=stats, users=users, year_start=year_start, limit=config_obj.monthly_incorrect_time_record_limit, excuses_error=excuses_error, )
def get(self): # Requested (or current) year year = self.request.GET.get('year') year = int(year) if year else datetime.date.today().year # Year start day and end day start = datetime.date(year, 1, 1) end = datetime.date(year, 12, 31) start_day = dict( day=start.day, dow=start.weekday(), ) day_count, date_range, months = self.necessary_data(start, end) holidays = Holiday.query \ .filter(Holiday.date >= start) \ .all() # Users users = [] user_groups = [] for name, (fullname, shortcut) in self.request.user.get_locations(): usersq = User.query.filter(User.is_not_client()) \ .filter(User.is_active==True) \ .filter(User.location==name) \ .order_by(User.is_freelancer(), User.name).all() users.extend(usersq) user_groups.append((fullname, len(usersq))) # Leaves leave_mandated = Leave.get_for_year(start.year) leave_used = Leave.get_used_for_year(start.year) # Transform users to dictionary, group by city and order by leave days users = [dict( id=str(u.id), name=u.name, leave_mandated=leave_mandated[u.id][0], leave_used=leave_used[u.id], location=u.location, ) for u in users] users = sorted( users, key=lambda u: u['location'], ) user_groups = sorted( user_groups, key=lambda u: u, ) absences, absences_months = self.get_absences(start, end, users) lates = self.get_lates(start, end) absences_sum = ( reduce(lambda s, u: s + u['leave_used'], users, 0), reduce(lambda s, u: s + u['leave_mandated'], users, 0), ) data = { 'users': users, 'userGroups': user_groups, 'year': start.year, 'startDay': start_day, 'dayCount': day_count, 'months': months, 'absences': absences, 'absencesSum': absences_sum, 'absencesMonths': absences_months, 'lates': lates, 'holidays': [h.date.strftime('%Y-%m-%d') for h in holidays], } return dict( data=json.dumps(data, ensure_ascii=False), year=start.year, v=self, )
def get(self): month_start, month_end = self._get_month() entries = DBSession.query('user_id', 'date', 'time', 'late_count').from_statement(""" SELECT t.user_id as "user_id", t.date as "date", ( SELECT COALESCE(SUM(h.time), 0.0) FROM time_entry h WHERE h.user_id = t.user_id AND h.date = t.date AND h.deleted = FALSE ) as "time", ( SELECT COUNT(*) FROM time_entry s WHERE s.user_id = t.user_id AND s.date = t.date AND DATE(s.modified_ts) > s.date ) as "late_count" FROM time_entry t WHERE t.date >= :month_start AND t.date <= :month_end GROUP BY t.user_id, t.date; """).params(month_start=month_start, month_end=month_end) if not self.request.has_perm('can_see_users_times'): users = [self.request.user ] # TODO do we need to constrain entries also? locations = {self.request.user.location: ('', 1)} else: location_names = self.request.user.get_locations() users = {} for name, (fullname, shortcut) in location_names: usersq = User.query.filter(User.is_not_client()) \ .filter(User.is_active==True) \ .filter(User.location==name) \ .order_by(User.is_freelancer(), User.name) users[name] = usersq.all() locations = { name: [User.LOCATIONS[name][0], len(users)] for name, users in users.iteritems() } locations[self.request.user.location][1] -= 1 ordered_users = [] for name, (fullname, shortcut) in location_names: ordered_users.extend(users[name]) users = ordered_users # move current user to the front of the list current_user_index = None for i, user in enumerate(users): if user.id == self.request.user.id: current_user_index = i users.insert(0, users.pop(current_user_index)) today = datetime.date.today() grouped = defaultdict(lambda: defaultdict(lambda: 0.0)) late = defaultdict(lambda: defaultdict(lambda: False)) sums = defaultdict(lambda: 0.0) daily_sums = defaultdict(lambda: 0.0) for user_id, date, time, late_count in entries: grouped[user_id][date] = time if date <= today: sums[user_id] += time daily_sums[date] += time late[user_id][date] = late_count > 0 holidays = Holiday.all() count_of_required_month_hours = {} count_of_required_hours_to_today = {} for user in users: sftw = user.start_full_time_work if sftw: if sftw > month_end: start_work = datetime.date(today.year + 10, 1, 1) elif sftw < month_start: start_work = month_start else: start_work = sftw month_hours = h.get_working_days(start_work, month_end) * 8 today_ = today if today < month_end else month_end hours_to_today = h.get_working_days(start_work, today_) * 8 count_of_required_month_hours[user.id] = month_hours count_of_required_hours_to_today[user.id] = hours_to_today else: count_of_required_month_hours[user.id] = 0 count_of_required_hours_to_today[user.id] = 0 return dict( entries=grouped, users=users, sums=sums, late=late, excuses=excuses.wrongtime(), daily_sums=daily_sums, monthly_sum=sum(daily_sums.values()), dates=__builtin__.list(dates_between(month_start, month_end)), is_holiday=lambda date: Holiday.is_holiday(date, holidays=holidays ), month_start=month_start, prev_date=previous_month(month_start), next_date=next_month(month_start), today=today, count_of_required_month_hours=count_of_required_month_hours, count_of_required_hours_to_today=count_of_required_hours_to_today, locations=locations, )
def get(self): month_start, month_end = self._get_month() entries = DBSession.query('user_id', 'date', 'time', 'late_count').from_statement(""" SELECT t.user_id as "user_id", t.date as "date", ( SELECT COALESCE(SUM(h.time), 0.0) FROM time_entry h WHERE h.user_id = t.user_id AND h.date = t.date AND h.deleted = FALSE ) as "time", ( SELECT COUNT(*) FROM time_entry s WHERE s.user_id = t.user_id AND s.date = t.date AND DATE(s.modified_ts) > s.date ) as "late_count" FROM time_entry t WHERE t.date >= :month_start AND t.date <= :month_end GROUP BY t.user_id, t.date; """).params(month_start=month_start, month_end=month_end) if not self.request.has_perm('can_see_users_times'): users = [self.request.user] # TODO do we need to constrain entries also? locations= { self.request.user.location: ('', 1) } else: users_w = User.query.filter(User.is_not_client()) \ .filter(User.is_active==True) \ .filter(User.location=='wroclaw') \ .order_by(User.is_freelancer(), User.name) users_w = users_w.all() users_p = User.query.filter(User.is_not_client()) \ .filter(User.is_active==True) \ .filter(User.location=='poznan') \ .order_by(User.is_freelancer(), User.name) users_p = users_p.all() locations = { 'wroclaw': [u'Wrocław', len(users_w)], 'poznan': [u'Poznań', len(users_p)], } locations[self.request.user.location][1] -= 1 if self.request.user.location == 'wroclaw': users = users_w users.extend(users_p) else: users = users_p users.extend(users_w) today = datetime.date.today() grouped = defaultdict(lambda: defaultdict(lambda: 0.0)) late = defaultdict(lambda: defaultdict(lambda: False)) sums = defaultdict(lambda: 0.0) daily_sums = defaultdict(lambda: 0.0) for user_id, date, time, late_count in entries: grouped[user_id][date] = time if date <= today: sums[user_id] += time daily_sums[date] += time late[user_id][date] = late_count > 0 holidays = Holiday.all() count_of_required_month_hours = {} count_of_required_hours_to_today = {} for user in users: sftw = user.start_full_time_work if sftw: if sftw > month_end: start_work = datetime.date(today.year+10, 1, 1) elif sftw < month_start: start_work = month_start else: start_work = sftw month_hours = h.get_working_days(start_work, month_end) * 8 today_ = today if today < month_end else month_end hours_to_today = h.get_working_days(start_work, today_) * 8 count_of_required_month_hours[user.id] = month_hours count_of_required_hours_to_today[user.id] = hours_to_today else: count_of_required_month_hours[user.id] = 0 count_of_required_hours_to_today[user.id] = 0 # move current user to the front of the list current_user_index = None for i, user in enumerate(users): if user.id == self.request.user.id: current_user_index = i users.insert(0, users.pop(current_user_index)) return dict( entries=grouped, users=users, sums=sums, late=late, excuses=excuses.wrongtime(), daily_sums=daily_sums, monthly_sum=sum(daily_sums.values()), dates=__builtin__.list(dates_between(month_start, month_end)), is_holiday=lambda date: Holiday.is_holiday(date, holidays=holidays), month_start=month_start, prev_date=previous_month(month_start), next_date=next_month(month_start), today=today, count_of_required_month_hours=count_of_required_month_hours, count_of_required_hours_to_today=count_of_required_hours_to_today, locations=locations, )
def get(self): # Requested (or current) year year = self.request.GET.get('year') year = int(year) if year else datetime.date.today().year # Year start day and end day start = datetime.date(year, 1, 1) end = datetime.date(year, 12, 31) start_day = dict( day=start.day, dow=start.weekday(), ) day_count, date_range, months = self.necessary_data(start, end) holidays = Holiday.query \ .filter(Holiday.date >= start) \ .all() # Users users_p = User.query.filter(User.is_not_client()) \ .filter(User.is_active==True) \ .filter(User.location=='poznan') \ .order_by(User.is_freelancer(), User.name) users_p = users_p.all() users_w = User.query.filter(User.is_not_client()) \ .filter(User.is_active==True) \ .filter(User.location=='wroclaw') \ .order_by(User.is_freelancer(), User.name) users_w = users_w.all() user_groups = [ (u'Poznań', len(users_p)), (u'Wrocław', len(users_w)), ] reverse = False if self.request.user.location == 'wroclaw': user_groups.insert(0, user_groups.pop()) reverse = True users_p.extend(users_w) # Leaves leave_mandated = Leave.get_for_year(start.year) leave_used = Leave.get_used_for_year(start.year) # Transform users to dictionary, group by city and order by leave days users = [dict( id=str(u.id), name=u.name, leave_mandated=leave_mandated[u.id][0], leave_used=leave_used[u.id], location=u.location, ) for u in users_p] employees, students = [], [] for user in users: if user['leave_mandated'] > 0: employees.append(user) else: students.append(user) users = employees + students # groupby location users = sorted( users, key=lambda u: u['location'], reverse=reverse ) absences, absences_months = self.get_absences(start, end, users) lates = self.get_lates(start, end) absences_sum = ( reduce(lambda s, u: s + u['leave_used'], users, 0), reduce(lambda s, u: s + u['leave_mandated'], users, 0), ) data = { 'users': users, 'userGroups': user_groups, 'year': start.year, 'startDay': start_day, 'dayCount': day_count, 'months': months, 'absences': absences, 'absencesSum': absences_sum, 'absencesMonths': absences_months, 'lates': lates, 'holidays': [h.date.strftime('%Y-%m-%d') for h in holidays], } return dict( data=json.dumps(data, ensure_ascii=False), year=start.year, v=self, )
def get(self): # Requested (or current) year year = self.request.GET.get('year') year = int(year) if year else datetime.date.today().year # Year start day and end day start = datetime.date(year, 1, 1) end = datetime.date(year, 12, 31) start_day = dict( day=start.day, dow=start.weekday(), ) day_count, date_range, months = self.necessary_data(start, end) holidays = Holiday.query \ .filter(Holiday.date >= start) \ .all() # Users users = [] user_groups = [] for name, (fullname, shortcut) in self.request.user.get_locations(): usersq = User.query.filter(User.is_not_client()) \ .filter(User.is_active==True) \ .filter(User.location==name) \ .order_by(User.is_freelancer(), User.name).all() users.extend(usersq) user_groups.append((fullname, len(usersq))) # Leaves leave_mandated = Leave.get_for_year(start.year) leave_used = Leave.get_used_for_year(start.year) # Transform users to dictionary, group by city and order by leave days users = [ dict( id=str(u.id), name=u.name, leave_mandated=leave_mandated[u.id][0], leave_used=leave_used[u.id], location=u.location, ) for u in users ] users = sorted( users, key=lambda u: u['location'], ) user_groups = sorted( user_groups, key=lambda u: u, ) absences, absences_months = self.get_absences(start, end, users) lates = self.get_lates(start, end) absences_sum = ( reduce(lambda s, u: s + u['leave_used'], users, 0), reduce(lambda s, u: s + u['leave_mandated'], users, 0), ) data = { 'users': users, 'userGroups': user_groups, 'year': start.year, 'startDay': start_day, 'dayCount': day_count, 'months': months, 'absences': absences, 'absencesSum': absences_sum, 'absencesMonths': absences_months, 'lates': lates, 'holidays': [h.date.strftime('%Y-%m-%d') for h in holidays], } return dict( data=json.dumps(data, ensure_ascii=False), year=start.year, v=self, )