From 4da9f717e242c36df3bfbab41e6c7019917363ae Mon Sep 17 00:00:00 2001 From: Luka Hietala Date: Mon, 8 Dec 2025 20:28:49 +0200 Subject: [PATCH] move filters to own file --- app.py | 57 ++--------------------------------------------------- filters.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 55 deletions(-) create mode 100644 filters.py diff --git a/app.py b/app.py index 6b0b144..6391784 100644 --- a/app.py +++ b/app.py @@ -1,7 +1,6 @@ import os import subprocess from flask import Flask, render_template, request, abort -from datetime import datetime from dotenv import load_dotenv from git.repo import get_bare_repos @@ -13,6 +12,7 @@ from git.misc import get_version, validate_repo_name, validate_ref, validate_ref from git.diff import get_diff from git.blame import get_blame from highlight import highlight_diff +from filters import register_filters load_dotenv() @@ -20,6 +20,7 @@ app = Flask(__name__) # for base.html app.jinja_env.globals['request'] = request +register_filters(app) @app.context_processor def inject_current_ref(): @@ -36,60 +37,6 @@ def inject_current_ref(): repo_path = os.getenv('GIT_REPO_PATH') -def datetime_filter(value, format='%Y-%m-%d %H:%M:%S'): - if isinstance(value, datetime): - # format regular datetime - return value.strftime(format) - elif isinstance(value, (int, float)): - # if not datetime, but number, try to convert - # just assume its unix timestamp, git uses that - dt = datetime.fromtimestamp(value) - return dt.strftime(format) - return value - -# age filter to show relative time like "2 days ago" -def age_filter(value): - if isinstance(value, (int, float)): - dt = datetime.fromtimestamp(value) - elif isinstance(value, datetime): - dt = value - else: - return value - now = datetime.now() - diff = now - dt - if diff.days > 365: - years = diff.days // 365 - return f"{years} year{'s' if years != 1 else ''} ago" - elif diff.days > 30: - months = diff.days // 30 - return f"{months} month{'s' if months != 1 else ''} ago" - elif diff.days > 0: - return f"{diff.days} day{'s' if diff.days != 1 else ''} ago" - elif diff.seconds > 3600: - hours = diff.seconds // 3600 - return f"{hours} hour{'s' if hours != 1 else ''} ago" - elif diff.seconds > 60: - minutes = diff.seconds // 60 - return f"{minutes} minute{'s' if minutes != 1 else ''} ago" - else: - return "just now" - -def size_filter(value): - if value is None: - return '' - if value < 1024: - return f"{value} B" - elif value < 1024 * 1024: - return f"{value / 1024:.1f} KB" - elif value < 1024 * 1024 * 1024: - return f"{value / (1024 * 1024):.1f} MB" - else: - return f"{value / (1024 * 1024 * 1024):.1f} GB" - -app.jinja_env.filters['datetime'] = datetime_filter -app.jinja_env.filters['age'] = age_filter -app.jinja_env.filters['size'] = size_filter - @app.route("/") def index(): repos = get_bare_repos(repo_path) diff --git a/filters.py b/filters.py new file mode 100644 index 0000000..9a68276 --- /dev/null +++ b/filters.py @@ -0,0 +1,58 @@ +from datetime import datetime + + +# Filter to format datetime objects or timestamps as strings (2025-12-08 12:18:21 ) +def datetime_filter(value, format="%Y-%m-%d %H:%M:%S"): + if isinstance(value, datetime): + return value.strftime(format) + if isinstance(value, (int, float)): + dt = datetime.fromtimestamp(value) + return dt.strftime(format) + return value + + +# Filter to display age in human-readable format (like "2 days ago", "3 hours ago") +def age_filter(value): + if isinstance(value, (int, float)): + dt = datetime.fromtimestamp(value) + elif isinstance(value, datetime): + dt = value + else: + return value + now = datetime.now() + diff = now - dt + if diff.days > 365: + years = diff.days // 365 + return f"{years} year{'s' if years != 1 else ''} ago" + if diff.days > 30: + months = diff.days // 30 + return f"{months} month{'s' if months != 1 else ''} ago" + if diff.days > 0: + return f"{diff.days} day{'s' if diff.days != 1 else ''} ago" + if diff.seconds > 3600: + hours = diff.seconds // 3600 + return f"{hours} hour{'s' if hours != 1 else ''} ago" + if diff.seconds > 60: + minutes = diff.seconds // 60 + return f"{minutes} minute{'s' if minutes != 1 else ''} ago" + return "just now" + + +# Filter to display file sizes in human-readable format (bytes to KB, MB, GB) +def size_filter(value): + if value is None: + return "" + if value < 1024: + return f"{value} B" + if value < 1024 * 1024: + return f"{value / 1024:.1f} KB" + if value < 1024 * 1024 * 1024: + return f"{value / (1024 * 1024):.1f} MB" + return f"{value / (1024 * 1024 * 1024):.1f} GB" + + +# Register filters with Flask app +def register_filters(app): + app.jinja_env.filters["datetime"] = datetime_filter + app.jinja_env.filters["age"] = age_filter + app.jinja_env.filters["size"] = size_filter -- 2.47.3