1
|
|
|
from typing import Mapping |
2
|
|
|
|
3
|
|
|
from skosprovider.registry import Registry |
4
|
|
|
from sqlalchemy.exc import NoResultFound |
5
|
|
|
from sqlalchemy.orm import Session |
6
|
|
|
|
7
|
|
|
from atramhasis import mappers |
8
|
|
|
from atramhasis.data.datamanagers import ProviderDataManager |
9
|
|
|
from atramhasis.data.models import Provider |
10
|
|
|
from atramhasis.errors import SQLAlchemyProviderNotFoundException |
11
|
|
|
from atramhasis.errors import ValidationError |
12
|
|
|
from atramhasis.scripts.delete_scheme import delete_scheme |
13
|
|
|
from atramhasis.validators import validate_provider_json |
14
|
|
|
|
15
|
|
|
|
16
|
|
|
def create_provider(json_data: Mapping, session: Session, skos_registry: Registry) -> Provider: |
17
|
|
|
"""Process a provider JSON into a newly stored Provider.""" |
18
|
|
|
for provider in skos_registry.get_providers(): |
19
|
|
|
if provider.get_vocabulary_uri() == json_data["conceptscheme_uri"]: |
20
|
|
|
raise ValidationError( |
21
|
|
|
"Provider could not be validated.", |
22
|
|
|
[{"conceptscheme_uri": "Collides with existing provider."}], |
23
|
|
|
) |
24
|
|
|
validate_provider_json(json_data) |
25
|
|
|
db_provider = mappers.map_provider(json_data) |
26
|
|
|
if not db_provider.id: |
27
|
|
|
# Store conceptscheme first so we can copy its id |
28
|
|
|
session.add(db_provider.conceptscheme) |
29
|
|
|
session.flush() |
30
|
|
|
db_provider.id = str(db_provider.conceptscheme.id) |
31
|
|
|
|
32
|
|
|
session.add(db_provider) |
33
|
|
|
session.flush() |
34
|
|
|
|
35
|
|
|
return db_provider |
36
|
|
|
|
37
|
|
|
|
38
|
|
|
def update_provider(provider_id: str, json_data: Mapping, session: Session) -> Provider: |
39
|
|
|
"""Process a JSON into to update an existing provider.""" |
40
|
|
|
validate_provider_json(json_data, provider_id) |
41
|
|
|
manager = ProviderDataManager(session) |
42
|
|
|
db_provider = manager.get_provider_by_id(provider_id) |
43
|
|
|
db_provider = mappers.map_provider(json_data, provider=db_provider) |
44
|
|
|
session.flush() |
45
|
|
|
return db_provider |
46
|
|
|
|
47
|
|
|
|
48
|
|
|
def delete_provider(provider_id, session: Session) -> None: |
49
|
|
|
manager = ProviderDataManager(session) |
50
|
|
|
try: |
51
|
|
|
db_provider = manager.get_provider_by_id(provider_id) |
52
|
|
|
except NoResultFound: |
53
|
|
|
raise SQLAlchemyProviderNotFoundException(provider_id) |
54
|
|
|
delete_scheme(session, db_provider.conceptscheme.id) |
55
|
|
|
session.delete(db_provider) |
56
|
|
|
|