update_provider()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 8
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
nop 3
dl 0
loc 8
rs 10
c 0
b 0
f 0
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