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
12 Base
= declarative_base(cls
=GMGTableBase
)
15 class SimpleFieldAlias(object):
16 """An alias for any field"""
17 def __init__(self
, fieldname
):
18 self
.fieldname
= fieldname
20 def __get__(self
, instance
, cls
):
21 return getattr(instance
, self
.fieldname
)
23 def __set__(self
, instance
, val
):
24 setattr(instance
, self
.fieldname
, val
)
28 __tablename__
= "users"
30 id = Column(Integer
, primary_key
=True)
31 username
= Column(Unicode
, nullable
=False, unique
=True)
32 email
= Column(Unicode
, nullable
=False)
33 created
= Column(DateTime
, nullable
=False, default
=datetime
.datetime
.now
)
34 pw_hash
= Column(Unicode
, nullable
=False)
35 email_verified
= Column(Boolean
)
36 status
= Column(Unicode
, default
=u
"needs_email_verification", nullable
=False)
37 verification_key
= Column(Unicode
)
38 is_admin
= Column(Boolean
, default
=False, nullable
=False)
40 bio
= Column(UnicodeText
) # ??
41 bio_html
= Column(UnicodeText
) # ??
42 fp_verification_key
= Column(Unicode
)
43 fp_token_expire
= Column(DateTime
)
46 # plugin data would be in a separate model
48 _id
= SimpleFieldAlias("id")
51 class MediaEntry(Base
):
52 __tablename__
= "media_entries"
54 id = Column(Integer
, primary_key
=True)
55 uploader
= Column(Integer
, ForeignKey('users.id'), nullable
=False)
56 title
= Column(Unicode
, nullable
=False)
57 slug
= Column(Unicode
, nullable
=False)
58 created
= Column(DateTime
, nullable
=False, default
=datetime
.datetime
.now
)
59 description
= Column(UnicodeText
) # ??
60 description_html
= Column(UnicodeText
) # ??
61 media_type
= Column(Unicode
, nullable
=False)
62 state
= Column(Unicode
, nullable
=False) # or use sqlalchemy.types.Enum?
64 fail_error
= Column(Unicode
)
65 fail_metadata
= Column(UnicodeText
)
67 queued_media_file
= Column(Unicode
)
69 queued_task_id
= Column(Unicode
)
72 UniqueConstraint('uploader', 'slug'),
75 get_uploader
= relationship(User
)
85 __tablename__
= "tags"
87 id = Column(Integer
, primary_key
=True)
88 slug
= Column(Unicode
, nullable
=False, unique
=True)
92 __tablename__
= "media_tags"
94 id = Column(Integer
, primary_key
=True)
95 tag
= Column(Integer
, ForeignKey('tags.id'), nullable
=False)
96 name
= Column(Unicode
)
98 Integer
, ForeignKey('media_entries.id'),
100 # created = Column(DateTime, nullable=False, default=datetime.datetime.now)
103 UniqueConstraint('tag', 'media_entry'),
107 class MediaComment(Base
):
108 __tablename__
= "media_comments"
110 id = Column(Integer
, primary_key
=True)
111 media_entry
= Column(
112 Integer
, ForeignKey('media_entries.id'), nullable
=False)
113 author
= Column(Integer
, ForeignKey('users.id'), nullable
=False)
114 created
= Column(DateTime
, nullable
=False, default
=datetime
.datetime
.now
)
115 content
= Column(UnicodeText
, nullable
=False)
116 content_html
= Column(UnicodeText
)
118 get_author
= relationship(User
)
121 def show_table_init():
122 from sqlalchemy
import create_engine
123 engine
= create_engine('sqlite:///:memory:', echo
=True)
125 Base
.metadata
.create_all(engine
)
128 if __name__
== '__main__':