class Blog(db.Model): __tablename__ = 'blogs' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(256), index=True) body = db.Column(db.Text()) timestamp = db.Column(db.DateTime, default=datetime.utcnow(), index=True) body_html = db.Column(db.Text()) author_id = db.Column(db.Integer, db.ForeignKey('users.id')) looks = db.Column(db.BigInteger, default=0) comments = db.relationship('Comment', backref='blog', lazy='dynamic') imgs = db.relationship('BlogImgs', backref='blog', lazy='dynamic') def __repr__(self): return '<blog %r>' % self.title # 博客发表 def upload_blog(self): db.session.add(self) db.session.commit() # 每浏览一次,浏览量自动加一 def ping(self): self.looks += 1 db.session.add(self) def delete_blog_imgs(self): for i in self.imgs: cos_class.delete_file(i.img_url) db.session.delete(i) cos_class.delete_file('/users/%s/blog_img/%s/' % (self.author.username, self.id)) #删除博客 def delete_blog(self): for c in self.comments: db.session.delete(c) self.delete_blog_imgs() db.session.delete(self) db.session.commit() # 将博客内容自动生成html格式 @staticmethod def on_changed_body(target, value, oldvalue, initiator): # 允许的标签 allowed_tags = ['a', 'abbr', 'acronym', 'b', 'blockquote', 'code',\ 'em', 'i', 'li', 'ol', 'pre', 'strong', 'ul', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'img', 'span'] # 允许的标签属性 allowed_columns = { '*': ['class', 'id', 'style', 'background', 'title', 'width', 'height'], 'a': ['href', 'rel'], 'img': ['src', 'alt'], } target.body_html = bleach.clean(value, tags=allowed_tags, attributes=allowed_columns, strip=True)
class Visualisation(db.Model): __tablename__ = 'visualisation' id = db.Column(db.Integer(), primary_key=True) created = db.Column(db.DateTime()) updated = db.Column(db.DateTime()) active = db.Column(db.Integer()) name = db.Column(db.Text()) identifier = db.Column(db.String(128), unique=True) descr = db.Column(db.Text()) data = db.Column(db.Text())
class Region(db.Model): __tablename__ = 'region' id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(255)) slug = db.Column(db.String(255), unique=True) created = db.Column(db.DateTime()) updated = db.Column(db.DateTime()) active = db.Column(db.Integer()) osm_id = db.Column(db.Integer()) geo_json = db.Column(db.Text()) rgs = db.Column(db.String(255)) region_level = db.Column(db.Integer()) postalcode = db.Column(db.String(255)) fulltext = db.Column(db.String(255)) lat = db.Column(db.Numeric(precision=10,scale=7)) lon = db.Column(db.Numeric(precision=10,scale=7)) def __init__(self): pass def __repr__(self): return '<Hoster %r>' % self.name
class Region(db.Model): __tablename__ = 'region' id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(255)) slug = db.Column(db.String(255), unique=True) created = db.Column(db.DateTime()) updated = db.Column(db.DateTime()) active = db.Column(db.Integer()) osm_id = db.Column(db.Integer()) geo_json = db.Column(db.Text()) rgs = db.Column(db.String(255)) region_level = db.Column(db.Integer()) postalcode = db.Column(db.String(255)) lat = db.Column(db.Numeric(precision=10,scale=7)) lon = db.Column(db.Numeric(precision=10,scale=7)) region_parent_id = db.Column(db.Integer, db.ForeignKey('region.id')) region_parent = db.relationship("Region", backref="region_children", remote_side=[id]) service_sites = db.relationship("ServiceSite", backref="region", lazy='dynamic') # hosts as defined in Host def __init__(self): pass def __repr__(self): return '<Hoster %r>' % self.name
class Suggestion(db.Model): __tablename__ = 'suggestion' id = db.Column(db.Integer(), primary_key=True) created = db.Column(db.DateTime()) updated = db.Column(db.DateTime()) type = db.Column(db.String(128)) suggestion = db.Column(db.Text())
class TrafficItem(db.Model): __tablename__ = 'traffic_item' id = db.Column(db.Integer(), primary_key=True) created = db.Column(db.DateTime()) updated = db.Column(db.DateTime()) active = db.Column(db.Integer()) name = db.Column(db.String(255)) slug = db.Column(db.String(255)) external_id = db.Column(db.String(255)) item_type = db.Column(db.Integer()) # 1 Baustelle 2 Auto-Parkplatz 3 Fahrrad-Ständer 4 Verkehrszählung 5 Sperranhänger raw_status = db.Column(db.Integer()) # 1 komplett roh, 2 verarbeitet is_meta = db.Column(db.Integer()) zoom_from = db.Column(db.Integer()) zoom_till = db.Column(db.Integer()) lat = db.Column(db.Numeric(precision=10,scale=7)) lon = db.Column(db.Numeric(precision=10,scale=7)) area = db.Column(db.Text()) traffic_item_provider_id = db.Column(db.Integer, db.ForeignKey('traffic_item_provider.id')) traffic_item_meta = db.relationship("TrafficItemMeta", backref="TrafficItem", lazy='dynamic') def __init__(self): pass def __repr__(self): return '<TrafficItem %r>' % self.name
class Track(db.Model): __tablename__ = 'tracks' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(140)) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) user_id = db.Column(db.Integer, db.ForeignKey('users.id')) description = db.Column(db.String(250)) raw_gpx = db.Column(db.Text()) def __repr__(self): return '<Track {}>'.format(self.title)
class Service(db.Model): __tablename__ = 'service' id = db.Column(db.Integer(), primary_key=True) created = db.Column(db.DateTime()) updated = db.Column(db.DateTime()) active = db.Column(db.Integer()) name = db.Column(db.Text()) fa_icon = db.Column(db.String(64)) descr_short = db.Column(db.Text()) descr = db.Column(db.Text()) make_ssl_test = db.Column(db.Integer()) service_group_id = db.Column(db.Integer, db.ForeignKey('service_group.id')) service_sites = db.relationship("ServiceSite", backref="Service", lazy='dynamic') def __init__(self): pass def __repr__(self): return '<Service %r>' % self.name
class SslTest(db.Model): __tablename__ = 'ssl_test' id = db.Column(db.Integer(), primary_key=True) created = db.Column(db.DateTime()) host = db.Column(db.Text()) ip = db.Column(db.Text()) port_443_available = db.Column(db.Integer()) port_25_available = db.Column(db.Integer()) ssl_ok = db.Column(db.Integer()) cert_matches = db.Column(db.Integer()) rc4_available = db.Column(db.Integer()) md5_available = db.Column(db.Integer()) anon_suite_available = db.Column(db.Integer()) dhe_key = db.Column(db.Integer()) ecdhe_key = db.Column(db.Integer()) pfs_available = db.Column(db.Integer()) fallback_scsv_available = db.Column(db.Integer()) protocol_num = db.Column(db.Integer()) protocol_best = db.Column(db.String(255)) sslv2_available = db.Column(db.Integer()) sslv3_available = db.Column(db.Integer()) tlsv1_available = db.Column(db.Integer()) tlsv1_1_available = db.Column(db.Integer()) tlsv1_2_available = db.Column(db.Integer()) sslv2_cipher_accepted = db.Column(db.Text()) sslv3_cipher_accepted = db.Column(db.Text()) tlsv1_cipher_accepted = db.Column(db.Text()) tlsv1_1_cipher_accepted = db.Column(db.Text()) tlsv1_2_cipher_accepted = db.Column(db.Text()) sslv2_cipher_preferred = db.Column(db.String(255)) sslv3_cipher_preferred = db.Column(db.String(255)) tlsv1_cipher_preferred = db.Column(db.String(255)) tlsv1_1_cipher_preferred = db.Column(db.String(255)) tlsv1_2_cipher_preferred = db.Column(db.String(255)) hsts_available = db.Column(db.Integer()) session_renegotiation_secure = db.Column(db.Integer()) session_renegotiation_client = db.Column(db.Integer()) heartbleed = db.Column(db.Integer()) ccs_injection = db.Column(db.Integer()) sha1_cert = db.Column(db.Integer()) ocsp_stapling = db.Column(db.Integer()) ssl_forward = db.Column(db.Integer()) compression = db.Column(db.Integer()) host_id = db.Column(db.Integer, db.ForeignKey('host.id'))
class TrafficItemProvider(db.Model): __tablename__ = 'traffic_item_provider' id = db.Column(db.Integer(), primary_key=True) created = db.Column(db.DateTime()) updated = db.Column(db.DateTime()) active = db.Column(db.Integer()) name = db.Column(db.String(255)) slug = db.Column(db.String(255)) descr_short = db.Column(db.Text()) descr = db.Column(db.Text()) external_id = db.Column(db.String(255)) email = db.Column(db.String(255)) website = db.Column(db.String(255)) licence = db.Column(db.Text()) street = db.Column(db.String(255)) postalcode = db.Column(db.String(5)) city = db.Column(db.String(255)) traffic_item = db.relationship("TrafficItem", backref="TrafficItemProvider", lazy='dynamic')
class Host(db.Model): __tablename__ = 'host' id = db.Column(db.Integer(), primary_key=True) created = db.Column(db.DateTime()) updated = db.Column(db.DateTime()) active = db.Column(db.Integer()) host = db.Column(db.String(255)) type = db.Column(db.String(255)) ip = db.Column(db.Text()) reverse_hostname = db.Column(db.Text()) ssl_result = db.Column(db.Integer()) service_sites = db.relationship("ServiceSite", backref="host", lazy='dynamic') ssl_tests = db.relationship("SslTest", backref="Host", lazy='dynamic') regions = db.relationship('Region', secondary=hosts_regions, backref=db.backref('hosts', lazy='dynamic')) def __init__(self): pass def __repr__(self): return '<Host %r>' % self.host
class SharingProvider(db.Model): __tablename__ = 'sharing_provider' id = db.Column(db.Integer(), primary_key=True) created = db.Column(db.DateTime()) updated = db.Column(db.DateTime()) active = db.Column(db.Integer()) name = db.Column(db.String(255)) slug = db.Column(db.String(255)) descr_short = db.Column(db.Text()) descr = db.Column(db.Text()) email = db.Column(db.String(255)) website = db.Column(db.String(255)) licence = db.Column(db.Text()) street = db.Column(db.String(255)) postalcode = db.Column(db.String(5)) city = db.Column(db.String(255)) sharing_station = db.relationship("SharingStation", backref="SharingProvider", lazy='dynamic')
class ServiceGroup(db.Model): __tablename__ = 'service_group' id = db.Column(db.Integer(), primary_key=True) created = db.Column(db.DateTime()) updated = db.Column(db.DateTime()) active = db.Column(db.Integer()) name = db.Column(db.Text()) services = db.relationship("Service", backref="ServiceGroup", lazy='dynamic') def __init__(self): pass def __repr__(self): return '<ServiceGroup %r>' % self.name
class ServiceSite(db.Model): __tablename__ = 'service_site' id = db.Column(db.Integer(), primary_key=True) created = db.Column(db.DateTime()) updated = db.Column(db.DateTime()) active = db.Column(db.Integer()) url = db.Column(db.Text()) quality = db.Column(db.String(255)) # 'offline', 'mail', 'online' quality_show = db.Column(db.Integer()) host_id = db.Column(db.Integer, db.ForeignKey('host.id')) region_id = db.Column(db.Integer, db.ForeignKey('region.id')) service_id = db.Column(db.Integer, db.ForeignKey('service.id')) def __init__(self): pass def __repr__(self): return '<ServiceSite %r>' % self.name
class Comment(db.Model): id = db.Column(db.Integer, autoincrement=True, primary_key=True) time_added = db.Column(db.DateTime, nullable=False, default=datetime.now(tz)) time_updated = db.Column(db.DateTime, default=datetime.now(tz), onupdate=datetime.now(tz)) comment = db.Column(db.Text()) author_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) task_id = db.Column(db.Integer, db.ForeignKey('task.id'), nullable=False) material = db.relationship('Material', backref='upload', lazy=True, foreign_keys="Material.upload_id") def __repr__(self): return f"Comment('{self.time_added}', '{self.author}')"
class Tree(db.Model): __tablename__ = 'tree' id = db.Column(db.Integer(), primary_key=True) type = db.Column(db.Integer()) public = db.Column(db.Integer()) author = db.Column(db.String(255)) email = db.Column(db.String(255)) ip = db.Column(db.String(15)) hostname = db.Column(db.String(255)) address = db.Column(db.String(255)) postalcode = db.Column(db.String(255)) city = db.Column(db.String(255)) picture = db.Column(db.Integer()) descr = db.Column(db.Text()) lat = db.Column(db.Numeric(precision=10,scale=7)) lng = db.Column(db.Numeric(precision=10,scale=7)) external_id = db.Column(db.String(255)) created_at = db.Column(db.DateTime()) updated_at = db.Column(db.DateTime()) tree_type_old = db.Column(db.String(255)) tree_type_new = db.Column(db.String(255)) chop_reason = db.Column(db.String(255)) source = db.Column(db.String(255)) tree_suggest = db.relationship('TreeSuggest', backref='tree', lazy='dynamic') def __init__(self): pass def __repr__(self): return '<Tree %r>' % self.id
class ConstructionSite(db.Model): __tablename__ = 'construction_site' id = db.Column(db.Integer(), primary_key=True) title = db.Column(db.String(255)) descr = db.Column(db.Text()) # Allg. Beschreibung reason = db.Column(db.Text()) # Begründung für Baustelle type = db.Column(db.Text()) # Art der Verkehrseinschränkung constructor = db.Column(db.Text()) # Bauherr execution = db.Column(db.Text()) # Ausführendes Bauunternehmen location_descr = db.Column(db.Text()) # Ort restriction = db.Column(db.Text()) # Einschränkungen area = db.Column(db.Text()) # GeoJSON lat = db.Column(db.Numeric(precision=10, scale=7)) lon = db.Column(db.Numeric(precision=10, scale=7)) external_id = db.Column( db.String(255)) # Externe ID (innerhalb der Source einzigartig) external_url = db.Column(db.Text()) # Externe URL begin = db.Column(db.DateTime()) # Start der Baumaßnahme end = db.Column(db.DateTime()) # Ende der Baumaßnahme created_at = db.Column(db.DateTime()) updated_at = db.Column(db.DateTime()) source_id = db.Column(db.Integer()) # Quelle licence_name = db.Column(db.Text()) licence_url = db.Column(db.Text()) licence_owner = db.Column(db.Text()) def __init__(self): pass def __repr__(self): return '<ConstructionSite %r>' % self.id
class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(64), index=True, unique=True) email = db.Column(db.String(128), index=True, unique=True) password_hash = db.Column(db.String(128)) name = db.Column(db.String(64)) sex = db.Column(db.String(4)) location = db.Column(db.String(64)) about_me = db.Column(db.Text()) member_since = db.Column(db.DateTime(), default=datetime.utcnow()) last_seen = db.Column(db.DateTime(), default=datetime.utcnow()) role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) confirmed = db.Column(db.Boolean, default=False) avatar_hash = db.Column(db.String(128)) blogs = db.relationship('Blog', backref='author', lazy='dynamic') comments = db.relationship('Comment', backref='author', lazy='dynamic') categorys = db.relationship('Category', backref='author', lazy='dynamic') 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') def __repr__(self): return '<User %r>' % self.username def __init__(self, **kwargs): super(User, self).__init__(**kwargs) if self.role is None: if self.email == current_app.config['FLASKY_ADMIN']: self.role = Role.query.filter_by(permissions=0xff).first() else: self.role = Role.query.filter_by(default=True).first() if self.avatar_hash is None: # 设置头像默认地址 if self.sex == '男': self.avatar_hash = url_for('static', filename='default_avatar_m.png', _external=True) elif self.sex == '女': self.avatar_hash = url_for('static', filename='default_avatar_w.png', _external=True) # 将password属性设置为不可获取 @property def password(self): raise AttributeError('该属性不被显示') # 当改变password时自动触发,改变对应的password_hash属性,生成password的hash值 @password.setter def password(self, password): self.password_hash = generate_password_hash(password) # 验证密码是否匹配对应的hash值 def verify_password(self, password): return check_password_hash(self.password_hash, password) # 生成密令 def generate_confirmation_token(self, expiration=3600): s = Serializer(current_app.config['SECRET_KEY'], expiration) return s.dumps({'confirm': self.id}) # 解密密令 def confirm(self, token): s = Serializer(current_app.config['SECRET_KEY']) try: data = s.loads(token) except: return False if data.get('confirm') != self.id: return False self.confirmed = True db.session.add(self) return True # 每次登录刷新一次登录项 def ping(self): self.last_seen = datetime.utcnow() db.session.add(self) # 查看用户是否有权限 def can(self, permission): return self.role is not None and\ (self.role.permissions & permission) == permission # 验证用户是否管理员 def is_administrator(self): return self.can(Permission.ADMINISTER) # 生成更改邮箱密令 def change_email_token(self, email, expiration=3600): s = Serializer(current_app.config['SECRET_KEY'], expiration) return s.dumps({ 'newEmail': email, 'id': self.id }) # 验证更改邮箱密令 def change_email_confirm(self, token): s = Serializer(current_app.config['SECRET_KEY']) try: data = s.loads(token) except: return False if data.get('id') != self.id: return False self.email = data.get('newEmail') db.session.add(self) return True # 生成“忘记密码”token def forget_passwd_token(self, newpasswd, expiration=3600): s = Serializer(current_app.config['SECRET_KEY'], expiration) return s.dumps({ 'id': self.id, 'newpasswd': newpasswd }) # “忘记密码”token验证 def forget_passwd_confirm(self, token): s = Serializer(current_app.config['SECRET_KEY']) try: data = s.loads(token) except: return False if data.get('id') != self.id: return False self.password = data.get('newpasswd') db.session.add(self) return True # 修改密码 def change_password(self, old_password, new_password): if not self.verify_password(old_password): return False self.password = new_password db.session.add(self) return True # 是否关注了某用户 def is_following(self, user): return self.followed.filter_by(followed_id=user.id).first() is not None # 是否被关注 def is_followed_by(self, user): return self.followers.filter_by(follower_id=user.id).first() is not None # 关注用户 def following(self, user): if not self.is_following(user): db.session.add(Follow(followed_id=user.id, follower_id=self.id)) return True # 取消关注 def cancel_follow(self, user): if self.is_following(user): db.session.delete(Follow.query.filter_by(followed_id=user.id).first()) return True # 为所有用户添加默认权限 @staticmethod def add_default_permission(): for u in User.query.all(): if u.email != os.environ.get('FLASKY_ADMIN'): u.role = Role.query.filter_by(default=True).first() db.session.add(u) db.session.commit() # 删除用户 def delete_user(self): for fer in self.followers: db.session.delete(fer) for fed in self.followed: db.session.delete(fed) for blog in self.blogs: blog.delete_blog() for category in self.categorys: db.session.delete(category) db.session.delete(self) db.session.commit() # 添加用户(用于注册) def add_self(self): db.session.add(self) db.session.commit()
class User(db.Model): __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(255), nullable=False, unique=True) f_name = db.Column(db.String(255), nullable=False) l_name = db.Column(db.String(255)) password = db.Column(db.String(255)) about = db.Column(db.Text()) account_type = db.Column(db.String(25), nullable=False, default="local") email_confirm = db.Column(db.Boolean(), nullable=False, default=False) email_confirm_on = db.Column(db.DateTime()) subscription = db.Column(db.Boolean(), nullable=False, default=False) blocked = db.Column(db.Boolean(), nullable=False, default=False) posts = db.relationship("Post", backref="users", lazy="dynamic") roles = db.relationship("Role", secondary=roles, backref=db.backref("users", lazy="dynamic")) def __init__(self, email, f_name): default_role = Role.query.filter_by(name="user").one() self.roles.append(default_role) self.email = email self.f_name = f_name # Check user's role @cache.memoize(timeout=60) def has_role(self, role_name): for role in self.roles: if role.name == role_name: return True return False # Block standard methods of Flask Login module @property def is_authenticated(self): if isinstance(self, AnonymousUserMixin): return False else: return True @property def is_active(self): if self.blocked: return False return True @property def is_anonymous(self): if isinstance(self, AnonymousUserMixin): return True else: return False def get_id(self): return str(self.id) # Encrypt user password def set_password(self, password): self.password = bcrypt.generate_password_hash(password).decode("utf-8") # Check hash from db and from login form def check_password(self, password): return bcrypt.check_password_hash(self.password, password) def __repr__(self): return f"<User '{self.email}'>"