From f1f27d076559a501253eff67fb681932a612a77a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20K=C3=BCnzel?= <simonk@fsmpi.rwth-aachen.de> Date: Fri, 18 Oct 2024 14:00:55 +0200 Subject: [PATCH] Small adjustments to objects --- src/videoag_common/__init__.py | 7 ++++--- src/videoag_common/miscellaneous/util.py | 4 ++-- src/videoag_common/objects/__init__.py | 1 + src/videoag_common/objects/changelog.py | 3 ++- src/videoag_common/objects/course.py | 7 +++++-- src/videoag_common/objects/medium.py | 6 ++++-- 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/videoag_common/__init__.py b/src/videoag_common/__init__.py index d75bae0..56bc2e6 100644 --- a/src/videoag_common/__init__.py +++ b/src/videoag_common/__init__.py @@ -1,13 +1,14 @@ import os from pathlib import Path -from videoag_common.miscellaneous.util import load_config_file, merge_config_with +from videoag_common.miscellaneous.util import load_config_file, merge_config_into if "VIDEOAG_CONFIG" not in os.environ: raise Exception("Missing VIDEOAG_CONFIG environment variable") config = load_config_file(Path(os.getcwd()).joinpath(os.environ["VIDEOAG_CONFIG"])) if "VIDEOAG_TEST_CONFIG_OVERRIDE" in os.environ: - merge_config_with( + merge_config_into( config, - load_config_file(Path(os.getcwd()).joinpath(os.environ["VIDEOAG_TEST_CONFIG_OVERRIDE"])) + load_config_file(Path(os.getcwd()).joinpath(os.environ["VIDEOAG_TEST_CONFIG_OVERRIDE"])), + overwrite_non_mergeable=True ) diff --git a/src/videoag_common/miscellaneous/util.py b/src/videoag_common/miscellaneous/util.py index 041325c..54c50b1 100644 --- a/src/videoag_common/miscellaneous/util.py +++ b/src/videoag_common/miscellaneous/util.py @@ -114,12 +114,12 @@ def load_config_file(path: Path): return config -def merge_config_with(config: dict, to_merge: dict, overwrite_non_mergeable: bool = False): +def merge_config_into(config: dict, to_merge: dict, overwrite_non_mergeable: bool = False): for key, item in to_merge.items(): if key not in config: config[key] = item elif isinstance(item, dict) and isinstance(config[key], dict): - merge_config_with(config[key], item) + merge_config_into(config[key], item, overwrite_non_mergeable=overwrite_non_mergeable) elif overwrite_non_mergeable: config[key] = item else: diff --git a/src/videoag_common/objects/__init__.py b/src/videoag_common/objects/__init__.py index 5e6d4b4..373c8c8 100644 --- a/src/videoag_common/objects/__init__.py +++ b/src/videoag_common/objects/__init__.py @@ -20,6 +20,7 @@ from .medium import ( ThumbnailTargetMedium, SourceMedium, SourceMediumStatus, + MediaProcessTemplate, LOAD_SOURCE_MEDIUM_LECTURE, LOAD_PUBLISH_MEDIUM_LECTURE, LOAD_PUBLISH_MEDIUM_TARGET_MEDIUM, diff --git a/src/videoag_common/objects/changelog.py b/src/videoag_common/objects/changelog.py index ae3bafc..a575ea9 100644 --- a/src/videoag_common/objects/changelog.py +++ b/src/videoag_common/objects/changelog.py @@ -88,7 +88,8 @@ class ChangelogModificationEntry(ChangelogEntry): old_value: Mapped[dict] = api_mapped( mapped_column(sql.types.JSON(), nullable=True), ApiJsonField( - include_in_data=True, data_notes="Note that this may contain arbitrary json due to legacy values" + include_in_data=True, data_if=lambda entry, args: entry.old_value is not None, + data_notes="Note that this may contain arbitrary json due to legacy values. Not present if this was at creation" ) ) new_value: Mapped[dict] = api_mapped( diff --git a/src/videoag_common/objects/course.py b/src/videoag_common/objects/course.py index 5f08fde..fa9629b 100644 --- a/src/videoag_common/objects/course.py +++ b/src/videoag_common/objects/course.py @@ -134,7 +134,7 @@ class Lecture(DeletableApiObject, VisibilityApiObject, ApiViewPermissionsObject, publish_time: Mapped[datetime] = api_mapped( mapped_column(TIMESTAMP(), nullable=True, index=True), ApiDatetimeField( - include_in_data=True + include_in_data=True, data_only_mod=True ) ) media_process: Mapped[dict] = api_mapped( @@ -467,11 +467,13 @@ class Course(DeletableApiObject, VisibilityApiObject, ApiViewPermissionsObject, lectures: Mapped[list[Lecture]] = relationship( back_populates="course", primaryjoin=lambda: sql.and_(Lecture.course_id == Course.id, Lecture.has_access(is_mod=True, from_course=True)), + order_by=Lecture.time.asc(), lazy="raise_on_sql" ) public_lectures: Mapped[list[Lecture]] = relationship( back_populates="course", primaryjoin=lambda: sql.and_(Lecture.course_id == Course.id, Lecture.has_access(is_mod=False, from_course=True)), + order_by=Lecture.time.asc(), lazy="raise_on_sql", viewonly=True ) @@ -492,7 +494,8 @@ class Course(DeletableApiObject, VisibilityApiObject, ApiViewPermissionsObject, type_id="lecture[]", data_id="lectures", data_if=lambda course, args: args.include_lectures, - data_notes="Only present if requested. All (public) lectures. Lectures will include chapters and media_sources" + data_notes="Only present if requested. All (public) lectures. Sorted by their time ascending. Lectures will " + "include chapters and publish media" ) def _data_lectures(self, is_mod: bool): return self.lectures if is_mod else self.public_lectures diff --git a/src/videoag_common/objects/medium.py b/src/videoag_common/objects/medium.py index b103c62..2bdb82b 100644 --- a/src/videoag_common/objects/medium.py +++ b/src/videoag_common/objects/medium.py @@ -558,13 +558,15 @@ class MediaProcessTemplate(ApiObject, Base): mapped_column(String(collation=STRING_COLLATION), nullable=False), ApiStringField( max_length=256, - include_in_config=True + include_in_config=True, config_directly_modifiable=True, + include_in_data=True ) ) process: Mapped[dict] = api_mapped( mapped_column(postgresql.JSONB, nullable=False), ApiMediaProcessField( - include_in_config=True + include_in_config=True, config_directly_modifiable=True, + include_in_data=True ) ) -- GitLab