-
- API
-
- Learn how to download and publish open data on the OEP using the
- API.
-
- Learn more
-
-
-
- Open Science
-
- Good scientific practice needs open licenses for software, data and
- content.
-
- Learn more
-
-
-
- Open Energy Community
-
- Collaborate and contribute to the development on GitHub.
-
- Learn
- more
-
+
+
+
+
+
+
+
+
+ API
+
+ Learn how to download and publish open data on the OEP using the
+ API.
+
+ Learn more
+
+
+
+ Open Science
+
+ Good scientific practice needs open licenses for software, data and
+ content.
+
+ Learn more
+
+
+
+ Open Energy Community
+
+ Collaborate and contribute to the development on GitHub.
+
+ Learn
+ more
+
{% endblock %}
diff --git a/base/templatetags/base_tags.py b/base/templatetags/base_tags.py
index 4ff288fa8..781a526f7 100644
--- a/base/templatetags/base_tags.py
+++ b/base/templatetags/base_tags.py
@@ -3,7 +3,13 @@
SPDX-License-Identifier: AGPL-3.0-or-later
""" # noqa: 501
+import re
+from pathlib import Path, PurePosixPath
+
+import markdown2
from django import template
+from django.contrib.staticfiles import finders
+from django.utils.safestring import mark_safe
register = template.Library()
@@ -11,3 +17,102 @@
@register.filter(name="addclass")
def addclass(field, css):
return field.as_widget(attrs={"class": css})
+
+
+def _is_safe_static_path(filename):
+ path = PurePosixPath(filename)
+ return not path.is_absolute() and ".." not in path.parts
+
+
+_RELEASE_FILE_PATTERN = re.compile(r"^(\d+)_(\d+)_(\d+)\.md$")
+
+_CHANGELOG_DIRECTORY = Path(__file__).resolve().parents[2] / "versions" / "changelogs"
+
+
+def _get_release_version(path):
+ """Read the version from a filename such as 1_8_0.md."""
+ match = _RELEASE_FILE_PATTERN.fullmatch(path.name)
+
+ if match is None:
+ return None
+
+ return tuple(int(number) for number in match.groups())
+
+
+def _find_latest_release_changelog():
+ """Find the newest published changelog."""
+ release_files = []
+
+ for path in _CHANGELOG_DIRECTORY.glob("*.md"):
+ version = _get_release_version(path)
+
+ if version is not None:
+ release_files.append((version, path))
+
+ if not release_files:
+ return None
+
+ return max(release_files, key=lambda item: item[0])[1]
+
+
+def _extract_startpage_highlights(markdown_content):
+ """Read only the Startpage Highlights section."""
+ pattern = re.compile(
+ r"^## Startpage Highlights\s*$\n" r"(?P.*?)(?=^##\s|\Z)",
+ flags=re.MULTILINE | re.DOTALL,
+ )
+
+ match = pattern.search(markdown_content)
+
+ if match is None:
+ return ""
+
+ return match.group("content").strip()
+
+
+@register.simple_tag
+def render_latest_release_highlights():
+ """Render highlights from the newest published changelog."""
+ latest_changelog = _find_latest_release_changelog()
+
+ if latest_changelog is None:
+ return ""
+
+ try:
+ markdown_content = latest_changelog.read_text(encoding="utf-8")
+ except OSError:
+ return ""
+
+ highlights = _extract_startpage_highlights(markdown_content)
+
+ if not highlights:
+ return ""
+
+ markdowner = markdown2.Markdown()
+ return mark_safe(markdowner.convert(highlights))
+
+
+@register.simple_tag
+def render_markdown(filename):
+ """Find a markdown file in staticfiles and render it as HTML.
+
+ The staticfiles lookup allows markdown content to live in any Django app's
+ static directory. The fallback keeps the old ``base/static/content`` lookup
+ behaviour for existing callers that pass only a filename.
+ """
+ if not _is_safe_static_path(filename):
+ return ""
+
+ md_path = finders.find(filename)
+ if not md_path:
+ md_path = (
+ Path(__file__).resolve().parent.parent / "static" / "content" / filename
+ )
+
+ try:
+ content = Path(md_path).read_text(encoding="utf-8")
+ except OSError:
+ return ""
+
+ markdowner = markdown2.Markdown()
+ return mark_safe(markdowner.convert(content))
diff --git a/dataedit/static/release_info_startpage/release_v1.8.0.md b/dataedit/static/release_info_startpage/release_v1.8.0.md
new file mode 100644
index 000000000..650b912e8
--- /dev/null
+++ b/dataedit/static/release_info_startpage/release_v1.8.0.md
@@ -0,0 +1,28 @@
+
+
+### ✨ Highlights
+
+- **Redesigned Tables listings & Search:** Introduced a dedicated search field
+ for user tables and reworked the table listing UI to display additional
+ metadata directly on the table cards.
+- **Updated OEO Viewer & Entity Pages:** Reorganized the OEO Viewer layout for
+ better hierarchy and mobile responsiveness. Added a language toggle for
+ English/German synonyms, automatic entity-type detection, and an updated Graph
+ View widget that supports graph comparisons.
+- **Scenario Comparison App (Prototype) Update:** Refactored the quantitative
+ scenario comparison prototype to work with the updated OEKG and OEO. The app
+ now uses E-Charts as its graph library.
+- **Automated Metadata Syncing:** The metadata API now synchronizes the
+ documented data schema in the metadata with the actual table schema available
+ in the database.
+- **Bug Fixes & General Improvements:** Fixed an issue in the oemetaBuilder tool
+ that removed specific references on save, corrected the Reviewer & Contributor
+ progress calculations to account for empty fields, and patched an OEO loading
+ bug related to version 2.12.0.
+
+👉 **Check out the full changelog and explore what’s new!**
+[Full Changelog](https://github.com/OpenEnergyPlatform/oeplatform/blob/master/versions/changelogs/1_8_0.md)
diff --git a/versions/changelogs/1_8_0.md b/versions/changelogs/1_8_0.md
index 5918b8eba..b906540f3 100644
--- a/versions/changelogs/1_8_0.md
+++ b/versions/changelogs/1_8_0.md
@@ -8,6 +8,20 @@ SPDX-License-Identifier: CC0-1.0
# Changes to the oeplatform code
+## Startpage Highlights
+
+- **Redesigned Tables listings & Search:** The table search and listing were
+ improved.
+- **Updated OEO Viewer:** The layout and mobile view were improved.
+- **Scenario Comparison App Update:** The application was updated for the
+ current OEKG and OEO.
+- **Automated Metadata Syncing:** Metadata and table schemas are now
+ synchronized.
+- **Bug Fixes:** Several issues were corrected.
+
+- Check out the full changelog and explore whats's new!
+ [Full Changelog](https://github.com/OpenEnergyPlatform/oeplatform/blob/master/versions/changelogs/1_8_0.md)
+
## Changes
- Create tables_sections.html, delete user_partial_tables
diff --git a/versions/changelogs/current.template.md b/versions/changelogs/current.template.md
index 599d6500c..f1f24e1b6 100644
--- a/versions/changelogs/current.template.md
+++ b/versions/changelogs/current.template.md
@@ -8,6 +8,13 @@ SPDX-License-Identifier: CC0-1.0
# Changes to the oeplatform code
+## Startpage Highlights
+
+
+
## Changes
## Features