def project_tree(context, request): """ This view is used by the customer-project-request javascript filter. """ all_projects = request.filter_viewables(DBSession.query(Project)) all_projects = [ project for project in request.filter_viewables(qry_active_projects()) if request.has_permission('reports_all_entries_for_project', project) ] customers = request.filter_viewables(set(p.customer for p in all_projects if p.active)) return [ { 'id': str(c.id), 'name': c.name, 'projects': [ { 'id': str(p.id), 'name': p.name, 'customer_requests': [ { 'id': str(cr.id), 'name': cr.name, } for cr in p.customer_requests ], } for p in c.projects if p in all_projects ] } for c in customers ]
def __call__(self): schema = self.MyEntriesSchema(validator=validate_period).clone()\ .bind(yesterday=yesterday(), today=datetime.date.today()) limit = 1000 projects = qry_active_projects().all() form = PorInlineForm(schema, formid='my_entries', method='GET', buttons=[ SearchButton(title=u'Search'), ]) form['project_id'].widget.values = [('', '')] + sorted([(str(p.id), ' / '.join([p.customer.name, p.name])) for p in projects], key=lambda x: x[1].lower()) result_table = '' controls = self.request.GET.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return { 'form': e.render(), 'saved_query_form': render_saved_query_form(self.request), 'result_table': None } current_uid = self.request.authenticated_user.id entries_by_date, entries_count = self.search(author_id=current_uid, limit=limit, **appstruct) highlight = functools.partial(webhelpers.html.tools.highlight, phrase=appstruct['searchtext']) delta0 = datetime.timedelta() delta_tot = sum([sum((e.hours for e in x[1]), delta0) for x in entries_by_date], delta0) human_tot = timedelta_as_human_str(delta_tot) days_tot = timedelta_as_work_days(delta_tot) result_table = render('por.dashboard:reports/templates/my_entries_results.pt', { 'entries_by_date': entries_by_date, 'entries_count': entries_count, 'highlight': highlight, 'human_tot': human_tot, 'days_tot': days_tot, 'datetime': datetime, 'ticket_url': ticket_url, 'timedelta_as_human_str': timedelta_as_human_str, }, request=self.request) return { 'form': form.render(appstruct=appstruct), 'saved_query_form': render_saved_query_form(self.request), 'result_table': result_table, }
def report_index(context, request): users = DBSession.query(User).order_by(User.fullname) users = filter_users_with_timeentries(users) projects = sorted(request.filter_viewables(qry_active_projects()), key=unicodelower) customers = sorted(set(p.customer for p in projects), key=unicodelower) current_uid = request.authenticated_user.id saved_queries = DBSession.query(SavedQuery).filter(SavedQuery.author_id==current_uid) return { 'users': users, 'customers': customers, 'projects': projects, 'saved_queries': saved_queries.all() }
def __call__(self): schema = self.CustomSchema(validator=validate_period).clone() projects = self.request.filter_viewables(qry_active_projects()) # select customers that have some active project customers = self.request.filter_viewables(sorted(set(p.customer for p in projects), key=unicodelower)) users = DBSession.query(User).order_by(User.fullname) users = filter_users_with_timeentries(users) customer_requests = self.request.filter_viewables(DBSession.query(CustomerRequest).order_by(CustomerRequest.name)) form = PorInlineForm(schema, formid='report-customer', method='GET', buttons=[ SearchButton(title=u'Search'), ]) workflow = get_workflow(TimeEntry(), 'TimeEntry') all_wf_states = [ (state, workflow._state_data[state]['title'] or state) for state in workflow._state_order ] form['workflow_states'].widget.values = all_wf_states # XXX the following validator is broken form['workflow_states'].validator = colander.OneOf([str(ws[0]) for ws in all_wf_states]) form['customer_id'].widget.values = [('', '')] + [(str(c.id), c.name) for c in customers] # don't validate as it might be an archived customer form['project_id'].widget.values = [('', '')] + [(str(p.id), p.name) for p in projects] # don't validate as it might be an archived project form['users'].widget.values = [(str(u.id), u.fullname) for u in users] # XXX the following validator is broken form['users'].validator = colander.OneOf([str(u.id) for u in users]) form['customer_requests'].widget.values = [(str(c.id), c.name) for c in customer_requests] # XXX the following validator is broken form['customer_requests'].validator = colander.OneOf([str(c.id) for c in customer_requests]) controls = self.request.GET.items() if not controls: # the form is empty return { 'form': form.render(), 'saved_query_form': render_saved_query_form(self.request), 'qs':'', 'result_table': None } try: appstruct = form.validate(controls) except ValidationFailure as e: return { 'form': e.render(), 'saved_query_form': render_saved_query_form(self.request), 'qs':'', 'result_table': None } detail = self.search(render_links=True, **appstruct) result_table = None if detail['rows']: base_link = self.request.path_url.rsplit('/', 1)[0] xls_link = ''.join([base_link, '/', 'custom_xls', '?', self.request.query_string]) json_link = ''.join([base_link, '/', 'custom_json', '?', self.request.query_string]) delta0 = datetime.timedelta() delta_tot = sum((row['hours'] for row in detail['rows']), delta0) human_tot = timedelta_as_human_str(delta_tot) result_table = render('por.dashboard:reports/templates/custom_results.pt', { 'rows': detail['rows'], 'columns': detail['columns'], 'xls_link': xls_link, 'json_link': json_link, 'format_web': self.format_web, 'human_tot': human_tot, }, request=self.request) return { 'form': form.render(appstruct=appstruct), 'saved_query_form': render_saved_query_form(self.request), 'qs': self.request.query_string, 'result_table': result_table, }
def __call__(self): done_state = set() done_contract = set() errors = {} if self.request.POST: done_state, done_contract, errors = self.state_contract_change() if done_state: self.request.add_message('State changed for %d time entries.' % len(done_state)) if done_contract: self.request.add_message('Contract changed for %d time entries.' % len(done_contract)) # GET parameters for the search form fanstatic_resources.report_te_state_change.need() schema = self.StateChangeSchema(validator=validate_period).clone() projects = self.request.filter_viewables(qry_active_projects()) # select customers that have some active project customers = self.request.filter_viewables(sorted(set(p.customer for p in projects), key=unicodelower)) users = DBSession.query(User).order_by(User.fullname) users = filter_users_with_timeentries(users) customer_requests = self.request.filter_viewables(DBSession.query(CustomerRequest).order_by(CustomerRequest.name)) form = PorInlineForm(schema, formid='te_state_change', method='GET', buttons=[ SearchButton(title=u'Search'), ]) workflow = get_workflow(TimeEntry(), 'TimeEntry') all_wf_states = [ (state, workflow._state_data[state]['title'] or state) for state in workflow._state_order ] form['workflow_states'].widget.values = all_wf_states # XXX the following validator is broken form['workflow_states'].validator = colander.OneOf([str(ws[0]) for ws in all_wf_states]) form['customer_id'].widget.values = [('', '')] + [(str(c.id), c.name) for c in customers] # don't validate as it might be an archived customer form['project_id'].widget.values = [('', '')] + [(str(p.id), p.name) for p in projects] # don't validate as it might be an archived project form['users'].widget.values = [(str(u.id), u.fullname) for u in users] # XXX the following validator is broken form['users'].validator = colander.OneOf([str(u.id) for u in users]) form['customer_requests'].widget.values = [(str(c.id), c.name) for c in customer_requests] # XXX the following validator is broken form['customer_requests'].validator = colander.OneOf([str(c.id) for c in customer_requests]) controls = self.request.GET.items() if not controls: # the form is empty return { 'form': form.render(), 'saved_query_form': render_saved_query_form(self.request), 'qs':'', 'result_table': '', } try: appstruct = form.validate(controls) except ValidationFailure as e: return { 'form': e.render(), 'saved_query_form': render_saved_query_form(self.request), 'qs':'', 'result_table': '', } entries_detail = self.search(**appstruct) all_contracts = DBSession().query(Contract.id, Contract.name).all() result_table = render('por.dashboard:reports/templates/state_change.pt', { 'entries_tree': entries_detail['entries_tree'], 'all_wf_states': all_wf_states, 'all_contracts': all_contracts, 'wf_state_names': dict((ws[0], ws[1]) for ws in all_wf_states), 'done_state': done_state, 'done_contract': done_contract, 'errors': errors, }, request=self.request) return { 'form': form.render(appstruct=appstruct), 'saved_query_form': render_saved_query_form(self.request), 'qs': self.request.query_string, 'result_table': result_table, }
def __call__(self): fanstatic_resources.report_all_entries.need() schema = self.AllEntriesSchema(validator=validate_period).clone() projects = [ project for project in self.request.filter_viewables(qry_active_projects()) if self.request.has_permission('reports_all_entries_for_project', project) ] # select customers that have some active project customers = self.request.filter_viewables(sorted(set(p.customer for p in projects), key=unicodelower)) users = DBSession.query(User).order_by(User.fullname) users = filter_users_with_timeentries(users) customer_requests = self.request.filter_viewables(DBSession.query(CustomerRequest).order_by(CustomerRequest.name)) form = PorInlineForm(schema, formid='all_entries', method='GET', buttons=[ SearchButton(title=u'Search'), ]) form['customer_id'].widget.values = [('', '')] + [(str(c.id), c.name) for c in customers] # don't validate as it might be an archived customer form['project_id'].widget.values = [('', '')] + [(str(p.id), p.name) for p in projects] # don't validate as it might be an archived project form['users'].widget.values = [(str(u.id), u.fullname) for u in users] # XXX the following validator is broken form['users'].validator = colander.OneOf([str(u.id) for u in users]) form['customer_requests'].widget.values = [(str(c.id), c.name) for c in customer_requests] # XXX the following validator is broken form['customer_requests'].validator = colander.OneOf([str(c.id) for c in customer_requests]) controls = self.request.GET.items() if not controls: # the form is empty return { 'form': form.render(), 'saved_query_form': render_saved_query_form(self.request), 'qs':'', 'has_results': False } try: appstruct = form.validate(controls) except ValidationFailure as e: return { 'form': e.render(), 'saved_query_form': render_saved_query_form(self.request), 'qs': self.request.query_string, 'has_results': False } entries_detail = self.search(**appstruct) col_headers = { 'customer': u'Customer', 'project': u'Project', 'request': u'Request', 'user': u'User', 'date': u'Data', } columns = [ { 'colvalue': 'time', 'groupbyrank': None, 'pivot': True, 'result': False }, ] for idx, colname in enumerate(entries_detail['groupby']): columns.append({ 'colvalue': colname, 'coltext': colname, 'header': col_headers[colname], 'groupbyrank': idx+1, 'pivot': False, 'result': False }) columns.append({'colvalue': 'description', 'coltext': 'description', 'header': 'description', 'pivot': False, 'result': False}) columns.append({'colvalue': 'seconds', 'groupbyrank': None, 'pivot': False, 'result': True}) sourcetable = { 'rows': entries_detail['rows'], 'columns': columns } return { 'form': form.render(appstruct=appstruct), 'saved_query_form': render_saved_query_form(self.request), 'qs': self.request.query_string, 'has_results': len(sourcetable['rows'])>0, 'tpReport_oConf': json.dumps({ 'sourcetable': sourcetable, 'id_tree': entries_detail['id_tree'], 'groupby': entries_detail['groupby'], }), }