Просмотр исходного кода

This will come in 0.2

Moved it to the 'feature' branch.
sh4nks 10 лет назад
Родитель
Сommit
a985d417a2

+ 0 - 34
flaskbb/api/__init__.py

@@ -1,34 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    flaskbb.api
-    ~~~~~~~~~~~
-
-    The API provides the possibility to get the data in JSON format
-    for the views.
-
-    :copyright: (c) 2015 by the FlaskBB Team.
-    :license: BSD, see LICENSE for more details.
-"""
-from flask import jsonify, make_response
-
-from flask_httpauth import HTTPBasicAuth
-
-from flaskbb.user.models import User
-
-
-auth = HTTPBasicAuth()
-
-
-@auth.verify_password
-def verify_password(username, password):
-    user, authenticated = User.authenticate(username, password)
-    if user and authenticated:
-        return True
-    return False
-
-
-@auth.error_handler
-def unauthorized():
-    # return 403 instead of 401 to prevent browsers from displaying the default
-    # auth dialog
-    return make_response(jsonify({'message': 'Unauthorized access'}), 403)

+ 0 - 219
flaskbb/api/forums.py

@@ -1,219 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    flaskbb.api.forums
-    ~~~~~~~~~~~~~~~~~~
-
-    The Forum API.
-    TODO: - POST/PUT/DELETE stuff
-          - Permission checks.
-
-    :copyright: (c) 2015 by the FlaskBB Team.
-    :license: BSD, see LICENSE for more details.
-"""
-from flask_restful import Resource, fields, marshal, abort, reqparse
-
-from flaskbb.forum.models import Category, Forum, Topic, Post
-
-
-category_fields = {
-    'id': fields.Integer,
-    'title': fields.String,
-    'description': fields.String,
-    'slug': fields.String,
-    'forums': fields.String(attribute="forums.title")
-}
-
-forum_fields = {
-    'id': fields.Integer,
-    'category_id': fields.Integer,
-    'title': fields.String,
-    'description': fields.String,
-    'position': fields.Integer,
-    'locked': fields.Boolean,
-    'show_moderators': fields.Boolean,
-    'external': fields.String,
-    'post_count': fields.Integer,
-    'topic_count': fields.Integer,
-    'last_post_id': fields.Integer,
-    'last_post_title': fields.String,
-    'last_post_created': fields.DateTime,
-    'last_post_username': fields.String
-}
-
-topic_fields = {
-    'id': fields.Integer,
-    'forum_id': fields.Integer,
-    'title': fields.String,
-    'user_id': fields.Integer,
-    'username': fields.String,
-    'date_created': fields.DateTime,
-    'last_updated': fields.DateTime,
-    'locked': fields.Boolean,
-    'important': fields.Boolean,
-    'views': fields.Integer,
-    'post_count': fields.Integer,
-    'content': fields.String(attribute='first_post.content'),
-    'first_post_id': fields.Integer,
-    'last_post_id': fields.Integer,
-}
-
-post_fields = {
-    'id': fields.Integer,
-    'topic_id': fields.Integer,
-    'user_id': fields.Integer,
-    'username': fields.String,
-    'content': fields.String,
-    'date_created': fields.DateTime,
-    'date_modified': fields.DateTime,
-    'modified_by': fields.String
-}
-
-
-class CategoryListAPI(Resource):
-
-    def __init__(self):
-        super(CategoryListAPI, self).__init__()
-
-    def get(self):
-        categories_list = Category.query.order_by(Category.position).all()
-
-        categories = {'categories': [marshal(category, category_fields)
-                                     for category in categories_list]}
-        return categories
-
-
-class CategoryAPI(Resource):
-
-    def __init__(self):
-        super(CategoryAPI, self).__init__()
-
-    def get(self, category_id):
-        category = Category.query.filter_by(id=category_id).first()
-
-        if not category:
-            abort(404)
-
-        return {'category': marshal(category, category_fields)}
-
-
-class ForumListAPI(Resource):
-
-    def __init__(self):
-        self.reqparse = reqparse.RequestParser()
-        self.reqparse.add_argument('category_id', type=int, location='args')
-        super(ForumListAPI, self).__init__()
-
-    def get(self):
-        # get the forums for a category or get all
-        args = self.reqparse.parse_args()
-        if args['category_id'] is not None:
-            forums_list = Forum.query.\
-                filter(Forum.category_id == args['category_id']).\
-                order_by(Forum.position).all()
-        else:
-            forums_list = Forum.query.order_by(Forum.position).all()
-
-        forums = {'forums': [marshal(forum, forum_fields)
-                             for forum in forums_list]}
-        return forums
-
-
-class ForumAPI(Resource):
-
-    def __init__(self):
-        super(ForumAPI, self).__init__()
-
-    def get(self, forum_id):
-        forum = Forum.query.filter_by(id=forum_id).first()
-
-        if not forum:
-            abort(404)
-
-        return {'forum': marshal(forum, forum_fields)}
-
-
-class TopicListAPI(Resource):
-
-    def __init__(self):
-        self.reqparse = reqparse.RequestParser()
-        self.reqparse.add_argument('page', type=int, location='args')
-        self.reqparse.add_argument('per_page', type=int, location='args')
-        self.reqparse.add_argument('forum_id', type=int, location='args')
-        super(TopicListAPI, self).__init__()
-
-    def get(self):
-        args = self.reqparse.parse_args()
-        page = args['page'] or 1
-        per_page = args['per_page'] or 20
-        forum_id = args['forum_id']
-
-        if forum_id is not None:
-            topics_list = Topic.query.filter_by(forum_id=forum_id).\
-                order_by(Topic.important.desc(), Topic.last_updated.desc()).\
-                paginate(page, per_page, True)
-        else:
-            topics_list = Topic.query.\
-                order_by(Topic.important.desc(), Topic.last_updated.desc()).\
-                paginate(page, per_page, True)
-
-        topics = {'topics': [marshal(topic, topic_fields)
-                             for topic in topics_list.items]}
-        return topics
-
-
-class TopicAPI(Resource):
-
-    def __init__(self):
-        super(TopicAPI, self).__init__()
-
-    def get(self, topic_id):
-        topic = Topic.query.filter_by(id=topic_id).first()
-
-        if not topic:
-            abort(404)
-
-        return {'topic': marshal(topic, topic_fields)}
-
-
-class PostListAPI(Resource):
-
-    def __init__(self):
-        self.reqparse = reqparse.RequestParser()
-        self.reqparse.add_argument('page', type=int, location='args')
-        self.reqparse.add_argument('per_page', type=int, location='args')
-        self.reqparse.add_argument('topic_id', type=int, location='args')
-        super(PostListAPI, self).__init__()
-
-    def get(self):
-        args = self.reqparse.parse_args()
-        page = args['page'] or 1
-        per_page = args['per_page'] or 20
-        topic_id = args['topic_id']
-
-        if topic_id is not None:
-            posts_list = Post.query.\
-                filter_by(topic_id=id).\
-                order_by(Post.id.asc()).\
-                paginate(page, per_page)
-        else:
-            posts_list = Post.query.\
-                order_by(Post.id.asc()).\
-                paginate(page, per_page)
-
-        posts = {'posts': [marshal(post, post_fields)
-                           for post in posts_list.items]}
-        return posts
-
-
-class PostAPI(Resource):
-
-    def __init__(self):
-        super(PostAPI, self).__init__()
-
-    def get(self, post_id):
-        post = Post.query.filter_by(id=post_id).first()
-
-        if not post:
-            abort(404)
-
-        return {'post': marshal(post, post_fields)}

+ 0 - 122
flaskbb/api/users.py

@@ -1,122 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    flaskbb.api.users
-    ~~~~~~~~~~~~~~~~~
-
-    The User API.
-    TODO: Permission checks.
-
-    :copyright: (c) 2015 by the FlaskBB Team.
-    :license: BSD, see LICENSE for more details.
-"""
-from datetime import datetime
-
-from flask_restful import Resource, reqparse, fields, marshal, abort
-
-from flaskbb.api import auth
-from flaskbb.user.models import User
-
-
-user_fields = {
-    'id': fields.Integer,
-    'username': fields.String,
-    'email': fields.String,
-    'date_joined': fields.DateTime,
-    'lastseen': fields.DateTime,
-    'birthday': fields.DateTime,
-    'gender': fields.String,
-    'website': fields.String,
-    'location': fields.String,
-    'signature': fields.String,
-    'notes': fields.String,
-    'theme': fields.String,
-    'language': fields.String,
-    'post_count': fields.Integer,
-    'primary_group': fields.String(attribute="primary_group.name")
-}
-
-
-class UserListAPI(Resource):
-
-    def __init__(self):
-        self.reqparse = reqparse.RequestParser()
-        self.reqparse.add_argument('username', type=str, required=True,
-                                   location="json")
-        self.reqparse.add_argument('email', type=str, required=True,
-                                   location='json')
-        self.reqparse.add_argument('password', type=str, required=True,
-                                   location='json')
-        self.user_fields = user_fields
-        super(UserListAPI, self).__init__()
-
-    def get(self):
-        users = {'users': [marshal(user, user_fields)
-                           for user in User.query.all()]}
-        return users
-
-    @auth.login_required
-    def post(self):
-        args = self.reqparse.parse_args()
-        user = User(username=args['username'],
-                    password=args['password'],
-                    email=args['email'],
-                    date_joined=datetime.utcnow(),
-                    primary_group_id=4)
-        user.save()
-
-        return {'user': marshal(user, user_fields)}, 201
-
-
-class UserAPI(Resource):
-
-    def __init__(self):
-        self.reqparse = reqparse.RequestParser()
-        self.reqparse.add_argument('email', type=str, location='json')
-        self.reqparse.add_argument('birthday', type=str, location='json')
-        self.reqparse.add_argument('gender', type=str, location='json')
-        self.reqparse.add_argument('website', type=str, location='json')
-        self.reqparse.add_argument('location', type=str, location='json')
-        self.reqparse.add_argument('signature', type=str, location='json')
-        self.reqparse.add_argument('notes', type=str, location='json')
-        self.reqparse.add_argument('theme', type=str, location='json')
-        self.reqparse.add_argument('language', type=str, location='json')
-
-        super(UserAPI, self).__init__()
-
-    def get(self, user_id):
-        user = User.query.filter_by(id=user_id).first()
-
-        if not user:
-            abort(404)
-
-        return {'user': marshal(user, user_fields)}
-
-    @auth.login_required
-    def put(self, user_id):
-        user = User.query.filter_by(id=user_id).first()
-
-        if not user:
-            abort(404)
-
-        if user.username != auth.username():
-            abort(403, message="You are not allowed to modify this user.")
-
-        args = self.reqparse.parse_args()
-        for k, v in args.items():
-            if v is not None:
-                setattr(user, k, v)
-        user.save()
-        return {'user': marshal(user, user_fields)}
-
-    @auth.login_required
-    def delete(self, user_id):
-        user = User.query.filter_by(id=user_id).first()
-
-        if not user:
-            abort(404)
-
-        if user.username != auth.username() and not user.permissions['admin']:
-            abort(403, message="You are not allowed to delete this user.")
-
-        user.delete()
-        return {'result': True}

+ 1 - 28
flaskbb/app.py

@@ -16,10 +16,9 @@ import time
 from sqlalchemy import event
 from sqlalchemy.engine import Engine
 
-from flask import Flask, Blueprint, request
+from flask import Flask, request
 from flask_login import current_user
 from flask_whooshalchemy import whoosh_index
-from flask_restful import Api
 
 # Import the user blueprint
 from flaskbb.user.views import user
@@ -67,7 +66,6 @@ def create_app(config=None):
     configure_before_handlers(app)
     configure_errorhandlers(app)
     configure_logging(app)
-    configure_api(app)
 
     return app
 
@@ -81,31 +79,6 @@ def configure_blueprints(app):
     )
 
 
-def configure_api(app):
-    from flaskbb.api.users import UserAPI, UserListAPI
-    from flaskbb.api.forums import (CategoryListAPI, CategoryAPI,
-                                    ForumListAPI, ForumAPI,
-                                    TopicListAPI, TopicAPI,
-                                    PostListAPI, PostAPI)
-
-    api_blueprint = Blueprint("api", __name__)
-    restful = Api(api_blueprint, prefix=app.config["API_URL_PREFIX"])
-
-    # User API
-    restful.add_resource(UserListAPI, "/users")
-    restful.add_resource(UserAPI, '/users/<int:id>')
-
-    # Forum API
-    restful.add_resource(CategoryListAPI, "/categories")
-    restful.add_resource(CategoryAPI, '/categories/<int:id>')
-    restful.add_resource(ForumListAPI, "/forums")
-    restful.add_resource(ForumAPI, '/forums/<int:id>')
-    restful.add_resource(TopicListAPI, "/topics")
-    restful.add_resource(TopicAPI, '/topics/<int:id>')
-    restful.add_resource(PostListAPI, "/posts")
-    restful.add_resource(PostAPI, '/posts/<int:id>')
-
-
 def configure_extensions(app):
     """Configures the extensions."""
 

+ 0 - 1
flaskbb/configs/default.py

@@ -88,4 +88,3 @@ class DefaultConfig(object):
     USER_URL_PREFIX = "/user"
     AUTH_URL_PREFIX = "/auth"
     ADMIN_URL_PREFIX = "/admin"
-    API_URL_PREFIX = "/api"

+ 0 - 1
flaskbb/configs/production.py.example

@@ -90,4 +90,3 @@ class ProductionConfig(DefaultConfig):
     USER_URL_PREFIX = "/user"
     AUTH_URL_PREFIX = "/auth"
     ADMIN_URL_PREFIX = "/admin"
-    API_URL_PREFIX = "/api"

+ 0 - 4
flaskbb/extensions.py

@@ -18,7 +18,6 @@ from flask_migrate import Migrate
 from flask_themes2 import Themes
 from flask_plugins import PluginManager
 from flask_babelex import Babel
-from flask_httpauth import HTTPBasicAuth
 
 
 # Database
@@ -50,6 +49,3 @@ plugin_manager = PluginManager()
 
 # Babel
 babel = Babel()
-
-# Flask-HTTPAuth
-auth = HTTPBasicAuth()

+ 0 - 2
requirements.txt

@@ -6,13 +6,11 @@ coverage==3.7.1
 Flask==0.10.1
 Flask-Cache==0.13.1
 Flask-DebugToolbar==0.9.2
-Flask-HTTPAuth==2.3.0
 Flask-Login==0.2.11
 Flask-Mail==0.9.1
 Flask-Migrate==1.3.0
 Flask-Plugins==1.5
 Flask-Redis==0.0.6
-Flask-RESTful==0.3.1
 Flask-Script==2.0.5
 Flask-SQLAlchemy==2.0
 Flask-Themes2==0.1.3

+ 0 - 2
setup.py

@@ -43,12 +43,10 @@ setup(
         'Flask-Redis',
         'Flask-Cache',
         'Flask-DebugToolbar',
-        'Flask-HTTPAuth',
         'Flask-Login',
         'Flask-Mail',
         'Flask-Migrate',
         'Flask-Plugins',
-        'Flask-RESTful',
         'Flask-SQLAlchemy',
         'Flask-Script',
         'Flask-Themes2',