From 70d3cd8b6a432924235b7eaae4210ecbf4c5e353 Mon Sep 17 00:00:00 2001 From: Francesco Siddi Date: Tue, 10 Mar 2015 11:38:57 +0100 Subject: [PATCH] Initial test with Eve --- attract/application/__init__.py | 72 ++++++++++++--------- attract/manage.py | 5 +- attract/settings.py | 111 ++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 31 deletions(-) create mode 100644 attract/settings.py diff --git a/attract/application/__init__.py b/attract/application/__init__.py index 99ba8d78..09715bc6 100644 --- a/attract/application/__init__.py +++ b/attract/application/__init__.py @@ -1,37 +1,51 @@ -import config -from flask import Flask, Blueprint -from flask.ext.mail import Mail -from flask.ext.sqlalchemy import SQLAlchemy -from flask.ext.thumbnails import Thumbnail -from flask.ext.assets import Environment, Bundle +from eve import Eve + +# import config +# from flask import Flask, Blueprint +# from flask.ext.mail import Mail +# from flask.ext.sqlalchemy import SQLAlchemy +# from flask.ext.thumbnails import Thumbnail +# from flask.ext.assets import Environment, Bundle # Initialize the Flask all object -app = Flask(__name__, - template_folder='templates', - static_folder='static') + +from eve.io.mongo import Validator + +class ValidateCustomFields(Validator): + def _validate_validcf(self, validcf, field, value): + if validcf: + print self.document['node_type'] + if value == 'hi': + return True + else: + self._error(field, "Must be hi") + + +app = Eve(validator=ValidateCustomFields) + # Filemanager used by Flask-Admin extension -filemanager = Blueprint('filemanager', __name__, static_folder='static/files') +# filemanager = Blueprint('filemanager', __name__, static_folder='static/files') -# Choose the configuration to load -app.config.from_object(config.Development) +# # Choose the configuration to load +# app.config.from_object(config.Development) -# Initialized the available extensions -mail = Mail(app) -db = SQLAlchemy(app) -thumb = Thumbnail(app) -assets = Environment(app) +# # Initialized the available extensions +# mail = Mail(app) +# db = SQLAlchemy(app) +# thumb = Thumbnail(app) +# assets = Environment(app) -# Import controllers -from application.modules.nodes import node_types -from application.modules.nodes import nodes -from application.modules.main import homepage -from application.modules.shots import shots -from application.modules.projects import projects +# # Import controllers +# from application.modules.nodes import node_types +# from application.modules.nodes import nodes +# from application.modules.main import homepage +# from application.modules.shots import shots +# from application.modules.projects import projects -# Register blueprints for the imported controllers -app.register_blueprint(filemanager) -app.register_blueprint(shots, url_prefix='/shots') -app.register_blueprint(projects, url_prefix='/projects') -app.register_blueprint(node_types, url_prefix='/node-types') -app.register_blueprint(nodes, url_prefix='/nodes') +# # Register blueprints for the imported controllers +# app.register_blueprint(filemanager) +# app.register_blueprint(shots, url_prefix='/shots') +# app.register_blueprint(projects, url_prefix='/projects') +# app.register_blueprint(node_types, url_prefix='/node-types') +# app.register_blueprint(nodes, url_prefix='/nodes') diff --git a/attract/manage.py b/attract/manage.py index 7ddee303..b63a283c 100644 --- a/attract/manage.py +++ b/attract/manage.py @@ -1,5 +1,5 @@ from application import app -from application import db +#from application import db from flask.ext.script import Manager # from flask.ext.migrate import Migrate # from flask.ext.migrate import MigrateCommand @@ -10,6 +10,7 @@ manager = Manager(app) @manager.command def create_all_tables(): - db.create_all() + pass + #db.create_all() manager.run() diff --git a/attract/settings.py b/attract/settings.py new file mode 100644 index 00000000..d16c7214 --- /dev/null +++ b/attract/settings.py @@ -0,0 +1,111 @@ +# Enable reads (GET), inserts (POST) and DELETE for resources/collections +# (if you omit this line, the API will default to ['GET'] and provide +# read-only access to the endpoint). +RESOURCE_METHODS = ['GET', 'POST', 'DELETE'] + +# Enable reads (GET), edits (PATCH), replacements (PUT) and deletes of +# individual items (defaults to read-only item access). +ITEM_METHODS = ['GET', 'PATCH', 'PUT', 'DELETE'] + + +schema = { + # Schema definition, based on Cerberus grammar. Check the Cerberus project + # (https://github.com/nicolaiarocci/cerberus) for details. + 'firstname': { + 'type': 'string', + 'minlength': 1, + 'maxlength': 10, + }, + 'lastname': { + 'type': 'string', + 'minlength': 1, + 'maxlength': 15, + 'required': True, + # talk about hard constraints! For the purpose of the demo + # 'lastname' is an API entry-point, so we need it to be unique. + 'unique': True, + }, + # 'role' is a list, and can only contain values from 'allowed'. + 'role': { + 'type': 'list', + 'allowed': ["author", "contributor", "copy"], + }, + # An embedded 'strongly-typed' dictionary. + 'location': { + 'type': 'dict', + 'schema': { + 'address': {'type': 'string'}, + 'city': {'type': 'string'} + }, + }, + 'born': { + 'type': 'datetime', + }, +} + +nodes_schema = { + 'name': { + 'type': 'string', + 'minlength': 1, + 'maxlength': 128, + }, + 'parent': { + 'type': 'objectid', + # 'data_relation': { + # 'resource': 'node', + # 'field': '_id', + # }, + }, + 'node_type' : { + 'type' : 'string', + 'validcf' : True, + }, + # 'custom_fields' : { + # 'type' : 'dict' + # } +} + + +nodes = { + # We choose to override global cache-control directives for this resource. + 'cache_control': 'max-age=10,must-revalidate', + 'cache_expires': 10, + + # most global settings can be overridden at resource level + 'resource_methods': ['GET', 'POST'], + + 'schema': nodes_schema +} + + + +people = { + # 'title' tag used in item links. Defaults to the resource title minus + # the final, plural 's' (works fine in most cases but not for 'people') + 'item_title': 'person', + + # by default the standard item entry point is defined as + # '/people/'. We leave it untouched, and we also enable an + # additional read-only entry point. This way consumers can also perform + # GET requests at '/people/'. + 'additional_lookup': { + 'url': 'regex("[\w]+")', + 'field': 'lastname' + }, + + # We choose to override global cache-control directives for this resource. + 'cache_control': 'max-age=10,must-revalidate', + 'cache_expires': 10, + + # most global settings can be overridden at resource level + 'resource_methods': ['GET', 'POST'], + + 'schema': schema +} + + +DOMAIN = { + 'people': people, + 'nodes' : nodes +} +