def document_field_detection_failed_impl(sender, signal, document: Document,
                                         document_field: DocumentField,
                                         message: str,
                                         document_initial_load: bool):
    if document_initial_load:
        # WS notifications for failed detection are disabled when
        # document is being processed for the first time
        return
    project_id = document.project_id
    data = {
        'document': {
            'id': document.pk,
            'name': document.name,
            'project_id': project_id,
            'project_name': document.project.name,
        },
        'field': {
            'id': document_field.uid,
            'code': document_field.code,
            'title': document_field.title
        },
        'message': message
    }
    chan_msg = ChannelMessage(message_types.CHANNEL_MSG_TYPE_DETECTION_FAILED,
                              data)

    users = User.get_users_for_object(object_pk=project_id,
                                      object_model=Project,
                                      perm_name='add_project_document')

    Websockets().send_to_users(qs_users=users, message_obj=chan_msg)
def notify_on_document_changes(doc_id: int, message: ChannelMessage):
    """
    Send the websocket message to the users allowed to read the specified document.
    :param doc_id: ID of the document.
    :param message: Message to send.
    :return:
    """
    project_id = Document.objects.get(pk=doc_id).project_id
    users_with_project_perm = User.get_users_for_object(
        object_pk=project_id,
        object_model=Project,
        perm_name='change_document_field_values')
    users_with_document_perm = User.get_users_for_object(
        object_pk=doc_id,
        object_model=Document,
        perm_name='change_document_field_values')

    Websockets().send_to_users(qs_users=users_with_project_perm.union(
        users_with_document_perm).distinct(),
                               message_obj=message)
def notify_cancelled_upload_session(session, user_id):
    """
    Notify users about cancelled upload session
    """
    cancelled_by_user = User.objects.get(pk=user_id)

    data = {'session_id': session.pk,
            'project_id': session.project_id,
            'cancelled_by_user_id': cancelled_by_user.pk if cancelled_by_user else None,
            'cancelled_by_user_name': cancelled_by_user.name if cancelled_by_user else None}

    message = ChannelMessage(message_types.CHANNEL_MSG_TYPE_CANCELLED_UPLOAD_SESSION, data)

    users = User.get_users_for_object(
        object_pk=session.project_id,
        object_model=Project,
        perm_name='add_project_document')

    Websockets().send_to_users(qs_users=users, message_obj=message)
def notify_failed_load_document(file_name, session_id, directory_path):
    """
    Notify users about failed LoadDocument tasks
    """
    project_id = UploadSession.objects.get(pk=session_id).project_id

    data = dict(
        file_name=file_name,
        project_id=project_id,
        upload_session_id=session_id,
        directory_path=directory_path
    )
    message = ChannelMessage(message_types.CHANNEL_MSG_TYPE_FAILED_LOAD_DOCUMENT, data)

    users = User.get_users_for_object(
        object_pk=project_id,
        object_model=Project,
        perm_name='add_project_document').values_list('pk', flat=True)

    Websockets().send_to_users(qs_users=users, message_obj=message)