class PhoneCallManager(object): def __init__(self, session): self.session = session self.tickets = TicketManager(self.session) def query(self): q = self.session.query(PhoneCall, TicketCurrentStatus) q = q.filter(PhoneCall.ticket_id == TicketCurrentStatus.ticket_id) return q def get(self, id): return self.session.query(PhoneCall).get(id) def get_status(self, id): q = self.query().filter(PhoneCall.id == id) return q.one() def new_call(self, received, caller, number, callee_id, received_by_id, title, description): with transaction.manager: now = datetime.now() # the ticket is opened by the receiver # and then handled by the callee ticket = self.tickets.open(received_by_id, title, description, callee_id) pc = PhoneCall() pc.received = received pc.caller = caller pc.number = number pc.callee_id = callee_id pc.received_by_id = received_by_id pc.ticket_id = ticket.id self.session.add(pc) return self.session.merge(pc) def _received_range_filter(self, query, start, end): query = query.filter(PhoneCall.received >= start) query = query.filter(PhoneCall.received <= end) return query def _lastchange_range_filter(self, query, start, end): query = query.filter(TicketCurrentStatus.last_change >= start) query = query.filter(TicketCurrentStatus.last_change <= end) return query def get_taken_calls(self, user_id, start=None, end=None, timestamps=False): q = self.query() q = q.filter(PhoneCall.received_by_id == user_id) if start is not None: if timestamps: start, end = convert_range_to_datetime(start, end) q = self._received_range_filter(q, start, end) q = q.filter(TicketCurrentStatus.status != 'closed') return q.all() def get_received_calls(self, user_id, start=None, end=None, timestamps=False): q = self.query() q = q.filter(PhoneCall.callee_id == user_id) if start is not None: if timestamps: start, end = convert_range_to_datetime(start, end) q = self._received_range_filter(q, start, end) q = q.filter(TicketCurrentStatus.status != 'closed') return q.all() def get_assigned_calls(self, user_id, start=None, end=None, timestamps=False): q = self.query() q = q.filter(TicketCurrentStatus.handler_id == user_id) if start is not None: if timestamps: start, end = convert_range_to_datetime(start, end) q = self._received_range_filter(q, start, end) q = q.filter(TicketCurrentStatus.status != 'closed') return q.all() def get_unread_calls(self, user_id, start=None, end=None, timestamps=False): q = self.query() q = q.filter(TicketCurrentStatus.handler_id == user_id) if start is not None: if timestamps: start, end = convert_range_to_datetime(start, end) q = self._received_range_filter(q, start, end) q = q.filter(TicketCurrentStatus.status == 'opened') return q.all() def get_pending_calls(self, user_id, start=None, end=None, timestamps=False): q = self.query() q = q.filter(TicketCurrentStatus.handler_id == user_id) if start is not None: if timestamps: start, end = convert_range_to_datetime(start, end) q = self._received_range_filter(q, start, end) q = q.filter(TicketCurrentStatus.status == 'pending') return q.all() def get_closed_calls(self, user_id, start=None, end=None, timestamps=False): q = self.query() q = q.filter(TicketCurrentStatus.handler_id == user_id) if start is not None: if timestamps: start, end = convert_range_to_datetime(start, end) q = self._received_range_filter(q, start, end) q = q.filter(TicketCurrentStatus.status == 'closed') return q.all() def get_delegated_calls(self, user_id, start=None, end=None, timestamps=False): q = self.query() q = q.filter(PhoneCall.callee_id == user_id) if start is not None: if timestamps: start, end = convert_range_to_datetime(start, end) q = self._received_range_filter(q, start, end) q = q.filter(TicketCurrentStatus.status == 'pending') q = q.filter(TicketCurrentStatus.changed_by_id != user_id) return q.all()
def __init__(self, session): self.session = session self.tickets = TicketManager(self.session)
def assign_to_ticket(self, doc_id, ticket_id, user_id): tickets = TicketManager(self.session) doc = tickets.attach_document(ticket_id, doc_id, user_id) self._tidy_assignments(doc_id) return doc