class Section(db.Model): ''' name is used by url, must be a-zA-Z0-9- title is utf-8 characters ''' __tablename__ = "section" query_class = SectionQuery id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), nullable=False) title = db.Column(db.String(200), nullable=False) descp = db.Column(db.Text, nullable=True) avatar = db.Column(db.String(200), nullable=True) title_alternative = db.Column(db.String(200), nullable=True) header = db.Column(db.Text, nullable=True) footer = db.Column(db.Text, nullable=True) node_count = db.Column(db.Integer, default=0) topic_count = db.Column(db.Integer, default=0) reply_count = db.Column(db.Integer, default=0) #created = db.Column(db.DateTime, nullable=True, default=func.now()) #last_modified = db.Column(db.DateTime, nullable=True, onupdate=datetime.datetime.now) created = db.Column(db.DateTime, nullable=True) last_modified = db.Column(db.DateTime, nullable=True) sort_order = db.Column(db.Integer, default=1) def __unicode__(self): return self.title
class Node(db.Model): '''node_type: 0 public plaza 1 public club, anybody can join without permission except people who is in blacklist 2 private club, one can join with permission or invitation 3 secret club, anybody cannot see secret club except members ''' __tablename__ = "node" query_class = NodeQuery id = db.Column(db.Integer, primary_key=True) section_id = db.Column(db.Integer, ForeignKey('section.id'), nullable=False) section = relationship("Section", backref="nodes") members = db.Column(db.Integer, default=0) follows = db.Column(db.Integer, default=0) node_type = db.Column(db.Integer, default=0) status = db.Column(db.Integer, default=0) name = db.Column(db.String(30), nullable=False) title = db.Column(db.String(60), nullable=False, index=True) descp = db.Column(db.Text, nullable=False, default="") header = db.Column(db.Text, nullable=True) footer = db.Column(db.Text, nullable=True) theme = db.Column(db.String(40), nullable=False, default="default") sidebar = db.Column(db.Text, nullable=True) sidebar_ads = db.Column(db.Text, nullable=True) category = db.Column(db.String(40), nullable=True, index=True) topic_count = db.Column(db.Integer, default=0) reply_count = db.Column(db.Integer, default=0) parent_node = db.Column(db.Integer, nullable=True) avatar_url = db.Column(db.String(100), nullable=True) keywords = db.Column(db.Text, default="") item_per_page = db.Column(db.Integer, default=50) created = db.Column(db.DateTime, nullable=True) #, default=func.now()) last_modified = db.Column( db.DateTime, nullable=True) #, onupdate=datetime.datetime.now) def __unicode__(self): return self.title
class Message(db.Model): __tablename__ = "message" query_class = MessageQuery id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(50), nullable=False) content = db.Column(db.String(500), nullable=False) sender_id = db.Column(db.Integer, ForeignKey('user.id')) receiver_id = db.Column(db.Integer, ForeignKey('user.id')) direction = db.Column(db.Integer, default=0) reply_id = db.Column(db.Integer, default=0) ancestor_id = db.Column(db.Integer, default=0) send_tm = db.Column(db.DateTime, nullable=False) status = db.Column(db.Integer, default=0) sender = relationship("User", primaryjoin="Message.sender_id==User.id") receiver = relationship("User", primaryjoin="Message.receiver_id==User.id")
class UserProfile(db.Model): __tablename__ = "userprofile" query_class = UserProfileQuery id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, ForeignKey('user.id')) role = db.Column(db.Integer, default=0) friends = db.Column(db.Integer, default=0) followings = db.Column(db.Integer, default=0) fans = db.Column(db.Integer, default=0) nodes = db.Column(db.Integer, default=0) topics = db.Column(db.Integer, default=0) replies = db.Column(db.Integer, default=0) city = db.Column(db.String(40), nullable=True) province = db.Column(db.String(40), nullable=True) birthday = db.Column(db.Date, nullable=True) blog = db.Column(db.String(100), nullable=True) descp = db.Column(db.String(500), nullable=True) signature = db.Column(db.String(200), nullable=True) workat = db.Column(db.String(200), nullable=True) realname = db.Column(db.String(80), nullable=True) idcard = db.Column(db.String(32), nullable=True) # money copper_coins = db.Column(db.BigInteger, default=0) gold_coins = db.Column(db.BigInteger, default=0) reputation = db.Column(db.Integer, default=100) favourate = db.Column(db.Integer, default=0) messages = db.Column(db.Integer, default=0) unread = db.Column(db.Integer, default=0) def __init__(self, *args, **kwargs): super(UserProfile, self).__init__(*args, **kwargs) # Required for administrative interface def __unicode__(self): return "User's %d profile" % self.id
class Topic(db.Model): ''' status: 0: normal 1: promotion 2: close ''' __tablename__ = "topic" query_class = TopicQuery id = db.Column(db.Integer, primary_key=True) section_id = db.Column(db.Integer, ForeignKey('section.id'), nullable=False, index=True) section = relationship("Section", backref="topics") node_id = db.Column(db.Integer, ForeignKey('node.id'), nullable=False, index=True) node = relationship("Node", backref="topics") user_id = db.Column(db.Integer, ForeignKey('user.id'), nullable=False, index=True) user = relationship("User", backref="topics") marks = db.Column(db.Integer, default=0) status = db.Column(db.Integer, default=0) title = db.Column(db.String(100), nullable=True, index=True) content = db.Column(db.Text, nullable=False) content_length = db.Column(db.Integer, nullable=True, default=0) created = db.Column(db.DateTime, nullable=True) #, default=func.now()) last_modified = db.Column(db.DateTime, nullable=True) hits = db.Column(db.Integer, default=1) reply_count = db.Column(db.Integer, default=0) reply_members = db.Column(db.Integer, default=0) last_reply_by = db.Column(db.String(100), nullable=False, default="", index=True) last_reply_at = db.Column( db.DateTime, nullable=True) #, onupdate=datetime.datetime.now) up_count = db.Column(db.Integer, default=0) down_count = db.Column(db.Integer, default=0) tags = db.Column(db.String(100), nullable=False, index=True) impact = db.Column(db.Integer, default=get_current_impact, index=True) theme = db.Column(db.String(40), nullable=False, default="default") def __unicode__(self): ''' admin need this ''' return self.title @property def hr_created_tm(self): return timesince(self.created) @property def hr_last_reply(self): return timesince(self.last_reply_at)
class User(UserMixin, db.Model): __tablename__ = "user" query_class = UserQuery id = db.Column(db.Integer, primary_key=True) # which is provided by sina weibo, qq weibo, twitter, facebook, etc auth_id = db.Column(db.String(32), unique=True, nullable=False) username = db.Column(db.String(32), unique=True) nickname = db.Column(db.String(32), nullable=True) modify_chance = db.Column(db.Integer, default=3) email = db.Column(db.String(100), unique=True, nullable=True) password = db.Column(db.String(64), nullable=True) activation_key = db.Column(db.String(64), nullable=True) date_joined = db.Column(db.DateTime, default=datetime.utcnow) block = db.Column(db.Boolean, default=False) avater = db.Column(db.String(200), nullable=True) avater_s = db.Column(db.String(200), nullable=True) avater_l = db.Column(db.String(200), nullable=True) gender = db.Column(db.String(12), default='', nullable=True) vest = db.Column(db.Boolean, default=False) vest_accounts = db.Column(db.Integer, default=0) profile = relationship("UserProfile", uselist=False, backref="user") # Required for administrative interface def __unicode__(self): return self.username def __init__(self, *args, **kwargs): super(User, self).__init__(*args, **kwargs) self.profile = None def is_active(self): return self.block == False def is_superuser(self): return self.id == 1 @property def url(self): return url_for("auth.member", username=urllib.quote(self.username)) @classmethod def create_password(cls, raw): salt = User.create_token(8) hsh = hashlib.sha1(salt + raw + current_app.config["SECRET_KEY"]).hexdigest() return "%s$%s" % (salt, hsh) @classmethod def create_token(cls, length=16): chars = ('0123456789' 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') salt = ''.join([choice(chars) for i in range(length)]) return salt def check_password(self, raw): if '$' not in self.password: return False salt, hsh = self.password.split('$') verify = hashlib.sha1(salt + raw + current_app.config["SECRET_KEY"]).hexdigest() return verify == hsh