diff --git a/.circleci/config.yml b/.circleci/config.yml index fd8fdb7e6..026d79af7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -130,14 +130,12 @@ workflows: filters: branches: only: - - develop - main - build-base-arm64: &filters-release filters: branches: only: - main - - /.*-ci/ - test-and-build-dist-amd64: <<: *filters-all requires: diff --git a/NEWS.md b/NEWS.md index 012f87209..f71fb3d36 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,11 +6,13 @@ width: 128px; border-radius: 128px; " /> -## v1.10.5 +## v1.10.6 - Fixes - Reset settings on OPDS start page more consistently. +## v1.10.5 - Broken release + ## v1.10.4 - Broken release ## v1.10.3 diff --git a/bin/docker-tag-latest.sh b/bin/docker-tag-latest.sh index 0e7cbed31..8a62033c1 100755 --- a/bin/docker-tag-latest.sh +++ b/bin/docker-tag-latest.sh @@ -22,7 +22,7 @@ fi # 1. Log in to registry echo "Logging in to $REGISTRY..." -echo "$DOCKER_PASSWORD" | docker login "$REGISTRY" -u "$DOCKER_USER" --password-stdin +echo "$DOCKER_PASS" | docker login "$REGISTRY" -u "$DOCKER_USER" --password-stdin # 2. Retag the multi-arch image # This creates a new manifest on the registry side without downloading image layers @@ -31,6 +31,7 @@ docker buildx imagetools create \ --tag "$REGISTRY/$IMAGE_NAME:$TARGET_TAG" \ "$REGISTRY/$IMAGE_NAME:$SOURCE_TAG" +# shellcheck disable=SC2181 if [ $? -eq 0 ]; then echo "Successfully updated $TARGET_TAG" else diff --git a/codex/views/browser/params.py b/codex/views/browser/params.py index 542a05802..53469890b 100644 --- a/codex/views/browser/params.py +++ b/codex/views/browser/params.py @@ -4,6 +4,8 @@ from types import MappingProxyType from typing import Any +from loguru import logger + from codex.serializers.browser.settings import ( BrowserSettingsSerializer, BrowserSettingsSerializerBase, @@ -32,7 +34,7 @@ def init_params(self) -> MutableMapping[str, Any]: params.update(serializer.validated_data) return params - def update_last_route(self, data: MutableMapping) -> None: + def _update_last_route(self, data: MutableMapping) -> None: """Save last route to data.""" last_route = data.get("last_route", {}) last_route.update( @@ -52,9 +54,14 @@ def set_params(self, params: Mapping) -> None: def params(self) -> MappingProxyType: """Validate submitted settings and apply them over the session settings.""" if self._params is None: - params = self.init_params() - self.update_last_route(params) - self.save_params_to_settings(params) - self.set_order_by_default(params) - self.set_params(params) + try: + params = self.init_params() + self._update_last_route(params) + self.save_params_to_settings(params) + self.set_order_by_default(params) + self.set_params(params) + except Exception as exc: + # for debugging if this goes awry + logger.exception(exc) + raise return self._params # pyright: ignore[reportReturnType], # ty: ignore[invalid-return-type] diff --git a/codex/views/opds/v2/feed/__init__.py b/codex/views/opds/v2/feed/__init__.py index 3b9501996..164321662 100644 --- a/codex/views/opds/v2/feed/__init__.py +++ b/codex/views/opds/v2/feed/__init__.py @@ -111,9 +111,9 @@ def _feed_navigation_and_groups( ) -> tuple[tuple, tuple, tuple]: groups = [] navigation = [] - top_groups = self._get_top_groups() + top_groups = self.get_top_groups() if self.IS_START_PAGE: - groups += self._get_ordered_groups() + groups += self.get_ordered_groups() first_top_group = next(iter(top_groups), {}) navigation = first_top_group.get("navigation", []) publications = [] @@ -121,14 +121,14 @@ def _feed_navigation_and_groups( # Move the first group's navigation to become the feed navigation. # The feed navigation is titled "Browse"" in Stump zero_pad = zero_pad or 0 - regular_groups = self._get_groups(group_qs, book_qs, title, zero_pad) + regular_groups = self.get_groups(group_qs, book_qs, title, zero_pad) first_regular_group = next(iter(regular_groups), {}) navigation = first_regular_group.pop("navigation", []) groups += regular_groups groups += top_groups - groups += self._get_facets() - groups += self._get_start_groups() + groups += self.get_facets() + groups += self.get_start_groups() publications = first_regular_group.pop("publications", []) return tuple(navigation), tuple(groups), tuple(publications) diff --git a/codex/views/opds/v2/feed/groups.py b/codex/views/opds/v2/feed/groups.py index 8d3194072..13909e37b 100644 --- a/codex/views/opds/v2/feed/groups.py +++ b/codex/views/opds/v2/feed/groups.py @@ -135,12 +135,12 @@ def _create_group(self, group_specs, *, paginate: bool = False) -> list: groups += self._create_group_from_group_spec(group_spec, paginate=paginate) return groups - def _get_top_groups(self): + def get_top_groups(self): """Top Nav Groups.""" return self._create_group(TOP_GROUPS) - def _get_ordered_groups(self) -> list: - # Top Nav Groups + def get_ordered_groups(self) -> list: + """Ordered Publication Groups.""" groups = [] for group_spec in PREVIEW_GROUPS: # explode into individual groups @@ -149,11 +149,12 @@ def _get_ordered_groups(self) -> list: groups += pub_section return groups - def _get_start_groups(self): - # Top Nav Groups + def get_start_groups(self): + """Start Groups.""" return self._create_group(START_GROUPS) - def _get_groups(self, group_qs, book_qs, title: str, zero_pad: int): + def get_groups(self, group_qs, book_qs, title: str, zero_pad: int): + """Regular publication groups.""" groups = [] # Regular Groups @@ -168,5 +169,6 @@ def _get_groups(self, group_qs, book_qs, title: str, zero_pad: int): return groups - def _get_facets(self): + def get_facets(self): + """Facet Groups.""" return self._create_group(FACETS) diff --git a/codex/views/opds/v2/feed/publications.py b/codex/views/opds/v2/feed/publications.py index 3147c0a4e..2dd62112c 100644 --- a/codex/views/opds/v2/feed/publications.py +++ b/codex/views/opds/v2/feed/publications.py @@ -13,7 +13,7 @@ from codex.models import AdminFlag, Comic from codex.models.groups import BrowserGroupModel, Folder from codex.settings import BROWSER_MAX_OBJ_PER_PAGE -from codex.views.opds.const import MimeType, Rel +from codex.views.opds.const import DEFAULT_PARAMS, MimeType, Rel from codex.views.opds.v2.const import HrefData, Link, LinkData from codex.views.opds.v2.feed.feed_links import OPDS2FeedLinksView @@ -239,12 +239,12 @@ def _get_publications_preview_feed_view(self, link_spec: Link): feed_view.request = self.request group = link_spec.group feed_view.kwargs = {"group": group, "pks": [0], "page": 1} - params = {} + params = dict(DEFAULT_PARAMS) if link_spec.query_params: for key, value in link_spec.query_params.items(): params[snakecase(key)] = value - params["show"] = {"p": True, "s": True} - params["limit"] = _PUBLICATION_PREVIEW_LIMIT + params["show"].update({"p": True, "s": True}) # pyright: ignore[reportCallIssue,reportAttributeAccessIssue,reportArgumentType], # ty: ignore[unresolved-attribute] + params["limit"] = _PUBLICATION_PREVIEW_LIMIT # pyright: ignore[reportArgumentType], # ty:ignore[invalid-assignment] feed_view.set_params(params) return feed_view @@ -260,8 +260,7 @@ def get_publications_preview(self, link_spec: Link) -> list: book_qs, zero_pad, link_spec.title, - "", - _PUBLICATION_PREVIEW_LIMIT, - link_spec, + items_per_page=_PUBLICATION_PREVIEW_LIMIT, + link_spec=link_spec, number_of_items=book_count, ) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 22d75fc2f..91f376916 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "codex", - "version": "1.10.5", + "version": "1.10.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "codex", - "version": "1.10.5", + "version": "1.10.6", "dependencies": { "@unhead/vue": "^2.0.8", "@vueuse/core": "^14.2.1", diff --git a/frontend/package.json b/frontend/package.json index 62691bf0f..8445058ae 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "codex", - "version": "1.10.5", + "version": "1.10.6", "private": true, "description": "ui for codex api", "type": "module", diff --git a/pyproject.toml b/pyproject.toml index 8d2b0dc46..14d627ea4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ readme = "README.md" requires-python = ">=3.12" license = "GPL-3.0-only" name = "codex" -version = "1.10.5" +version = "1.10.6" [[project.authors]] name = "AJ Slater" email = "aj@slater.net" diff --git a/uv.lock b/uv.lock index 4ae2ec0f3..3fbef1cba 100644 --- a/uv.lock +++ b/uv.lock @@ -399,7 +399,7 @@ wheels = [ [[package]] name = "codex" -version = "1.10.5" +version = "1.10.6" source = { editable = "." } dependencies = [ { name = "bidict" },