Commit e9a61693 authored by Mickaël Desfrênes's avatar Mickaël Desfrênes
Browse files

add rpc method

parent fbda0a64
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -1159,6 +1159,48 @@ def remove_meta_from_resource(user: User, resource_id: int, meta_value_id: int)
    return False


@_rpc_groups(["Metadatas", "Resources"])
def set_metas_to_resource(user: User, resource_id: int, metas: dict) -> bool:
    """
    Sets all metas for a unique metadata set.

    Metas is metadata id => metadata value dictionary.

    All metas must share the same metadata set.
    """
    # prevent mixing metas from different sets
    metadatasets_ids = []
    for meta_id, meta_value in metas.items():
        meta = Metadata.objects.get(pk=meta_id)
        metadatasets_ids.append(meta.set.pk)
    metadatasets_ids = list(set(metadatasets_ids))
    if len(metadatasets_ids) > 1:
        raise ServiceException(
            "can't mix metadata sets when setting multiple meta values at once"
        )

    # check that objects exist
    resource_instance = Resource.objects.filter(
        pk=resource_id, deleted_at__isnull=True
    ).first()
    if not resource_instance:
        raise ServiceException("no such resource")
    metadataset_instance = MetadataSet.objects.filter(pk=metadatasets_ids[0]).first()
    if not metadataset_instance:
        raise ServiceException("no such metadatas set")

    # remove all metas from the set
    for meta_value in resource_instance.metadataresourcevalue_set.filter(
        metadata__set=metadataset_instance
    ):
        remove_meta_from_resource(user, resource_id, meta_value.metadata.pk)

    # add metas
    for meta_id, meta_value in metas.items():
        add_meta_to_resource(user, resource_id, meta_id, meta_value)
    return True


@_rpc_groups(["Metadatas", "Resources"])
def add_meta_to_resource(
    user: User, resource_id: int, meta_id: int, meta_value: str