aboutsummaryrefslogtreecommitdiff
path: root/src/web/views/article.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/web/views/article.py')
-rw-r--r--src/web/views/article.py74
1 files changed, 60 insertions, 14 deletions
diff --git a/src/web/views/article.py b/src/web/views/article.py
index 7996e894..407345c3 100644
--- a/src/web/views/article.py
+++ b/src/web/views/article.py
@@ -1,14 +1,16 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -
from datetime import datetime, timedelta
from flask import (Blueprint, g, render_template, redirect,
- flash, url_for, request)
+ flash, url_for, make_response, request)
+
from flask.ext.babel import gettext
-from flask.ext.login import login_required
+from flask.ext.login import login_required, current_user
+
from bootstrap import db
+from web.export import export_json, export_html
from web.lib.utils import clear_string, redirect_url
-from web.controllers import ArticleController
+from web.controllers import (ArticleController, UserController,
+ CategoryController)
from web.lib.view_utils import etag_match
articles_bp = Blueprint('articles', __name__, url_prefix='/articles')
@@ -18,7 +20,7 @@ article_bp = Blueprint('article', __name__, url_prefix='/article')
@article_bp.route('/redirect/<int:article_id>', methods=['GET'])
@login_required
def redirect_to_article(article_id):
- contr = ArticleController(g.user.id)
+ contr = ArticleController(current_user.id)
article = contr.get(id=article_id)
if not article.readed:
contr.update({'id': article.id}, {'readed': True})
@@ -32,7 +34,7 @@ def article(article_id=None):
"""
Presents the content of an article.
"""
- article = ArticleController(g.user.id).get(id=article_id)
+ article = ArticleController(current_user.id).get(id=article_id)
previous_article = article.previous_article()
if previous_article is None:
previous_article = article.source.articles[0]
@@ -53,7 +55,7 @@ def like(article_id=None):
"""
Mark or unmark an article as favorites.
"""
- art_contr = ArticleController(g.user.id)
+ art_contr = ArticleController(current_user.id)
article = art_contr.get(id=article_id)
art_contr = art_contr.update({'id': article_id},
{'like': not article.like})
@@ -66,7 +68,7 @@ def delete(article_id=None):
"""
Delete an article from the database.
"""
- article = ArticleController(g.user.id).delete(article_id)
+ article = ArticleController(current_user.id).delete(article_id)
flash(gettext('Article %(article_title)s deleted',
article_title=article.title), 'success')
return redirect(url_for('home'))
@@ -77,9 +79,9 @@ def delete(article_id=None):
@articles_bp.route('/history/<int:year>/<int:month>', methods=['GET'])
@login_required
def history(year=None, month=None):
- counter, articles = ArticleController(g.user.id).get_history(year, month)
- return render_template('history.html', articles_counter=counter,
- articles=articles, year=year, month=month)
+ cntr, artcles = ArticleController(current_user.id).get_history(year, month)
+ return render_template('history.html', articles_counter=cntr,
+ articles=artcles, year=year, month=month)
@article_bp.route('/mark_as/<string:new_value>', methods=['GET'])
@@ -91,7 +93,7 @@ def mark_as(new_value='read', feed_id=None, article_id=None):
Mark all unreaded articles as read.
"""
readed = new_value == 'read'
- art_contr = ArticleController(g.user.id)
+ art_contr = ArticleController(current_user.id)
filters = {'readed': not readed}
if feed_id is not None:
filters['feed_id'] = feed_id
@@ -117,7 +119,7 @@ def expire():
"""
current_time = datetime.utcnow()
weeks_ago = current_time - timedelta(int(request.args.get('weeks', 10)))
- art_contr = ArticleController(g.user.id)
+ art_contr = ArticleController(current_user.id)
query = art_contr.read(__or__={'date__lt': weeks_ago,
'retrieved_date__lt': weeks_ago})
@@ -126,3 +128,47 @@ def expire():
db.session.commit()
flash(gettext('%(count)d articles deleted', count=count), 'info')
return redirect(redirect_url())
+
+
+@articles_bp.route('/export', methods=['GET'])
+@login_required
+def export():
+ """
+ Export all articles to HTML or JSON.
+ """
+ user = UserController(current_user.id).get(id=current_user.id)
+ if request.args.get('format') == "HTML":
+ # Export to HTML
+ try:
+ archive_file, archive_file_name = export_html(user)
+ except Exception as e:
+ print(e)
+ flash(gettext("Error when exporting articles."), 'danger')
+ return redirect(redirect_url())
+ response = make_response(archive_file)
+ response.headers['Content-Type'] = 'application/x-compressed'
+ response.headers['Content-Disposition'] = 'attachment; filename=%s' \
+ % archive_file_name
+ elif request.args.get('format') == "JSON":
+ # Export to JSON
+ try:
+ json_result = export_json(user)
+ except Exception as e:
+ flash(gettext("Error when exporting articles."), 'danger')
+ return redirect(redirect_url())
+ response = make_response(json_result)
+ response.mimetype = 'application/json'
+ response.headers["Content-Disposition"] \
+ = 'attachment; filename=account.json'
+ elif request.args.get('format') == "OPML":
+ categories = {cat.id: cat.dump()
+ for cat in CategoryController(user.id).read()}
+ response = make_response(render_template('opml.xml', user=user,
+ categories=categories,
+ now=datetime.now()))
+ response.headers['Content-Type'] = 'application/xml'
+ response.headers['Content-Disposition'] = 'attachment; filename=feeds.opml'
+ else:
+ flash(gettext('Export format not supported.'), 'warning')
+ return redirect(redirect_url())
+ return response
bgstack15