3 from sqlalchemy
.ext
.declarative
import declarative_base
4 from sqlalchemy
import (
5 Column
, Integer
, Unicode
, UnicodeText
, DateTime
, Boolean
, ForeignKey
,
7 from sqlalchemy
.orm
import relationship
9 from mediagoblin
.db
.sql
.base
import GMGTableBase
10 from mediagoblin
.db
.mixin
import UserMixin
, MediaEntryMixin
13 Base
= declarative_base(cls
=GMGTableBase
)
16 class SimpleFieldAlias(object):
17 """An alias for any field"""
18 def __init__(self
, fieldname
):
19 self
.fieldname
= fieldname
21 def __get__(self
, instance
, cls
):
22 return getattr(instance
, self
.fieldname
)
24 def __set__(self
, instance
, val
):
25 setattr(instance
, self
.fieldname
, val
)
28 class User(Base
, UserMixin
):
29 __tablename__
= "users"
31 id = Column(Integer
, primary_key
=True)
32 username
= Column(Unicode
, nullable
=False, unique
=True)
33 email
= Column(Unicode
, nullable
=False)
34 created
= Column(DateTime
, nullable
=False, default
=datetime
.datetime
.now
)
35 pw_hash
= Column(Unicode
, nullable
=False)
36 email_verified
= Column(Boolean
)
37 status
= Column(Unicode
, default
=u
"needs_email_verification", nullable
=False)
38 verification_key
= Column(Unicode
)
39 is_admin
= Column(Boolean
, default
=False, nullable
=False)
41 bio
= Column(UnicodeText
) # ??
42 bio_html
= Column(UnicodeText
) # ??
43 fp_verification_key
= Column(Unicode
)
44 fp_token_expire
= Column(DateTime
)
47 # plugin data would be in a separate model
49 _id
= SimpleFieldAlias("id")
52 class MediaEntry(Base
, MediaEntryMixin
):
53 __tablename__
= "media_entries"
55 id = Column(Integer
, primary_key
=True)
56 uploader
= Column(Integer
, ForeignKey('users.id'), nullable
=False)
57 title
= Column(Unicode
, nullable
=False)
58 slug
= Column(Unicode
, nullable
=False)
59 created
= Column(DateTime
, nullable
=False, default
=datetime
.datetime
.now
)
60 description
= Column(UnicodeText
) # ??
61 description_html
= Column(UnicodeText
) # ??
62 media_type
= Column(Unicode
, nullable
=False)
63 state
= Column(Unicode
, nullable
=False) # or use sqlalchemy.types.Enum?
65 fail_error
= Column(Unicode
)
66 fail_metadata
= Column(UnicodeText
)
68 queued_media_file
= Column(Unicode
)
70 queued_task_id
= Column(Unicode
)
73 UniqueConstraint('uploader', 'slug'),
76 get_uploader
= relationship(User
)
86 __tablename__
= "tags"
88 id = Column(Integer
, primary_key
=True)
89 slug
= Column(Unicode
, nullable
=False, unique
=True)
93 __tablename__
= "media_tags"
95 id = Column(Integer
, primary_key
=True)
96 tag
= Column(Integer
, ForeignKey('tags.id'), nullable
=False)
97 name
= Column(Unicode
)
99 Integer
, ForeignKey('media_entries.id'),
101 # created = Column(DateTime, nullable=False, default=datetime.datetime.now)
104 UniqueConstraint('tag', 'media_entry'),
108 class MediaComment(Base
):
109 __tablename__
= "media_comments"
111 id = Column(Integer
, primary_key
=True)
112 media_entry
= Column(
113 Integer
, ForeignKey('media_entries.id'), nullable
=False)
114 author
= Column(Integer
, ForeignKey('users.id'), nullable
=False)
115 created
= Column(DateTime
, nullable
=False, default
=datetime
.datetime
.now
)
116 content
= Column(UnicodeText
, nullable
=False)
117 content_html
= Column(UnicodeText
)
119 get_author
= relationship(User
)
122 def show_table_init():
123 from sqlalchemy
import create_engine
124 engine
= create_engine('sqlite:///:memory:', echo
=True)
126 Base
.metadata
.create_all(engine
)
129 if __name__
== '__main__':