Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: correct circulation policy #633

Merged
merged 1 commit into from
Nov 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions data/circulation_policies.json
Original file line number Diff line number Diff line change
Expand Up @@ -331,15 +331,15 @@
"$ref": "https://ils.rero.ch/api/patron_types/1"
},
"item_type": {
"$ref": "https://ils.rero.ch/api/item_types/7"
"$ref": "https://ils.rero.ch/api/item_types/8"
}
},
{
"patron_type": {
"$ref": "https://ils.rero.ch/api/patron_types/2"
},
"item_type": {
"$ref": "https://ils.rero.ch/api/item_types/7"
"$ref": "https://ils.rero.ch/api/item_types/8"
}
}
]
Expand All @@ -359,18 +359,18 @@
"settings": [
{
"patron_type": {
"$ref": "https://ils.rero.ch/api/patron_types/3"
"$ref": "https://ils.rero.ch/api/patron_types/6"
},
"item_type": {
"$ref": "https://ils.rero.ch/api/item_types/8"
"$ref": "https://ils.rero.ch/api/item_types/9"
}
},
{
"patron_type": {
"$ref": "https://ils.rero.ch/api/patron_types/4"
},
"item_type": {
"$ref": "https://ils.rero.ch/api/item_types/8"
"$ref": "https://ils.rero.ch/api/item_types/9"
}
}
]
Expand Down
9 changes: 9 additions & 0 deletions data/patron_types.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,14 @@
"organisation": {
"$ref": "https://ils.rero.ch/api/organisations/3"
}
},
{
"$schema": "https://ils.rero.ch/schema/patron_types/patron_type-v0.0.1.json",
"pid": "6",
"name": "Children",
"description": "Children and teenagers (< 16 years old).",
"organisation": {
"$ref": "https://ils.rero.ch/api/organisations/2"
}
}
]
23 changes: 23 additions & 0 deletions rero_ils/modules/circ_policies/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,29 @@ class CircPolicy(IlsRecord):
fetcher = circ_policy_id_fetcher
provider = CircPolicyProvider

def extended_validation(self, **kwargs):
"""Validate record against schema.

and extended validation to check that patron types and item types are
part of the correct organisation.
"""
from ..patron_types.api import PatronType
from ..item_types.api import ItemType
AoNoOokami marked this conversation as resolved.
Show resolved Hide resolved

org = self.get('organisation')
for setting in self.replace_refs().get('settings', []):
patron_type = PatronType.get_record_by_pid(setting.get(
'patron_type', {}).get('pid')
)
item_type = ItemType.get_record_by_pid(setting.get(
'item_type', {}).get('pid')
)
if patron_type.get('organisation') != org or item_type.get(
'organisation'
) != org:
return False
return True

@classmethod
def exist_name_and_organisation_pid(cls, name, organisation_pid):
"""Check if the policy name is unique on organisation."""
Expand Down
26 changes: 16 additions & 10 deletions rero_ils/modules/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,18 +217,22 @@ def init(force):
@click.option('-s', '--schema', 'schema', default=None)
@click.option('-p', '--pid_type', 'pid_type', default=None)
@click.option('-l', '--lazy', 'lazy', is_flag=True, default=False)
@click.option('-o', '--dont-stop', 'dont_stop_on_error',
is_flag=True, default=False)
@click.argument('infile', type=click.File('r'), default=sys.stdin)
@with_appcontext
def create(infile, append, reindex, dbcommit, verbose, schema, pid_type, lazy):
def create(infile, append, reindex, dbcommit, verbose, schema, pid_type, lazy,
dont_stop_on_error):
"""Load REROILS record.

infile: Json file
append: appends pids to database
reindex: reindex record by record
dbcommit: commit record to database
pid_type: record type
schema: recoord schema
lazy: lazy reads file
:param infile: Json file
:param append: appends pids to database
:param reindex: reindex record by record
:param dbcommit: commit record to database
:param pid_type: record type
:param schema: recoord schema
:param lazy: lazy reads file
:param dont_stop_on_error: don't stop on error
"""
click.secho(
'Loading {pid_type} records from {file_name}.'.format(
Expand Down Expand Up @@ -271,15 +275,17 @@ def create(infile, append, reindex, dbcommit, verbose, schema, pid_type, lazy):
except Exception as err:
error_records.append(record)
click.secho(
'{count: <8} {pid_type} creat error {pid}: {err}'.format(
'{count: <8} {pid_type} create error {pid}: {err}'.format(
count=count,
pid_type=pid_type,
pid=record.get('pid', '???'),
err=err
),
err=True,
fg='red'
)
)
if not dont_stop_on_error:
sys.exit(1)

if error_records:
err_file_name = '{pid_type}_error.json'.format(pid_type=pid_type)
Expand Down
64 changes: 34 additions & 30 deletions scripts/setup
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ DATA_PATH=$(pipenv --where)/data
# used for create only the items and holdings files for the 'big' documents file
# --deployment:
# used for deploy the 'big' files
# --dont_stop:
# used for continue script on error

RED='\033[0;31m'
GREEN='\033[0;0;32m'
Expand All @@ -43,9 +45,10 @@ CREATE_ITEMS_HOLDINGS_SMALL=false
CREATE_ITEMS_HOLDINGS_BIG=false
STOP_EXECUTION=true
CREATE_LAZY=""
DONT_STOP=""

# options may be followed by one colon to indicate they have a required argument
if ! options=$(getopt -o dsb -l deployment,create_items_holdings_small,create_items_holdings_big,lazy,data_path: -- "$@")
if ! options=$(getopt -o dsb -l deployment,create_items_holdings_small,create_items_holdings_big,lazy,dont_stop,data_path: -- "$@")
then
# something went wrong, getopt will put out an error message for us
exit 1
Expand All @@ -59,6 +62,7 @@ do
-b|--create_items_holdings_big) CREATE_ITEMS_HOLDINGS_BIG=true ;;
-c|--continue) STOP_EXECUTION=false ;;
-l|--lazy) CREATE_LAZY="--lazy" ;;
-p|--pursue) DONT_STOP="--dont-stop" ;;
-D|--data_path) DATA_PATH=$2 ;;
(--) shift; break;;
(-*) display_error_message "$0: error - unrecognized option $1"; exit 1;;
Expand Down Expand Up @@ -141,25 +145,25 @@ pipenv run invenio access allow superuser-access role superusers
pipenv run invenio roles add admin@rero.ch admins
pipenv run invenio roles add admin@rero.ch superusers

display_success_message "Organisations:"
pipenv run invenio fixtures create --pid_type org ${DATA_PATH}/organisations.json --append ${CREATE_LAZY}
pipenv run invenio utils reindex -t org --yes-i-know
display_success_message "Libraries:"
pipenv run invenio fixtures create --pid_type lib ${DATA_PATH}/libraries.json --append ${CREATE_LAZY}
pipenv run invenio utils reindex -t lib --yes-i-know
display_success_message "Locations:"
pipenv run invenio fixtures create --pid_type loc ${DATA_PATH}/locations.json --append ${CREATE_LAZY}
pipenv run invenio utils reindex -t loc --yes-i-know
display_success_message "Item types:"
pipenv run invenio fixtures create --pid_type itty ${DATA_PATH}/item_types.json --append ${CREATE_LAZY}
pipenv run invenio utils reindex -t itty --yes-i-know
display_success_message "Patron types:"
pipenv run invenio fixtures create --pid_type ptty ${DATA_PATH}/patron_types.json --append ${CREATE_LAZY}
pipenv run invenio utils reindex -t ptty --yes-i-know
display_success_message "Circulation policies:"
pipenv run invenio fixtures create --pid_type cipo ${DATA_PATH}/circulation_policies.json --append ${CREATE_LAZY}
pipenv run invenio utils reindex -t cipo --yes-i-know
pipenv run invenio utils runindex --raise-on-error
display_success_message "Organisations: ${CREATE_LAZY} ${DONT_STOP}"
pipenv run invenio fixtures create --pid_type org ${DATA_PATH}/organisations.json --append ${CREATE_LAZY} ${DONT_STOP}
pipenv run invenio index reindex -t org --yes-i-know
display_success_message "Libraries: ${CREATE_LAZY} ${DONT_STOP}"
pipenv run invenio fixtures create --pid_type lib ${DATA_PATH}/libraries.json --append ${CREATE_LAZY} ${DONT_STOP}
pipenv run invenio index reindex -t lib --yes-i-know
display_success_message "Locations: ${CREATE_LAZY} ${DONT_STOP}"
pipenv run invenio fixtures create --pid_type loc ${DATA_PATH}/locations.json --append ${CREATE_LAZY} ${DONT_STOP}
pipenv run invenio index reindex -t loc --yes-i-know
display_success_message "Item types: ${CREATE_LAZY} ${DONT_STOP}"
pipenv run invenio fixtures create --pid_type itty ${DATA_PATH}/item_types.json --append ${CREATE_LAZY} ${DONT_STOP}
pipenv run invenio index reindex -t itty --yes-i-know
display_success_message "Patron types: ${CREATE_LAZY} ${DONT_STOP}"
pipenv run invenio fixtures create --pid_type ptty ${DATA_PATH}/patron_types.json --append ${CREATE_LAZY} ${DONT_STOP}
pipenv run invenio index reindex -t ptty --yes-i-know
display_success_message "Circulation policies: ${CREATE_LAZY} ${DONT_STOP}"
pipenv run invenio fixtures create --pid_type cipo ${DATA_PATH}/circulation_policies.json --append ${CREATE_LAZY} ${DONT_STOP}
pipenv run invenio index reindex -t cipo --yes-i-know
pipenv run invenio index run --raise-on-error

pipenv run invenio fixtures import_users ${DATA_PATH}/users.json -v

Expand All @@ -185,9 +189,9 @@ else
HOLDINGS=${DATA_PATH}/holdings_small.json
fi

display_success_message "Documents:"
display_success_message "Documents: ${DONT_STOP}"
echo -e ${DOCUMENTS}
pipenv run invenio fixtures create --pid_type doc --schema 'http://ils.rero.ch/schema/documents/document-v0.0.1.json' ${DOCUMENTS} --append
pipenv run invenio fixtures create --pid_type doc --schema 'http://ils.rero.ch/schema/documents/document-v0.0.1.json' ${DOCUMENTS} --append ${DONT_STOP}

if $CREATE_ITEMS_HOLDINGS_SMALL
then
Expand All @@ -211,17 +215,17 @@ then
fi
fi

display_success_message "Holdings: ${CREATE_LAZY}"
display_success_message "Holdings: ${CREATE_LAZY} ${DONT_STOP}"
echo -e ${HOLDINGS}
pipenv run invenio fixtures create --pid_type hold --schema 'http://ils.rero.ch/schema/holdings/holding-v0.0.1.json' ${HOLDINGS} --append ${CREATE_LAZY}
pipenv run invenio utils reindex -t hold --yes-i-know
pipenv run invenio utils runindex -c 4 --raise-on-error
pipenv run invenio fixtures create --pid_type hold --schema 'http://ils.rero.ch/schema/holdings/holding-v0.0.1.json' ${HOLDINGS} --append ${CREATE_LAZY} ${DONT_STOP}
pipenv run invenio index reindex -t hold --yes-i-know
pipenv run invenio index run -c 4 --raise-on-error

display_success_message "Items: ${CREATE_LAZY}"
display_success_message "Items: ${CREATE_LAZY} ${DONT_STOP}"
echo -e ${ITEMS}
pipenv run invenio fixtures create --pid_type item --schema 'http://ils.rero.ch/schema/items/item-v0.0.1.json' ${ITEMS} --append ${CREATE_LAZY}
pipenv run invenio utils reindex -t item --yes-i-know
pipenv run invenio utils runindex -c 4 --raise-on-error
pipenv run invenio fixtures create --pid_type item --schema 'http://ils.rero.ch/schema/items/item-v0.0.1.json' ${ITEMS} --append ${CREATE_LAZY} ${DONT_STOP}
pipenv run invenio index reindex -t item --yes-i-know
pipenv run invenio index run -c 4 --raise-on-error

display_success_message "Index Documents:"
pipenv run invenio utils reindex -t doc --yes-i-know
Expand Down
41 changes: 39 additions & 2 deletions tests/ui/circ_policies/test_circ_policies_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,13 @@
from __future__ import absolute_import, print_function

from copy import deepcopy

import pytest
import mock
from utils import get_mapping

from rero_ils.modules.circ_policies.api import CircPoliciesSearch, \
CircPolicy, circ_policy_id_fetcher
from rero_ils.modules.errors import RecordValidationError


def test_no_default_policy(app):
Expand All @@ -34,7 +35,15 @@ def test_no_default_policy(app):
assert not cipo


def test_circ_policy_create(db, circ_policy_martigny_data_tmp):
def test_circ_policy_create(circ_policy_martigny_data_tmp,
AoNoOokami marked this conversation as resolved.
Show resolved Hide resolved
org_martigny,
lib_martigny, lib_saxon,
patron_type_children_martigny,
item_type_standard_martigny,
patron_type_adults_martigny,
item_type_specific_martigny,
item_type_regular_sion,
patron_type_youngsters_sion):
"""Test circulation policy creation."""
cipo = CircPolicy.create(circ_policy_martigny_data_tmp, delete_pid=True)
assert cipo == circ_policy_martigny_data_tmp
Expand All @@ -53,6 +62,34 @@ def test_circ_policy_create(db, circ_policy_martigny_data_tmp):
assert cipo.get('$schema')
assert cipo.get('pid') == '2'

cipo_data = {
'$schema': 'https://ils.rero.ch/schema/'
'circ_policies/circ_policy-v0.0.1.json',
'pid': 'cipo_test',
'name': 'test',
'organisation': {
'$ref': 'https://ils.rero.ch/api/organisations/org1'
},
'is_default': False,
'settings': [{
'patron_type': {
'$ref': 'https://ils.rero.ch/api/patron_types/ptty3'
},
'item_type': {
'$ref': 'https://ils.rero.ch/api/item_types/itty1'
}
}, {
'patron_type': {
'$ref': 'https://ils.rero.ch/api/patron_types/ptty2'
},
'item_type': {
'$ref': 'https://ils.rero.ch/api/item_types/itty4'
}
}]
}
with pytest.raises(RecordValidationError):
cipo = CircPolicy.create(cipo_data, delete_pid=False)


def test_circ_policy_exist_name_and_organisation_pid(
circ_policy_default_martigny):
Expand Down