def get(self, request, **kwargs): self.get_params() groups = ['designers', 'programmers', 'educationaltechnologists', 'video', 'management'] report = WeeklySummaryReportCalculator(groups) data = report.calc(self.week_start, self.week_end) start_str = self.week_start.strftime('%Y%m%d') end_str = self.week_end.strftime('%Y%m%d') filename = "weekly-summary-report-%s-%s" % (start_str, end_str) column_names = ['Project'] + [x.capitalize() for x in groups] + \ ['Project Total'] rows = [] for project in data['project_times']: row = [project['name']] for grouptime in project['group_times']: row.append(interval_to_hours(grouptime)) row.append(interval_to_hours(project['total_time'])) rows.append(row) generator = ReportFileGenerator() return generator.generate( column_names, rows, filename, self.request.GET.get('format'))
def test_interval_to_hours(self): self.assertEqual(interval_to_hours(timedelta(0)), 0) self.assertEqual(interval_to_hours(timedelta(hours=1)), 1) self.assertEqual(interval_to_hours(timedelta(hours=1, seconds=1800)), 1.5) self.assertEqual( interval_to_hours(timedelta(days=1, hours=1, seconds=1800)), 25.5)
def test_interval_to_hours(self): self.assertEqual( utils.interval_to_hours(timedelta(0)), 0) self.assertEqual( utils.interval_to_hours(timedelta(hours=1)), 1) self.assertEqual( utils.interval_to_hours(timedelta(hours=1, seconds=1800)), 1.5) self.assertEqual( utils.interval_to_hours(timedelta(days=1, hours=1, seconds=1800)), 25.5)
def get(self, request, *args, **kwargs): self.get_params() calc = ActiveProjectsCalculator() data = calc.calc(self.interval_start, self.interval_end) # Find dates for displaying to the user start_str = self.interval_start.strftime('%Y%m%d') end_str = self.interval_end.strftime('%Y%m%d') filename = "active-projects-%s-%s" % (start_str, end_str) column_names = [ 'ID', 'Name', 'Project Number', 'Last worked on', 'Project Status', 'Caretaker', 'Hours logged' ] rows = [[ x.pid, x.name, x.projnum, x.last_worked_on, x.status, x.caretaker_user, interval_to_hours(x.hours_logged) ] for x in data['projects']] generator = ReportFileGenerator() return generator.generate(column_names, rows, filename, self.request.GET.get('format'))
def get(self, request, *args, **kwargs): days = 31 if self.request.GET.get('days', None): days = int(self.request.GET['days']) calc = ActiveProjectsCalculator() data = calc.calc(days) # Find dates for displaying to the user now = datetime.now() interval_start = now + timedelta(days=-days) interval_end = now start_str = interval_start.strftime('%Y%m%d') end_str = interval_end.strftime('%Y%m%d') filename = "active-projects-%s-%s" % (start_str, end_str) column_names = ['ID', 'Name', 'Project Number', 'Last worked on', 'Project Status', 'Caretaker', 'Hours logged'] rows = [[x.pid, x.name, x.projnum, x.last_worked_on, x.status, x.caretaker, interval_to_hours(x.hours_logged)] for x in data['projects']] generator = ReportFileGenerator() return generator.generate( column_names, rows, filename, self.request.GET.get('format'))
def get(self, request, pk): p = get_object_or_404(Project, pk=pk) if request.GET.get('interval_start') and \ request.GET.get('interval_end'): interval_start = pytz.timezone(settings.TIME_ZONE).localize( datetime.combine( parse_date(request.GET.get('interval_start')), datetime.min.time())) interval_end = pytz.timezone(settings.TIME_ZONE).localize( datetime.combine( parse_date(request.GET.get('interval_end')), datetime.max.time())) actual_times = p.actual_times_between(interval_start, interval_end) else: actual_times = p.all_actual_times() filename = "project-hours-%d" % p.pid column_names = [ 'iid', 'item title', 'type', 'owner', 'assigned_to', 'priority', 'target_date', 'estimated_time', 'mid', 'milestone', 'user', 'hours', 'completed at'] rows = [[a.item.iid, a.item.title, a.item.type, a.item.owner_user.userprofile.username, a.item.assigned_user.userprofile.username, a.item.priority, a.item.target_date, interval_to_hours(a.item.estimated_time), a.item.milestone.mid, a.item.milestone.name, a.user.userprofile.username, interval_to_hours(a.actual_time), a.completed] for a in actual_times] generator = ReportFileGenerator() return generator.generate( column_names, rows, filename, self.request.GET.get('format', 'csv'))
def get(self, request, pk): p = get_object_or_404(Project, pk=pk) if request.GET.get('interval_start') and \ request.GET.get('interval_end'): interval_start = pytz.timezone(settings.TIME_ZONE).localize( datetime.combine(parse_date(request.GET.get('interval_start')), datetime.min.time())) interval_end = pytz.timezone(settings.TIME_ZONE).localize( datetime.combine(parse_date(request.GET.get('interval_end')), datetime.max.time())) actual_times = p.actual_times_between(interval_start, interval_end) else: actual_times = p.all_actual_times() filename = "project-hours-%d" % p.pid column_names = [ 'iid', 'item title', 'type', 'owner', 'assigned_to', 'priority', 'target_date', 'estimated_time', 'mid', 'milestone', 'user', 'hours', 'completed at' ] rows = [[ a.item.iid, a.item.title, a.item.type, a.item.owner_user.userprofile.username, a.item.assigned_user.userprofile.username, a.item.priority, a.item.target_date, interval_to_hours(a.item.estimated_time), a.item.milestone.mid, a.item.milestone.name, a.user.userprofile.username, interval_to_hours(a.actual_time), a.completed ] for a in actual_times] generator = ReportFileGenerator() return generator.generate(column_names, rows, filename, self.request.GET.get('format', 'csv'))
def get(self, request, *args, **kwargs): self.get_params() calc = StaffReportCalculator( UserProfile.objects.filter(status='active', grp=False)) data = calc.calc(self.interval_start, self.interval_end) start_str = self.interval_start.strftime('%Y%m%d') end_str = self.interval_end.strftime('%Y%m%d') filename = "staff-report-%s-%s" % (start_str, end_str) column_names = ['Staff Member', 'Hours Logged'] rows = [[x['user'].fullname, interval_to_hours(x['user_time'])] for x in data] generator = ReportFileGenerator() return generator.generate(column_names, rows, filename, self.request.GET.get('format'))
def get(self, request, *args, **kwargs): self.get_params() calc = StaffReportCalculator( UserProfile.objects.filter(status='active', grp=False)) data = calc.calc(self.interval_start, self.interval_end) start_str = self.interval_start.strftime('%Y%m%d') end_str = self.interval_end.strftime('%Y%m%d') filename = "staff-report-%s-%s" % (start_str, end_str) column_names = ['Staff Member', 'Hours Logged'] rows = [ [x['user'].fullname, interval_to_hours(x['user_time'])] for x in data] generator = ReportFileGenerator() return generator.generate( column_names, rows, filename, self.request.GET.get('format'))
def get(self, request, *args, **kwargs): self.get_params() calc = StaffReportCalculator(['designers', 'programmers', 'video', 'educationaltechnologists', 'management']) data = calc.calc(self.week_start, self.week_end) start_str = self.week_start.strftime('%Y%m%d') end_str = self.week_end.strftime('%Y%m%d') filename = "staff-report-%s-%s" % (start_str, end_str) column_names = ['Staff Member', 'Group', 'Hours Logged'] rows = [[x['user'].fullname, x['group_name'], interval_to_hours(x['user_time'])] for x in data['users']] generator = ReportFileGenerator() return generator.generate( column_names, rows, filename, self.request.GET.get('format'))
def interval_to_hours(duration): return utils.interval_to_hours(duration)
def body(self): hours = interval_to_hours(self.a.actual_time) return "{:.2f} hour{}".format(hours, pluralize(hours))