def create(self,
               validated_data,
               recipient=None,
               parent=None,
               reply_all=None,
               auto_moderators=[]):
        """
        Save as many messages as there are recipients.

        Additional actions:
        - If it's a reply, build a conversation
        - Call auto-moderators
        - Notify parties if needed

        Return False if one of the messages is rejected.

        """

        if validated_data and 'recipients' in validated_data:  # action is "create"
            recipients = validated_data['recipients']
            new_messsage = DmMessage(subject=validated_data['subject'],
                                     body=validated_data['body'],
                                     sender=self.sender,
                                     moderation_status=STATUS_ACCEPTED)
        elif parent:  # action is "reply"
            if reply_all:
                recipients = validated_data['recipients']
            else:
                recipients = parent.sender
            quoted = parent.quote(*(format_subject, format_body))
            # print quoted, parent.subject
            sbjct = validated_data['subject'] if (
                validated_data
                and 'subject' in validated_data) else quoted['subject']
            # bdy = validated_data['body'] if (validated_data and 'body' in validated_data) else format_body(parent.sender, parent.body)
            new_messsage = DmMessage(subject=sbjct,
                                     body=validated_data['body'],
                                     sender=self.sender,
                                     moderation_status=STATUS_ACCEPTED)

        # print type(recipients), new_messsage.subject, new_messsage.body

        if parent and not parent.thread_id:  # at the very first reply, make it a conversation
            parent.thread = parent
            parent.save()
            # but delay the setting of parent.replied_at to the moderation step
        if parent:
            new_messsage.parent = parent
            new_messsage.thread_id = parent.thread_id

        initial_moderation = new_messsage.get_moderation()
        initial_dates = new_messsage.get_dates()
        initial_status = new_messsage.moderation_status
        if recipient:
            if isinstance(recipient,
                          get_user_model()) and recipient in recipients:
                recipients.remove(recipient)
            recipients.insert(0, recipient)
        is_successful = True

        if isinstance(recipients, get_user_model()):  # change to list type
            recipients = [recipients]

        for r in recipients:
            usr_model = get_user_model()
            if isinstance(r, get_user_model()):
                new_messsage.recipient = r
            else:
                new_messsage.recipient = usr_model.objects.get(email=r)
            new_messsage.pk = None  # force_insert=True is not accessible from here
            new_messsage.auto_moderate(auto_moderators)
            new_messsage.clean_moderation(initial_status)
            new_messsage.clean_for_visitor()
            m = new_messsage.save()
            if new_messsage.is_rejected():
                is_successful = False
            new_messsage.update_parent(initial_status)
            # new_messsage.notify_users(initial_status, self.site)

            # some resets for next reuse
            if not isinstance(r, get_user_model()):
                new_messsage.email = ''
            new_messsage.set_moderation(*initial_moderation)
            new_messsage.set_dates(*initial_dates)
        return is_successful