def format_xls(self, value): if isinstance(value, datetime.timedelta): # Render durations as float in order to sum them return total_seconds(value) / 60.0 / 60.0 if isinstance(value, literal): # sanitize HTML return value.striptags() return value
def get_estimate(self, cr): td = self.estimations_cache.get(cr.id, datetime.timedelta(0)) return total_seconds(td)
def get_done(self, cr): td = self.done_cache.get(cr.id, datetime.timedelta(0)) return total_seconds(td)
def search(self, customer_id, project_id, date_from, date_to, users, customer_requests, groupbyfirst): # also search archived projects, if none are specified qry = DBSession.query(TimeEntry).join(TimeEntry.project).join(Project.customer).outerjoin(TimeEntry.author) qry = qry.options(lazyload(TimeEntry.project, TimeEntry.author, Project.customer)) groupby = ['customer'] groupby.extend(groupbyfirst.split('.')) if customer_id is not colander.null: qry = qry.filter(Project.customer_id == customer_id) groupby.remove('customer') if project_id is not colander.null: qry = qry.filter(TimeEntry.project_id == project_id) try: groupby.remove('customer') except ValueError: pass groupby.remove('project') if date_from is not colander.null: qry = qry.filter(TimeEntry.date>=date_from) if date_to is not colander.null: qry = qry.filter(TimeEntry.date<=date_to) if date_from == date_to and date_from is not colander.null: groupby.remove('date') if users: qry = qry.filter(TimeEntry.author_id.in_(users)) qry = qry.filter(te_filter_by_customer_requests(customer_requests, request=self.request)) rows = [] id_tree = IDTree() time_entries = list(self.request.filter_viewables(qry)) proj_tickets = collections.defaultdict(set) for te in time_entries: if te.ticket is None: continue proj_tickets[te.project_id].add(te.ticket) # projectsmap = { # 'project_id': { # 'ticket_id': 'customer_request_id', # ... # }, # ... # } projectsmap = {} for project_id, ticket_ids in proj_tickets.items(): project = DBSession.query(Project).get(project_id) if not self.request.has_permission('reports_all_entries_for_project', project): continue projectsmap[project_id] = dict(ticket_store.get_requests_from_tickets( project, tuple(ticket_ids), request=self.request)) cr_get = DBSession.query(CustomerRequest).get nullcr = NullCustomerRequest() for te in time_entries: if te.ticket is None: customer_request = nullcr else: if not self.request.has_permission('reports_all_entries_for_project', te.project): continue cr_id = projectsmap[te.project_id].get(te.ticket) if not cr_id: continue customer_request = cr_get(cr_id) or nullcr entry = { 'customer': te.project.customer.name.strip(), 'project': te.project.name.strip(), 'request': customer_request.name.strip(), 'user': te.author.fullname.strip(), 'date': te.date.strftime('%Y-%m-%d'), 'description': te.description, 'seconds': total_seconds(te.hours), 'time': 'ore', } rows.append(entry) id_tree.insert_entry(groupby, te.id, **entry) return { 'groupby': groupby, 'rows': rows, 'id_tree': id_tree, }