コード例 #1
0
ファイル: custom.py プロジェクト: getpenelope/por.dashboard
 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
コード例 #2
0
ファイル: backlog.py プロジェクト: getpenelope/por.dashboard
 def get_estimate(self, cr):
     td = self.estimations_cache.get(cr.id, datetime.timedelta(0))
     return total_seconds(td)
コード例 #3
0
ファイル: backlog.py プロジェクト: getpenelope/por.dashboard
 def get_done(self, cr):
     td = self.done_cache.get(cr.id, datetime.timedelta(0))
     return total_seconds(td)
コード例 #4
0
    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,
                }