Merge branch 'master' of gitorious.org:mediagoblin/mediagoblin
[mediagoblin.git] / mediagoblin / db / sql / models.py
1 import datetime
2
3 from sqlalchemy.ext.declarative import declarative_base
4 from sqlalchemy import (
5 Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey,
6 UniqueConstraint)
7 from sqlalchemy.orm import relationship
8
9 from mediagoblin.db.sql.base import GMGTableBase
10 from mediagoblin.db.mixin import UserMixin, MediaEntryMixin
11
12
13 Base = declarative_base(cls=GMGTableBase)
14
15
16 class SimpleFieldAlias(object):
17 """An alias for any field"""
18 def __init__(self, fieldname):
19 self.fieldname = fieldname
20
21 def __get__(self, instance, cls):
22 return getattr(instance, self.fieldname)
23
24 def __set__(self, instance, val):
25 setattr(instance, self.fieldname, val)
26
27
28 class User(Base, UserMixin):
29 __tablename__ = "users"
30
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)
40 url = Column(Unicode)
41 bio = Column(UnicodeText) # ??
42 bio_html = Column(UnicodeText) # ??
43 fp_verification_key = Column(Unicode)
44 fp_token_expire = Column(DateTime)
45
46 ## TODO
47 # plugin data would be in a separate model
48
49 _id = SimpleFieldAlias("id")
50
51
52 class MediaEntry(Base, MediaEntryMixin):
53 __tablename__ = "media_entries"
54
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?
64
65 fail_error = Column(Unicode)
66 fail_metadata = Column(UnicodeText)
67
68 queued_media_file = Column(Unicode)
69
70 queued_task_id = Column(Unicode)
71
72 __table_args__ = (
73 UniqueConstraint('uploader', 'slug'),
74 {})
75
76 get_uploader = relationship(User)
77
78 ## TODO
79 # media_files
80 # media_data
81 # attachment_files
82 # fail_error
83
84
85 class Tag(Base):
86 __tablename__ = "tags"
87
88 id = Column(Integer, primary_key=True)
89 slug = Column(Unicode, nullable=False, unique=True)
90
91
92 class MediaTag(Base):
93 __tablename__ = "media_tags"
94
95 id = Column(Integer, primary_key=True)
96 tag = Column(Integer, ForeignKey('tags.id'), nullable=False)
97 name = Column(Unicode)
98 media_entry = Column(
99 Integer, ForeignKey('media_entries.id'),
100 nullable=False)
101 # created = Column(DateTime, nullable=False, default=datetime.datetime.now)
102
103 __table_args__ = (
104 UniqueConstraint('tag', 'media_entry'),
105 {})
106
107
108 class MediaComment(Base):
109 __tablename__ = "media_comments"
110
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)
118
119 get_author = relationship(User)
120
121
122 def show_table_init():
123 from sqlalchemy import create_engine
124 engine = create_engine('sqlite:///:memory:', echo=True)
125
126 Base.metadata.create_all(engine)
127
128
129 if __name__ == '__main__':
130 show_table_init()