class Image(db.Model): __tablename__ = "images" id = db.Column( db.Integer, primary_key=True, ) user_id = db.Column(db.Integer(), db.ForeignKey('users.id')) user = db.relationship("User", back_populates="photo")
class Post(db.Model): id = db.Column(db.Integer, primary_key=True) header = db.Column(db.String(256), ) body = db.Column(db.String(512), ) user_id = db.Column(db.Integer, db.ForeignKey("user.id")) timestamp = db.Column(db.DateTime, default=datetime.utcnow) @staticmethod def add_post(user_id, header, body): post = Post(header=header, body=body) post.user_id = user_id return post @staticmethod def get_post_by_id(id, ): post = Post.query.get(id) return post def edit_post(self, header, body): self.header = header self.body = body def __repr__(self, ): return "<Post: {}>".format(self.header)
class ShortUrl(db.Model): __tablename__ = "short_urls" id = db.Column( db.Integer, primary_key=True, ) name = db.Column( db.String(length=250), unique=True, ) url = db.Column(db.String(length=250), ) user_id = db.Column(db.Integer(), db.ForeignKey('users.id')) user = db.relationship("User", back_populates="short_urls") @staticmethod def create_short_url(url, ): return uuid.uuid4().hex @staticmethod def all_user_urls(user): return ShortUrl.query.filter_by(user=user).all() def __repr__(self): return "<Short {0}>".format(self.name)
class User(UserMixin, db.Model): __tablename__ = "users" id = db.Column( db.Integer, primary_key=True, ) name = db.Column(db.String(length=256, ), ) family = db.Column(db.String(length=256, ), ) username = db.Column( db.String(length=256, ), unique=True, ) photo = db.relationship("Image", back_populates="user", uselist=False) short_urls = db.relationship( "ShortUrl", back_populates="user", ) password_hash = db.Column(db.String(length=256, ), ) role_id = db.Column( db.Integer, db.ForeignKey("roles.id"), ) role = db.relationship( "Role", back_populates="users", ) email = db.Column(db.String(length=256), unique=True) location = db.Column(db.String(length=256)) about_me = db.Column(db.Text()) last_seen = db.Column(db.DateTime, default=datetime.utcnow) is_active = db.Column(db.Boolean(), default=False) def __init__(self, *args, **kwargs): super(User, self).__init__(*args, **kwargs) if self.role is None: if self.email == current_app.config["ADMIN"]: self.role = Role.query.filter_by(name="admin").first() self.is_active = True else: self.role = Role.query.filter_by(name="user").first() @property def password(self): raise AttributeError("[-] Setting password directly is not allowed!") @password.setter def password(self, password): self.password_hash = generate_password_hash(password=password) def verify_password(self, password): return check_password_hash(self.password_hash, password) def __repr__(self): return "<User {0}>".format(self.name) def can(self, permission): if permission is not None: return self.role.has_permission(permission) return False def update_last_seen(self, ): self.last_seen = datetime.utcnow() db.session.add(self) db.session.commit() def get_photo_url(self, ): if self.photo: photo = self.photo return str(photo.id) + current_app.config.get("SAVE_EXTENSION") def generate_signature(self, exp=60000): serializer = TimedJSONWebSignatureSerializer( secret_key=current_app.config['SECRET_KEY'], salt='pd', expires_in=exp, ) return serializer.dumps({ 'code': self.id, }) def validate_signature(self, token): result = False serializer = TimedJSONWebSignatureSerializer( secret_key=current_app.config["SECRET_KEY"], salt='pd', ) try: data = serializer.loads(token) if data.get('code') == self.id: result = True except Exception as e: print(e) return result
UserMixin, ) from itsdangerous import ( TimedJSONWebSignatureSerializer, BadTimeSignature, SignatureExpired, ) from app.init import ( db, ) from app.packages.blog.models import Post followers = db.Table( "followers", db.Column( "follower", db.Integer, db.ForeignKey("user.id"), primary_key=True, ), db.Column( "followed", db.Integer, db.ForeignKey("user.id"), primary_key=True, ), ) class User(UserMixin, db.Model): id = db.Column( db.Integer, primary_key=True,