def get_queryset(self, **kwargs): org = self.derive_org() qs = Message.objects.filter(org=org) room_id = self.request.REQUEST.get('room', None) ids = self.request.REQUEST.get('ids') before_id = self.request.REQUEST.get('before_id', None) after_id = self.request.REQUEST.get('after_id', None) before_time = self.request.REQUEST.get('before_time', None) after_time = self.request.REQUEST.get('after_time', None) if room_id: room = Room.objects.get(pk=room_id) if not self.request.user.has_room_access(room): raise PermissionDenied() qs = qs.filter(room_id=room.id) else: qs = qs.filter(room__in=self.request.user.get_rooms(org)) if ids: qs = qs.filter(pk__in=ids.split(',')) if before_id: qs = qs.filter(pk__lt=int(before_id)) if after_id: qs = qs.filter(pk__gt=int(after_id)) if before_time: qs = qs.filter(time__lt=parse_iso8601(before_time)) if after_time: qs = qs.filter(time__gt=parse_iso8601(after_time)) return self.order_queryset(qs)
def derive_queryset(self, **kwargs): label_id = self.request.GET.get('label', None) view = ItemView[self.request.GET['view']] assignee_id = self.request.GET.get('assignee', None) before = self.request.REQUEST.get('before', None) after = self.request.REQUEST.get('after', None) label = Label.objects.get(pk=label_id) if label_id else None assignee = Partner.get_all(self.request.org).get( pk=assignee_id) if assignee_id else None if view == ItemView.open: qs = Case.get_open(self.request.org, user=self.request.user, label=label) elif view == ItemView.closed: qs = Case.get_closed(self.request.org, user=self.request.user, label=label) else: raise ValueError('Invalid item view for cases') if assignee: qs = qs.filter(assignee=assignee) if before: qs = qs.filter(opened_on__lt=parse_iso8601(before)) if after: qs = qs.filter(opened_on__gt=parse_iso8601(after)) return qs.prefetch_related('labels').select_related( 'assignee').order_by('-pk')
def get_context_data(self, **kwargs): context = super(CaseCRUDL.Timeline, self).get_context_data(**kwargs) org = self.request.org after = parse_iso8601(self.request.GET.get( 'after', None)) or self.object.message_on before = parse_iso8601(self.request.GET.get( 'before', None)) or self.object.closed_on # if this isn't a first request for the existing items, we check on our side to see if there will be new # items before hitting the RapidPro API do_api_fetch = True if after != self.object.message_on: last_event = self.object.events.order_by('-pk').first() last_outgoing = self.object.outgoing_messages.order_by( '-pk').first() last_event_time = last_event.created_on if last_event else None last_outgoing_time = last_outgoing.created_on if last_outgoing else None last_message_time = safe_max(last_event_time, last_outgoing_time) do_api_fetch = last_message_time and after <= last_message_time if do_api_fetch: # fetch messages in chronological order messages = org.get_temba_client().get_messages( contacts=[self.object.contact_uuid], after=after, before=before, reverse=True) Message.annotate_with_sender(org, messages) else: messages = [] # fetch actions in chronological order actions = self.object.actions.filter(created_on__gte=after, created_on__lte=before) actions = actions.select_related('assignee', 'created_by').order_by('pk') # merge actions and messages and JSON-ify both label_map = {l.name: l for l in Label.get_all(self.request.org)} timeline = [{ 'time': m.created_on, 'type': 'M', 'item': Message.as_json(m, label_map) } for m in messages] timeline += [{ 'time': a.created_on, 'type': 'A', 'item': a.as_json() } for a in actions] timeline = sorted(timeline, key=lambda event: event['time']) context['timeline'] = timeline return context
def derive_search(self): """ Collects and prepares message search parameters into JSON serializable dict """ request = self.request view = ItemView[request.GET['view']] after = parse_iso8601(request.GET.get('after', None)) before = parse_iso8601(request.GET.get('before', None)) label_objs = Label.get_all(request.org, request.user) if view == ItemView.unlabelled: labels = [('-%s' % l.name) for l in label_objs] msg_types = ['I'] else: label_id = request.GET.get('label', None) if label_id: label_objs = label_objs.filter(pk=label_id) labels = [l.name for l in label_objs] msg_types = None if view == ItemView.flagged: labels.append('+%s' % SYSTEM_LABEL_FLAGGED) contact = request.GET.get('contact', None) contacts = [contact] if contact else None groups = request.GET.get('groups', None) groups = parse_csv(groups) if groups else None if view == ItemView.archived: archived = True # only archived elif str_to_bool(request.GET.get('archived', '')): archived = None # both archived and non-archived else: archived = False # only non-archived return { 'labels': labels, 'contacts': contacts, 'groups': groups, 'after': after, 'before': before, 'text': request.GET.get('text', None), 'types': msg_types, 'archived': archived }
def _org_get_last_message_time(org, labelled): key = LAST_LABELLED_TIME_CACHE_KEY if labelled else LAST_UNLABELLED_TIME_CACHE_KEY time = cache.get(key % org.pk) return parse_iso8601(time) if time else None