Initial release prep
This commit is contained in:
parent
c9b9d892f4
commit
92395b2b4b
100 changed files with 405 additions and 401 deletions
|
|
@ -1,84 +1,84 @@
|
|||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
MODE_ALL as MODE_ALL,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
MODE_LATEST as MODE_LATEST,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
MODE_NEW as MODE_NEW,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
MODE_UNREAD as MODE_UNREAD,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
PublicationListItem as PublicationListItem,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
UnreadPublicationItem as UnreadPublicationItem,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
count_favorite_for_user as count_favorite_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
count_for_user as count_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
count_latest_for_user as count_latest_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
count_pdf_queue_items as count_pdf_queue_items,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
count_unread_for_user as count_unread_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
enqueue_all_missing_pdf_jobs as enqueue_all_missing_pdf_jobs,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
enqueue_retry_pdf_job_for_publication_id as enqueue_retry_pdf_job_for_publication_id,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
get_latest_run_id_for_user as get_latest_run_id_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
get_publication_item_for_user as get_publication_item_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
hydrate_pdf_enrichment_state as hydrate_pdf_enrichment_state,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
list_for_user as list_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
list_pdf_queue_items as list_pdf_queue_items,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
list_pdf_queue_page as list_pdf_queue_page,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
list_unread_for_user as list_unread_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
mark_all_unread_as_read_for_user as mark_all_unread_as_read_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
mark_selected_as_read_for_user as mark_selected_as_read_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
publications_query as publications_query,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
resolve_publication_view_mode as resolve_publication_view_mode,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
retry_pdf_for_user as retry_pdf_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
schedule_missing_pdf_enrichment_for_user as schedule_missing_pdf_enrichment_for_user,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
schedule_retry_pdf_enrichment_for_row as schedule_retry_pdf_enrichment_for_row,
|
||||
)
|
||||
from app.services.domains.publications.application import (
|
||||
from app.services.publications.application import (
|
||||
set_publication_favorite_for_user as set_publication_favorite_for_user,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,46 +1,46 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from app.services.domains.publications.counts import (
|
||||
from app.services.publications.counts import (
|
||||
count_favorite_for_user,
|
||||
count_for_user,
|
||||
count_latest_for_user,
|
||||
count_unread_for_user,
|
||||
)
|
||||
from app.services.domains.publications.enrichment import (
|
||||
from app.services.publications.enrichment import (
|
||||
hydrate_pdf_enrichment_state,
|
||||
schedule_missing_pdf_enrichment_for_user,
|
||||
schedule_retry_pdf_enrichment_for_row,
|
||||
)
|
||||
from app.services.domains.publications.listing import (
|
||||
from app.services.publications.listing import (
|
||||
list_for_user,
|
||||
list_unread_for_user,
|
||||
retry_pdf_for_user,
|
||||
)
|
||||
from app.services.domains.publications.modes import (
|
||||
from app.services.publications.modes import (
|
||||
MODE_ALL,
|
||||
MODE_LATEST,
|
||||
MODE_NEW,
|
||||
MODE_UNREAD,
|
||||
resolve_publication_view_mode,
|
||||
)
|
||||
from app.services.domains.publications.pdf_queue import (
|
||||
from app.services.publications.pdf_queue import (
|
||||
count_pdf_queue_items,
|
||||
enqueue_all_missing_pdf_jobs,
|
||||
enqueue_retry_pdf_job_for_publication_id,
|
||||
list_pdf_queue_items,
|
||||
list_pdf_queue_page,
|
||||
)
|
||||
from app.services.domains.publications.queries import (
|
||||
from app.services.publications.queries import (
|
||||
get_latest_run_id_for_user,
|
||||
get_publication_item_for_user,
|
||||
publications_query,
|
||||
)
|
||||
from app.services.domains.publications.read_state import (
|
||||
from app.services.publications.read_state import (
|
||||
mark_all_unread_as_read_for_user,
|
||||
mark_selected_as_read_for_user,
|
||||
set_publication_favorite_for_user,
|
||||
)
|
||||
from app.services.domains.publications.types import PublicationListItem, UnreadPublicationItem
|
||||
from app.services.publications.types import PublicationListItem, UnreadPublicationItem
|
||||
|
||||
__all__ = [
|
||||
"MODE_ALL",
|
||||
|
|
|
|||
|
|
@ -6,13 +6,13 @@ from sqlalchemy import distinct, func, select
|
|||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.db.models import Publication, ScholarProfile, ScholarPublication
|
||||
from app.services.domains.publications.modes import (
|
||||
from app.services.publications.modes import (
|
||||
MODE_ALL,
|
||||
MODE_LATEST,
|
||||
MODE_UNREAD,
|
||||
resolve_publication_view_mode,
|
||||
)
|
||||
from app.services.domains.publications.queries import get_latest_run_id_for_user
|
||||
from app.services.publications.queries import get_latest_run_id_for_user
|
||||
|
||||
|
||||
async def count_for_user(
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ from sqlalchemy.orm import aliased
|
|||
|
||||
from app.db.models import Publication, PublicationIdentifier, ScholarPublication
|
||||
from app.logging_utils import structured_log
|
||||
from app.services.domains.ingestion.fingerprints import (
|
||||
from app.services.ingestion.fingerprints import (
|
||||
canonical_title_text_for_dedup,
|
||||
canonical_title_tokens_for_dedup,
|
||||
normalize_title,
|
||||
|
|
|
|||
|
|
@ -5,12 +5,12 @@ import logging
|
|||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.logging_utils import structured_log
|
||||
from app.services.domains.publications.pdf_queue import (
|
||||
from app.services.publications.pdf_queue import (
|
||||
enqueue_missing_pdf_jobs,
|
||||
enqueue_retry_pdf_job,
|
||||
overlay_pdf_job_state,
|
||||
)
|
||||
from app.services.domains.publications.types import PublicationListItem
|
||||
from app.services.publications.types import PublicationListItem
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
|||
|
|
@ -4,20 +4,20 @@ from datetime import datetime
|
|||
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.services.domains.publication_identifiers import application as identifier_service
|
||||
from app.services.domains.publications.modes import (
|
||||
from app.services.publication_identifiers import application as identifier_service
|
||||
from app.services.publications.modes import (
|
||||
MODE_ALL,
|
||||
MODE_UNREAD,
|
||||
resolve_publication_view_mode,
|
||||
)
|
||||
from app.services.domains.publications.queries import (
|
||||
from app.services.publications.queries import (
|
||||
get_latest_run_id_for_user,
|
||||
get_publication_item_for_user,
|
||||
publication_list_item_from_row,
|
||||
publications_query,
|
||||
unread_item_from_row,
|
||||
)
|
||||
from app.services.domains.publications.types import PublicationListItem, UnreadPublicationItem
|
||||
from app.services.publications.types import PublicationListItem, UnreadPublicationItem
|
||||
|
||||
|
||||
async def list_for_user(
|
||||
|
|
|
|||
|
|
@ -18,13 +18,13 @@ from app.db.models import (
|
|||
)
|
||||
from app.db.session import get_session_factory
|
||||
from app.logging_utils import structured_log
|
||||
from app.services.domains.publication_identifiers import application as identifier_service
|
||||
from app.services.domains.publication_identifiers.types import DisplayIdentifier
|
||||
from app.services.domains.publications.pdf_resolution_pipeline import (
|
||||
from app.services.publication_identifiers import application as identifier_service
|
||||
from app.services.publication_identifiers.types import DisplayIdentifier
|
||||
from app.services.publications.pdf_resolution_pipeline import (
|
||||
resolve_publication_pdf_outcome_for_row,
|
||||
)
|
||||
from app.services.domains.publications.types import PublicationListItem
|
||||
from app.services.domains.unpaywall.application import (
|
||||
from app.services.publications.types import PublicationListItem
|
||||
from app.services.unpaywall.application import (
|
||||
FAILURE_RESOLUTION_EXCEPTION,
|
||||
OaResolutionOutcome,
|
||||
)
|
||||
|
|
@ -450,7 +450,7 @@ async def _resolve_publication_row(
|
|||
openalex_api_key: str | None = None,
|
||||
allow_arxiv_lookup: bool = True,
|
||||
) -> bool:
|
||||
from app.services.domains.openalex.client import OpenAlexBudgetExhaustedError
|
||||
from app.services.openalex.client import OpenAlexBudgetExhaustedError
|
||||
|
||||
await _mark_attempt_started(publication_id=row.publication_id, user_id=user_id)
|
||||
try:
|
||||
|
|
@ -493,8 +493,8 @@ async def _run_resolution_task(
|
|||
request_email: str | None,
|
||||
rows: list[PublicationListItem],
|
||||
) -> None:
|
||||
from app.services.domains.openalex.client import OpenAlexBudgetExhaustedError
|
||||
from app.services.domains.settings import application as user_settings_service
|
||||
from app.services.openalex.client import OpenAlexBudgetExhaustedError
|
||||
from app.services.settings import application as user_settings_service
|
||||
|
||||
# Resolve the best available API key: per-user setting → env var fallback.
|
||||
openalex_api_key: str | None = None
|
||||
|
|
|
|||
|
|
@ -5,11 +5,11 @@ from dataclasses import dataclass
|
|||
from typing import Any
|
||||
|
||||
from app.logging_utils import structured_log
|
||||
from app.services.domains.arxiv.errors import ArxivRateLimitError
|
||||
from app.services.domains.arxiv.guards import arxiv_skip_reason_for_item
|
||||
from app.services.domains.openalex.client import OpenAlexBudgetExhaustedError
|
||||
from app.services.domains.publications.types import PublicationListItem
|
||||
from app.services.domains.unpaywall.application import OaResolutionOutcome, resolve_publication_oa_outcomes
|
||||
from app.services.arxiv.errors import ArxivRateLimitError
|
||||
from app.services.arxiv.guards import arxiv_skip_reason_for_item
|
||||
from app.services.openalex.client import OpenAlexBudgetExhaustedError
|
||||
from app.services.publications.types import PublicationListItem
|
||||
from app.services.unpaywall.application import OaResolutionOutcome, resolve_publication_oa_outcomes
|
||||
from app.settings import settings
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
@ -59,8 +59,8 @@ async def _openalex_outcome(
|
|||
request_email: str | None,
|
||||
openalex_api_key: str | None = None,
|
||||
) -> OaResolutionOutcome | None:
|
||||
from app.services.domains.openalex.client import OpenAlexClient
|
||||
from app.services.domains.openalex.matching import find_best_match
|
||||
from app.services.openalex.client import OpenAlexClient
|
||||
from app.services.openalex.matching import find_best_match
|
||||
|
||||
if not row.title:
|
||||
return None
|
||||
|
|
@ -105,7 +105,7 @@ async def _arxiv_outcome(
|
|||
request_email: str | None,
|
||||
allow_lookup: bool = True,
|
||||
) -> OaResolutionOutcome | None:
|
||||
from app.services.domains.arxiv.application import discover_arxiv_id_for_publication
|
||||
from app.services.arxiv.application import discover_arxiv_id_for_publication
|
||||
|
||||
if not allow_lookup:
|
||||
structured_log(
|
||||
|
|
|
|||
|
|
@ -13,8 +13,8 @@ from app.db.models import (
|
|||
ScholarProfile,
|
||||
ScholarPublication,
|
||||
)
|
||||
from app.services.domains.publications.modes import MODE_LATEST, MODE_UNREAD
|
||||
from app.services.domains.publications.types import PublicationListItem, UnreadPublicationItem
|
||||
from app.services.publications.modes import MODE_LATEST, MODE_UNREAD
|
||||
from app.services.publications.types import PublicationListItem, UnreadPublicationItem
|
||||
|
||||
|
||||
def _normalized_citation_count(value: object) -> int:
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ from __future__ import annotations
|
|||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
|
||||
from app.services.domains.publication_identifiers.types import DisplayIdentifier
|
||||
from app.services.publication_identifiers.types import DisplayIdentifier
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue