Source code for pacifica.metadata.rest.transaction_queries.transaction_release_state

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""CherryPy Status Transaction Metadata object class."""
from cherrypy import tools, request
from pacifica.metadata.rest.transaction_queries.query_base import QueryBase
from pacifica.metadata.orm import TransactionUser, DOITransaction, CitationTransaction, Relationships
from pacifica.metadata.rest.user_queries.user_lookup import UserLookup
from pacifica.metadata.orm.base import db_connection_decorator


[docs]class TransactionReleaseState(QueryBase): """Retrieves release state for an individual transaction (GET) or set of transactions (POST).""" exposed = True
[docs] @staticmethod def _get_release_state(transaction_list): releases = TransactionReleaseState._get_release_info(transaction_list) output_results = {} user_lookup_cache = {} found_transactions = [] transactions = QueryBase._get_transaction_sizes(transaction_list) for release in releases: found_transactions.append(release['transaction']) # NOTE: we should change this back to authorized_user with relationship link if release['user'] not in user_lookup_cache: user_lookup_cache[release['user']] = UserLookup.get_user_info_block( release['user'], 'simple') release.update({ 'user': user_lookup_cache[release['user']], 'release_state': 'released', 'display_state': 'Released', 'release_date': release['release_date'].isoformat(), 'total_size_bytes': transactions[release['transaction']]['total_file_size_bytes'], 'total_file_count': transactions[release['transaction']]['total_file_count'], 'release_doi_entries': TransactionReleaseState._get_doi_release(release['transaction']), 'release_citations': TransactionReleaseState._get_citation_release(release['transaction']) }) output_results[release['transaction']] = release missing_transactions = TransactionReleaseState._generate_missing_transactions( transaction_list, found_transactions ) output_results.update(missing_transactions) return output_results
[docs] @staticmethod def _generate_missing_transactions(transaction_list, found_transactions): output_results = {} missing_transactions = list( set(transaction_list) - set(found_transactions)) for txn in missing_transactions: output_results[txn] = { 'user': None, 'release_state': 'not_released', 'display_state': 'Not Released', 'transaction': txn } return output_results
[docs] @staticmethod def _get_release_info(transaction_list): # pylint: disable=no-member releases = (TransactionUser .select(TransactionUser.transaction, TransactionUser.user, TransactionUser.updated.alias('release_date')) .join(Relationships) .where( (Relationships.name == 'authorized_releaser') & (Relationships.uuid == TransactionUser.relationship) & (TransactionUser.transaction << transaction_list) ).dicts()) # pylint: enable=no-member return releases
[docs] @staticmethod def _get_doi_release(transaction_id): output_results = None rel_obj = Relationships.get(Relationships.name == 'authorized_releaser') # pylint: disable=no-member doi_releases = (DOITransaction .select() .join(TransactionUser) .where( (TransactionUser.relationship == str(rel_obj.uuid)) & (DOITransaction.transaction == TransactionUser.uuid) & (TransactionUser.transaction == transaction_id) )) # pylint: enable=no-member if doi_releases.exists(): output_results = [] for release in doi_releases: # mint_api = release.doi.metadata.where(release.doi.metadata.key == 'minting_api_id') # print(mint_api) metadata = {info_bit.__data__['key']: info_bit.__data__[ 'value'] for info_bit in release.doi.metadata} output_results.append({ 'doi_status': release.doi.status, 'is_released': release.doi.released, 'doi_reference': release.doi.doi, 'site_url': release.doi.site_url, 'submission_date': release.created.isoformat(), 'metadata': metadata }) return output_results
[docs] @staticmethod def _get_citation_release(transaction_id): output_results = None rel_obj = Relationships.get(Relationships.name == 'authorized_releaser') # pylint: disable=no-member citation_releases = (CitationTransaction .select() .join(TransactionUser) .where( (TransactionUser.relationship == str(rel_obj.uuid)) & (CitationTransaction.transaction == TransactionUser.uuid) & (TransactionUser.transaction == transaction_id) )) # pylint: enable=no-member if citation_releases.exists(): output_results = [] for citation_entry in citation_releases: output_results.append( { 'citation_id': citation_entry.citation.id, 'title': citation_entry.citation.article_title, 'doi_reference': citation_entry.citation.doi_reference } ) return output_results
# Cherrypy requires these named methods. # pylint: disable=invalid-name @staticmethod @tools.json_out() @db_connection_decorator def GET(trans_id=None): """Return release details about the specified transaction entity.""" return TransactionReleaseState._get_release_state((int(trans_id),)) # pylint: disable=duplicate-code @staticmethod @tools.json_out() @tools.json_in() @db_connection_decorator # pylint: enable=duplicate-code def POST(): """Return transaction release state details for the list of transaction_id's.""" transaction_list = [int(trans_id) for trans_id in request.json] return TransactionReleaseState._get_release_state(transaction_list)