diff --git a/store/app.py b/store/app.py index ba787bc1..e161e510 100644 --- a/store/app.py +++ b/store/app.py @@ -11,6 +11,7 @@ import hmac import string import random import urllib +from datetime import datetime from slugify import slugify from flask import ( Flask, @@ -19,6 +20,7 @@ from flask import ( session, redirect, request, + make_response, ) from flask_babel import Babel from flask_babel import gettext as _ @@ -89,6 +91,13 @@ def days_ago(timestamp): return int((time.time() - timestamp) / (60 * 60 * 24)) +@app.template_filter("format_datetime") +def format_datetime(value, format="%d %b %Y %I:%M %p"): + if value is None: + return "" + return datetime.strptime(value, "%b %d %Y").strftime(format) + + @app.context_processor def utils(): d = { @@ -487,6 +496,22 @@ def charts(): ) +@app.route("/news.rss") +def news_rss(): + + news_per_date = json.loads(open(".cache/news.json").read()) + + # Keepy only the last N entries + news_per_date = {d: infos for d, infos in reversed(list(news_per_date.items())[-2:])} + + rss_xml = render_template('news_rss.xml', news_per_date=news_per_date, catalog=get_catalog()) + response = make_response(rss_xml) + response.headers['Content-Type'] = 'application/rss+xml' + response.headers['Content-Disposition'] = "inline; filename=news_rss.xml" + return response + + + ############################################################################### # Session / SSO using Discourse # ############################################################################### diff --git a/store/templates/charts.html b/store/templates/charts.html index 0eccab3d..4fc086d7 100644 --- a/store/templates/charts.html +++ b/store/templates/charts.html @@ -10,8 +10,13 @@
-
-

{{ _("History") }}

+
+

+ {{ _("History") }} + + Suscribe via RSS +

+
{% for date, news in news_per_date.items()|reverse %}

{{ date }}

diff --git a/store/templates/news_rss.xml b/store/templates/news_rss.xml new file mode 100644 index 00000000..6232754f --- /dev/null +++ b/store/templates/news_rss.xml @@ -0,0 +1,31 @@ + + + + YunoHost apps catalog News + {{ url_for('news_rss')}} + + YunoHost apps catalog news + {%- for date, news in news_per_date.items() %} + {%- for status in ("added", "repaired", "broke", "removed") %}i + {%- for app, url in news[status] %} + {% set manifest = catalog["apps"][app]["manifest"] %} + + [{{ status|capitalize }}] {{ manifest['name'] }} + {{ url_for('app_info', app_id=app) }} + {{ app }}#{{ date|format_datetime("%Y%m%d") }} + {{ date|format_datetime("%a, %d %b %Y %H:%M:%S +0000") }} + {{ manifest["description"].get("en") }} + {{ manifest["description"].get("en") }} + + {% endfor -%} + {% endfor -%} + {% endfor %} + +