diff --git a/fablib.py b/fablib.py index eac50e7..5fecc9e 100644 --- a/fablib.py +++ b/fablib.py @@ -4,9 +4,12 @@ import os import hashlib import boto +from markdown import markdown from flask import Flask, request, abort, redirect from flask.ext.restful import Resource, Api, reqparse -from markdown import markdown +from flask.ext.sqlalchemy import SQLAlchemy +from werkzeug.security import generate_password_hash, check_password_hash + BUCKET_NAME = os.environ['BUCKET_NAME'] DATABASE_URL = os.environ['DATABASE_URL'] @@ -40,9 +43,11 @@ class Trunk(object): return text app = Flask(__name__) -app.debug=True +app.config['SQLALCHEMY_DATABASE_URI'] = DATABASE_URL +app.debug = True api = Api(app) trunk = Trunk(BUCKET_NAME) +db = SQLAlchemy(app) @app.route('/') def hello(): @@ -52,19 +57,60 @@ todos = {} todos['1'] = 'yo' -_user = { - 'name': 'kennethreitz', - 'email': 'me@kennethreitz.com', - 'password': 'xxxxx' -} +class BaseModel(object): + def save(self): + db.session.add(self) + return db.session.commit() -_document = { - 'name': 'kennethreitz', - 'slug': 'emulators', - 'text': '# Emulators\n\nGames are fun.', - 'owner': 'kennethreitz' -} +class UserModel(db.Model, BaseModel): + __tablename__ = 'users' + id = db.Column(db.Integer, primary_key=True) + email = db.Column(db.String(120), unique=True) + username = db.Column(db.String(80), unique=True) + password = db.Column(db.String(120), unique=False) + def __init__(self, username, email, password): + self.username = username + self.email = email + self.set_password(password) + + def __repr__(self): + return '' % self.username + + def set_password(self, password): + self.password = generate_password_hash(password) + + def check_password(self, password): + return check_password_hash(self.password, password) + + @staticmethod + def from_username(username): + return UserModel.query.filter_by(username=username).first() + +class DocumentModel(db.Model, BaseModel): + __tablename__ = 'documents' + id = db.Column(db.Integer, primary_key=True) + slug = db.Column(db.String(120)) + content = db.Column(db.String(80), unique=False) + private = db.Column(db.Boolean, default=False) + owner_id = db.Column(db.Integer, db.ForeignKey('users.id')) + fork_of = db.Column(db.Integer, db.ForeignKey('documents.id')) + + def __repr__(self): + return '' % self.id + + @property + def forks(self): + return DocumentModel.query.filter_by(fork_of=self).all() + + def set_content(self, data): + key = trunk.set(data) + self.content = key + + @staticmethod + def from_keys(username, slug): + user = UserModel.from_username(username) + return DocumentModel.query.filter_by(owner_id=user.id, slug=slug).first() class UserProfile(Resource): @@ -83,7 +129,15 @@ api.add_resource(UserProfile, '/') class Document(Resource): def get(self, profile, document): - return {'user': _user, 'document': _document} + u = UserModel.from_username(profile) + # d = UserModel.from_username(profile) + d = DocumentModel.from_keys(profile, document) + content = trunk.get(d.content) + + user = {'username': u.username, 'email': u.email} + doc = {'text': content} + + return {'user': user, 'document': doc} def put(self, profile, document): todos[profile] = request.form['data'] diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..0ff18b6 --- /dev/null +++ b/manage.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from flask.ext.script import Manager + +from fablib import app, db + + +manager = Manager(app) + +@manager.command +def syncdb(): + """Initializes the database.""" + db.create_all() + + +if __name__ == "__main__": + manager.run() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 59833ef..863fc69 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ Flask==0.10.1 Flask-RESTful==0.2.5 Flask-SQLAlchemy==1.0 +Flask-Script==0.6.2 Jinja2==2.7.1 Markdown==2.3.1 MarkupSafe==0.18