From 42d6da0a59cb26f27cf0b9ab5f9ca829e5a36cd5 Mon Sep 17 00:00:00 2001 From: Renaud Michotte Date: Thu, 6 May 2021 11:16:44 +0200 Subject: [PATCH] serials: fix issue.status_date field update * Ensure that the `issue.status_date` field is updated when an issue is created/updated. * Closes rero#1654. Co-Authored-by: Renaud Michotte --- rero_ils/modules/items/api/issue.py | 7 ++++++- rero_ils/modules/items/api/record.py | 18 ++++++++++++++---- rero_ils/modules/items/models.py | 9 ++++++++- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/rero_ils/modules/items/api/issue.py b/rero_ils/modules/items/api/issue.py index c2c2f1d9fa..3c821186c7 100644 --- a/rero_ils/modules/items/api/issue.py +++ b/rero_ils/modules/items/api/issue.py @@ -23,12 +23,17 @@ from flask import current_app from .record import ItemRecord -from ..models import ItemIssueStatus +from ..models import ItemIssueStatus, TypeOfItem class ItemIssue(ItemRecord): """Item issue class.""" + @property + def is_issue(self): + """Is this item is an issue or not.""" + return self.get('type') == TypeOfItem.ISSUE + @property def expected_date(self): """Shortcut for issue expected date.""" diff --git a/rero_ils/modules/items/api/record.py b/rero_ils/modules/items/api/record.py index b31f7e6eaf..0df82b9d98 100644 --- a/rero_ils/modules/items/api/record.py +++ b/rero_ils/modules/items/api/record.py @@ -22,6 +22,7 @@ from elasticsearch_dsl.query import Q from flask_babelex import gettext as _ +from ..models import TypeOfItem from ..utils import item_pid_to_object from ...api import IlsRecord from ...item_types.api import ItemType @@ -97,6 +98,7 @@ def create(cls, data, id_=None, delete_pid=False, """Create item record.""" cls._item_build_org_ref(data) data = cls._prepare_item_record(data=data, mode='create') + data = cls._set_issue_status_date(data=data) record = super().create( data, id_, delete_pid, dbcommit, reindex, **kwargs) holding = cls._increment_next_prediction_for_holding( @@ -109,7 +111,7 @@ def create(cls, data, id_=None, delete_pid=False, # If `dbcommit` is already set to True, this commit is already done by # the `IlsRecord.update()` function. # - # /!\ if we write some other operation after _increement_next_predition + # /!\ if we write some other operation after _increment_next_predition # we need to manage ourself the `rollback()`. # # TODO :: best solution will be to create an invenio `post_create` @@ -153,11 +155,19 @@ def _set_issue_status_date(cls, data): :param data: The record to update. :return: The updated record. """ + if data.get('type') != TypeOfItem.ISSUE: + return data + status = data.get('issue', {}).get('status') item = cls.get_record_by_pid(data.get('pid')) - if status and item and status != item.issue_status: - data['issue']['status_date'] = \ - datetime.now(timezone.utc).isoformat() + now = datetime.now(timezone.utc).isoformat() + + if item: # item already exists + if status and status != item.issue_status: + data['issue']['status_date'] = now + else: # item creation + if status: + data['issue']['status_date'] = now return data @classmethod diff --git a/rero_ils/modules/items/models.py b/rero_ils/modules/items/models.py index 1ccef4cdf2..e0acbb10b9 100644 --- a/rero_ils/modules/items/models.py +++ b/rero_ils/modules/items/models.py @@ -43,8 +43,15 @@ class ItemMetadata(db.Model, RecordMetadataBase): __tablename__ = 'item_metadata' +class TypeOfItem: + """Enum class to list all possible item type.""" + + STANDARD = 'standard' + ISSUE = 'issue' + + class ItemStatus: - """Class holding all availabe circulation item statuses.""" + """Class holding all available circulation item statuses.""" ON_SHELF = 'on_shelf' AT_DESK = 'at_desk'