from sqlalchemy import and_, Column, ForeignKey, Index
from sqlalchemy.orm import relation
-from sqlalchemy.types import DateTime, Integer, Unicode
+from sqlalchemy.types import DateTime, Enum, Integer, Unicode
from spline.model.meta import TableBase
from splinext.users import model as users_model
__tablename__ = 'forums'
id = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
name = Column(Unicode(133), nullable=False)
+ access_level = Column(Enum(u'normal', u'soapbox', u'archive', name='forums_access_level'), nullable=False, default=u'normal', server_default=u'normal')
+
+ def can_create_thread(self, user):
+ """Returns True ifff the named user can make a new thread in this
+ forum.
+ """
+ if not user.can('forum:create-thread'):
+ return False
+
+ if self.access_level == u'soapbox' and \
+ not user.can('forum:override-soapbox'):
+ return False
+
+ if self.access_level == u'archive' and \
+ not user.can('forum:override-archive'):
+ return False
+
+ return True
class Thread(TableBase):
__tablename__ = 'threads'
return self.posts.filter_by(position=position).one()
+ def can_create_post(self, user):
+ """Returns True ifff the named user can make a new post in this thread.
+ """
+ if not user.can('forum:create-post'):
+ return False
+
+ if self.forum.access_level == u'archive' and \
+ not user.can('forum:override-archive'):
+ return False
+
+ return True
+
class Post(TableBase):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
# XXX sort by time, how?
Forum.threads = relation(Thread, order_by=Thread.id.desc(), lazy='dynamic', backref='forum')
-Thread.posts = relation(Post, order_by=Post.posted_time.desc(), lazy='dynamic', backref='thread')
+Thread.posts = relation(Post, order_by=Post.position.asc(), lazy='dynamic', backref='thread')
Thread.first_post = relation(Post, primaryjoin=and_(Post.thread_id == Thread.id, Post.position == 1), uselist=False)
Thread.last_post = relation(Post, primaryjoin=and_(Post.thread_id == Thread.id, Post.position == Thread.post_count), uselist=False)