from datetime import datetimefrom turbogears.database import PackageHubfrom sqlobject import *from turbogears import identityhub = PackageHub('wiki20')__connection__ = hub# identity models.class Visit(SQLObject): """ A visit to your site """ class sqlmeta: table = 'visit' visit_key = StringCol(length=40, alternateID=True, alternateMethodName='by_visit_key') created = DateTimeCol(default=datetime.now) expiry = DateTimeCol() def lookup_visit(cls, visit_key): try: return cls.by_visit_key(visit_key) except SQLObjectNotFound: return None lookup_visit = classmethod(lookup_visit)class VisitIdentity(SQLObject): """ A Visit that is link to a User object """ visit_key = StringCol(length=40, alternateID=True, alternateMethodName='by_visit_key') user_id = IntCol()class Group(SQLObject): """ An ultra-simple group definition. """ # names like "Group", "Order" and "User" are reserved words in SQL # so we set the name to something safe for SQL class sqlmeta: table = 'tg_group' group_name = UnicodeCol(length=16, alternateID=True, alternateMethodName='by_group_name') display_name = UnicodeCol(length=255) created = DateTimeCol(default=datetime.now) # collection of all users belonging to this group users = RelatedJoin('User', intermediateTable='user_group', joinColumn='group_id', otherColumn='user_id') # collection of all permissions for this group permissions = RelatedJoin('Permission', joinColumn='group_id', intermediateTable='group_permission', otherColumn='permission_id')class User(SQLObject): """ Reasonably basic User definition. Probably would want additional attributes. """ # names like "Group", "Order" and "User" are reserved words in SQL # so we set the name to something safe for SQL class sqlmeta: table = 'tg_user' user_name = UnicodeCol(length=16, alternateID=True, alternateMethodName='by_user_name') email_address = UnicodeCol(length=255, alternateID=True, alternateMethodName='by_email_address') display_name = UnicodeCol(length=255) password = UnicodeCol(length=40) created = DateTimeCol(default=datetime.now) # groups this user belongs to groups = RelatedJoin('Group', intermediateTable='user_group', joinColumn='user_id', otherColumn='group_id') def _get_permissions(self): perms = set() for g in self.groups: perms = perms | set(g.permissions) return perms def _set_password(self, cleartext_password): "Runs cleartext_password through the hash algorithm before saving." password_hash = identity.encrypt_password(cleartext_password) self._SO_set_password(password_hash) def set_password_raw(self, password): "Saves the password as-is to the database." self._SO_set_password(password)class Permission(SQLObject): """ A relationship that determines what each Group can do """ permission_name = UnicodeCol(length=16, alternateID=True, alternateMethodName='by_permission_name') description = UnicodeCol(length=255) groups = RelatedJoin('Group', intermediateTable='group_permission', joinColumn='permission_id', otherColumn='group_id')class Page(SQLObject): pagename = UnicodeCol(alternateID=True, length=30) data = UnicodeCol()class Category(SQLObject): categoryname = UnicodeCol(alternateID=True, length=30) body = UnicodeCol() forums = MultipleJoin('Forum', joinColumn="category_id")class Forum(SQLObject): forumname = UnicodeCol(alternateID=True, length=30) body = UnicodeCol() category = ForeignKey('Category') topics = MultipleJoin('Topic')class Topic(SQLObject): topicname = UnicodeCol(alternateID=True, length=30) posts = MultipleJoin('Post') forum = ForeignKey('Forum')class Post(SQLObject): body = UnicodeCol() created = DateTimeCol(default=datetime.now) user = ForeignKey('User') attachments = MultipleJoin('Attachment') topic = ForeignKey('Forum')class Attachment(SQLObject): display_name = UnicodeCol() size = IntCol() created = DateTimeCol(default=datetime.now) filename = UnicodeCol() post = ForeignKey('Post')