Skip to content
This repository was archived by the owner on May 3, 2020. It is now read-only.

WIP global: javascript restructuring #64

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
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
2 changes: 1 addition & 1 deletion invenio_circulation/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy_continuum import version_class

from invenio_circulation.models import ItemStatus
from .models import ItemStatus


def check_status(method=None, statuses=None):
Expand Down
27 changes: 13 additions & 14 deletions invenio_circulation/bundles.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,15 @@
'node_modules/angular/angular.js',
'node_modules/invenio-search-js/dist/invenio-search-js.js',
'node_modules/angular-ui-bootstrap/dist/ui-bootstrap.js',
'js/circulation/app.js',
'js/circulation/circulationItemBasket.js',
'js/circulation/directives/circulationUserSearch.js',
'js/circulation/directives/circulationAddItem.js',
'js/circulation/directives/circulationItemBasket.js',
'js/circulation/factories/circulationItemStore.js',
'js/circulation/factories/circulationUserStore.js',
'js/circulation/circulationSettings.js',
'js/circulation/directives/circulationSettings.js',
'js/circulation/factories/circulationSettingsStore.js',
'js/circulation/circulation_admin/circulation_app.js',
'js/circulation/circulation_admin/circulation.js',
'js/circulation/circulation_admin/directives/circulationUserSearch.js',
'js/circulation/circulation_admin/directives/circulationAddItem.js',
'js/circulation/circulation_admin/directives/circulationItemBasket.js',
'js/circulation/circulation_admin/directives/circulationSettings.js',
'js/circulation/circulation_admin/factories/circulationUserStore.js',
'js/circulation/circulation_admin/factories/circulationItemStore.js',
'js/circulation/circulation_admin/factories/circulationSettingsStore.js',
filters='requirejs',
output='gen/circulation.%(version)s.js',
npm={
Expand All @@ -61,10 +60,10 @@

user_hub_js = NpmBundle(
'node_modules/almond/almond.js',
'js/circulation/user_hub_app.js',
'js/circulation/circulationUserHub.js',
'js/circulation/factories/circulationUserHoldingsStore.js',
'js/circulation/directives/circulationUserHoldings.js',
'js/circulation/user_hub/user_hub_app.js',
'js/circulation/user_hub/circulationUserHub.js',
'js/circulation/user_hub/factories/circulationUserHoldingsStore.js',
'js/circulation/user_hub/directives/circulationUserHoldings.js',
filters='requirejs',
output='gen/circulation_user_hub.%(version)s.js',
npm={
Expand Down
21 changes: 21 additions & 0 deletions invenio_circulation/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,27 @@
'item_route': '/circulation/items/<pid(crcitm):pid_value>',
'default_media_type': 'application/json',
'max_result_window': 10000,
},
'crcitmrev': {
'pid_type': 'crcitm',
'pid_minter': 'circulation_item',
'pid_fetcher': 'circulation_item',
'record_class': 'invenio_circulation.api:Item',
'record_serializers': {
'application/json': ('invenio_records_rest.serializers'
':json_v1_response'),
},
'search_class': 'invenio_circulation.search:ItemRevisionSearch',
'search_index': None,
'search_type': None,
'search_serializers': {
'application/json': ('invenio_circulation.serializers'
':revision_serializer'),
},
'list_route': '/circulation/item_revisions/',
'item_route': '/circulation/item_revisions/<pid(crcitm):pid_value>',
'default_media_type': 'application/json',
'max_result_window': 10000,
}
}
"""Basic REST circulation configuration."""
Expand Down
79 changes: 79 additions & 0 deletions invenio_circulation/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@
# as an Intergovernmental Organization or submit itself to any jurisdiction.

"""Configuration for circulation search."""
from elasticsearch_dsl.query import Bool, MultiMatch, Range

from invenio_search import RecordsSearch

from .api import Item


class ItemSearch(RecordsSearch):
"""Default search class."""
Expand All @@ -35,3 +38,79 @@ class Meta:

index = 'circulation-item'
doc_types = None


class ItemRevisionSearch(object):
"""Search class utilizing `Item.find_by_holding`.

Since this function doesn't utilize elasticsearch, ItemRevisionSearch
has to mimick certain aspects of `elasticsearch_dsl.Search`.
"""

class Meta:
"""Configuration for circulation search."""

index = 'circulation-item'
doc_types = None

class Results(object):
"""Substitution of `elasticsearch_dsl.result.Result."""

class Hits(object):
"""Wrapper class for the search hits."""

def __init__(self, results):
"""Constructor to wrap the search results."""
self.hits = self.Hits()
self.hits.total = len(results)
self.results = results

def to_dict(self):
"""Convert results into a dictionary."""
return {
'hits': {
'hits': self.results,
'total': self.hits.total
}
}

def __init__(self):
"""Constructor for `elasticsearch_dsl.result.Result substituion.

Adds dummy `_index` value.
"""
self._index = ['']
self._query = {}

def query(self, q, *args, **kwargs):
"""Set the desired query."""
if type(q) is not Bool:
q = Bool(must=[q])
for must in q.must:
if type(must) == MultiMatch:
for field in must.fields:
self._query[field] = must.query
elif type(must) == Range:
for key, value in must._params.items():
self._query[key] = [value['gte'], value['lte']]
return self

def __getitem__(self, *args, **kwargs):
"""Support slicing of the search results. Currently not implemented."""
return self

def params(self, *args, **kwargs):
"""Specify query params to be used. Currently not implemented."""
return self

def execute(self):
"""Execute the search.

:returns: ItemRevisionSearch.Results
"""
res = []
for uuid, revision in Item.find_by_holding(**self._query):
item = Item.get_record(uuid)
res.append(item.revisions[revision-2])

return self.Results(res)
54 changes: 54 additions & 0 deletions invenio_circulation/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
#
# This file is part of Invenio.
# Copyright (C) 2016 CERN.
#
# Invenio is free software; you can redistribute it
# and/or modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# Invenio is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Invenio; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307, USA.
#
# In applying this license, CERN does not
# waive the privileges and immunities granted to it by virtue of its status
# as an Intergovernmental Organization or submit itself to any jurisdiction.

"""Serializers for circulation search."""
import json

from invenio_records_rest.serializers import JSONSerializer
from invenio_records_rest.serializers.response import search_responsify
from invenio_records_rest.serializers.schemas.json import RecordSchemaJSONV1


class RevisionSerializer(JSONSerializer):
"""JSON serializer for items found by `Item.find_by_holding`."""

def serialize_search(self, pid_fetcher, search_result, links=None,
item_links_factory=None):
"""Serialize a search result.

:param search_result: Elasticsearch search result.
:param links: Dictionary of links to add to response.
"""
return json.dumps({
'hits': {
'hits': [hit for hit in search_result['hits']['hits']],
'total': search_result['hits']['total'],
},
'links': links or {},
'aggregations': search_result.get('aggregations', {}),
}, **self._format_args())


revision_serializer = search_responsify(RevisionSerializer(RecordSchemaJSONV1),
'application/json')
28 changes: 0 additions & 28 deletions invenio_circulation/static/js/circulation/circulationItemBasket.js

This file was deleted.

27 changes: 0 additions & 27 deletions invenio_circulation/static/js/circulation/circulationUserSearch.js

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@


(function (angular) {
angular.module('circulationSettings', []);
angular.module('circulation', ['ui.bootstrap']);
})(angular);
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,13 @@
require([
'node_modules/angular/angular.js',
'node_modules/invenio-search-js/dist/invenio-search-js',
'js/circulation/circulationUserSearch',
'js/circulation/circulationItemBasket',
'js/circulation/circulationSettings',
'js/circulation/circulation_admin/circulation',
], function() {
// When the DOM is ready bootstrap the `invenio-search-js`
angular.element(document).ready(function() {
angular.bootstrap(
document.getElementById("invenio-search"), [
'invenioSearch', 'circulationUserSearch', 'circulationItemBasket',
'circulationSettings'
'invenioSearch', 'circulation',
]
);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
(function (angular) {
// Setup
angular
.module('circulationItemBasket')
.module('circulation')
.directive('circulationAddItem', circulationAddItem);

circulationAddItem.$inject = ['circulationItemStore'];
Expand All @@ -42,7 +42,9 @@
return directive;

function link(scope, element, attributes) {
scope.click = function() {
scope.addItem = addItem;

function addItem() {
circulationItemStore.items.push(scope.item);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
(function (angular) {
// Setup
angular
.module('circulationItemBasket')
.module('circulation')
.directive('circulationItemBasket', circulationItemBasket);

circulationItemBasket.$inject = [
Expand All @@ -51,22 +51,30 @@

function link(scope, element, attributes) {
scope.items = circulationItemStore.items;
scope.remove = function(index) {
scope.remove = remove;
scope.loan = loan;
scope.request = request;
scope.return = returnItem;
Copy link

@drjova drjova Jan 18, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a tiny thing, it is better to set the scope after the functions' definition :)


function remove(index) {
circulationItemStore.items.splice(index, 1);
}
scope.loan = function() {

function loan() {
var data = {
'user_id': circulationUserStore.user.id,
};
performAction(attributes.loanEndpoint, data);
}
scope.request = function() {

function request() {
var data = {
'user_id': circulationUserStore.user.id,
};
performAction(attributes.requestEndpoint, data);
}
scope.return = function() {

function returnItem() {
var data = {};
performAction(attributes.returnEndpoint, data);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
(function (angular) {
// Setup
angular
.module('circulationSettings')
.module('circulation')
.directive('circulationSettings', circulationSettings);

circulationSettings.$inject = ['circulationSettingsStore'];
Expand Down
Loading