Example #1
0
 def save(self, obj):
     data = self.form.cleaned_data
     org = self.request.user.get_org()
     name = data['name']
     description = data['description']
     keywords = parse_csv(data['keywords'])
     self.object = Label.create(org, name, description, keywords)
Example #2
0
        def post(self, request, *args, **kwargs):
            org = request.org
            user = request.user

            action = kwargs['action']

            message_ids = parse_csv(request.POST.get('messages', ''), as_ints=True)
            messages = org.incoming_messages.filter(org=org, backend_id__in=message_ids)

            label_id = int(request.POST.get('label', 0))
            label = Label.get_all(org, user).get(pk=label_id) if label_id else None

            if action == 'flag':
                Message.bulk_flag(org, user, messages)
            elif action == 'unflag':
                Message.bulk_unflag(org, user, messages)
            elif action == 'label':
                Message.bulk_label(org, user, messages, label)
            elif action == 'unlabel':
                Message.bulk_unlabel(org, user, messages, label)
            elif action == 'archive':
                Message.bulk_archive(org, user, messages)
            elif action == 'restore':
                Message.bulk_restore(org, user, messages)
            else:
                return HttpResponseBadRequest("Invalid action: %s", action)

            return HttpResponse(status=204)
Example #3
0
def fetch_label_uuids(apps, schema_editor):
    labels = list(Label.objects.filter(uuid=None).select_related('org'))
    for label in labels:
        remote = Label.get_or_create_remote(label.org, label.name)
        label.uuid = remote.uuid
        label.save(update_fields=('uuid', ))

    if labels:
        print "Fetched missing UUIDs for %d labels" % len(labels)
Example #4
0
def fetch_label_uuids(apps, schema_editor):
    labels = list(Label.objects.filter(uuid=None).select_related('org'))
    for label in labels:
        remote = Label.get_or_create_remote(label.org, label.name)
        label.uuid = remote.uuid
        label.save(update_fields=('uuid',))

    if labels:
        print "Fetched missing UUIDs for %d labels" % len(labels)
Example #5
0
        def post(self, request, *args, **kwargs):
            org = request.org
            user = request.user

            message_id = int(kwargs['id'])
            message = org.incoming_messages.filter(org=org, backend_id=message_id).first()

            label_ids = parse_csv(self.request.POST.get('labels', ''), as_ints=True)
            labels = Label.get_all(org, user).filter(pk__in=label_ids)

            message.update_labels(user, labels)

            return HttpResponse(status=204)
Example #6
0
def handle_messages(org, since, until):
    from casepro.backend import get_backend
    from casepro.cases.models import Case, Label
    from .models import Message
    backend = get_backend()

    labelled, unlabelled, case_replies = [], [], []

    # fetch all unhandled messages who now have full contacts
    unhandled = list(Message.get_unhandled(org).filter(contact__is_stub=False).select_related('contact'))
    if unhandled:
        labels_by_keyword = Label.get_keyword_map(org)
        label_matches = defaultdict(list)  # messages that match each label

        for msg in unhandled:
            open_case = Case.get_open_for_contact_on(org, msg.contact, msg.created_on)

            if open_case:
                msg.case = open_case
                msg.is_archived = True
                msg.save(update_fields=('case', 'is_archived'))

                case_replies.append(msg)
            else:
                # only apply labels if there isn't a currently open case for this contact
                matched_labels = msg.auto_label(labels_by_keyword)
                if matched_labels:
                    labelled.append(msg)
                    for label in matched_labels:
                        label_matches[label].append(msg)
                else:
                    unlabelled.append(msg)

        # add labels to matching messages
        for label, matched_msgs in six.iteritems(label_matches):
            if matched_msgs:
                # TODO check for pointless re-labelling

                for msg in matched_msgs:
                    msg.labels.add(label)

                backend.label_messages(org, matched_msgs, label)

        # archive messages which are case replies on the backend
        if case_replies:
            backend.archive_messages(org, case_replies)

        # mark all of these messages as handled
        Message.objects.filter(pk__in=[m.pk for m in unhandled]).update(is_handled=True)

    return {'messages': len(unhandled), 'labelled': len(labelled), 'case_replies': len(case_replies)}
Example #7
0
    def clean_keywords(self):
        keywords = parse_csv(self.cleaned_data['keywords'])
        clean_keywords = []
        for keyword in keywords:
            clean_keyword = normalize(keyword)

            if len(keyword) < Label.KEYWORD_MIN_LENGTH:
                raise forms.ValidationError(_("Keywords must be at least %d characters long")
                                            % Label.KEYWORD_MIN_LENGTH)

            if not Label.is_valid_keyword(keyword):
                raise forms.ValidationError(_("Invalid keyword: %s") % keyword)

            clean_keywords.append(clean_keyword)

        return ','.join(clean_keywords)
Example #8
0
 def create_label(self, org, name, description, words, partners, uuid):
     return Label.create(org, name, description, words, partners, uuid)
Example #9
0
 def create_label(self, org, name, description, words, partners, uuid):
     return Label.create(org, name, description, words, partners, uuid)