def load_submission(submission_id: Optional[int]) \ -> Tuple[events.domain.Submission, List[events.domain.Event]]: """ Load a submission by ID. Parameters ---------- submission_id : int Returns ------- :class:`events.domain.Submission` Raises ------ :class:`werkzeug.exceptions.NotFound` Raised when there is no submission with the specified ID. """ if submission_id is None: logger.debug('No submission ID') raise NotFound('No such submission.') g = get_application_global() if g is None or f'submission_{submission_id}' not in g: try: submission, submission_events = events.load(submission_id) except events.exceptions.NoSuchSubmission as e: raise NotFound('No such submission.') from e if g is not None: setattr(g, f'submission_{submission_id}', (submission, submission_events)) if g is not None: return getattr(g, f'submission_{submission_id}') return submission, submission_events
def current_session(cls) -> 'StreamPublisher': """Get/create :class:`.StreamPublisher` for this context.""" g = get_application_global() if not g: return cls.get_session() elif 'stream' not in g: g.stream = cls.get_session() # type: ignore return g.stream # type: ignore
def current_session(cls) -> 'SessionStore': """Get/create :class:`.SearchSession` for this context.""" g = get_application_global() if not g: return cls.get_session() if 'redis' not in g: g.redis = cls.get_session() return g.redis # type: ignore
def current_session() -> Session: """Get/create database session for this context.""" g = get_application_global() if not g: return _get_session() if 'registry_data_session' not in g: g.registry_data_session = _get_session() return g.registry_data_session
def current_session() -> Session: """Get/create :class:`.Session` for this context.""" g = get_application_global() if not g: return get_session() if 'classic' not in g: g.classic = get_session() # type: ignore return g.classic # type: ignore
def current_session() -> Session: """Get/create database session for this context.""" g = get_application_global() if not g: return _get_session() if 'user_data' not in g: g.user_data = _get_session() return g.user_data
def current_engine() -> Engine: """Get/create :class:`.Engine` for this context.""" g = get_application_global() if not g: return get_engine() if 'classic_engine' not in g: g.classic_engine = get_engine() # type: ignore return g.classic_engine # type: ignore
def _current_engine() -> Engine: """Get/create :class:`.Engine` for this context.""" g = get_application_global() if not g: return _get_engine() if 'user_data_engine' not in g: g.user_data_engine = _get_engine() return g.user_data_engine
def current_session(cls) -> 'PreviewStore': """Get the current store session for this application.""" g = get_application_global() if g is None: return cls.get_session() if 'store' not in g: g.store = cls.get_session() store: PreviewStore = g.store return store
def current_session() -> AbsMetaSession: """Get/create :class:`.AbsMetaSession` for this context.""" g = get_application_global() if not g: return get_session() if 'abs_meta' not in g: g.abs_meta = get_session() assert isinstance(g.abs_meta, AbsMetaSession) return g.abs_meta
def current_session(cls) -> 'Storage': """Get the current :class:`.Storage` instance for this application.""" g = get_application_global() if g is None: return cls.create_session() if 'store' not in g: g.store = cls.create_session() instance: 'Storage' = g.store return instance
def current_session() -> DocumentCacheSession: """Get/create :class:`.DocumentCacheSession` for this context.""" g = get_application_global() if not g: return get_session() if 'doc_cache' not in g: g.doc_cache = get_session() assert isinstance(g.doc_cache, DocumentCacheSession) return g.doc_cache
def current_session() -> GrobidSession: """Get/create :class:`.GrobidSession` for this context.""" g = get_application_global() if g is None: return get_session() if 'grobid' not in g: g.grobid = get_session() session: GrobidSession = g.grobid return session
def current_session() -> RetrievePDFSession: """Get/create :class:`.RetrievePDFSession` for this context.""" g = get_application_global() if g is None: return get_session() if 'retrieve' not in g: g.retrieve = get_session() session: RetrievePDFSession = g.retrieve return session
def current_session() -> RefExtractSession: """Get/create :class:`.RefExtractSession` for this context.""" g = get_application_global() if g is None: return get_session() if 'refextract' not in g: g.refextract = get_session() session: RefExtractSession = g.refextract return session
def current_session() -> CermineSession: """Get/create :class:`.CermineSession` for this context.""" g = get_application_global() if g is None: return get_session() if 'cermine' not in g: g.cermine = get_session() session: CermineSession = g.cermine return session
def current_session() -> ScienceParseSession: """Get/create :class:`.ScienceParseSession` for this context.""" g = get_application_global() if g is None: return get_session() if 'scienceparse' not in g: g.scienceparse = get_session() session: ScienceParseSession = g.scienceparse return session
def current_session() -> ReferenceStoreSession: """Get/create :class:`.ReferenceStoreSession` for this context.""" g = get_application_global() if g is None: return get_session() if 'data_store' not in g: g.data_store = get_session() session: ReferenceStoreSession = g.data_store return session
def get_or_create_worker_app() -> Celery: """ Get the current worker app, or create one. Uses the Flask application global to keep track of the worker app. """ g = get_application_global() if not g: return create_worker_app() if 'worker' not in g: g.worker = create_worker_app() return g.worker
def retrieve(upload_id: int, skip_cache: bool = False) -> Optional[Upload]: """ Get data about a upload. Parameters ---------- upload_id : int Unique identifier for the upload. skip_cache : bool If `True`, will load fresh data regardless of what might already be around. Otherwise, will only load the same :class:`Upload` instance once. Returns ------- :class:`.Upload` Data about the upload. Raises ------ IOError When there is a problem querying the database. """ logger.debug('Retrieve upload data from database for %s (skip_cache: %s)', upload_id, skip_cache) # We use the application global object to create a simple cache for # loaded uploads. This allows us to avoid multiple queries on the same # state when different parts of the application need access to the same # upload. g = get_application_global() if g and 'uploads' not in g: g.uploads = {} if g and not skip_cache and upload_id in g.uploads: upload_data = g.uploads[upload_id] else: try: upload_data = db.session.query(DBUpload).get(upload_id) except OperationalError as e: logger.debug('Could not query database: %s', e.detail) raise IOError('Could not query database: %s' % e.detail) from e if upload_data is None: return None if g: g.uploads[upload_id] = upload_data # Cache for next time. args = {} args['upload_id'] = upload_data.upload_id args['owner_user_id'] = upload_data.owner_user_id args['archive'] = upload_data.archive args['created_datetime'] = upload_data.created_datetime.replace(tzinfo=UTC) args['modified_datetime'] = upload_data.modified_datetime.replace( tzinfo=UTC) args['state'] = upload_data.state args['lock'] = upload_data.lock if upload_data.lastupload_start_datetime is not None: args['lastupload_start_datetime'] = \ upload_data.lastupload_start_datetime.replace(tzinfo=UTC) if upload_data.lastupload_completion_datetime is not None: args['lastupload_completion_datetime'] = \ upload_data.lastupload_completion_datetime.replace(tzinfo=UTC) if upload_data.lastupload_logs is not None: args['lastupload_logs'] = upload_data.lastupload_logs if upload_data.lastupload_file_summary is not None: args['lastupload_file_summary'] = upload_data.lastupload_file_summary if upload_data.lastupload_upload_status is not None: args['lastupload_upload_status'] = upload_data.lastupload_upload_status return Upload(**args)