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

add rpc method

parent 15d513ee
Loading
Loading
Loading
Loading
+42 −1
Original line number Diff line number Diff line
@@ -1169,7 +1169,6 @@ def set_metas_to_resource(user: User, resource_id: int, metas: List[dict]) -> bo
    All metas must share the same metadata set.
    """
    # prevent mixing metas from different sets
    # id, value
    metadatasets_ids = []
    for meta_dict in metas:
        meta = Metadata.objects.get(pk=meta_dict["id"])
@@ -1202,6 +1201,48 @@ def set_metas_to_resource(user: User, resource_id: int, metas: List[dict]) -> bo
    return True


@_rpc_groups(["Metadatas", "Collections"])
def set_metas_to_collection(user: User, collection_id: int, metas: List[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_dict in metas:
        meta = Metadata.objects.get(pk=meta_dict["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
    collection_instance = Collection.objects.filter(
        pk=collection_id, deleted_at__isnull=True
    ).first()
    if not collection_instance:
        raise ServiceException("no such collection")
    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 collection_instance.metadatacollectionvalue_set.filter(
        metadata__set=metadataset_instance
    ):
        remove_meta_from_collection(user, collection_id, meta_value.metadata.pk)

    # add metas
    for meta_dict in metas:
        add_meta_to_collection(user, collection_id, meta_dict["id"], meta_dict["value"])
    return True


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