flask/flask_website/database.py

136 lines
4 KiB
Python
Raw Normal View History

2010-05-02 19:07:42 +02:00
from datetime import datetime
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, \
String, DateTime, ForeignKey
2010-05-03 11:20:52 +02:00
from sqlalchemy.orm import scoped_session, sessionmaker, backref, relation
2010-05-02 19:07:42 +02:00
from sqlalchemy.ext.declarative import declarative_base
2010-05-03 11:20:52 +02:00
from werkzeug import cached_property
from flask import url_for
2010-05-02 19:07:42 +02:00
from flask_website import config
engine = create_engine(config.DATABASE_URI, convert_unicode=True)
2010-05-02 19:07:42 +02:00
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
def init_db():
Model.metadata.create_all(bind=engine)
2010-05-03 11:20:52 +02:00
Model = declarative_base(name='Model')
Model.query = db_session.query_property()
2010-05-02 19:07:42 +02:00
class User(Model):
__tablename__ = 'users'
id = Column('user_id', Integer, primary_key=True)
openid = Column('openid', String(200))
2010-05-03 11:20:52 +02:00
name = Column(String(200), unique=True)
def __init__(self, name, openid):
self.name = name
self.openid = openid
2010-05-15 23:19:13 +02:00
@property
def is_admin(self):
return self.openid in config.ADMINS
2010-05-03 11:20:52 +02:00
def __eq__(self, other):
return type(self) is type(other) and self.id == other.id
2010-05-02 19:07:42 +02:00
2010-05-03 11:20:52 +02:00
def __ne__(self, other):
return not self.__eq__(other)
2010-05-02 19:07:42 +02:00
class Category(Model):
__tablename__ = 'categories'
id = Column('category_id', Integer, primary_key=True)
name = Column(String(50))
slug = Column(String(50))
2010-05-03 11:20:52 +02:00
def __init__(self, name):
self.name = name
self.slug = '-'.join(name.split()).lower()
@cached_property
def count(self):
return self.snippets.count()
@property
def url(self):
return url_for('snippets.category', slug=self.slug)
2010-05-02 19:07:42 +02:00
class Snippet(Model):
__tablename__ = 'snippets'
id = Column('snippet_id', Integer, primary_key=True)
2010-05-03 11:20:52 +02:00
author_id = Column(Integer, ForeignKey('users.user_id'))
category_id = Column(Integer, ForeignKey('categories.category_id'))
2010-05-02 19:07:42 +02:00
title = Column(String(200))
body = Column(String)
2010-05-03 11:20:52 +02:00
pub_date = Column(DateTime)
2010-05-02 19:07:42 +02:00
2010-05-03 13:05:42 +02:00
author = relation(User, backref=backref('snippets', lazy='dynamic'))
category = relation(Category, backref=backref('snippets', lazy='dynamic'))
2010-05-03 11:20:52 +02:00
def __init__(self, author, title, body, category):
2010-05-02 19:07:42 +02:00
self.author = author
self.title = title
self.body = body
2010-05-03 11:20:52 +02:00
self.category = category
2010-05-02 19:07:42 +02:00
self.pub_date = datetime.utcnow()
2010-05-03 11:20:52 +02:00
@property
def url(self):
return url_for('snippets.show', id=self.id)
@property
def rendered_body(self):
from flask_website.utils import format_creole
return format_creole(self.body)
2010-05-02 19:07:42 +02:00
class Comment(Model):
__tablename__ = 'comments'
id = Column('comment_id', Integer, primary_key=True)
2010-05-03 11:20:52 +02:00
snippet_id = Column(Integer, ForeignKey('snippets.snippet_id'))
author_id = Column(Integer, ForeignKey('users.user_id'))
2010-05-02 19:07:42 +02:00
title = Column(String(200))
text = Column(String)
2010-05-03 11:20:52 +02:00
pub_date = Column(DateTime)
2010-05-02 19:07:42 +02:00
2010-05-03 13:05:42 +02:00
snippet = relation(Snippet, backref=backref('comments', lazy=True))
author = relation(User, backref=backref('comments', lazy='dynamic'))
2010-05-03 11:20:52 +02:00
def __init__(self, snippet, author, title, text):
self.snippet = snippet
2010-05-02 19:07:42 +02:00
self.author = author
self.title = title
self.text = text
self.pub_date = datetime.utcnow()
2010-05-03 11:20:52 +02:00
@property
def rendered_text(self):
from flask_website.utils import format_creole
return format_creole(self.text)
2010-05-02 19:07:42 +02:00
class OpenIDAssociation(Model):
2010-05-03 11:20:52 +02:00
__tablename__ = 'openid_associations'
2010-05-02 19:07:42 +02:00
id = Column('association_id', Integer, primary_key=True)
server_url = Column(String(1024))
handle = Column(String(255))
secret = Column(String(255))
issued = Column(Integer)
lifetime = Column(Integer)
assoc_type = Column(String(64))
2010-05-03 11:20:52 +02:00
class OpenIDUserNonce(Model):
__tablename__ = 'openid_user_nonces'
2010-05-02 19:07:42 +02:00
id = Column('user_nonce_id', Integer, primary_key=True)
server_url = Column(String(1024))
timestamp = Column(Integer)
salt = Column(String(40))