feat: Add build date functionality and enhance documentation pages

- Added a script to save the build date during Docker image build.
- Introduced a build_date property in the Settings class to retrieve the build date from the environment or file.
- Enhanced the homepage to display system statistics including processed files and active integrations.
- Updated the about page with a comprehensive list of features.
- Added new privacy, imprint, cookies, and terms pages with relevant content.
- Improved the license page with related information links.
- Refactored the base template for better mobile responsiveness and footer links.
This commit is contained in:
Christian Krakau-Louis
2025-04-07 00:05:49 +02:00
parent e669dc8553
commit b93c781339
12 changed files with 584 additions and 55 deletions
+10
View File
@@ -21,6 +21,16 @@ COPY ./frontend /app/frontend
COPY ./VERSION /app/VERSION COPY ./VERSION /app/VERSION
COPY ./LICENSE /app/LICENSE COPY ./LICENSE /app/LICENSE
# Copy build script and generate build date
COPY ./docker/build-scripts/save-build-date.sh /tmp/
RUN mkdir -p /app/docker/build-scripts/ && \
cp /tmp/save-build-date.sh /app/docker/build-scripts/ && \
chmod +x /tmp/save-build-date.sh && \
/tmp/save-build-date.sh
# Set build date as environment variable
#ENV BUILD_DATE=$(cat /app/BUILD_DATE)
# Set Python path explicitly # Set Python path explicitly
ENV PYTHONPATH=/app ENV PYTHONPATH=/app
+24
View File
@@ -3,6 +3,7 @@
from pydantic_settings import BaseSettings from pydantic_settings import BaseSettings
from typing import Optional, List, Dict, Any from typing import Optional, List, Dict, Any
import os import os
from datetime import datetime
class Settings(BaseSettings): class Settings(BaseSettings):
database_url: str database_url: str
@@ -121,6 +122,29 @@ class Settings(BaseSettings):
# Feature flags # Feature flags
allow_file_delete: bool = True # Default to allowing file deletion from database allow_file_delete: bool = True # Default to allowing file deletion from database
# Get build date from environment or file
@property
def build_date(self) -> str:
# First try to get build date from environment
env_build_date = os.environ.get("BUILD_DATE")
if env_build_date:
return env_build_date
# Then try to get build date from BUILD_DATE file
build_date_file = os.path.join(os.path.dirname(os.path.dirname(__file__)), "BUILD_DATE")
if os.path.exists(build_date_file):
with open(build_date_file, "r") as f:
return f.read().strip()
# If a timestamp file doesn't exist, try to get the app.py creation/modification time
app_file = os.path.join(os.path.dirname(__file__), "app.py")
if os.path.exists(app_file):
timestamp = os.path.getmtime(app_file)
return datetime.fromtimestamp(timestamp).strftime("%B %d, %Y")
# Default to current date if not found elsewhere
return datetime.now().strftime("%B %d, %Y")
# Get version from file or environment # Get version from file or environment
@property @property
def version(self) -> str: def version(self) -> str:
+47 -1
View File
@@ -4,21 +4,55 @@ General routes for the application homepage and basic pages.
from fastapi import Request, HTTPException from fastapi import Request, HTTPException
from fastapi.responses import FileResponse from fastapi.responses import FileResponse
from pathlib import Path from pathlib import Path
from datetime import date
from app.views.base import APIRouter, templates, require_login from app.views.base import APIRouter, templates, require_login
from app.utils.config_validator import get_provider_status, validate_storage_configs
router = APIRouter() router = APIRouter()
@router.get("/", include_in_schema=False) @router.get("/", include_in_schema=False)
async def serve_index(request: Request): async def serve_index(request: Request):
"""Serve the index/home page.""" """Serve the index/home page."""
return templates.TemplateResponse("index.html", {"request": request}) # Get provider information from config validator
providers = get_provider_status()
# Count configured providers
configured_providers = sum(1 for provider in providers.values() if provider['configured'])
# Count different types of storage targets
storage_issues = validate_storage_configs()
configured_storage_targets = sum(1 for provider, issues in storage_issues.items()
if not issues and provider in ['dropbox', 'nextcloud', 'sftp',
's3', 'ftp', 'webdav',
'google_drive', 'onedrive'])
# Create stats object to pass to the template
stats = {
"processed_files": 0, # Placeholder - would need actual DB query
"active_integrations": configured_providers,
"storage_targets": configured_storage_targets
}
return templates.TemplateResponse("index.html", {"request": request, "stats": stats})
@router.get("/about", include_in_schema=False) @router.get("/about", include_in_schema=False)
async def serve_about(request: Request): async def serve_about(request: Request):
"""Serve the about page.""" """Serve the about page."""
return templates.TemplateResponse("about.html", {"request": request}) return templates.TemplateResponse("about.html", {"request": request})
@router.get("/privacy", include_in_schema=False)
async def serve_privacy(request: Request):
"""Serve the privacy policy page."""
# Pass the current date for the "Last Updated" field
current_date = date.today().strftime("%B %d, %Y")
return templates.TemplateResponse("privacy.html", {"request": request, "current_date": current_date})
@router.get("/imprint", include_in_schema=False)
async def serve_imprint(request: Request):
"""Serve the imprint/impressum page."""
return templates.TemplateResponse("imprint.html", {"request": request})
@router.get("/upload", include_in_schema=False) @router.get("/upload", include_in_schema=False)
@require_login @require_login
async def serve_upload(request: Request): async def serve_upload(request: Request):
@@ -74,3 +108,15 @@ Please visit http://www.apache.org/licenses/LICENSE-2.0 for the complete license
"license_text": license_text "license_text": license_text
} }
) )
@router.get("/cookies", include_in_schema=False)
async def serve_cookies(request: Request):
"""Serve the cookie policy page."""
current_date = date.today().strftime("%B %d, %Y")
return templates.TemplateResponse("cookies.html", {"request": request, "current_date": current_date})
@router.get("/terms", include_in_schema=False)
async def serve_terms(request: Request):
"""Serve the terms of service page."""
current_date = date.today().strftime("%B %d, %Y")
return templates.TemplateResponse("terms.html", {"request": request, "current_date": current_date})
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
# Get current date in Month DD, YYYY format (e.g., May 15, 2024)
BUILD_DATE=$(date +"%B %d, %Y")
# Save it to the BUILD_DATE file
echo $BUILD_DATE > /app/BUILD_DATE
# Also set it as an environment variable
echo "Setting BUILD_DATE=$BUILD_DATE"
export BUILD_DATE
+69 -18
View File
@@ -15,7 +15,7 @@
<h2 class="text-2xl font-semibold mb-2">Our Story</h2> <h2 class="text-2xl font-semibold mb-2">Our Story</h2>
<p class="text-gray-600 mb-4"> <p class="text-gray-600 mb-4">
DocuElevate was created with one goal in mind: to simplify and streamline document management DocuElevate was created with one goal in mind: to simplify and streamline document management
for everyone, whether youre a small startup or a large enterprise. for everyone, whether you're a small startup or a large enterprise.
</p> </p>
<p class="text-gray-600"> <p class="text-gray-600">
We harness the power of OpenAI for metadata extraction and text refinement, integrate seamlessly We harness the power of OpenAI for metadata extraction and text refinement, integrate seamlessly
@@ -24,18 +24,48 @@
</p> </p>
</section> </section>
<!-- Key Features Section --> <!-- Key Features Section - Updated with more comprehensive features -->
<section class="bg-white shadow rounded p-6 mb-8"> <section class="bg-white shadow rounded p-6 mb-8">
<h2 class="text-2xl font-semibold mb-2">Key Features</h2> <h2 class="text-2xl font-semibold mb-2">Key Features</h2>
<ul class="list-disc list-inside text-gray-600"> <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<li>Simple and secure file uploads with drag & drop support</li> <div>
<li>Automated metadata extraction, indexing, and version control</li> <h3 class="font-medium text-lg text-gray-800">Document Processing</h3>
<li>Integration with popular cloud services and storage platforms</li> <ul class="list-disc list-inside text-gray-600 ml-2">
<li>OCR and intelligent document processing powered by AI</li> <li>Simple and secure file uploads with drag & drop support</li>
<li>IMAP integration for automated document fetching</li> <li>OCR powered by Azure Document Intelligence</li>
<li>Highly configurable via environment variables</li> <li>Automated metadata extraction using OpenAI</li>
<li>Docker-ready for easy deployment</li> <li>PDF conversion for various file formats via Gotenberg</li>
</ul> <li>Intelligent document classification and date extraction</li>
</ul>
</div>
<div>
<h3 class="font-medium text-lg text-gray-800">Integration & Storage</h3>
<ul class="list-disc list-inside text-gray-600 ml-2">
<li>Multi-destination support (store documents in multiple locations)</li>
<li>Cloud storage: Dropbox, Google Drive, OneDrive, Amazon S3</li>
<li>Self-hosted options: Nextcloud, Paperless NGX, WebDAV</li>
<li>Transfer protocols: FTP, SFTP, Email forwarding</li>
</ul>
</div>
<div>
<h3 class="font-medium text-lg text-gray-800">Automation</h3>
<ul class="list-disc list-inside text-gray-600 ml-2">
<li>IMAP inbox polling from multiple sources</li>
<li>Gmail and generic email account integration</li>
<li>Automated document ingestion from various inputs</li>
<li>Background processing with Redis and Celery</li>
</ul>
</div>
<div>
<h3 class="font-medium text-lg text-gray-800">Administration</h3>
<ul class="list-disc list-inside text-gray-600 ml-2">
<li>Powerful REST API for programmatic access</li>
<li>OAuth2 authentication support with Authentik</li>
<li>Highly configurable via environment variables</li>
<li>Docker-ready for easy deployment and scaling</li>
</ul>
</div>
</div>
</section> </section>
<!-- Meet the Creator Section --> <!-- Meet the Creator Section -->
@@ -47,17 +77,38 @@
</p> </p>
</section> </section>
<!-- GitHub Link Section --> <!-- Privacy & Legal Section -->
<section class="bg-white shadow rounded p-6 mb-8">
<h2 class="text-2xl font-semibold mb-2">Privacy & Legal</h2>
<p class="text-gray-600 mb-4">
We care about your privacy and data security. Please review our:
</p>
<div class="flex space-x-4">
<a href="/privacy" class="text-blue-600 hover:underline">Privacy Notice</a>
<a href="/license" class="text-blue-600 hover:underline">License Information</a>
</div>
</section>
<!-- Links Section -->
<section class="bg-white shadow rounded p-6"> <section class="bg-white shadow rounded p-6">
<h2 class="text-2xl font-semibold mb-2">Get Involved</h2> <h2 class="text-2xl font-semibold mb-2">Get Involved</h2>
<p class="text-gray-600 mb-4"> <p class="text-gray-600 mb-4">
Want to dive into the code, contribute ideas, or simply check out the magic behind DocuElevate? Want to dive into the code, contribute ideas, or learn more about DocuElevate?
Visit our GitHub repository!
</p> </p>
<a href="https://github.com/christianlouis/document-processor" target="_blank" class="flex items-center space-x-2 text-blue-600 hover:text-blue-800"> <div class="flex flex-col space-y-3">
<img src="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" alt="GitHub Logo" class="h-6 w-6" /> <a href="https://github.com/christianlouis/DocuElevate" target="_blank" class="flex items-center space-x-2 text-blue-600 hover:text-blue-800">
<span>View DocuElevate on GitHub</span> <img src="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" alt="GitHub Logo" class="h-6 w-6" />
</a> <span>View DocuElevate on GitHub</span>
</a>
<a href="https://www.docuelevate.org" target="_blank" class="flex items-center space-x-2 text-blue-600 hover:text-blue-800">
<i class="fas fa-globe h-6 w-6"></i>
<span>Visit DocuElevate Website</span>
</a>
<a href="https://docuelevate.readthedocs.io" target="_blank" class="flex items-center space-x-2 text-blue-600 hover:text-blue-800">
<i class="fas fa-book h-6 w-6"></i>
<span>Read the Documentation</span>
</a>
</div>
</section> </section>
</div> </div>
{% endblock %} {% endblock %}
+17 -14
View File
@@ -54,19 +54,17 @@
</div> </div>
<!-- Mobile menu button --> <!-- Mobile menu button -->
<div class="md:hidden"> <button
<button @click="mobileMenuOpen = !mobileMenuOpen"
@click="mobileMenuOpen = !mobileMenuOpen" type="button"
type="button" class="md:hidden inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500"
class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500" :aria-expanded="mobileMenuOpen"
:aria-expanded="mobileMenuOpen" >
> <span class="sr-only">Open main menu</span>
<span class="sr-only">Open main menu</span> <svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" /> </svg>
</svg> </button>
</button>
</div>
<!-- Mobile menu, show/hide based on menu state --> <!-- Mobile menu, show/hide based on menu state -->
<div <div
@@ -104,7 +102,12 @@
<!-- 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">
DocuElevate 2025 - Licensed under <a href="/license" class="text-blue-500 hover:underline">Apache License 2.0</a> - DocuElevate 2025 -
<a href="/privacy" class="text-blue-500 hover:underline">Privacy</a> -
<a href="/imprint" class="text-blue-500 hover:underline">Imprint</a> -
<a href="/terms" class="text-blue-500 hover:underline">Terms</a> -
<a href="/cookies" class="text-blue-500 hover:underline">Cookies</a> -
<a href="/license" class="text-blue-500 hover:underline">License</a> -
<span class="text-xs">Version {{ app_version|default(version, true) }}</span> <span class="text-xs">Version {{ app_version|default(version, true) }}</span>
</div> </div>
</footer> </footer>
+56
View File
@@ -0,0 +1,56 @@
{% extends "base.html" %}
{% block title %}Cookie Policy - DocuElevate{% endblock %}
{% block content %}
<div class="container mx-auto px-4 py-8 max-w-4xl">
<h1 class="text-4xl font-bold mb-6">Cookie Policy</h1>
<p class="text-sm text-gray-500 mb-8">Last Updated: {{ build_date|default(current_date|default('May 14, 2024')) }}</p>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">What Are Cookies</h2>
<p class="text-gray-700 mb-3">
Cookies are small text files that are stored on your computer or mobile device when you visit a website. They are widely used to make websites work more efficiently and provide information to the website owners.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">How We Use Cookies</h2>
<p class="text-gray-700 mb-3">
DocuElevate only uses essential session cookies for the following purpose:
</p>
<ul class="list-disc list-inside text-gray-700 ml-4 mb-3">
<li>Authentication & Session Management: To identify you when you sign in and maintain your session while you use the application</li>
</ul>
<p class="text-gray-700 mb-3">
These cookies are mandatory for the proper functioning of our service. Without these cookies, you would be required to log in repeatedly during your browsing session.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Duration of Cookies</h2>
<p class="text-gray-700 mb-3">
The session cookies we use are temporary and are deleted when you close your browser.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">No Third-Party Cookies</h2>
<p class="text-gray-700 mb-3">
DocuElevate does not use any third-party cookies, tracking cookies, advertising cookies, or analytics cookies. We respect your privacy and only implement the minimum cookies required for our service to function.
</p>
<p class="text-gray-700">
For more information about how we handle your data, please see our <a href="/privacy" class="text-blue-600 hover:underline">Privacy Policy</a>.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Managing Cookies</h2>
<p class="text-gray-700 mb-3">
While most web browsers allow you to control cookies through their settings, please note that blocking or deleting our session cookies will prevent DocuElevate from functioning properly, as user authentication relies on these cookies.
</p>
<p class="text-gray-700">
By using DocuElevate, you consent to our use of cookies as described in this policy. This Cookie Policy is part of and incorporated into our <a href="/terms" class="text-blue-600 hover:underline">Terms of Service</a>.
</p>
</div>
</div>
{% endblock %}
+38
View File
@@ -0,0 +1,38 @@
{% extends "base.html" %}
{% block title %}Imprint - DocuElevate{% endblock %}
{% block content %}
<div class="container mx-auto px-4 py-8 max-w-4xl">
<h1 class="text-4xl font-bold mb-6">Imprint</h1>
<p class="text-sm text-gray-500 mb-8">Information according to § 5 TMG (German Telemedia Act)</p>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Contact Information</h2>
<p class="text-gray-700 mb-3">
<strong>DocuElevate</strong><br>
Represented by: Christian Krakau-Louis<br>
Email: docuelevate@christian-louis.de
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Legal Notices</h2>
<p class="text-gray-700 mb-3">
Despite careful content control, we assume no liability for the content of external links. The operators of the linked pages are solely responsible for their content.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6">
<h2 class="text-2xl font-semibold mb-4">Related Policies</h2>
<p class="text-gray-700 mb-3">
Our service is governed by the following policies:
</p>
<ul class="list-disc list-inside text-gray-700 ml-4 mb-3">
<li><a href="/terms" class="text-blue-600 hover:underline">Terms of Service</a> - Rules for using DocuElevate</li>
<li><a href="/privacy" class="text-blue-600 hover:underline">Privacy Policy</a> - How we handle your data</li>
<li><a href="/cookies" class="text-blue-600 hover:underline">Cookie Policy</a> - Information about cookies we use</li>
<li><a href="/license" class="text-blue-600 hover:underline">License Information</a> - How our software is licensed</li>
</ul>
</div>
</div>
{% endblock %}
+123 -19
View File
@@ -3,28 +3,132 @@
{% block content %} {% block content %}
<div class="container mx-auto px-4 py-8"> <div class="container mx-auto px-4 py-8">
<h1 class="text-4xl font-bold mb-4">Welcome to DocuElevate</h1> <!-- Hero Section -->
<p class="text-gray-700 mb-8"> <div class="bg-gradient-to-r from-blue-500 to-indigo-600 rounded-lg shadow-lg text-white p-8 mb-8">
Your intelligent solution for processing, managing, and organizing documents effortlessly. <h1 class="text-4xl font-bold mb-4">Welcome to DocuElevate</h1>
</p> <p class="text-xl mb-6">
<!-- Sample sections --> Your intelligent solution for processing, managing, and organizing documents effortlessly.
<div class="grid grid-cols-1 md:grid-cols-2 gap-8"> </p>
<div class="bg-white shadow rounded p-6"> <div class="flex flex-wrap gap-4">
<h2 class="text-2xl font-semibold mb-2">Upload Documents</h2> <a href="/upload" class="bg-white text-blue-600 hover:bg-gray-100 font-bold py-2 px-4 rounded-lg transition duration-300 flex items-center">
<p class="text-gray-600"> <i class="fas fa-upload mr-2"></i> Upload Document
Quickly upload and process your files with our user-friendly interface. </a>
</p> <a href="/status" class="bg-transparent border border-white text-white hover:bg-white hover:text-blue-600 font-bold py-2 px-4 rounded-lg transition duration-300 flex items-center">
<a href="/upload" class="mt-4 inline-block text-blue-600 hover:text-blue-800"> <i class="fas fa-cog mr-2"></i> System Status
Get Started &rarr;
</a> </a>
</div> </div>
<div class="bg-white shadow rounded p-6"> </div>
<h2 class="text-2xl font-semibold mb-2">Manage Your Files</h2>
<p class="text-gray-600"> <!-- Stats Section -->
View, organize, and collaborate on your processed files in one central hub. <div class="bg-white rounded-lg shadow p-6 mb-8">
<h2 class="text-2xl font-semibold mb-4">System Overview</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="border-r border-gray-200 px-4">
<p class="text-4xl font-bold text-blue-600">{{ stats.processed_files|default('0') }}</p>
<p class="text-gray-600">Documents Processed</p>
</div>
<div class="border-r border-gray-200 px-4">
<p class="text-4xl font-bold text-green-600">{{ stats.active_integrations|default('0') }}</p>
<p class="text-gray-600">Active Integrations</p>
</div>
<div class="px-4">
<p class="text-4xl font-bold text-indigo-600">{{ stats.storage_targets|default('0') }}</p>
<p class="text-gray-600">Storage Targets</p>
</div>
</div>
</div>
<!-- Features Section -->
<h2 class="text-3xl font-semibold mb-6">Core Features</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-10">
<div class="bg-white shadow rounded-lg p-6 hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-4">
<i class="fas fa-file-alt fa-2x"></i>
</div>
<h3 class="text-xl font-semibold mb-2">Document Processing</h3>
<p class="text-gray-600 mb-4">
Upload and process documents with OCR, metadata extraction, and intelligent classification.
</p> </p>
<a href="/files" class="mt-4 inline-block text-blue-600 hover:text-blue-800"> <a href="/upload" class="text-blue-600 hover:text-blue-800 font-medium">
View Files &rarr; Start processing &rarr;
</a>
</div>
<div class="bg-white shadow rounded-lg p-6 hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-4">
<i class="fas fa-cloud fa-2x"></i>
</div>
<h3 class="text-xl font-semibold mb-2">Multiple Storage Options</h3>
<p class="text-gray-600 mb-4">
Connect to Dropbox, NextCloud, OneDrive and other storage solutions seamlessly.
</p>
<a href="/status" class="text-blue-600 hover:text-blue-800 font-medium">
Configure storage &rarr;
</a>
</div>
<div class="bg-white shadow rounded-lg p-6 hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-4">
<i class="fas fa-robot fa-2x"></i>
</div>
<h3 class="text-xl font-semibold mb-2">AI-Powered Analysis</h3>
<p class="text-gray-600 mb-4">
Leverage AI to extract metadata, classify documents, and organize your information.
</p>
<a href="/files" class="text-blue-600 hover:text-blue-800 font-medium">
View processed files &rarr;
</a>
</div>
<div class="bg-white shadow rounded-lg p-6 hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-4">
<i class="fas fa-envelope fa-2x"></i>
</div>
<h3 class="text-xl font-semibold mb-2">Email Integration</h3>
<p class="text-gray-600 mb-4">
Auto-process documents received via email with our IMAP polling capabilities.
</p>
<a href="/status" class="text-blue-600 hover:text-blue-800 font-medium">
Set up email &rarr;
</a>
</div>
<div class="bg-white shadow rounded-lg p-6 hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-4">
<i class="fas fa-cogs fa-2x"></i>
</div>
<h3 class="text-xl font-semibold mb-2">Workflow Automation</h3>
<p class="text-gray-600 mb-4">
Create workflows to automatically process and route documents based on content.
</p>
<a href="/about" class="text-blue-600 hover:text-blue-800 font-medium">
Learn more &rarr;
</a>
</div>
<div class="bg-white shadow rounded-lg p-6 hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-4">
<i class="fas fa-shield-alt fa-2x"></i>
</div>
<h3 class="text-xl font-semibold mb-2">Secure & Private</h3>
<p class="text-gray-600 mb-4">
Your documents are processed securely with privacy-focused design principles.
</p>
<a href="/privacy" class="text-blue-600 hover:text-blue-800 font-medium">
Privacy policy &rarr;
</a>
</div>
</div>
<!-- Getting Started Section -->
<div class="bg-gray-50 rounded-lg border border-gray-200 p-8">
<div class="flex flex-col md:flex-row md:items-center justify-between">
<div class="mb-6 md:mb-0">
<h2 class="text-2xl font-bold mb-2">Ready to get started?</h2>
<p class="text-gray-600">Upload your first document and see DocuElevate in action.</p>
</div>
<a href="/upload" class="bg-blue-600 hover:bg-blue-700 text-white font-bold py-3 px-6 rounded-lg transition duration-300">
Try it now
</a> </a>
</div> </div>
</div> </div>
+15 -1
View File
@@ -6,7 +6,7 @@
<div class="container mx-auto px-4 py-8"> <div class="container mx-auto px-4 py-8">
<h1 class="text-2xl font-bold mb-4">License Information</h1> <h1 class="text-2xl font-bold mb-4">License Information</h1>
<div class="bg-white shadow-md rounded-lg p-6"> <div class="bg-white shadow-md rounded-lg p-6 mb-6">
<h2 class="text-xl font-semibold mb-4">Apache License 2.0</h2> <h2 class="text-xl font-semibold mb-4">Apache License 2.0</h2>
<div class="prose"> <div class="prose">
@@ -19,5 +19,19 @@
contribute to the project. contribute to the project.
</p> </p>
</div> </div>
<div class="bg-white shadow-md rounded-lg p-6">
<h2 class="text-xl font-semibold mb-4">Related Information</h2>
<p class="mb-3 text-gray-600">
While this license governs the use of our software, please also review our
<a href="/terms" class="text-blue-600 hover:underline">Terms of Service</a> and
<a href="/privacy" class="text-blue-600 hover:underline">Privacy Policy</a> for
information about using the DocuElevate service.
</p>
<p class="text-gray-600">
For more information about DocuElevate, please visit the
<a href="/about" class="text-blue-600 hover:underline">About page</a>.
</p>
</div>
</div> </div>
{% endblock %} {% endblock %}
+106
View File
@@ -0,0 +1,106 @@
{% extends "base.html" %}
{% block title %}Privacy Notice - DocuElevate{% endblock %}
{% block content %}
<div class="container mx-auto px-4 py-8 max-w-4xl">
<h1 class="text-4xl font-bold mb-6">DocuElevate Privacy Notice</h1>
<p class="text-sm text-gray-500 mb-8">Last Updated: {{ build_date|default(current_date|default('April 7, 2024')) }}</p>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Data Controller</h2>
<p class="text-gray-700 mb-3">
The controller responsible for processing your personal data under the EU General Data Protection Regulation (GDPR) is DocuElevate.
</p>
<p class="text-gray-700 mb-3">
Contact Email: <a href="mailto:docuelevate@christian-louis.de" class="text-blue-600 hover:underline">docuelevate@christian-louis.de</a>
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Scope of this Privacy Notice</h2>
<p class="text-gray-700">
This notice applies to the DocuElevate web application, hosted at <a href="{{ request.url.scheme }}://{{ request.url.netloc }}/" class="text-blue-600 hover:underline" target="_blank">{{ request.url.scheme }}://{{ request.url.netloc }}/</a>.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Data Collection & Purposes</h2>
<p class="text-gray-700 mb-3">
<strong>User Authentication:</strong> We use Google, Dropbox, and Microsoft OAuth for sign-in. Through these services, we may receive information such as your name, email address, and profile picture.
</p>
<p class="text-gray-700 mb-3">
<strong>Purpose:</strong> We use this information to authenticate you, personalize your experience, and provide the core functionality of DocuElevate.
</p>
<p class="text-gray-700 mb-3">
<strong>Legal Basis (GDPR Art. 6):</strong> Our primary legal bases for processing are:
</p>
<ul class="list-disc list-inside text-gray-700 ml-4 mb-3">
<li>(1)(b) Performance of a contract: to provide the DocuElevate service.</li>
<li>(1)(f) Legitimate interests: ensuring the security of the service and preventing fraud.</li>
</ul>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Use of Cookies & Similar Technologies</h2>
<p class="text-gray-700 mb-3">
We may use cookies or similar technologies to maintain your session, remember your preferences, and enhance your user experience.
</p>
<p class="text-gray-700">
For more information about our use of cookies, please visit our <a href="/cookies" class="text-blue-600 hover:underline">Cookie Policy</a>.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Third-Party Services</h2>
<p class="text-gray-700 mb-3">
<strong>OAuth Providers:</strong> Google, Dropbox, and Microsoft. These providers may process your personal data according to their own privacy policies.
</p>
<p class="text-gray-700">
<strong>No Additional Sharing:</strong> We do not share, sell, or otherwise disclose your personal data to third parties for advertising or marketing purposes.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Data Retention</h2>
<p class="text-gray-700 mb-3">
We retain your personal data only as long as necessary to provide the DocuElevate service or to comply with legal obligations.
</p>
<p class="text-gray-700">
If you wish to have your data deleted or your account removed, please contact us at <a href="mailto:docuelevate@christian-louis.de" class="text-blue-600 hover:underline">docuelevate@christian-louis.de</a>.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Data Security</h2>
<p class="text-gray-700">
We implement appropriate technical and organizational measures to protect your personal data against unauthorized access, alteration, disclosure, or destruction.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Your Rights under GDPR</h2>
<ul class="list-disc list-inside text-gray-700 ml-4">
<li class="mb-2"><strong>Access & Rectification:</strong> You can request to see the data we hold about you and ask for corrections if necessary.</li>
<li class="mb-2"><strong>Erasure (Right to be Forgotten):</strong> You can request deletion of your data where there is no legitimate reason for us to continue processing it.</li>
<li class="mb-2"><strong>Restriction of Processing:</strong> In certain circumstances, you can request a temporary block on processing your personal data.</li>
<li class="mb-2"><strong>Data Portability:</strong> You can request a copy of your data in a commonly used, machine-readable format.</li>
<li class="mb-2"><strong>Objection:</strong> You have the right to object to data processing, especially where processing is based on legitimate interests.</li>
<li class="mb-2"><strong>Withdrawal of Consent:</strong> If processing is based on your consent, you have the right to withdraw that consent at any time.</li>
<li><strong>Complaint:</strong> If you believe your rights have been violated, you have the right to lodge a complaint with a supervisory authority in the EU Member State of your residence or workplace.</li>
</ul>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">Updates to this Privacy Notice</h2>
<p class="text-gray-700 mb-3">
We may update this notice from time to time to reflect changes in our practices or applicable laws. Any changes will be posted at <a href="{{ request.url.scheme }}://{{ request.url.netloc }}/" class="text-blue-600 hover:underline" target="_blank">{{ request.url.scheme }}://{{ request.url.netloc }}/</a>, and where appropriate, we will notify you via email or other channels.
</p>
<p class="text-gray-700 mb-3">
If you have any questions or concerns about this Privacy Notice or your personal data, please contact us at <a href="mailto:docuelevate@christian-louis.de" class="text-blue-600 hover:underline">docuelevate@christian-louis.de</a>.
</p>
<p class="text-gray-700">
Please also review our <a href="/terms" class="text-blue-600 hover:underline">Terms of Service</a> and <a href="/license" class="text-blue-600 hover:underline">License Information</a>.
</p>
</div>
</div>
{% endblock %}
+66
View File
@@ -0,0 +1,66 @@
{% extends "base.html" %}
{% block title %}Terms of Service - DocuElevate{% endblock %}
{% block content %}
<div class="container mx-auto px-4 py-8 max-w-4xl">
<h1 class="text-4xl font-bold mb-6">Terms of Service</h1>
<p class="text-sm text-gray-500 mb-8">Last Updated: {{ current_date|default('May 14, 2024') }}</p>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">1. Acceptance of Terms</h2>
<p class="text-gray-700 mb-3">
By accessing or using DocuElevate, you agree to be bound by these Terms of Service. If you do not agree to these terms, please do not use this service.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">2. Description of Service</h2>
<p class="text-gray-700 mb-3">
DocuElevate provides document processing, OCR, metadata extraction, and storage services. We reserve the right to modify or discontinue any aspect of the service at any time.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">3. User Responsibilities</h2>
<p class="text-gray-700 mb-3">
You are responsible for:
</p>
<ul class="list-disc list-inside text-gray-700 ml-4 mb-3">
<li>All content you upload to DocuElevate</li>
<li>Ensuring you have proper rights to upload and process documents</li>
<li>Maintaining the confidentiality of your account credentials</li>
<li>Any activity that occurs under your account</li>
</ul>
<p class="text-gray-700 mb-3">
By using our service, you also agree to our <a href="/privacy" class="text-blue-600 hover:underline">Privacy Policy</a> and <a href="/cookies" class="text-blue-600 hover:underline">Cookie Policy</a>.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">4. Intellectual Property Rights</h2>
<p class="text-gray-700 mb-3">
DocuElevate respects intellectual property rights. Users may not upload content that infringes on the intellectual property rights of others.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6 mb-6">
<h2 class="text-2xl font-semibold mb-4">5. Limitation of Liability</h2>
<p class="text-gray-700 mb-3">
DocuElevate provides the service "as is" without warranties of any kind. We shall not be liable for any direct, indirect, incidental, special, consequential, or punitive damages resulting from your use of or inability to use the service.
</p>
</div>
<div class="bg-white shadow rounded-lg p-6">
<h2 class="text-2xl font-semibold mb-4">6. Governing Law</h2>
<p class="text-gray-700 mb-3">
These Terms shall be governed by the laws of Germany, without regard to its conflict of law provisions.
</p>
<p class="text-gray-700 mb-3">
If you have any questions about these Terms, please contact us at <a href="mailto:docuelevate@christian-louis.de" class="text-blue-600 hover:underline">docuelevate@christian-louis.de</a>.
</p>
<p class="text-gray-700">
For information about how we use cookies, please see our <a href="/cookies" class="text-blue-600 hover:underline">Cookie Policy</a>. For licensing information, please refer to our <a href="/license" class="text-blue-600 hover:underline">License Information</a>.
</p>
</div>
</div>
{% endblock %}