5:1622dbdfa709 0.1.0
Anton Shestakov <engored@ya.ru>, Wed, 26 Dec 2012 22:00:13 +0900
Better writing.

next change 7:5c5d433b3a14
previous change 3:fd68ae95de5e

app.py

Permissions: -rwxr-xr-x

Other formats: Feeds:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import os
from flask import Flask, g, request, render_template
from flask.ext.restful import Resource, Api
from CodernityDB.database import RecordNotFound
from CodernityDB.database_thread_safe import ThreadSafeDatabase
from fruitbar.indexes import ProjectIndex, TaskIndex
app = Flask(__name__)
api = Api(app)
db_path = os.path.join(os.path.dirname(__file__), 'db')
cdb = ThreadSafeDatabase(db_path)
if cdb.exists():
cdb.open()
cdb.reindex()
else:
cdb.create()
cdb.add_index(ProjectIndex(cdb.path, 'project'))
cdb.add_index(TaskIndex(cdb.path, 'task'))
cdb.insert({'_id': '29c21f00190f475ba2d855f810c1085e', '_t': 'project', 'name': 'Test Project', 'color': 'success'})
cdb.insert({'_t': 'task', 'project': '29c21f00190f475ba2d855f810c1085e', 'name': 'Test Task', 'note': 'Task Note', 'done': True})
@app.before_request
def before_request():
g.db = cdb
class ResourceList(Resource):
db_index = 'id'
doc_stub = {}
def get(self):
return [project['doc'] for project in g.db.all(self.db_index, with_doc=True)]
def post(self):
doc = self.doc_stub.copy()
doc.update(request.json)
response = g.db.insert(doc)
return g.db.get('id', response['_id'], with_doc=True)
class CRUDResource(Resource):
""" CRUD? More like RUD!
"""
safe_fields = tuple()
def get(self, resource_id):
try:
doc = g.db.get('id', resource_id, with_doc=True)
except RecordNotFound:
return '', 404
return doc
def put(self, resource_id):
try:
doc = g.db.get('id', resource_id, with_doc=True)
except RecordNotFound:
return '', 404
userdata = dict((k, v) for (k, v) in request.json.items() if k in self.safe_fields)
doc.update(userdata)
response = g.db.update(doc)
return self.get(response['_id'])
def delete(self, resource_id):
try:
doc = g.db.get('id', resource_id, with_doc=True)
except RecordNotFound:
return '', 404
g.db.delete(doc)
return '', 200
class ProjectList(ResourceList):
doc_stub = {'_t': 'project'}
db_index = 'project'
class Project(CRUDResource):
safe_fields = ('name', 'color')
def delete(self, resource_id):
g.db.run('task', 'delete_for_project', resource_id)
return super(Project, self).delete(resource_id)
class TaskList(ResourceList):
doc_stub = {'_t': 'task'}
db_index = 'task'
class Task(CRUDResource):
safe_fields = ('name', 'note', 'done')
api.add_resource(ProjectList, '/projects/')
api.add_resource(Project, '/projects/<resource_id>/')
api.add_resource(TaskList, '/tasks/')
api.add_resource(Task, '/tasks/<resource_id>/')
@app.route('/')
def index():
data = {
'projects': [project['doc'] for project in g.db.all('project', with_doc=True)],
'tasks': [task['doc'] for task in g.db.all('task', with_doc=True)]
}
return render_template('index.html', data=data)
def main():
app.run(debug=True)
if __name__ == '__main__':
main()