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)
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)
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)
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)
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)
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)}
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)
def create_label(self, org, name, description, words, partners, uuid): return Label.create(org, name, description, words, partners, uuid)