def smartadd_submit(self): """ Receives a line of smart-add and performs validation/insertion. """ projects = dict( ('%s - %s' % (p.name, p.customer.name), p.id) for p in self.request.filter_viewables(DBSession.query(Project).filter(Project.active)) ) def ticket_provider(project_id): if project_id: project = DBSession.query(Project).get(project_id) return [ t['id'] for t in ticket_store.get_tickets_for_project(project=project, not_invoiced=True, request=self.request) ] parser = SmartAddParser(unicode(self.request.body, 'utf8', 'ignore'), projects=projects, available_tickets=ticket_provider, request=self.request) errors = parser.validation_errors() if errors: # XXX register appropriate exception handler return Response(' - '.join(errors), status_int=400) pte = parser.parsed_time_entry parsed_tickets = pte['tickets'] ticket_summaries = [] entry_durations = list(time_chunks(pte['hours'], len(parsed_tickets))) for parsed_ticket, duration in zip(parsed_tickets, entry_durations): date = pte.get('date') or datetime.date.today() te = TimeEntry(date = date, start = pte['start'], end = pte['start'], description = pte['description'], ticket = parsed_ticket, project_id = pte['project_id'], hours = duration, ) te.request = self.request #bind for user calculation DBSession.add(te) # retrieve ticket descriptions (another trip to the store..) ticket_summaries.append( '#%s (%s)' % (te.ticket, ticket_store.get_ticket(self.request, te.project_id, te.ticket)[3]['summary']) ) return Response(u'Added to ticket(s) %s' % ', '.join(ticket_summaries))
if not project: return { 'state': False, 'message': u'Not able to get the project with id %s' % entry_project, } crstate_errors = timeentry_crstate_validation_errors(entry_project, [entry_ticket], request) if crstate_errors: return { 'state': False, 'message': '\n'.join(crstate_errors), } time_entry = TimeEntry(date = entry_date, hours = entry_time_delta, location = entry_location, description = entry_description, ticket = entry_ticket) time_entry.request = request # bind for user lookup time_entry.project_id = entry_project session.add(time_entry) session.flush() return { 'status': True, 'message': u'Correctly added time entry %s for %s ticket #%s' % (time_entry.id, entry_project, entry_ticket), }