Example #1
0
        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)
Example #2
0
        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')
Example #3
0
        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
Example #4
0
    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
        }
Example #5
0
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