chris.models.collection_links

 1import dataclasses
 2import functools
 3from dataclasses import dataclass
 4from typing import Iterator
 5
 6from serde import deserialize
 7
 8from chris.models.types import ApiUrl, UserUrl, AdminUrl
 9
10
11@deserialize
12@dataclass(frozen=True)
13class AbstractCollectionLinks:
14    @classmethod
15    def has_field(cls, field_name: str) -> bool:
16        return field_name in cls._field_names()
17
18    @classmethod
19    def _field_names(cls) -> Iterator[str]:
20        return (f.name for f in dataclasses.fields(cls))
21
22    def get(self, collection_name: str) -> str:
23        url = self._dict.get(collection_name, None)
24        if url is None:
25            raise TypeError(
26                f'{self.__class__} does not have link for "{collection_name}"'
27            )
28        return url
29
30    @functools.cached_property
31    def _dict(self) -> dict[str, str]:
32        return dataclasses.asdict(self)
33
34
35@deserialize
36@dataclass(frozen=True)
37class AnonymousCollectionLinks(AbstractCollectionLinks):
38    chrisinstance: ApiUrl
39    files: ApiUrl
40    compute_resources: ApiUrl
41    plugin_metas: ApiUrl
42    plugins: ApiUrl
43    plugin_instances: ApiUrl
44    pipelines: ApiUrl
45    pipeline_instances: ApiUrl
46    workflows: ApiUrl
47    tags: ApiUrl
48    uploadedfiles: ApiUrl
49    pacsfiles: ApiUrl
50    servicefiles: ApiUrl
51    filebrowser: ApiUrl
52
53
54@deserialize
55@dataclass(frozen=True)
56class CollectionLinks(AnonymousCollectionLinks):
57    user: UserUrl
58
59
60@deserialize
61@dataclass(frozen=True)
62class AdminCollectionLinks(CollectionLinks):
63    admin: AdminUrl
64
65
66@deserialize
67@dataclass(frozen=True)
68class AdminApiCollectionLinks(AbstractCollectionLinks):
69    compute_resources: ApiUrl