#!/usr/bin/env python
# -*- coding: utf-8 -*-
+# __all__
+
from sqlalchemy import (
Table, Column, ForeignKey,
Boolean, Enum, Binary, PickleType,
Integer, SmallInteger, BigInteger, Float,
String, Text, Unicode, UnicodeText,
DateTime, Date, Time,
- func, )
+ func, TypeDecorator, )
from sqlalchemy.orm import relationship, backref, aliased
-from sqlalchemy.types import TypeDecorator, VARCHAR
-from sqlalchemy.ext.associationproxy import association_proxy
import anyjson as json
from crisishaiku import db
class JSONData(TypeDecorator):
"Type representing serialized JSON data."
- impl = VARCHAR
+ impl = String
def process_bind_param(self, value, dialect):
if value is not None:
### Model Classes
-class Target(db.Model):
- "A polymorphic pointer to a Comment, Haiku, or Section."
- id = Column(Integer, primary_key=True)
- section = relationship('Section')
- haiku = relationship('Haiku')
- comment = relationship('Comment')
-
- @property
- def value(self):
- return self.section or self.haiku or self.comment
-
-
-class Section(db.Model):
- "A chunk of the Report. May represent a chapter/section node, or a paragraph of text."
- id = Column(Integer, primary_key=True)
- title = Column(String(200))
- text = Column(Text())
- parent_id = Column(Integer, ForeignKey('section.id'))
- children = relationship('Section', lazy='dynamic', backref=backref('parent', lazy='dynamic'))
- haikus = relationship('Haiku', lazy='dynamic', backref=backref('context', lazy='dynamic'))
-
-
-class Haiku(db.Model):
- id = Column(Integer, primary_key=True)
- text = Column(Text())
- start = Column(Integer) # character index into the section where this haiku begins
- context_id = Column(Integer, ForeignKey('section.id'))
-
-
-# likes = db.Table('likes',
-# Column('user_id', Integer, ForeignKey('user.id')),
-# Column('target_id', Integer, ForeignKey('target.id')),
-# )
-
-class Like(db.Model):
- id = Column(Integer, primary_key=True)
- target = relationship('Target', lazy='dynamic')
- user_id = Column(Integer, ForeignKey('user.id'))
- ctime = Column(DateTime, default=func.now())
-
-
-class Comment(TimestampMixin, db.Model):
- id = Column(Integer, primary_key=True)
- target = relationship('Target', lazy='dynamic')
- author_id = Column(Integer, ForeignKey('user.id'))
- text = Column(Text())
- approved = Column(Boolean, default=False) # spam filter approval
- deleted = Column(Boolean, default=False)
-
-
-haiku_tags = db.Table('haiku_tags',
- Column('tag_id', Integer, ForeignKey('tag.id')),
- Column('haiku_id', Integer, ForeignKey('haiku.id')),
-)
-
-class Tag(db.Model):
- id = Column(Integer, primary_key=True)
- name = Column(String(120), unique=True)
- haikus = relationship('Haiku', secondary=haiku_tags, lazy='dynamic', backref=backref('tags', lazy='dynamic'))
-
-
-# user_tags = db.Table('user_tags',
-# Column('tag', String(120), unique=True),
-# Column('user_id', Integer, ForeignKey('user.id')),
-# Column('haiku_id', Integer, ForeignKey('haiku.id')),
-# )
-
-
class User(TimestampMixin, db.Model):
id = Column(Integer, primary_key=True)
username = Column(String(30), unique=True)
# OAuth & OpenID accounts
accounts = Column(JSONData())
- # We can store the verification crap elsewhere
- # verification_token = Column(String(60))
-
- likes = relationship('Like', lazy='dynamic', backref=backref('user', lazy='dynamic'))
+ # likes = relationship('Like', lazy='dynamic', backref=backref('user', lazy='dynamic'))
comments = relationship('Comment', lazy='dynamic', backref=backref('author', lazy='dynamic'))
- # disable per-user tag tracking
+ # per-user tag tracking disabled for now
## tags = relationship('UserTag', backref=backref('user', lazy='dynamic'))
+ # We can store the verification crap elsewhere (and ignore it for now)
+ # verification_token = Column(String(60))
+
def __init__(self, username, email):
self.username = username
def __repr__(self):
return '<User %r, %r>' % (self.username, self.email)
+
+# class Section(db.Model):
+# "A chunk of the Report. May represent a chapter/section node, or a paragraph of text."
+# id = Column(Integer, primary_key=True)
+# title = Column(String(200))
+# text = Column(Text())
+# parent_id = Column(Integer, ForeignKey('section.id'))
+# children = relationship('Section', lazy='dynamic', backref=backref('parent', lazy='dynamic'))
+# haikus = relationship('Haiku', lazy='dynamic', backref=backref('context', lazy='dynamic'))
+
+
+# class Haiku(db.Model):
+# id = Column(Integer, primary_key=True)
+# text = Column(Text())
+# start = Column(Integer) # character index into the section where this haiku begins
+# context_id = Column(Integer, ForeignKey('section.id'))
+
+
+class Comment(TimestampMixin, db.Model):
+ id = Column(Integer, primary_key=True)
+ # target = relationship('Target', lazy='dynamic')
+ author_id = Column(Integer, ForeignKey('user.id'))
+ text = Column(Text())
+ approved = Column(Boolean, default=False) # spam filter approval
+ deleted = Column(Boolean, default=False)
+
+
+
+
+# class Target(db.Model):
+# "A polymorphic pointer to a Comment, Haiku, or Section."
+# id = Column(Integer, primary_key=True)
+# section = relationship('Section')
+# haiku = relationship('Haiku')
+# comment = relationship('Comment')
+#
+# @property
+# def value(self):
+# return self.section or self.haiku or self.comment
+
+
+# likes = db.Table('likes',
+# Column('user_id', Integer, ForeignKey('user.id')),
+# Column('target_id', Integer, ForeignKey('target.id')),
+# )
+
+# class Like(db.Model):
+# id = Column(Integer, primary_key=True)
+# target = relationship('Target', lazy='dynamic')
+# user_id = Column(Integer, ForeignKey('user.id'))
+# ctime = Column(DateTime, default=func.now())
+
+
+# haiku_tags = db.Table('haiku_tags',
+# Column('tag_id', Integer, ForeignKey('tag.id')),
+# Column('haiku_id', Integer, ForeignKey('haiku.id')),
+# )
+
+# class Tag(db.Model):
+# id = Column(Integer, primary_key=True)
+# name = Column(String(120), unique=True)
+# haikus = relationship('Haiku', secondary=haiku_tags, lazy='dynamic', backref=backref('tags', lazy='dynamic'))
+
+
+# user_tags = db.Table('user_tags',
+# Column('tag', String(120), unique=True),
+# Column('user_id', Integer, ForeignKey('user.id')),
+# Column('haiku_id', Integer, ForeignKey('haiku.id')),
+# )
+
+