feat: add license page and version display in templates, update LICENSE file, and enhance footer with license information
This commit is contained in:
@@ -19,6 +19,7 @@ COPY --from=builder /usr/local/bin /usr/local/bin
|
|||||||
COPY ./app /app/app
|
COPY ./app /app/app
|
||||||
COPY ./frontend /app/frontend
|
COPY ./frontend /app/frontend
|
||||||
COPY ./VERSION /app/VERSION
|
COPY ./VERSION /app/VERSION
|
||||||
|
COPY ./LICENSE /app/LICENSE
|
||||||
|
|
||||||
# Set Python path explicitly
|
# Set Python path explicitly
|
||||||
ENV PYTHONPATH=/app
|
ENV PYTHONPATH=/app
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Apache License
|
Apache License
|
||||||
Version 2.0, January 2004
|
Version 2.0, January 2004
|
||||||
http://www.apache.org/licenses/
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
@@ -175,18 +175,7 @@
|
|||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
Copyright 2025 Christian Krakau-Louis <christian@docunova.org>
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@@ -15,6 +15,20 @@ from app.config import settings
|
|||||||
templates_dir = Path(__file__).parent.parent.parent / "frontend" / "templates"
|
templates_dir = Path(__file__).parent.parent.parent / "frontend" / "templates"
|
||||||
templates = Jinja2Templates(directory=str(templates_dir))
|
templates = Jinja2Templates(directory=str(templates_dir))
|
||||||
|
|
||||||
|
# Customize Jinja2Templates to include app_version in all templates
|
||||||
|
original_template_response = templates.TemplateResponse
|
||||||
|
|
||||||
|
def template_response_with_version(*args, **kwargs):
|
||||||
|
"""Wrapper for TemplateResponse to include version in all templates"""
|
||||||
|
# If context dict is provided, add version to it
|
||||||
|
if len(args) >= 2 and isinstance(args[1], dict):
|
||||||
|
args[1].setdefault("version", settings.version)
|
||||||
|
elif "context" in kwargs and isinstance(kwargs["context"], dict):
|
||||||
|
kwargs["context"].setdefault("version", settings.version)
|
||||||
|
return original_template_response(*args, **kwargs)
|
||||||
|
|
||||||
|
templates.TemplateResponse = template_response_with_version
|
||||||
|
|
||||||
# Set up logging
|
# Set up logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|||||||
@@ -33,3 +33,44 @@ def favicon():
|
|||||||
# If favicon doesn't exist, return a 404
|
# If favicon doesn't exist, return a 404
|
||||||
raise HTTPException(status_code=404, detail="Favicon not found")
|
raise HTTPException(status_code=404, detail="Favicon not found")
|
||||||
return FileResponse(favicon_path)
|
return FileResponse(favicon_path)
|
||||||
|
|
||||||
|
@router.get("/license", include_in_schema=False)
|
||||||
|
async def serve_license(request: Request):
|
||||||
|
"""Serve the license page."""
|
||||||
|
# Try multiple possible locations for the license file
|
||||||
|
possible_locations = [
|
||||||
|
Path(__file__).parent.parent.parent / "LICENSE", # Repository root
|
||||||
|
Path("/app/LICENSE"), # Docker container path
|
||||||
|
Path.home() / "LICENSE", # Home directory (fallback)
|
||||||
|
]
|
||||||
|
|
||||||
|
license_text = None
|
||||||
|
|
||||||
|
# Try to read from any of the possible locations
|
||||||
|
for path in possible_locations:
|
||||||
|
try:
|
||||||
|
with open(path, "r") as f:
|
||||||
|
license_text = f.read()
|
||||||
|
break # File found and read, exit loop
|
||||||
|
except (FileNotFoundError, PermissionError):
|
||||||
|
continue # Try next location
|
||||||
|
|
||||||
|
# If license text is still None, use embedded text
|
||||||
|
if license_text is None:
|
||||||
|
license_text = """
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
This software is licensed under the Apache License 2.0.
|
||||||
|
The full license text could not be located on this system.
|
||||||
|
Please visit http://www.apache.org/licenses/LICENSE-2.0 for the complete license text.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return templates.TemplateResponse(
|
||||||
|
"license.html",
|
||||||
|
{
|
||||||
|
"request": request,
|
||||||
|
"license_text": license_text
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|||||||
@@ -104,7 +104,8 @@
|
|||||||
<!-- Footer -->
|
<!-- Footer -->
|
||||||
<footer class="bg-white shadow">
|
<footer class="bg-white shadow">
|
||||||
<div class="max-w-7xl mx-auto px-4 py-4 text-center text-gray-600">
|
<div class="max-w-7xl mx-auto px-4 py-4 text-center text-gray-600">
|
||||||
© 2025 DocuNova. All rights reserved.
|
DocuNova 2025 - Licensed under <a href="/license" class="text-blue-500 hover:underline">Apache License 2.0</a> -
|
||||||
|
<span class="text-xs">Version {{ app_version|default(version, true) }}</span>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block title %}DocuNova - License{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="container mx-auto px-4 py-8">
|
||||||
|
<h1 class="text-2xl font-bold mb-4">License Information</h1>
|
||||||
|
|
||||||
|
<div class="bg-white shadow-md rounded-lg p-6">
|
||||||
|
<h2 class="text-xl font-semibold mb-4">Apache License 2.0</h2>
|
||||||
|
|
||||||
|
<div class="prose">
|
||||||
|
<pre class="whitespace-pre-wrap text-sm font-mono bg-gray-50 p-4 rounded border overflow-auto max-h-96 mb-4">{{ license_text }}</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="mt-4 text-gray-600">
|
||||||
|
DocuNova is distributed under the Apache License 2.0, which is a permissive
|
||||||
|
open-source software license that allows you to use, modify, distribute, and
|
||||||
|
contribute to the project.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{{ version }}
|
||||||
Reference in New Issue
Block a user