Example #1
0
    def delete_all_movies(payload):

        try:
            db_drop_and_create_all()
            return jsonify({"success": True, "deleted": "All Movies"})
        except Exception:
            abort(422)
    def setUp(self):
        """Define test variables and initialize app."""
        self.app = create_app()
        self.client = self.app.test_client

        setup_db(self.app)

        # binds the app to the current context
        with self.app.app_context():
            self.db = SQLAlchemy()
            self.db.init_app(self.app)
            # create all tables
            self.db.create_all()
        db_drop_and_create_all()
Example #3
0
    def setUp(self):
        self.app = create_app()
        self.client = self.app.test_client
        self.database_path = os.environ.get(
            'DATABASE_URL', "postgres://{}:{}@{}/{}".format(
                database_credentials["username"],
                database_credentials["password"], database_credentials["port"],
                database_credentials["development_database"]))

        setup_db(self.app, self.database_path)
        db_drop_and_create_all()
        # binds the app to the current context
        with self.app.app_context():
            self.db = SQLAlchemy()
            self.db.init_app(self.app)
            # create all tables
            self.db.create_all()
import json
from flask_cors import CORS

from database.models import db_drop_and_create_all, setup_db, Drink
from auth.auth import AuthError, requires_auth
from werkzeug.datastructures import ImmutableMultiDict

app = Flask(__name__)
setup_db(app)
CORS(app)
# '''
# @TODO uncomment the following line to initialize the datbase
# !! NOTE THIS WILL DROP ALL RECORDS AND START YOUR DB FROM SCRATCH
# !! NOTE THIS MUST BE UNCOMMENTED ON FIRST RUN
# '''
db_drop_and_create_all()


@app.route('/drinks')
def get_drinks():
    drink_selection = Drink.query.all()
    all_drinks = [drink.short() for drink in drink_selection]

    if not all_drinks:
        abort(404)
    return jsonify({
        'success': True,
        'drinks': all_drinks
    }), 200

Example #5
0
def create_app(test_config=None):
    app = Flask(__name__)
    setup_db(app)
    CORS(app)

    # DROP ALL RECORDS AND START YOUR DB FROM SCRATCH
    db_drop_and_create_all()

    @app.after_request
    def after_request(response):
        response.headers.add('Access-Control-Allow-Headers',
                             'Content-Type, Authorization, true')
        response.headers.add('Access-Control-Allow-Methods',
                             'GET, PATCH, POST, DELETE, OPTIONS')
        return response

    @app.route('/')
    def hi():
        return jsonify({
            'success': True,
            'message': 'Welcome to API'
        })

    @app.route('/actor', methods=['GET'])
    @requires_auth('get:actor')
    def get_all_actors(jwt):
        data = Actor.query.all()
        actor = list(map(Actor.get_actor, data))
        if actor is None or len(actor) == 0:
            abort(404)
        return jsonify({
            'success': True,
            'actor': actor
        })

    @app.route('/actor', methods=['POST'])
    @requires_auth('post:actor')
    def create_actor(jwt):
        body = request.get_json()
        if body is None:
            abort(404)
        name = body.get('name', None)
        age = body.get('age', None)
        gender = body.get('gender', None)

        try:
            new_actor = Actor(name=name, age=age, gender=gender)
            new_actor.insert()
            return jsonify({
                'success': True,
                'actors': [new_actor.get_actor()]
            })

        except Exception:
            abort(404)

    @app.route('/actor/<int:actor_id>', methods=['PATCH'])
    @requires_auth('patch:actor')
    def update_one_actor(jwt, actor_id):
        actor = Actor.query.filter(Actor.id == actor_id).one_or_none()
        if actor is None:
            abort(404)
        body = request.get_json()
        if body is None:
            abort(404)
        updated_name = body.get('name', None)
        updated_age = body.get('age', None)
        updated_gender = body.get('gender', None)

        if updated_name is not None:
            actor.name = updated_name
        if updated_age is not None:
            actor.age = updated_age
        if updated_gender is not None:
            actor.gender = updated_gender

        try:
            actor.update()
            return jsonify({
                'success': True,
                'actor': [actor.get_actor()]
            })
        except Exception:
            abort(422)

    @app.route('/actor/<actor_id>', methods=['DELETE'])
    @requires_auth('delete:actor')
    def drop_one_actor(jwt, actor_id):
        selected_actor = Actor.query.filter(Actor.id == actor_id).one_or_none()
        if selected_actor is None:
            abort(404)
        try:
            selected_actor.delete()
            return jsonify({
                "success": True,
                "deleted": actor_id
            })
        except Exception:
            abort(422)

    @app.route('/movie', methods=['GET'])
    @requires_auth('get:movie')
    def get_all_movie(jwt):
        data = Movie.query.all()
        movie = list(map(Movie.get_movie, data))
        if movie is None or len(movie) == 0:
            abort(404)
        return jsonify({
            'success': True,
            'movie': movie
        })

    @app.route('/movie', methods=['POST'])
    @requires_auth('post:movie')
    def create_new_movie(jwt):
        body = request.get_json()
        if 'title' not in body:
            abort(404)
        title = body.get('title', None)
        release_date = body.get('release_date', None)

        try:
            new_movie = Movie(title=title, release_date=release_date)
            new_movie.insert()
            return jsonify({
                'success': True,
                'movie': [new_movie.get_movie()]
            })
        except Exception:
            abort(422)

    @app.route('/movie/<int:movie_id>', methods=['PATCH'])
    @requires_auth('patch:movie')
    def update_movie(jwt, movie_id):
        movie = Movie.query.filter(Movie.id == movie_id).one_or_none()
        if movie is None:
            abort(404)
        body = request.get_json()
        if body is None:
            abort(404)

        updated_title = body.get('title', None)
        updated_release_date = body.get('release_date', None)

        if updated_title is not None:
            movie.title = updated_title
        if updated_release_date is not None:
            movie.release_date = updated_release_date

        try:
            movie.update()
            return jsonify({
                'success': True,
                'movie': movie.get_movie()
            })
        except Exception:
            abort(422)

    @app.route('/movie/<movie_id>', methods=['DELETE'])
    @requires_auth('delete:movie')
    def drop_one_movie(jwt, movie_id):
        selected_movie = Movie.query.filter(Movie.id == movie_id).one_or_none()
        if selected_movie is None:
            abort(404)
        try:
            selected_movie.delete()
            return jsonify({
                "success": True,
                "deleted": movie_id
            })
        except Exception:
            abort(422)

    @app.route('/show')
    def get_all_show():
        data = Show.query.all()
        show = list(map(Show.get_show, data))
        if show is None or len(show) == 0:
            abort(404)
        return jsonify({
            'success': True,
            'show': show
        })

    @app.route('/show', methods=['POST'])
    def create_new_show():
        body = request.get_json()
        if body is None:
            abort(404)
        actor_id = body.get('actor_id', None)
        movie_id = body.get('movie_id', None)

        try:
            new_show = Show(actor_id=actor_id, movie_id=movie_id)
            new_show.insert()
            return jsonify({
                'success': True,
                'new show': [new_show.get_show()]
            })

        except Exception:
            abort(422)

    @app.errorhandler(404)
    def not_found(error):
        return jsonify({
            "success": False,
            "error": 404,
            "message": "resource not found"
        }), 404

    @app.errorhandler(400)
    def bad_request(error):
        return jsonify({
            "success": False,
            "error": 400,
            "message": "bad request"
        }), 400

    @app.errorhandler(405)
    def not_allowed(error):
        return jsonify({
            "success": False,
            "error": 405,
            "message": "method not allowed"
        }), 405

    @app.errorhandler(422)
    def unprocessable(error):
        return jsonify({
            "success": False,
            "error": 422,
            "message": "unprocessable"
        }), 422

    @app.errorhandler(AuthError)
    def auth_error(error):
        return jsonify({
            "success": False,
            "error": error.status_code,
            "code": error.error['code'],
            "message": error.error['description']
        }), error.status_code

    return app
def create_app():

    app = Flask(__name__, static_url_path="", template_folder=STATIC_DIRECTORY, static_folder=STATIC_DIRECTORY)
    setup_db(app)

    # Use this to re-initialize database:
    db_drop_and_create_all()

    @app.errorhandler(404)
    def static_handler(e):
        try:
            render = render_template("index.html")
        except TemplateNotFound as exception:
            return e
        return render, 200

    @app.route("/api/todo", methods=["GET"])
    def get_all_todo():
        todo_list = [todo.dictionary() for todo in TodoItem.query.all()]
        return jsonify(todo_list), 200

    @app.route("/api/todo", methods=["POST"])
    def add_todo():
        description = request.json.get("description", None)
        if not description:
            raise BadRequest("Required body parameter \"description\" not found.")
        todo = TodoItem(description=description, done=False)
        todo.insert()
        return jsonify(todo.dictionary()), 201

    @app.route("/api/todo", methods=["PUT"])
    def update_todo():
        todo_id = request.json.get("id", None)
        if not todo_id:
            raise BadRequest("Required body parameter \"id\" not found.")
        description = request.json.get("description", None)
        done = request.json.get("done", None)
        todo = TodoItem.get(todo_id)
        todo.description = description if description else todo.description
        todo.done = done
        todo.update()
        return jsonify(todo.dictionary()), 200

    @app.route("/api/todo", methods=["DELETE"])
    def delete_todo():
        todo_id = request.args.get("id", None)
        if not todo_id:
            raise BadRequest("Required query parameter \"id\" not found.")
        todo = TodoItem.get(todo_id)
        todo.delete()
        return jsonify({}), 200

    @app.errorhandler(InternalServerError)
    def server_error(error):
        return jsonify(code="SERVER_ERROR", message="An internal server error occurred."), error.code

    @app.errorhandler(BadRequest)
    def bad_request_error(error):
        return jsonify(code="BAD_REQUEST", message=error.description), error.code

    return app
Example #7
0
File: app.py Project: seDhmi/FSND
def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__)
    CORS(app, resources={r"/api/*": {"origins": "*"}})
    setup_db(app)

    db_drop_and_create_all()

    # CORS headers
    @app.after_request
    def after_request(response):
        response.headers.add('Access-Control-Allow-Headers',
                             'Content-Type, Authorization')
        response.headers.add('Access-Control-Allow-Methods',
                             'GET, PATCH, POST, DELETE, OPTIONS')
        return response

    @app.route('/')
    def index():
        return f'hello capstone!'

    # Retrive All Shows
    @app.route('/shows')
    def retrive_all_shows():
        data = Show.query.all()
        shows = list(map(Show.get_show, data))
        if shows is None or len(shows) == 0:
            abort(404)
        return jsonify({'success': True, 'shows': shows})

    # Add Shows
    @app.route('/shows', methods=['POST'])
    def add_new_show():
        body = request.get_json()
        if body is None:
            abort(404)
        actor_id = body.get('actor_id', None)
        movie_id = body.get('movie_id', None)

        try:
            new_show = Show(actor_id=actor_id, movie_id=movie_id)
            new_show.insert()
            return jsonify({
                'success': True,
                'new show': [new_show.get_show()]
            })

        except Exception:
            abort(422)

        # Actors

    # Retrive All Actors.
    @app.route('/actors')
    @requires_auth('get:actors')
    def retrive_actors(payload):
        actors = Actor.query.all()
        if not actors:
            abort(404)
        formatActors = [actor.format() for actor in actors]

        return jsonify({'success': True, 'Actors': formatActors})

    # Add Actors.
    @app.route('/actors', methods=['POST'])
    @requires_auth('post:actors')
    def add_actors(payload):
        body = request.get_json()
        if body is None:
            abort(404)
        name = body.get('name', None)
        age = body.get('age', None)
        gender = body.get('gender', None)

        try:
            new_actor = Actor(name=name, age=age, gender=gender)
            new_actor.insert()
            return jsonify({
                'success': True,
                'actors': [new_actor.get_actor()]
            })

        except Exception:
            abort(422)

    # Retrive Actors.
    @app.route('/actors/<int:actor_id>/movies')
    def retrive_movies_of_an_actor(actor_id):
        data = Show.query.filter(Show.actor_id == actor_id).all()
        data = db.session.execute('''select movie_id from shows where
            actor_id=''' + str(actor_id)).fetchall()

        for d in data:
            movies = Movie.query.get(d.movie_id)
            print(movies)
        if movies is None or len(movies) == 0:
            abort(404)
        return jsonify({'success': True, 'movies': movies})

        # Actors

    # Delete an Actor.
    @app.route('/actors/<int:actor_id>', methods=['DELETE'])
    @requires_auth(permission='delete:actors')
    def delete_actor_by_id(payload, actor_id):
        try:
            actor = Actor.query.filter(Actor.id == actor_id).one_or_none()

            if actor is None:
                abort(404)

            actor.delete()

            return jsonify({'success': True, 'delete': actor_id}), 200

        except:
            abort(422)

    # Retrive All Movies.
    @app.route('/movies', methods=['GET'])
    @requires_auth('get:movies')
    def retrive_movies(payload):

        movies = Movie.query.all()
        if not movies:
            abort(404)
        formatMovies = [movie.format() for movie in movies]

        return jsonify({'success': True, 'movies': formatMovies})

    # Add Movie.
    @app.route('/movies', methods=['POST'])
    @requires_auth('post:movies')
    def add_movie(payload):
        body = request.get_json()
        if 'title' not in body:
            abort(404)
        title = body.get('title', None)
        release_date = body.get('release_date', None)

        try:
            new_movie = Movie(title=title, release_date=release_date)
            new_movie.insert()
            return jsonify({
                'success': True,
                'movies': [new_movie.get_movie()]
            })
        except Exception:
            abort(422)

    # Edit Movie.
    @app.route('/movies/<int:movie_id>', methods=['PATCH'])
    @requires_auth('patch:movies')
    def edit_movie(payload, movie_id):
        body = request.get_json()
        try:
            movie = Movie.query.filter(Movie.id == movie_id).one_or_none()

            if movie is None:
                abort(404)
            if 'title' in body:
                movie.title = body.get('title', None)
            if 'release_data' in body:
                movie.release_data = body.get('release_data', None)

            movie.update()
            format_movie = [movie.format()]

            return jsonify({'success': True, 'movie': format_movie}), 200
        except Exception:
            abort(422)

    # Delete Movie.
    @app.route('/movies/<movie_id>', methods=['DELETE'])
    @requires_auth('delete:movies')
    def delete_movie(payload, movie_id):
        try:
            movie = Movie.query.filter(Movie.id == movie_id).one_or_none()
            if movie is None:
                abort(404)

            movie.delete()

            return jsonify({'success': True, 'delete': movie_id}), 200

        except:
            abort(422)

    # Error Handling.

    @app.errorhandler(404)
    def not_found(error):
        return jsonify({
            "success": False,
            "error": 404,
            "message": "resource not found"
        }), 404

    @app.errorhandler(400)
    def bad_request(error):
        return jsonify({
            "success": False,
            "error": 400,
            "message": "bad request"
        }), 400

    @app.errorhandler(405)
    def method_not_allowed(error):
        return jsonify({
            "success": False,
            "error": 405,
            "message": "method not allowed"
        }), 405

    @app.errorhandler(422)
    def unprocessable(error):
        return jsonify({
            "success": False,
            "error": 422,
            "message": "unprocessable"
        }), 422

    @app.errorhandler(AuthError)
    def auth_error(error):
        return jsonify({
            "success": False,
            "error": error.status_code,
            "message": error.error['description']
        }), error.status_code

    return app
Example #8
0
 def test_0_refresh_db(self):
     db_drop_and_create_all()
Example #9
0
def create_tables():
    db_drop_and_create_all()
Example #10
0
def create_app(test_config=None):
    # create and configure the app
    APP = Flask(__name__)
    setup_db(APP)
    # CORS(app)

    # APP = create_app()

    # if __name__ == '__main__':
    #    APP.run(host='127.0.0.1', port=5000, debug=True)

    db_drop_and_create_all()

    @APP.route('/token')
    def get_token():
        return jsonify({'success': True}), 200

    @APP.route('/actors', methods=['GET'])
    def get_actors():
        # query all listed actors
        actors = Actor.query.all()
        formatted_actors = [actor.format() for actor in actors]
        # return results with the success code
        return jsonify({'success': True, 'actors': formatted_actors}), 200

    @APP.route('/movies', methods=['GET'])
    def get_movies():
        # query all listed actors
        movies = Movie.query.all()
        formatted_movies = [movie.format() for movie in movies]
        # return results with the success code
        return jsonify({'success': True, 'movies': formatted_movies}), 200

    @APP.route('/actors/<int:id>', methods=['DELETE'])
    @requires_auth('delete:actor')
    def delete_actor(payload, id):
        # code
        actor = Actor.query.filter(Actor.id == id).one_or_none()
        if not actor:
            abort(404)
        try:
            actor.delete()
        except BaseException:
            abort(400)

        return jsonify({'success': True, 'delete': id}), 200

    @APP.route('/movies/<int:id>', methods=['DELETE'])
    @requires_auth('delete:movie')
    def delete_movie(payload, id):
        # code
        movie = Movie.query.filter(Movie.id == id).one_or_none()
        if not movie:
            abort(404)
        try:
            movie.delete()
        except BaseException:
            abort(400)

        return jsonify({'success': True, 'delete': id}), 200

    @APP.route('/actors', methods=['POST'])
    @requires_auth('post:actor')
    def post_actor(payload):
        data = request.get_json()
        try:
            actor = Actor(name=data['name'],
                          gender=data['gender'],
                          age=data['age'])
            actor.insert()

            return jsonify({'success': True, 'actor': actor.format()}), 200
        except:
            abort(422)

    @APP.route('/movies', methods=['POST'])
    @requires_auth('post:movie')
    def post_movie(payload):
        data = request.get_json()
        try:
            movie = Movie(title=data['title'],
                          release_date=datetime.strptime(
                              data['release_date'], '%Y-%m-%d'))
            movie.insert()

            return jsonify({'success': True, 'movie': movie.format()}), 200
        except:
            abort(422)

    @APP.route('/actors/<int:id>', methods=['PATCH'])
    @requires_auth('patch:actor')
    def modify_actor(payload, id):
        actor = Actor.query.get(id)
        if actor is None:
            abort(404)

        data = request.get_json()
        if 'name' in data:
            actor.name = data['name']

        if 'gender' in data:
            actor.gender = data['gender']

        if 'age' in data:
            actor.age = data['age']

        try:
            actor.update()
        except BaseException:
            abort(400)

        return jsonify({'success': True, 'actor': actor.format()}), 200

    @APP.route('/movies/<int:id>', methods=['PATCH'])
    @requires_auth('patch:movie')
    def modify_movie(payload, id):
        movie = Movie.query.get(id)
        if movie is None:
            abort(404)

        data = request.get_json()
        if 'title' in data:
            movie.title = data['title']

        if 'release_date' in data:
            movie.release_date = datetime.strptime(data['release_date'],
                                                   '%Y-%m-%d')

        try:
            movie.update()
        except BaseException:
            abort(400)

        return jsonify({'success': True, 'movie': movie.format()}), 200

    # error handling

    @APP.errorhandler(422)
    def unprocessable(error):
        return jsonify({
            "success": False,
            "error": 422,
            "message": "unprocessable"
        }), 422

    @APP.errorhandler(404)
    def not_found(error):
        return jsonify({
            "success": False,
            "error": 404,
            "message": "Resource Not Found"
        }), 404

    '''
    error handler for AuthError
    '''

    @APP.errorhandler(AuthError)
    def auth_error(error):
        return jsonify({
            "success": False,
            "error": error.status_code,
            "message": error.error['description']
        }), error.status_code

    @APP.errorhandler(401)
    def unauthorized(error):
        return jsonify({
            "success": False,
            "error": 401,
            "message": 'Unauthorized'
        }), 401

    @APP.errorhandler(400)
    def bad_request(error):
        return jsonify({
            "success": False,
            "error": 400,
            "message": 'Bad Request'
        }), 400

    return APP
Example #11
0
def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__)
    setup_db(app)
    db_drop_and_create_all()

    CORS(app)

    @app.after_request
    def after_request(response):
        response.headers.add('Access-Control-Allow-Headers',
                             'Content-Type,Authorization,true')
        response.headers.add('Access-Control-Allow-Methods',
                             'GET,PATCH,POST,DELETE,OPTIONS')
        return response

    def get_error_message(error, default_text):
        try:
            return error.description['message']
        except:
            return default_text

    def paginate_results(request, selection):
        page = request.args.get('page', 1, type=int)
        start = (page - 1) * ROWS_PER_PAGE
        end = start + ROWS_PER_PAGE

        objects_formatted = [object_name.format() for object_name in selection]
        return objects_formatted[start:end]

    #----------------------------------------------------------------------------#
    # Endpoint /actors GET/POST/DELETE/PATCH
    #----------------------------------------------------------------------------#
    @app.route('/actors', methods=['GET'])
    @requires_auth('get:actors')
    def get_actors(payload):
        selection = Actor.query.all()
        actors_paginated = paginate_results(request, selection)

        if len(actors_paginated) == 0:
            abort(404, {'message': 'no actors found in database.'})

        return jsonify({'success': True, 'actors': actors_paginated})

    @app.route('/actors', methods=['POST'])
    @requires_auth('post:actors')
    def insert_actors(payload):

        body = request.get_json()

        if not body:
            abort(400,
                  {'message': 'request does not contain a valid JSON body.'})
        name = body.get('name', None)
        age = body.get('age', None)
        gender = body.get('gender', 'Other')

        if not name:
            abort(422, {'message': 'no name provided.'})

        if not age:
            abort(422, {'message': 'no age provided.'})

        new_actor = (Actor(name=name, age=age, gender=gender))
        new_actor.insert()

        return jsonify({'success': True, 'created': new_actor.id})

    @app.route('/actors/<actor_id>', methods=['PATCH'])
    @requires_auth('patch:actors')
    def edit_actors(payload, actor_id):
        body = request.get_json()

        if not actor_id:
            abort(400,
                  {'message': 'please append an actor id to the request url.'})

        if not body:
            abort(400,
                  {'message': 'request does not contain a valid JSON body.'})

        actor_to_update = Actor.query.filter(
            Actor.id == actor_id).one_or_none()
        if not actor_to_update:
            abort(
                404, {
                    'message':
                    'Actor with id {} not found in database.'.format(actor_id)
                })

        name = body.get('name', actor_to_update.name)
        age = body.get('age', actor_to_update.age)
        gender = body.get('gender', actor_to_update.gender)

        actor_to_update.name = name
        actor_to_update.age = age
        actor_to_update.gender = gender

        actor_to_update.update()

        return jsonify({
            'success': True,
            'updated': actor_to_update.id,
            'actor': [actor_to_update.format()]
        })

    @app.route('/actors/<actor_id>', methods=['DELETE'])
    @requires_auth('delete:actors')
    def delete_actors(payload, actor_id):

        if not actor_id:
            abort(400,
                  {'message': 'please append an actor id to the request url.'})

        actor_to_delete = Actor.query.filter(
            Actor.id == actor_id).one_or_none()

        if not actor_to_delete:
            abort(
                404, {
                    'message':
                    'Actor with id {} not found in database.'.format(actor_id)
                })

        actor_to_delete.delete()

        return jsonify({'success': True, 'deleted': actor_id})

    #----------------------------------------------------------------------------#
    # Endpoint /movies GET/POST/DELETE/PATCH
    #----------------------------------------------------------------------------#
    @app.route('/movies', methods=['GET'])
    @requires_auth('get:movies')
    def get_movies(payload):
        selection = Movie.query.all()
        movies_paginated = paginate_results(request, selection)

        if len(movies_paginated) == 0:
            abort(404, {'message': 'no movies found in database.'})

        return jsonify({'success': True, 'movies': movies_paginated})

    @app.route('/movies', methods=['POST'])
    @requires_auth('post:movies')
    def insert_movies(payload):
        body = request.get_json()

        if not body:
            abort(400,
                  {'message': 'request does not contain a valid JSON body.'})

        title = body.get('title', None)
        release_date = body.get('release_date', None)

        if not title:
            abort(422, {'message': 'no title provided.'})

        if not release_date:
            abort(422, {'message': 'no "release_date" provided.'})

        new_movie = (Movie(title=title, release_date=release_date))
        new_movie.insert()

        return jsonify({'success': True, 'created': new_movie.id})

    @app.route('/movies/<movie_id>', methods=['PATCH'])
    @requires_auth('patch:movies')
    def edit_movies(payload, movie_id):
        body = request.get_json()

        if not movie_id:
            abort(400,
                  {'message': 'please append an movie id to the request url.'})

        if not body:
            abort(400,
                  {'message': 'request does not contain a valid JSON body.'})

        movie_to_update = Movie.query.filter(
            Movie.id == movie_id).one_or_none()

        if not movie_to_update:
            abort(
                404, {
                    'message':
                    'Movie with id {} not found in database.'.format(movie_id)
                })

        title = body.get('title', movie_to_update.title)
        release_date = body.get('release_date', movie_to_update.release_date)

        movie_to_update.title = title
        movie_to_update.release_date = release_date

        movie_to_update.update()

        return jsonify({
            'success': True,
            'edited': movie_to_update.id,
            'movie': [movie_to_update.format()]
        })

    @app.route('/movies/<movie_id>', methods=['DELETE'])
    @requires_auth('delete:movies')
    def delete_movies(payload, movie_id):

        if not movie_id:
            abort(400,
                  {'message': 'please append an movie id to the request url.'})

        movie_to_delete = Movie.query.filter(
            Movie.id == movie_id).one_or_none()

        if not movie_to_delete:
            abort(
                404, {
                    'message':
                    'Movie with id {} not found in database.'.format(movie_id)
                })

        movie_to_delete.delete()

        return jsonify({'success': True, 'deleted': movie_id})

    #----------------------------------------------------------------------------#
    # Error Handlers
    #----------------------------------------------------------------------------#

    @app.errorhandler(422)
    def unprocessable(error):
        return jsonify({
            "success": False,
            "error": 422,
            "message": get_error_message(error, "unprocessable")
        }), 422

    @app.errorhandler(400)
    def bad_request(error):
        return jsonify({
            "success": False,
            "error": 400,
            "message": get_error_message(error, "bad request")
        }), 400

    @app.errorhandler(404)
    def ressource_not_found(error):
        return jsonify({
            "success":
            False,
            "error":
            404,
            "message":
            get_error_message(error, "resource not found")
        }), 404

    @app.errorhandler(AuthError)
    def authentification_failed(AuthError):
        return jsonify({
            "success": False,
            "error": AuthError.status_code,
            "message": AuthError.error['description']
        }), AuthError.status_code

    return app