aboutsummaryrefslogtreecommitdiff
path: root/newspipe/web/views/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'newspipe/web/views/views.py')
-rw-r--r--newspipe/web/views/views.py95
1 files changed, 95 insertions, 0 deletions
diff --git a/newspipe/web/views/views.py b/newspipe/web/views/views.py
new file mode 100644
index 00000000..57f790b1
--- /dev/null
+++ b/newspipe/web/views/views.py
@@ -0,0 +1,95 @@
+import sys
+import logging
+import operator
+from datetime import datetime, timedelta
+from flask import (request, render_template, flash,
+ url_for, redirect, current_app)
+from flask_babel import gettext
+from sqlalchemy import desc
+
+import conf
+from web import __version__
+from conf import API_ROOT, ADMIN_EMAIL
+from web.controllers import FeedController, UserController
+from web.lib.view_utils import etag_match
+
+logger = logging.getLogger(__name__)
+
+
+@current_app.errorhandler(401)
+def authentication_required(error):
+ if API_ROOT in request.url:
+ return error
+ flash(gettext('Authentication required.'), 'info')
+ return redirect(url_for('login'))
+
+
+@current_app.errorhandler(403)
+def authentication_failed(error):
+ if API_ROOT in request.url:
+ return error
+ flash(gettext('Forbidden.'), 'danger')
+ return redirect(url_for('login'))
+
+
+@current_app.errorhandler(404)
+def page_not_found(error):
+ return render_template('errors/404.html'), 404
+
+
+@current_app.errorhandler(500)
+def internal_server_error(error):
+ return render_template('errors/500.html'), 500
+
+
+@current_app.errorhandler(AssertionError)
+def handle_sqlalchemy_assertion_error(error):
+ return error.args[0], 400
+
+
+@current_app.route('/popular', methods=['GET'])
+@etag_match
+def popular():
+ """
+ Return the most popular feeds for the last nb_days days.
+ """
+ # try to get the 'recent' popular websites, created after
+ # 'not_created_before'
+ # ie: not_added_before = date_last_added_feed - nb_days
+ try:
+ nb_days = int(request.args.get('nb_days', 365))
+ except ValueError:
+ nb_days = 10000
+ last_added_feed = FeedController().read().\
+ order_by(desc('created_date')).limit(1).all()
+ if last_added_feed:
+ date_last_added_feed = last_added_feed[0].created_date
+ else:
+ date_last_added_feed = datetime.now()
+ not_added_before = date_last_added_feed - timedelta(days=nb_days)
+
+ filters = {}
+ filters['created_date__gt'] = not_added_before
+ filters['private'] = False
+ filters['error_count__lt'] = conf.DEFAULT_MAX_ERROR
+ feeds = FeedController().count_by_link(**filters)
+ sorted_feeds = sorted(list(feeds.items()), key=operator.itemgetter(1),
+ reverse=True)
+ return render_template('popular.html', popular=sorted_feeds)
+
+
+@current_app.route('/about', methods=['GET'])
+@etag_match
+def about():
+ return render_template('about.html', contact=ADMIN_EMAIL)
+
+@current_app.route('/about/more', methods=['GET'])
+@etag_match
+def about_more():
+ return render_template('about_more.html',
+ newspipe_version=__version__.split()[1],
+ on_heroku=[conf.ON_HEROKU and 'Yes' or 'No'][0],
+ registration=[conf.SELF_REGISTRATION and 'Open' or 'Closed'][0],
+ python_version="{}.{}.{}".format(*sys.version_info[:3]),
+ nb_users=UserController().read().count())
+
bgstack15