Skip to content

Commit

Permalink
Merge 3d11bf7 into d9558a7
Browse files Browse the repository at this point in the history
  • Loading branch information
Wim-De-Clercq committed Sep 14, 2020
2 parents d9558a7 + 3d11bf7 commit c9d4378
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 31 deletions.
10 changes: 6 additions & 4 deletions atramhasis/alembic/versions/3e9675b35dfc_cascades.py
Expand Up @@ -5,16 +5,17 @@
Create Date: 2020-08-12 14:48:35.592316
"""
from alembic import op

# revision identifiers, used by Alembic.
revision = '3e9675b35dfc'
down_revision = 'cb568ec81000'

from alembic import op

is_sqlite = op.get_bind().dialect.name == 'sqlite'
convention = ({"fk": "FK_%(table_name)s_%(referred_table_name)s"} if is_sqlite else
{"fk": "%(table_name)s_%(column_0_name)s_fkey"})
def _get_convention():
is_sqlite = op.get_bind().dialect.name == 'sqlite'
return ({"fk": "FK_%(table_name)s_%(referred_table_name)s"} if is_sqlite else
{"fk": "%(table_name)s_%(column_0_name)s_fkey"})


def upgrade():
Expand Down Expand Up @@ -45,6 +46,7 @@ def upgrade():
('concept_label', 'concept', 'concept_id', 'id'),
('concept_label', 'label', 'label_id', 'id'),
]
convention = _get_convention()

for source_table, referent_table, local_col, remote_col in args:
with op.batch_alter_table(source_table, naming_convention=convention) as batch_op:
Expand Down
@@ -0,0 +1,25 @@
"""unique concept.id + conceptscheme.id
Revision ID: 79ff53a30228
Revises: 3e9675b35dfc
Create Date: 2020-09-14 12:23:22.546226
"""
from alembic import op

# revision identifiers, used by Alembic.
revision = '79ff53a30228'
down_revision = '3e9675b35dfc'


def upgrade():
with op.batch_alter_table('concept') as batch_op:
batch_op.create_unique_constraint(
'uq_concept_concept_id_conceptscheme_id',
['concept_id', 'conceptscheme_id']
)


def downgrade():
with op.batch_alter_table('concept') as batch_op:
batch_op.drop_constraint('uq_concept_concept_id_conceptscheme_id')
24 changes: 18 additions & 6 deletions atramhasis/data/datamanagers.py
Expand Up @@ -5,16 +5,27 @@
:versionadded: 0.4.1
"""
from datetime import datetime, date
from datetime import date
from datetime import datetime

import dateutil.relativedelta
from skosprovider_sqlalchemy.models import ConceptScheme, Thing, Label, Concept, Collection, Language, MatchType, Match, \
LabelType
from sqlalchemy import desc, func, and_
from skosprovider_sqlalchemy.models import Collection
from skosprovider_sqlalchemy.models import Concept
from skosprovider_sqlalchemy.models import ConceptScheme
from skosprovider_sqlalchemy.models import Label
from skosprovider_sqlalchemy.models import LabelType
from skosprovider_sqlalchemy.models import Language
from skosprovider_sqlalchemy.models import Match
from skosprovider_sqlalchemy.models import MatchType
from skosprovider_sqlalchemy.models import Thing
from sqlalchemy import and_
from sqlalchemy import desc
from sqlalchemy import func
from sqlalchemy.orm import joinedload

from atramhasis.data import popular_concepts
from atramhasis.data.models import ConceptVisitLog, ConceptschemeCounts
from atramhasis.data.models import ConceptVisitLog
from atramhasis.data.models import ConceptschemeCounts


class DataManager(object):
Expand Down Expand Up @@ -184,9 +195,10 @@ def get_all_label_types(self):
return self.session.query(LabelType).all()

def get_next_cid(self, conceptscheme_id):
return self.session.query(
max_id = self.session.query(
func.max(Thing.concept_id)
).filter_by(conceptscheme_id=conceptscheme_id).first()[0]
return max_id + 1 if max_id else 1


class LanguagesManager(DataManager):
Expand Down
62 changes: 41 additions & 21 deletions atramhasis/views/crud.py
Expand Up @@ -2,22 +2,31 @@
"""
Module containing views related to the REST service.
"""
import time

import colander
from pyramid.view import view_defaults, view_config
import transaction
from pyramid.httpexceptions import HTTPMethodNotAllowed
from pyramid.view import view_config
from pyramid.view import view_defaults
from pyramid_skosprovider.views import ProviderView
from skosprovider_sqlalchemy.models import Collection
from skosprovider_sqlalchemy.models import Concept
from skosprovider_sqlalchemy.providers import SQLAlchemyProvider
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm.exc import NoResultFound
from skosprovider_sqlalchemy.models import Concept, Collection

from atramhasis.errors import SkosRegistryNotFoundException, ConceptSchemeNotFoundException, \
ValidationError, ConceptNotFoundException
from atramhasis.mappers import map_concept, map_conceptscheme
from atramhasis.protected_resources import protected_operation
from atramhasis.utils import from_thing, internal_providers_only
from atramhasis.cache import invalidate_scheme_cache
from atramhasis.audit import audit
from pyramid_skosprovider.views import ProviderView
from atramhasis.cache import invalidate_scheme_cache
from atramhasis.errors import ConceptNotFoundException
from atramhasis.errors import ConceptSchemeNotFoundException
from atramhasis.errors import SkosRegistryNotFoundException
from atramhasis.errors import ValidationError
from atramhasis.mappers import map_concept
from atramhasis.mappers import map_conceptscheme
from atramhasis.protected_resources import protected_operation
from atramhasis.utils import from_thing
from atramhasis.utils import internal_providers_only


@view_defaults(accept='application/json', renderer='skosrenderer_verbose')
Expand Down Expand Up @@ -149,19 +158,30 @@ def add_concept(self):
:raises atramhasis.errors.ValidationError: If the provided json can't be validated
"""
validated_json_concept = self._validate_concept(self._get_json_body(), self.provider.conceptscheme_id)
cid = self.skos_manager.get_next_cid(self.provider.conceptscheme_id)
if not cid:
cid = 0
cid += 1
if validated_json_concept['type'] == 'concept':
concept = Concept()
exc = None
for _ in range(5):
try:
if validated_json_concept['type'] == 'concept':
concept = Concept()
else:
concept = Collection()
concept.concept_id = self.skos_manager.get_next_cid(
self.provider.conceptscheme_id
)
concept.conceptscheme_id = self.provider.conceptscheme_id
concept.uri = self.provider.uri_generator.generate(id=concept.concept_id)
map_concept(concept, validated_json_concept, self.skos_manager)
concept = self.skos_manager.save(concept)
break
except IntegrityError as exc:
# There is a small chance that another concept gets added at the same
# time. There is nothing wrong with the request, so we try again.
transaction.abort()
time.sleep(0.05)
else:
concept = Collection()
concept.concept_id = cid
concept.conceptscheme_id = self.provider.conceptscheme_id
concept.uri = self.provider.uri_generator.generate(id=concept.concept_id)
map_concept(concept, validated_json_concept, self.skos_manager)
concept = self.skos_manager.save(concept)
raise Exception(
"Could not save new concept due to IntegrityErrors. {}".format(exc)
)

invalidate_scheme_cache(self.scheme_id)

Expand Down

0 comments on commit c9d4378

Please sign in to comment.