diff options
-rw-r--r-- | newspipe/bootstrap.py | 4 | ||||
-rw-r--r-- | newspipe/web/views/__init__.py | 3 | ||||
-rw-r--r-- | newspipe/web/views/api/v3/__init__.py | 3 | ||||
-rw-r--r-- | newspipe/web/views/api/v3/article.py | 84 | ||||
-rw-r--r-- | newspipe/web/views/api/v3/common.py | 105 | ||||
-rw-r--r-- | newspipe/web/views/api/v3/feed.py | 62 | ||||
-rw-r--r-- | poetry.lock | 54 | ||||
-rw-r--r-- | pyproject.toml | 1 |
8 files changed, 7 insertions, 309 deletions
diff --git a/newspipe/bootstrap.py b/newspipe/bootstrap.py index 01e38fbf..cbdbc820 100644 --- a/newspipe/bootstrap.py +++ b/newspipe/bootstrap.py @@ -6,7 +6,6 @@ import os import conf import logging -import flask_restless from urllib.parse import urlsplit @@ -80,9 +79,6 @@ if not application.config["SECURITY_PASSWORD_SALT"]: db = SQLAlchemy(application) -# Create the Flask-Restless API manager. -manager = flask_restless.APIManager(application, flask_sqlalchemy_db=db) - def populate_g(): from flask import g diff --git a/newspipe/web/views/__init__.py b/newspipe/web/views/__init__.py index b8b415f9..a2f7bd1c 100644 --- a/newspipe/web/views/__init__.py +++ b/newspipe/web/views/__init__.py @@ -1,4 +1,4 @@ -from web.views.api import v2, v3 +from web.views.api import v2 from web.views import views, home, session_mgmt from web.views.article import article_bp, articles_bp from web.views.feed import feed_bp, feeds_bp @@ -13,7 +13,6 @@ __all__ = [ "home", "session_mgmt", "v2", - "v3", "article_bp", "articles_bp", "feed_bp", diff --git a/newspipe/web/views/api/v3/__init__.py b/newspipe/web/views/api/v3/__init__.py deleted file mode 100644 index 5066b0b6..00000000 --- a/newspipe/web/views/api/v3/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from web.views.api.v3 import article - -__all__ = ["article"] diff --git a/newspipe/web/views/api/v3/article.py b/newspipe/web/views/api/v3/article.py deleted file mode 100644 index 55ba3326..00000000 --- a/newspipe/web/views/api/v3/article.py +++ /dev/null @@ -1,84 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- - -# Newspipe - A Web based news aggregator. -# Copyright (C) 2010-2020 Cédric Bonhomme - https://www.cedricbonhomme.org -# -# For more information : http://gitlab.com/newspipe/newspipe -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/> - -__author__ = "Cedric Bonhomme" -__version__ = "$Revision: 0.1 $" -__date__ = "$Date: 2016/04/29 $" -__revision__ = "$Date: 2016/04/29 $" -__copyright__ = "Copyright (c) Cedric Bonhomme" -__license__ = "GPLv3" - -from flask_login import current_user -from werkzeug.exceptions import NotFound -from flask_restless import ProcessingException -from web import models -from bootstrap import application, manager -from web.controllers import ArticleController, FeedController -from web.views.api.v3.common import AbstractProcessor -from web.views.api.v3.common import url_prefix, auth_func - - -class ArticleProcessor(AbstractProcessor): - """Concrete processors for the Article Web service. - """ - - def get_single_preprocessor(self, instance_id=None, **kw): - try: - article = ArticleController(current_user.id).get(id=instance_id) - except NotFound: - raise ProcessingException(description="No such article.", code=404) - self.is_authorized(current_user, article) - - def post_preprocessor(self, data=None, **kw): - data["user_id"] = current_user.id - - try: - feed = FeedController(current_user.id).get(id=data["feed_id"]) - except NotFound: - raise ProcessingException(description="No such feed.", code=404) - self.is_authorized(current_user, feed) - - data["category_id"] = feed.category_id - - def delete_preprocessor(self, instance_id=None, **kw): - try: - article = ArticleController(current_user.id).get(id=instance_id) - except NotFound: - raise ProcessingException(description="No such article.", code=404) - self.is_authorized(current_user, article) - - -article_processor = ArticleProcessor() - -blueprint_article = manager.create_api_blueprint( - models.Article, - url_prefix=url_prefix, - methods=["GET", "POST", "PUT", "DELETE"], - preprocessors=dict( - GET_SINGLE=[auth_func, article_processor.get_single_preprocessor], - GET_MANY=[auth_func, article_processor.get_many_preprocessor], - POST=[auth_func, article_processor.post_preprocessor], - PUT_SINGLE=[auth_func, article_processor.put_single_preprocessor], - PUT_MANY=[auth_func, article_processor.put_many_preprocessor], - DELETE=[auth_func, article_processor.delete_preprocessor], - ), -) -application.register_blueprint(blueprint_article) diff --git a/newspipe/web/views/api/v3/common.py b/newspipe/web/views/api/v3/common.py deleted file mode 100644 index bf49bff5..00000000 --- a/newspipe/web/views/api/v3/common.py +++ /dev/null @@ -1,105 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- - -# Newspipe - A Web based news aggregator. -# Copyright (C) 2010-2020 Cédric Bonhomme - https://www.cedricbonhomme.org -# -# For more information : http://gitlab.com/newspipe/newspipe -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/> - -__author__ = "Cedric Bonhomme" -__version__ = "$Revision: 0.1 $" -__date__ = "$Date: 2016/04/29 $" -__revision__ = "$Date: 2016/04/29 $" -__copyright__ = "Copyright (c) Cedric Bonhomme" -__license__ = "GPLv3" - -from flask import request -from flask_login import current_user -from flask_restless import ProcessingException -from werkzeug.exceptions import NotFound -from web.controllers import ArticleController, UserController -from web.views.common import login_user_bundle - -url_prefix = "/api/v3" - - -def auth_func(*args, **kw): - if request.authorization: - ucontr = UserController() - try: - user = ucontr.get(nickname=request.authorization.username) - except NotFound: - raise ProcessingException("Couldn't authenticate your user", code=401) - if not ucontr.check_password(user, request.authorization.password): - raise ProcessingException("Couldn't authenticate your user", code=401) - if not user.is_active: - raise ProcessingException("User is deactivated", code=401) - login_user_bundle(user) - if not current_user.is_authenticated: - raise ProcessingException(description="Not authenticated!", code=401) - - -class AbstractProcessor: - """Abstract processors for the Web services. - """ - - def is_authorized(self, user, obj): - if user.id != obj.user_id: - raise ProcessingException(description="Not Authorized", code=401) - - def get_single_preprocessor(self, instance_id=None, **kw): - # Check if the user is authorized to modify the specified - # instance of the model. - pass - - def get_many_preprocessor(self, search_params=None, **kw): - """Accepts a single argument, `search_params`, which is a dictionary - containing the search parameters for the request. - """ - filt = dict(name="user_id", op="eq", val=current_user.id) - - # Check if there are any filters there already. - if "filters" not in search_params: - search_params["filters"] = [] - - search_params["filters"].append(filt) - - def post_preprocessor(self, data=None, **kw): - pass - - def put_single_preprocessor(instance_id=None, data=None, **kw): - """Accepts two arguments, `instance_id`, the primary key of the - instance of the model to patch, and `data`, the dictionary of fields - to change on the instance. - """ - pass - - def put_many_preprocessor(search_params=None, data=None, **kw): - """Accepts two arguments: `search_params`, which is a dictionary - containing the search parameters for the request, and `data`, which - is a dictionary representing the fields to change on the matching - instances and the values to which they will be set. - """ - filt = dict(name="user_id", op="eq", val=current_user.id) - - # Check if there are any filters there already. - if "filters" not in search_params: - search_params["filters"] = [] - - search_params["filters"].append(filt) - - def delete_preprocessor(self, instance_id=None, **kw): - pass diff --git a/newspipe/web/views/api/v3/feed.py b/newspipe/web/views/api/v3/feed.py deleted file mode 100644 index fffbf40d..00000000 --- a/newspipe/web/views/api/v3/feed.py +++ /dev/null @@ -1,62 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- - -# Newspipe - A Web based news aggregator. -# Copyright (C) 2010-2020 Cédric Bonhomme - https://www.cedricbonhomme.org -# -# For more information : http://gitlab.com/newspipe/newspipe -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/> - -__author__ = "Cedric Bonhomme" -__version__ = "$Revision: 0.1 $" -__date__ = "$Date: 2016/04/29 $" -__revision__ = "$Date: 2016/04/29 $" -__copyright__ = "Copyright (c) Cedric Bonhomme" -__license__ = "GPLv3" - -from flask_login import current_user -from web import models -from bootstrap import application, manager -from web.controllers import FeedController -from web.views.api.v3.common import AbstractProcessor -from web.views.api.v3.common import url_prefix, auth_func - - -class FeedProcessor(AbstractProcessor): - """Concrete processors for the Feed Web service. - """ - - def get_single_preprocessor(self, instance_id=None, **kw): - # Check if the user is authorized to modify the specified - # instance of the model. - feed = FeedController(current_user.id).get(id=instance_id) - self.is_authorized(current_user, feed) - - -feed_processor = FeedProcessor() - -blueprint_feed = manager.create_api_blueprint( - models.Feed, - url_prefix=url_prefix, - methods=["GET", "POST", "PUT", "DELETE"], - preprocessors=dict( - GET_SINGLE=[auth_func, feed_processor.get_single_preprocessor], - GET_MANY=[auth_func, feed_processor.get_many_preprocessor], - PUT_SINGLE=[auth_func], - POST=[auth_func], - DELETE=[auth_func], - ), -) -application.register_blueprint(blueprint_feed) diff --git a/poetry.lock b/poetry.lock index 2631e7ca..e7890909 100644 --- a/poetry.lock +++ b/poetry.lock @@ -22,7 +22,7 @@ description = "A database migration tool for SQLAlchemy." name = "alembic" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.0" +version = "1.4.1" [package.dependencies] Mako = "*" @@ -225,20 +225,6 @@ docs = ["sphinx"] [[package]] category = "main" -description = "A Flask extension for easy ReSTful API generation" -name = "flask-restless" -optional = false -python-versions = "*" -version = "0.17.0" - -[package.dependencies] -flask = ">=0.10" -mimerender = ">=0.5.2" -python-dateutil = ">2.0" -sqlalchemy = ">=0.8" - -[[package]] -category = "main" description = "Scripting support for Flask" name = "flask-script" optional = false @@ -323,7 +309,7 @@ description = "A super-fast templating language that borrows the best ideas fro name = "mako" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.1.1" +version = "1.1.2" [package.dependencies] MarkupSafe = ">=0.9.2" @@ -342,17 +328,6 @@ version = "1.1.1" [[package]] category = "main" -description = "RESTful HTTP Content Negotiation for Flask, Bottle, web.py and webapp2 (Google App Engine)" -name = "mimerender" -optional = false -python-versions = "*" -version = "0.6.0" - -[package.dependencies] -python_mimeparse = ">=0.1.4" - -[[package]] -category = "main" description = "multidict implementation" name = "multidict" optional = false @@ -419,14 +394,6 @@ version = "1.0.4" [[package]] category = "main" -description = "A module provides basic functions for parsing mime-type names and matching them against a list of media-ranges." -name = "python-mimeparse" -optional = false -python-versions = "*" -version = "1.6.0" - -[[package]] -category = "main" description = "World timezone definitions, modern and historical" name = "pytz" optional = false @@ -559,7 +526,7 @@ idna = ">=2.0" multidict = ">=4.0" [metadata] -content-hash = "e8b3a93859c566e8f72ce498eaee7d1ff257823c60e95e064700951dd55e880a" +content-hash = "c28c1de9afd6a173dd8ee2b84cca6353663ed5f1a3d86f2584449c0685ef7f0a" python-versions = "^3.8" [metadata.files] @@ -578,7 +545,7 @@ aiohttp = [ {file = "aiohttp-3.6.2.tar.gz", hash = "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326"}, ] alembic = [ - {file = "alembic-1.4.0.tar.gz", hash = "sha256:2df2519a5b002f881517693b95626905a39c5faf4b5a1f94de4f1441095d1d26"}, + {file = "alembic-1.4.1.tar.gz", hash = "sha256:791a5686953c4b366d3228c5377196db2f534475bb38d26f70eb69668efd9028"}, ] aniso8601 = [ {file = "aniso8601-8.0.0-py2.py3-none-any.whl", hash = "sha256:c033f63d028b9a58e3ab0c2c7d0532ab4bfa7452bfc788fbfe3ddabd327b181a"}, @@ -647,9 +614,6 @@ flask-restful = [ {file = "Flask-RESTful-0.3.8.tar.gz", hash = "sha256:5ea9a5991abf2cb69b4aac19793faac6c032300505b325687d7c305ffaa76915"}, {file = "Flask_RESTful-0.3.8-py2.py3-none-any.whl", hash = "sha256:d891118b951921f1cec80cabb4db98ea6058a35e6404788f9e70d5b243813ec2"}, ] -flask-restless = [ - {file = "Flask-Restless-0.17.0.tar.gz", hash = "sha256:1de47fe80abd47239c9a1804e0ba5da1d23b9f40cfc26202d16bed37f178c2b6"}, -] flask-script = [ {file = "Flask-Script-2.0.6.tar.gz", hash = "sha256:6425963d91054cfcc185807141c7314a9c5ad46325911bd24dcb489bd0161c65"}, ] @@ -703,7 +667,8 @@ lxml = [ {file = "lxml-4.5.0.tar.gz", hash = "sha256:8620ce80f50d023d414183bf90cc2576c2837b88e00bea3f33ad2630133bbb60"}, ] mako = [ - {file = "Mako-1.1.1.tar.gz", hash = "sha256:2984a6733e1d472796ceef37ad48c26f4a984bb18119bb2dbc37a44d8f6e75a4"}, + {file = "Mako-1.1.2-py2.py3-none-any.whl", hash = "sha256:8e8b53c71c7e59f3de716b6832c4e401d903af574f6962edbbbf6ecc2a5fe6c9"}, + {file = "Mako-1.1.2.tar.gz", hash = "sha256:3139c5d64aa5d175dbafb95027057128b5fbd05a40c53999f3905ceb53366d9d"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, @@ -740,9 +705,6 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] -mimerender = [ - {file = "mimerender-0.6.0.tar.gz", hash = "sha256:e7f1377efee18c3f562cee54907a3329223c824332889fb74b745ddfd0a9b1c6"}, -] multidict = [ {file = "multidict-4.7.5-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:fc3b4adc2ee8474cb3cd2a155305d5f8eda0a9c91320f83e55748e1fcb68f8e3"}, {file = "multidict-4.7.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:42f56542166040b4474c0c608ed051732033cd821126493cf25b6c276df7dd35"}, @@ -819,10 +781,6 @@ python-editor = [ {file = "python_editor-1.0.4-py3-none-any.whl", hash = "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d"}, {file = "python_editor-1.0.4-py3.5.egg", hash = "sha256:c3da2053dbab6b29c94e43c486ff67206eafbe7eb52dbec7390b5e2fb05aac77"}, ] -python-mimeparse = [ - {file = "python-mimeparse-1.6.0.tar.gz", hash = "sha256:76e4b03d700a641fd7761d3cd4fdbbdcd787eade1ebfac43f877016328334f78"}, - {file = "python_mimeparse-1.6.0-py2.py3-none-any.whl", hash = "sha256:a295f03ff20341491bfe4717a39cd0a8cc9afad619ba44b77e86b0ab8a2b8282"}, -] pytz = [ {file = "pytz-2019.3-py2.py3-none-any.whl", hash = "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d"}, {file = "pytz-2019.3.tar.gz", hash = "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"}, diff --git a/pyproject.toml b/pyproject.toml index 29c7fc5c..3047e33f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,6 @@ Flask-Login = "^0.5.0" Flask-Principal = "^0.4.0" Flask-WTF = "^0.14.3" Flask-RESTful = "^0.3.8" -Flask-Restless = "^0.17.0" Flask-paginate = "^0.5.5" Flask-Babel = "^1.0.0" Flask-Migrate = "^2.5.2" |