class Ins(db.Model): __tablename__ = 'ins' id = db.Column(db.String(24), default=objectid, primary_key=True) type = db.Column(db.String(255), comment='机构类型') name = db.Column(db.String(50), comment='机构名称') ins_picture = db.Column(db.String(255), comment='机构图片') location_id = db.Column(db.String(50), db.ForeignKey('location.id'), comment='位置') ins_address = db.Column(db.String(255), comment='机构地址') note = db.Column(db.Text, comment='备注') latitude = db.Column(db.Float(asdecimal=True), comment='纬度') longitude = db.Column(db.Float(asdecimal=True), comment='经度') admin_user_id = db.Column(db.String(24), db.ForeignKey('user.id'), comment='管理员id') community = db.relationship('Community', secondary=t_community_ins, backref=db.backref('f1_community', lazy='dynamic'), lazy='dynamic') user = db.relationship('User', secondary=t_user_ins, backref=db.backref('f_user', lazy='dynamic'), lazy='dynamic') disabled = db.Column(db.Boolean, nullable=False, default=False, comment='是否可用')
class User(db.Model): __tablename__ = 'user' id = db.Column(db.String(24), default=objectid, primary_key=True) disabled = db.Column(db.Boolean, nullable=False, default=False, comment='是否停用 (1、禁用 0、正常)') contract_tel = db.Column(db.String(20), comment='用户电话') username = db.Column(db.String(20), index=True, comment='用户名)') password = db.Column(db.String(32), comment='密码') email = db.Column(db.String(60), comment='email') #salt = db.Column(db.String(50), comment='加密盐') createTime = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间') #lastTime = db.Column(db.DateTime, comment='最后登陆时间') user_role = db.relationship('UserRole', foreign_keys=[UserRole.user_id], backref=db.backref('f_user_role', lazy='joined'), lazy='dynamic') #real_name = db.Column(db.String(50), comment='姓名') sensor_visable = db.Column(db.Boolean, default=True, comment='传感器是否可见') ins = db.relationship('Ins', secondary=t_user_ins, backref=db.backref('f_ins', lazy='dynamic'), lazy='dynamic')
class Comment(Base): __tablename__ = 'comments' id = Column(Integer, primary_key=True) content = Column(Text) created = Column(DateTime, default=datetime.now) commenter_name = Column(String(64)) commenter_email = Column(String(64)) # 头像相关 avatar_hash = Column(String(32)) article_id = Column(Integer, ForeignKey('articles.id')) disabled = Column(Boolean, default=False) comment_type = Column(db.String(64), default='comment') reply_to = Column(String(128), default='notReply') followed = db.relationship('Follow', foreign_keys=[Follow.follower_id], backref=db.backref('follower', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan') followers = db.relationship('Follow', foreign_keys=[Follow.followed_id], backref=db.backref('followed', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan') @property def replys(self): return [i.follower for i in self.followers] # 根据email 生成图像 def __init__(self, **kwargs): super(Comment, self).__init__(**kwargs) if self.commenter_email is not None and self.avatar_hash is None: self.avatar_hash = hashlib.md5( self.commenter_email.encode('utf-8')).hexdigest() def gravatar(self, size=40, default='identicon', rating='g'): if request.is_secure: url = 'https://secure.gravatar.com/avatar' else: url = 'http://www.gravatar.com/avatar' hash = self.avatar_hash or hashlib.md5( self.commenter_email.encode('utf-8')).hexdigest() return '{url}/{hash}?s={size}&d={default}&r={rating}'.format( url=url, hash=hash, size=size, default=default, rating=rating) def followed_name(self): if self.is_reply(): return self.followed.first().followed.commenter_name def __repr__(self): return '<Comment %r>' % self.id def __str__(self): return self.id
class UserRole(db.Model): __tablename__ = 'user_role' id = db.Column(db.String(24), default=objectid, primary_key=True) user_id = db.Column(db.String(24), db.ForeignKey('user.id'), index=True) role_id = db.Column(db.String(24), db.ForeignKey('role.id'), index=True) disable = db.Column(db.Boolean, nullable=False, default=False) role = db.relationship('Role', backref=db.backref('f1_role', lazy='dynamic'), lazy='joined') user = db.relationship('User', backref=db.backref('f1_user', lazy='dynamic'), lazy='joined')
class User(db.Model, UserMixin): __tablename__ = 'users' id = db.Column(db.Integer(), autoincrement=True, primary_key=True) name = db.Column(db.String(64)) login = db.Column(db.String(64), unique=True) password = db.Column(db.String(255)) is_active = db.Column(db.Boolean(), server_default=expression.text('True'), nullable=False) # 这里使用 expression.true() 似乎不起作用 roles = db.relationship( 'Role', secondary=users_roles, backref=db.backref('users', lazy='dynamic') ) def set_password(self, password): return pbkdf2_sha256.hash(password) def check_password(self, password): return pbkdf2_sha256.verify(password, self.password) def is_authenticated(self): return not isinstance(self, AnonymousUserMixin) def is_anonymous(self): return isinstance(self, AnonymousUserMixin) def get_id(self): return self.id def __repr__(self): return '<Model User {}>'.format(self.name)
class Note(Base): """ 公告表 """ __tablename__ = "notes" content = db.Column(db.String(255), nullable=False, comment="公告内容") level = db.Column(db.Integer(), default=0, comment="排序") start_date = db.Column(db.Date(), default="", comment="起始时间") end_date = db.Column(db.Date(), default="", comment="结束时间") admin_id = db.Column(db.Integer(), db.ForeignKey('admins.id')) admin = db.relationship('Admin', backref=db.backref('notes', lazy="dynamic")) @classmethod def _query_search(cls, query, _keyword): if _keyword is not None: keyword = '%' + str(_keyword) + '%' return query.filter(or_(cls.content.like(keyword), )) return query def create(self, data): with db.auto_commit(): self.set_attrs(data) self.active = 1 self.admin = current_user self.created_at = time_now() self.updated_at = time_now() db.session.add(self)
class Role(db.Model): __tablename__ = 'role' id = db.Column(db.String(24), default=objectid, primary_key=True) name = db.Column(db.String(30), nullable=False) disabled = db.Column(db.Boolean, nullable=False, default=True, comment='是否可用') description = db.Column(db.String(60), comment='权限描述') user_role = db.relationship('UserRole', foreign_keys=[UserRole.role_id], backref=db.backref('F_user_role', lazy='joined'), lazy='dynamic') menus = db.relationship('Menu', secondary=t_role_menu, backref=db.backref('role_menus', lazy='dynamic'), lazy='dynamic')
class Currentrecord(db.Model): __tablename__ = 'currentrecord' id = db.Column(db.String(24), default=objectid, primary_key=True) currentperson_id = db.Column(db.String(24), db.ForeignKey('user.id')) currenttime = db.Column(db.DateTime, default=datetime.datetime.now) currentcontent = db.Column(db.Text) attachment = db.Column(db.String(200)) work_id = db.Column(db.String(24), db.ForeignKey('workorder.id')) work = db.relationship('Workorder', backref=db.backref('f1_worker', lazy='dynamic'), lazy='joined')
class Consume(db.Model): __tablename__ = 'consume' id = db.Column(db.String(24), default=objectid, primary_key=True) reporter_id = db.Column(db.String(24)) report_time = db.Column(db.DateTime) consume_name = db.Column(db.String(32)) count = db.Column(db.Integer) work_id = db.Column(db.String(24), db.ForeignKey('workorder.id')) work = db.relationship('Workorder', backref=db.backref('f_worker', lazy='dynamic'), lazy='joined')
class Alarm(db.Model): __tablename__ = 'alarm' id = db.Column(db.String(24), default=objectid, primary_key=True) type = db.Column(db.Integer) value = db.Column(db.Float) time = db.Column(db.DateTime, default=datetime.datetime.now) if_confirm = db.Column(db.Boolean, nullable=False, default=False) note = db.Column(db.Text) node_id = db.Column(db.String(24), db.ForeignKey('node.id')) node = db.relationship('Node', backref=db.backref('f1_node', lazy='dynamic'), lazy='joined')
class Equipment(db.Model): __tablename__ = 'equipment' id = db.Column(db.String(24), default=objectid, primary_key=True) name = db.Column(db.String(50)) type = db.Column(db.Integer) picture = db.Column(db.String(200)) note = db.Column(db.Text) status = db.Column(db.Integer) orgs = db.relationship('Organization', secondary='org_equ', backref=db.backref('f_equi_orgs', lazy='dynamic'), lazy='dynamic')
class Node(db.Model): __tablename__ = 'node' id = db.Column(db.String(24), default=objectid, primary_key=True) name = db.Column(db.String(50)) type = db.Column(db.Integer) status = db.Column(db.Integer) value = db.Column(db.Float) note = db.Column(db.Text) equ_id = db.Column(db.String(24), db.ForeignKey('equipment.id'), index=True) equ = db.relationship('Equipment', backref=db.backref('f_node_equ', lazy='dynamic'), lazy='joined')
class Facility(db.Model): __tablename__ = 'facility' id = db.Column(db.String(24), default=objectid, primary_key=True) facility_name = db.Column(db.String(50), comment='设施名') facility_picture = db.Column(db.String(200), comment='设施图片') note = db.Column(db.String(200), comment='备注') knowledge = db.relationship('Knowledge', secondary=t_facility_knowledge, backref=db.backref('f_knowledge', lazy='dynamic'), lazy='dynamic') disabled = db.Column(db.Boolean, nullable=False, default=False, comment='是否可用')
class User(db.Model): __tablename__ = 'user' id = db.Column(db.String(24), default=objectid, primary_key=True) username = db.Column(db.String(24)) real_name = db.Column(db.String(50)) password = db.Column(db.String(32)) email = db.Column(db.String(60)) user_tel = db.Column(db.String(20)) salt = db.Column(db.String(50)) disabled = db.Column(db.Boolean, nullable=False, default=False) createtime = db.Column(db.DateTime, default=datetime.datetime.now) lastTime = db.Column(db.DateTime) works = db.relationship('Workorder', secondary='user_work', backref=db.backref('f_user_work', lazy='dynamic'), lazy='joined')
class Organization(db.Model): __tablename__ = 'organization' id = db.Column(db.String(24), default=objectid, primary_key=True) name = db.Column(db.String(50)) address = db.Column(db.String(255)) picture = db.Column(db.String(200)) telephone = db.Column(db.String(20)) admin_user_id = db.Column(db.String(24), db.ForeignKey('user.id')) longitude = db.Column(db.Numeric(10, 7)) latitude = db.Column(db.Numeric(10, 7)) note = db.Column(db.Text) users = db.relationship('User', secondary='user_org', backref=db.backref('f_org_user', lazy='dynamic'), lazy='dynamic')
class Focus(Base): """ 焦点图表 """ __tablename__ = "focuses" title = db.Column(db.String(20), nullable=False, comment="焦点图名称", unique=True) label = db.Column(db.String(255), default="", comment="焦点图说明") link = db.Column(db.String(100), default="", comment="链接") thumb_image = db.Column(db.String(100), default="", comment="缩略图") target = db.Column(db.Boolean(), default=0, comment="新窗口打开") column_id = db.Column(db.Integer(), db.ForeignKey('columns.id')) level = db.Column(db.Integer(), default=0, comment="排序") column = db.relationship('Column', backref=db.backref('focuses', lazy="dynamic")) @classmethod def _query_search(cls, query, _keyword): if _keyword is not None: keyword = '%' + str(_keyword) + '%' return query.filter(or_(cls.title.like(keyword), cls.label.like(keyword), )) return query def create(self, data): with db.auto_commit(): self.column = Column.query.filter_by(id=data['column_id']).api_first_or_404() self.set_attrs(data) self.active = 1 self.created_at = time_now() self.updated_at = time_now() db.session.add(self) def update(self, data, edit_one_field=None): """ edit_one_field 是否表内单个编辑 标识 :param data: :param flag: :return: """ with db.auto_commit(): if not edit_one_field: self.column = Column.query.filter_by(id=data['column_id']).api_first_or_404() self.set_attrs(data) else: self.set_attr(data) self.updated_at = time_now()
class Knowledge(db.Model): __tablename__ = 'knowledge' id = db.Column(db.String(24), default=objectid, primary_key=True) type = db.Column(db.String(50), comment='知识类型 (0.消防 1.逃生 2.灭火 3.新闻 4.其他)') content = db.Column(db.Text, comment='知识正文') title = db.Column(db.String(50), comment='知识标题') publish_time = db.Column(db.DateTime, default=datetime.datetime.now) publish_from = db.Column(db.String(100)) facility = db.relationship('Facility', secondary=t_facility_knowledge, backref=db.backref('f_facility', lazy='dynamic'), lazy='dynamic') disabled = db.Column(db.Boolean, nullable=False, default=False, comment='是否可用')
class Menu(db.Model): __tablename__ = 'menu' id = db.Column(db.String(24), default=objectid, primary_key=True) p_id = db.Column(db.String(24), db.ForeignKey('menu.id'), comment='父id') children = db.relationship("Menu") parent = db.relationship("Menu", remote_side=[id]) label = db.Column(db.String(20), nullable=False, comment='标签') level = db.Column(db.SmallInteger, comment='层级') type = db.Column(db.SmallInteger, comment='类型') style = db.Column(db.String(50), comment='样式') disabled = db.Column(db.Boolean, default=False, comment='是否可用') roles = db.relationship('Role', secondary=t_role_menu, backref=db.backref('menu_roles', lazy='dynamic'), lazy='dynamic') path = db.Column(db.String(200), comment='和url什么区别???') order = db.Column(db.SmallInteger, comment='?????') url = db.Column(db.String(200), comment='和path什么区别???')
class Permission(Base): """ 权限表 """ __tablename__ = "permissions" name = db.Column(db.String(20), nullable=False, comment="权限名称", unique=True) endpoint_name = db.Column(db.String(20), nullable=False, comment="endpoint名称", unique=True) label = db.Column(db.String(20), nullable=True, default="", comment="权限说明") level = db.Column(db.Integer(), default=0, comment="排序") menu_id = db.Column(db.Integer(), db.ForeignKey('menus.id'), default=0, comment="后台菜单ID") menu = db.relationship("Menu", backref=db.backref("permissions",lazy="dynamic")) @classmethod def _query_search(cls, query, _keyword): if _keyword is not None: keyword = '%' + str(_keyword) + '%' return query.filter(or_(cls.name.like(keyword), cls.label.like(keyword), cls.endpoint_name.like(keyword))) return query
class Community(db.Model): __tablename__ = 'community' id = db.Column(db.String(24), default=objectid, primary_key=True) name = db.Column(db.String(255), comment='社区名') community_picture = db.Column(db.String(200), comment='社区图片') detail_address = db.Column(db.String(255), comment='详细地址') save_distance = db.Column(db.Integer, comment='求救距离') eva_distance = db.Column(db.Integer, comment='疏散距离') longitude = db.Column(db.Float(asdecimal=True), comment='经度') latitude = db.Column(db.Float(asdecimal=True), comment='纬度') ins = db.relationship('Ins', secondary=t_community_ins, backref=db.backref('f1_ins', lazy='dynamic'), lazy='dynamic') homes = db.relationship('Home', lazy='dynamic') location_id = db.Column(db.String(50), db.ForeignKey('location.id'), comment='位置') disabled = db.Column(db.Boolean, nullable=False, default=False, comment='是否可用')
class Document(Base): """ 文档表 """ __tablename__ = "documents" uuid = db.Column(db.String(100), nullable=False, comment="别名", unique=True, index=True) title = db.Column(db.String(100), nullable=False, comment="文档标题", unique=True) use_title = db.Column(db.String(100), comment="文档标题带样式") sub_title = db.Column(db.String(100), nullable=False, comment="副标题") keyword = db.Column(db.String(255), default="", comment="META关键字") description = db.Column(db.String(255), default="", comment="META描述") label = db.Column(db.String(255), default="", comment="摘要") external_link = db.Column(db.String(100), default="", comment="外部链接") published_at = db.Column(db.DateTime(), default="", comment="发布时间") thumb_image = db.Column(db.String(100), default="", comment="缩略图") author = db.Column(db.String(20), default="", comment="作者") source = db.Column(db.String(100), default="", comment="来源") source_link = db.Column(db.String(100), default="", comment="来源链接") attribute = db.Column(db.String(100), default="", comment="属性") content = db.Column(db.Text(), default="", comment="正文") tags = db.Column(db.String(100), default="", comment="标签", index=True) target = db.Column(db.Boolean(), default=0, comment="新窗口打开") click = db.Column(db.Integer(), default=0, comment="阅读数") editor = db.Column(db.String(100), default="", comment="编辑") is_original = db.Column(db.Boolean(), default=0, comment="是否原创") open_comment = db.Column(db.Boolean(), default=0, comment="允许评论") attach_file = db.Column(db.String(100), default="", comment="附件地址") attach_name = db.Column(db.String(100), default="", comment="附件名称") column_id = db.Column(db.Integer(), db.ForeignKey('columns.id'), comment="栏目id") admin_id = db.Column(db.Integer(), db.ForeignKey('admins.id'), comment="管理员id") column = db.relationship('Column', backref=db.backref('documents', lazy="dynamic")) admin = db.relationship('Admin', backref=db.backref('documents', lazy="dynamic")) login_show = db.Column(db.Boolean(), default=0, comment="登录可见") password_txt = db.Column(db.String(100), default=0, comment="不为空为密码可见") user_group = db.Column(db.Boolean(), default=0, comment="VIP可见") @classmethod def _query_search(cls, query, _keyword): if _keyword is not None: keyword = '%' + str(_keyword) + '%' return query.filter( or_( cls.title.like(keyword), cls.label.like(keyword), cls.keyword.like(keyword), cls.description.like(keyword), cls.author.like(keyword), )) return query def create(self, data): attributes = request.form.getlist('attribute[]') with db.auto_commit(): self.set_attrs(data) self.active = 1 self.admin = current_user self.attribute = ",".join(attributes) self.created_at = time_now() self.updated_at = time_now() db.session.add(self) def update(self, data, edit_one_field=None): """ edit_one_field 是否表内单个编辑 标识 :param data: :param flag: :return: """ attributes = request.form.getlist('attribute[]') with db.auto_commit(): if not edit_one_field: self.set_attrs(data) self.attribute = ",".join(attributes) else: self.set_attr(data) self.updated_at = time_now()
class Article(Base): __tablename__ = 'articles' query_class = ArticleQuery # per_page = current_app.config['PER_PAGE'] id = Column(Integer, primary_key=True, autoincrement=True) title = Column(String(256), index=True) summary = Column(Text) published = Column(Boolean, default=True) hits = Column(Integer, default=0) content = Column(Text) content_html = Column(Text) created = Column(DateTime()) last_modified = Column(DateTime()) author_id = Column(Integer, ForeignKey(User.id)) tags = relationship(Tag, secondary=article_tags_table, backref=db.backref("articles")) category_id = Column(Integer(), ForeignKey(Category.id), nullable=False) source_id = Column( Integer, ForeignKey(Source.id), nullable=False, ) comments = db.relationship('Comment', backref='article', lazy='dynamic') def __repr__(self): return '<Article %r>' % (self.title) def __str__(self): return self.title\ @property def year(self): return int(self.created.year) @property def month_and_day(self): return str(self.created.month) + "-" + str(self.created.day) @property def link(self): return url_for('web.article', id=self.id, _external=True) @property def month_and_day(self): return str(self.created.month) + "-" + str(self.created.day) @property def get_next(self): pass @property def get_prev(self): pass @property def has_more(self): return pattern_hasmore.search(self.body) is not None or \ self.summary.find('...') >= 0 @staticmethod def on_change_content(target, value, oldvalue, initiator): target.content_html = markitup(value) # TODO 有问题 def _format(_html): return do_truncate(do_striptags(_html), length=200) if target.summary is None or target.summary.strip() == '': # 新增文章时,如果 summary 为空,则自动生成 _match = pattern_hasmore.search(value) if _match is not None: more_start = _match.start() # target.summary = _format(markitup(value[:more_start])) target.summary = markitup(value[:more_start]) else: target.summary = target.body_html @staticmethod def before_insert(mapper, connection, target): def _format(_html): return do_truncate(do_striptags(_html), length=200) value = target.content if target.summary is None or target.summary.strip() == '': # 新增文章时,如果 summary 为空,则自动生成 _match = pattern_hasmore.search(value) if _match is not None: more_start = _match.start() target.summary = _format(markitup(value[:more_start])) else: target.summary = _format(target.body_html)