- Allow and improve viewing of different content types. First type implemented: changelog
This commit is contained in:
@@ -7,7 +7,7 @@ from werkzeug.middleware.proxy_fix import ProxyFix
|
||||
import logging.config
|
||||
|
||||
from common.extensions import (db, migrate, bootstrap, security, login_manager, cors, csrf, session,
|
||||
minio_client, simple_encryption, metrics, cache_manager)
|
||||
minio_client, simple_encryption, metrics, cache_manager, content_manager)
|
||||
from common.models.user import User, Role, Tenant, TenantDomain
|
||||
import common.models.interaction
|
||||
import common.models.entitlements
|
||||
@@ -124,6 +124,7 @@ def register_extensions(app):
|
||||
minio_client.init_app(app)
|
||||
cache_manager.init_app(app)
|
||||
metrics.init_app(app)
|
||||
content_manager.init_app(app)
|
||||
|
||||
|
||||
def register_blueprints(app):
|
||||
|
||||
102
eveai_app/templates/basic/view_markdown.html
Normal file
102
eveai_app/templates/basic/view_markdown.html
Normal file
@@ -0,0 +1,102 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
|
||||
{% block content_title %}{{ title }}{% endblock %}
|
||||
{% block content_description %}{{ description }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container mt-5">
|
||||
<div class="card">
|
||||
<div class="card-header bg-light d-flex justify-content-between align-items-center">
|
||||
<div class="btn-group" role="group">
|
||||
<button class="btn btn-sm btn-outline-secondary" id="showRaw">Show Raw</button>
|
||||
<button class="btn btn-sm btn-outline-primary active" id="showRendered">Show Rendered</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<!-- Raw markdown view (hidden by default) -->
|
||||
<div id="rawMarkdown" class="code-wrapper" style="display: none;">
|
||||
<pre><code class="language-markdown">{{ markdown_content }}</code></pre>
|
||||
</div>
|
||||
|
||||
<!-- Rendered markdown view -->
|
||||
<div id="renderedMarkdown" class="markdown-body">
|
||||
{{ markdown_content | markdown }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block styles %}
|
||||
{{ super() }}
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/github-markdown-css@4.0.0/github-markdown.min.css">
|
||||
<style>
|
||||
pre, code {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
white-space: pre-wrap !important;
|
||||
word-wrap: break-word !important;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
pre code {
|
||||
padding: 1rem !important;
|
||||
border-radius: 4px;
|
||||
font-size: 0.75rem;
|
||||
line-height: 1.5;
|
||||
white-space: pre-wrap !important;
|
||||
}
|
||||
|
||||
.code-wrapper {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.markdown-body {
|
||||
padding: 1rem;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Dark mode styling (optional) */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.markdown-body {
|
||||
color: #c9d1d9;
|
||||
background-color: #0d1117;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
{{ super() }}
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Initialize syntax highlighting
|
||||
document.querySelectorAll('pre code').forEach((block) => {
|
||||
hljs.highlightElement(block);
|
||||
});
|
||||
|
||||
// Toggle buttons for display
|
||||
const showRawBtn = document.getElementById('showRaw');
|
||||
const showRenderedBtn = document.getElementById('showRendered');
|
||||
const rawMarkdown = document.getElementById('rawMarkdown');
|
||||
const renderedMarkdown = document.getElementById('renderedMarkdown');
|
||||
|
||||
showRawBtn.addEventListener('click', function() {
|
||||
rawMarkdown.style.display = 'block';
|
||||
renderedMarkdown.style.display = 'none';
|
||||
showRawBtn.classList.add('active');
|
||||
showRenderedBtn.classList.remove('active');
|
||||
});
|
||||
|
||||
showRenderedBtn.addEventListener('click', function() {
|
||||
rawMarkdown.style.display = 'none';
|
||||
renderedMarkdown.style.display = 'block';
|
||||
showRawBtn.classList.remove('active');
|
||||
showRenderedBtn.classList.add('active');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -9,9 +9,17 @@ from common.models.user import Tenant
|
||||
from common.utils.database import Database
|
||||
from common.utils.nginx_utils import prefixed_url_for
|
||||
from .basic_forms import SessionDefaultsForm
|
||||
from common.extensions import content_manager
|
||||
|
||||
import markdown
|
||||
|
||||
basic_bp = Blueprint('basic_bp', __name__)
|
||||
|
||||
# Markdown filter toevoegen aan Jinja2
|
||||
@basic_bp.app_template_filter('markdown')
|
||||
def render_markdown(text):
|
||||
return markdown.markdown(text, extensions=['tables', 'fenced_code'])
|
||||
|
||||
|
||||
@basic_bp.before_request
|
||||
def log_before_request():
|
||||
@@ -104,28 +112,57 @@ def check_csrf():
|
||||
})
|
||||
|
||||
|
||||
@basic_bp.route('/release_notes', methods=['GET'])
|
||||
@basic_bp.route('/content/<content_type>', methods=['GET'])
|
||||
@roles_accepted('Super User', 'Partner Admin', 'Tenant Admin')
|
||||
def release_notes():
|
||||
"""Display the CHANGELOG.md file."""
|
||||
def view_content(content_type):
|
||||
"""
|
||||
Show content like release notes, terms of use, etc.
|
||||
|
||||
Args:
|
||||
content_type (str): Type content (eg. 'changelog', 'terms', 'privacy')
|
||||
"""
|
||||
try:
|
||||
# Construct the URL to the CHANGELOG.md file in the static directory
|
||||
static_url = url_for('static', filename='docs/CHANGELOG.md', _external=True)
|
||||
current_app.logger.debug(f"Showing content {content_type}")
|
||||
major_minor = request.args.get('version')
|
||||
patch = request.args.get('patch')
|
||||
|
||||
# Make a request to get the content of the CHANGELOG.md file
|
||||
response = requests.get(static_url)
|
||||
response.raise_for_status() # Raise an exception for HTTP errors
|
||||
# Gebruik de ContentManager om de content op te halen
|
||||
content_data = content_manager.read_content(content_type, major_minor, patch)
|
||||
|
||||
# Get the content of the response
|
||||
markdown_content = response.text
|
||||
if not content_data:
|
||||
flash(f'Content van type {content_type} werd niet gevonden.', 'danger')
|
||||
return redirect(prefixed_url_for('basic_bp.index'))
|
||||
|
||||
# Titels en beschrijvingen per contenttype
|
||||
titles = {
|
||||
'changelog': 'Release Notes',
|
||||
'terms': 'Terms & Conditions',
|
||||
'privacy': 'Privacy Statement',
|
||||
# Voeg andere types toe indien nodig
|
||||
}
|
||||
|
||||
descriptions = {
|
||||
'changelog': 'EveAI Release Notes',
|
||||
'terms': "Terms & Conditions for using AskEveAI's Evie",
|
||||
'privacy': "Privacy Statement for AskEveAI's Evie",
|
||||
# Voeg andere types toe indien nodig
|
||||
}
|
||||
|
||||
return render_template(
|
||||
'basic/view_markdown.html',
|
||||
title='Release Notes',
|
||||
description='EveAI Release Notes and Change History',
|
||||
markdown_content=markdown_content
|
||||
title=titles.get(content_type, content_type.capitalize()),
|
||||
description=descriptions.get(content_type, ''),
|
||||
markdown_content=content_data['content'],
|
||||
version=content_data['version']
|
||||
)
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"Error displaying release notes: {str(e)}")
|
||||
flash(f'Error displaying release notes: {str(e)}', 'danger')
|
||||
current_app.logger.error(f"Error displaying content {content_type}: {str(e)}")
|
||||
flash(f'Error displaying content: {str(e)}', 'danger')
|
||||
return redirect(prefixed_url_for('basic_bp.index'))
|
||||
|
||||
@basic_bp.route('/release_notes', methods=['GET'])
|
||||
@roles_accepted('Super User', 'Partner Admin', 'Tenant Admin')
|
||||
def release_notes():
|
||||
"""Doorverwijzen naar de nieuwe content view voor changelog"""
|
||||
current_app.logger.debug(f"Redirecting to content viewer")
|
||||
return redirect(prefixed_url_for('basic_bp.view_content', content_type='changelog'))
|
||||
|
||||
Reference in New Issue
Block a user