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