Exemplo n.º 1
0
    def create_contact(self,
                       name=None,
                       number=None,
                       twitter=None,
                       twitterid=None,
                       urn=None,
                       **kwargs):
        """
        Create a contact in the master test org
        """
        urns = []
        if number:
            urns.append(URN.from_tel(number))
        if twitter:
            urns.append(URN.from_twitter(twitter))
        if twitterid:
            urns.append(URN.from_twitterid(twitterid))
        if urn:
            urns.append(urn)

        if not name and not urns:  # pragma: no cover
            raise ValueError("Need a name or URN to create a contact")

        kwargs["name"] = name
        kwargs["urns"] = urns

        if "org" not in kwargs:
            kwargs["org"] = self.org
        if "user" not in kwargs:
            kwargs["user"] = self.user

        return Contact.get_or_create_by_urns(**kwargs)
Exemplo n.º 2
0
    def create_contact(self,
                       name=None,
                       number=None,
                       twitter=None,
                       twitterid=None,
                       urn=None,
                       is_test=False,
                       **kwargs):
        """
        Create a contact in the master test org
        """
        urns = []
        if number:
            urns.append(URN.from_tel(number))
        if twitter:
            urns.append(URN.from_twitter(twitter))
        if twitterid:
            urns.append(URN.from_twitterid(twitterid))
        if urn:
            urns.append(urn)

        if not name and not urns:  # pragma: no cover
            raise ValueError("Need a name or URN to create a contact")

        kwargs['name'] = name
        kwargs['urns'] = urns
        kwargs['is_test'] = is_test

        if 'org' not in kwargs:
            kwargs['org'] = self.org
        if 'user' not in kwargs:
            kwargs['user'] = self.user

        return Contact.get_or_create_by_urns(**kwargs)
Exemplo n.º 3
0
    def create_contact(self,
                       name=None,
                       number=None,
                       twitter=None,
                       urn=None,
                       fields=None,
                       **kwargs):
        """
        Create a contact in the master test org
        """

        org = kwargs.pop("org", None) or self.org
        user = kwargs.pop("user", None) or self.user

        urns = []
        if number:
            urns.append(URN.from_tel(number))
        if twitter:
            urns.append(URN.from_twitter(twitter))
        if urn:
            urns.append(urn)

        assert name or urns, "contact should have a name or a contact"

        kwargs["name"] = name
        kwargs["urns"] = urns

        contact = Contact.get_or_create_by_urns(org, user, **kwargs)

        if fields:
            update_fields_locally(user, contact, fields)

        return contact
Exemplo n.º 4
0
    def create_contacts(self, spec, org, user):
        self._log(f"Creating {len(spec['contacts'])} contacts... ")

        fields_by_key = {f.key: f for f in ContactField.user_fields.all()}

        for c in spec["contacts"]:
            contact = Contact.get_or_create_by_urns(org, user, c["name"],
                                                    c["urns"])
            contact.uuid = c["uuid"]
            contact.save(update_fields=["uuid"], handle_update=False)

            # add to any groups we belong to
            groups = list(
                ContactGroup.user_groups.filter(org=org,
                                                name__in=c.get("groups", [])))
            mods = contact.update_static_groups(groups)

            # set any fields we have
            values = {
                fields_by_key[key]: val
                for key, val in c.get("fields", {}).items()
            }
            mods += contact.update_fields(values)

            contact.modify(user, mods)

        self._log(self.style.SUCCESS("OK") + "\n")
Exemplo n.º 5
0
    def create_contact(self, name=None, number=None, twitter=None, twitterid=None, urn=None, is_test=False, **kwargs):
        """
        Create a contact in the master test org
        """
        urns = []
        if number:
            urns.append(URN.from_tel(number))
        if twitter:
            urns.append(URN.from_twitter(twitter))
        if twitterid:
            urns.append(URN.from_twitterid(twitterid))
        if urn:
            urns.append(urn)

        if not name and not urns:  # pragma: no cover
            raise ValueError("Need a name or URN to create a contact")

        kwargs["name"] = name
        kwargs["urns"] = urns
        kwargs["is_test"] = is_test

        if "org" not in kwargs:
            kwargs["org"] = self.org
        if "user" not in kwargs:
            kwargs["user"] = self.user

        return Contact.get_or_create_by_urns(**kwargs)
Exemplo n.º 6
0
    def parse_contacts(cls, org, json_obj):
        contacts = []
        for contact in json_obj.get(VariableContactAction.CONTACTS):
            name = contact.get(VariableContactAction.NAME, None)
            phone = contact.get(VariableContactAction.PHONE, None)
            contact_uuid = contact.get(VariableContactAction.UUID, None)

            urns = []
            for urn in contact.get(VariableContactAction.URNS, []):
                scheme = urn.get(VariableContactAction.SCHEME)
                path = urn.get(VariableContactAction.PATH)

                if scheme and path:
                    urns.append(URN.from_parts(scheme, path))

            if phone:  # pragma: needs cover
                urns.append(URN.from_tel(phone))

            contact = Contact.objects.filter(uuid=contact_uuid, org=org).first()

            if not contact:
                contact = Contact.get_or_create_by_urns(org, org.created_by, name=None, urns=urns)

                # if they don't have a name use the one in our action
                if name and not contact.name:  # pragma: needs cover
                    contact.name = name
                    contact.save(update_fields=["name"], handle_update=True)

            if contact:
                contacts.append(contact)

        return contacts
Exemplo n.º 7
0
    def save(self):
        """
        Update our contact
        """
        name = self.validated_data.get('name')
        fields = self.validated_data.get('fields')
        language = self.validated_data.get('language')

        # treat empty names as None
        if not name:
            name = None

        changed = []

        if self.instance:
            if self.parsed_urns is not None:
                self.instance.update_urns(self.user, self.parsed_urns)

            # update our name and language
            if name != self.instance.name:
                self.instance.name = name
                changed.append('name')
        else:
            self.instance = Contact.get_or_create_by_urns(self.org, self.user, name, urns=self.parsed_urns,
                                                          language=language, force_urn_update=True)

        # Contact.get_or_create doesn't nullify language so do that here
        if 'language' in self.validated_data and language is None:
            self.instance.language = language.lower() if language else None
            self.instance.save()

        # save our contact if it changed
        if changed:
            self.instance.save(update_fields=changed)

        # update our fields
        if fields is not None:
            for key, value in fields.items():
                existing_by_key = ContactField.objects.filter(org=self.org, key__iexact=key, is_active=True).first()
                if existing_by_key:
                    self.instance.set_field(self.user, existing_by_key.key, value)
                    continue
                elif self.new_fields and key in self.new_fields:
                    new_field = ContactField.get_or_create(org=self.org, user=self.user,
                                                           key=regex.sub('[^A-Za-z0-9]+', '_', key).lower(),
                                                           label=key)
                    self.instance.set_field(self.user, new_field.key, value)

                # TODO as above, need to get users to stop updating via label
                existing_by_label = ContactField.get_by_label(self.org, key)
                if existing_by_label:
                    self.instance.set_field(self.user, existing_by_label.key, value)

        # update our contact's groups
        if self.group_objs is not None:
            self.instance.update_static_groups(self.user, self.group_objs)

        return self.instance
Exemplo n.º 8
0
    def create_contacts(self, spec, org, locations, user):
        self._log(f"Creating {len(spec['contacts'])} contacts... ")

        for c in spec["contacts"]:
            contact = Contact.get_or_create_by_urns(org, user, c["name"], c["urns"])
            contact.uuid = c["uuid"]
            contact.save(update_fields=["uuid"], handle_update=False)

            # add to any groups we belong to
            for g in c.get("groups", []):
                group = ContactGroup.user_groups.get(org=org, name=g)
                group.update_contacts(user, [contact], True)

            # set any fields we have
            for key, value in c.get("fields", {}).items():
                contact.set_field(user, key, value)

        self._log(self.style.SUCCESS("OK") + "\n")
Exemplo n.º 9
0
    def save(self):
        """
        Update our contact
        """
        name = self.validated_data.get("name")
        language = self.validated_data.get("language")
        urns = self.validated_data.get("urns")
        groups = self.validated_data.get("groups")
        custom_fields = self.validated_data.get("fields")

        changed = []

        if self.instance:
            # update our name and language
            if "name" in self.validated_data and name != self.instance.name:
                self.instance.name = name
                changed.append("name")
            if "language" in self.validated_data and language != self.instance.language:
                self.instance.language = language
                changed.append("language")

            if changed:
                self.instance.save(update_fields=changed, handle_update=True)

            if "urns" in self.validated_data and urns is not None:
                self.instance.update_urns(self.context["user"], urns)

        else:
            self.instance = Contact.get_or_create_by_urns(self.context["org"],
                                                          self.context["user"],
                                                          name,
                                                          urns=urns,
                                                          language=language)

        # update our fields
        if custom_fields is not None:
            self.instance.set_fields(user=self.context["user"],
                                     fields=custom_fields)

        # update our groups
        if groups is not None:
            self.instance.update_static_groups(self.context["user"], groups)

        return self.instance
Exemplo n.º 10
0
    def save(self):
        """
        Update our contact
        """
        name = self.validated_data.get('name')
        language = self.validated_data.get('language')
        urns = self.validated_data.get('urns')
        groups = self.validated_data.get('groups')
        custom_fields = self.validated_data.get('fields')

        changed = []

        if self.instance:
            # update our name and language
            if 'name' in self.validated_data and name != self.instance.name:
                self.instance.name = name
                changed.append('name')
            if 'language' in self.validated_data and language != self.instance.language:
                self.instance.language = language
                changed.append('language')

            if 'urns' in self.validated_data and urns is not None:
                self.instance.update_urns(self.context['user'], urns)

            if changed:
                self.instance.save(update_fields=changed)
        else:
            self.instance = Contact.get_or_create_by_urns(self.context['org'],
                                                          self.context['user'],
                                                          name,
                                                          urns=urns,
                                                          language=language)

        # update our fields
        if custom_fields is not None:
            for key, value in six.iteritems(custom_fields):
                self.instance.set_field(self.context['user'], key, value)

        # update our groups
        if groups is not None:
            self.instance.update_static_groups(self.context['user'], groups)

        return self.instance
Exemplo n.º 11
0
    def save(self):
        """
        Update our contact
        """
        name = self.validated_data.get("name")
        language = self.validated_data.get("language")
        urns = self.validated_data.get("urns")
        groups = self.validated_data.get("groups")
        custom_fields = self.validated_data.get("fields")

        changed = []

        if self.instance:
            # update our name and language
            if "name" in self.validated_data and name != self.instance.name:
                self.instance.name = name
                changed.append("name")
            if "language" in self.validated_data and language != self.instance.language:
                self.instance.language = language
                changed.append("language")

            if changed:
                self.instance.save(update_fields=changed, handle_update=True)

            if "urns" in self.validated_data and urns is not None:
                self.instance.update_urns(self.context["user"], urns)

        else:
            self.instance = Contact.get_or_create_by_urns(
                self.context["org"], self.context["user"], name, urns=urns, language=language
            )

        # update our fields
        if custom_fields is not None:
            self.instance.set_fields(user=self.context["user"], fields=custom_fields)

        # update our groups
        if groups is not None:
            self.instance.update_static_groups(self.context["user"], groups)

        return self.instance
Exemplo n.º 12
0
    def save(self):
        """
        Update our contact
        """
        name = self.validated_data.get("name")
        fields = self.validated_data.get("fields")
        language = self.validated_data.get("language")

        # treat empty names as None
        if not name:
            name = None

        changed = []

        if self.instance:
            if self.parsed_urns is not None:
                self.instance.update_urns(self.user, self.parsed_urns)

            # update our name and language
            if name != self.instance.name:
                self.instance.name = name
                changed.append("name")
        else:
            self.instance = Contact.get_or_create_by_urns(
                self.org, self.user, name, urns=self.parsed_urns, language=language, force_urn_update=True
            )

        # Contact.get_or_create doesn't nullify language so do that here
        if "language" in self.validated_data and language is None:
            self.instance.language = language.lower() if language else None
            changed.append("language")

        # save our contact if it changed
        if changed:
            self.instance.save(update_fields=changed, handle_update=True)

        # update our fields
        if fields is not None:
            for key, value in fields.items():
                existing_by_key = ContactField.user_fields.filter(
                    org=self.org, key__iexact=key, is_active=True
                ).first()
                if existing_by_key:
                    self.instance.set_field(self.user, existing_by_key.key, value)
                    continue
                elif self.new_fields and key in self.new_fields:
                    new_field = ContactField.get_or_create(
                        org=self.org, user=self.user, key=regex.sub("[^A-Za-z0-9]+", "_", key).lower(), label=key
                    )
                    self.instance.set_field(self.user, new_field.key, value)

                # TODO as above, need to get users to stop updating via label
                existing_by_label = ContactField.get_by_label(self.org, key)
                if existing_by_label:
                    self.instance.set_field(self.user, existing_by_label.key, value)

        # update our contact's groups
        if self.group_objs is not None:
            self.instance.update_static_groups(self.user, self.group_objs)

        return self.instance