示例#1
0
class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(50), unique=True)

    def __repr__(self):
        return f"Role('{self.name}')"
示例#2
0
class Notification(db.Model):
    __tablename__ = 'notifications'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128), index=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    timestamp = db.Column(db.Float, index=True, default=time)
    payload_json = db.Column(db.Text)

    def get_data(self):
        return json.loads(str(self.payload_json))
示例#3
0
class Message(db.Model):
    __tablename__ = 'messages'
    id = db.Column(db.Integer, primary_key=True)
    sender_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    recipient_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    body = db.Column(db.String(140))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)

    def __repr__(self):
        return '<Message {}>'.format(self.body)
示例#4
0
class Address(db.Model):
    __tablename__ = 'addresses'
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    line_one = db.Column(db.String(255), nullable=False)
    line_two = db.Column(db.String(255), nullable=True)
    province = db.Column(db.String(255), nullable=False)
    district = db.Column(db.String(255), nullable=False)
    city = db.Column(db.String(255), nullable=False)
    postal_code = db.Column(db.String(255), nullable=False)

    def __repr__(self):
        return f"Role('{self.line_one}','{self.line_two}','{self.province}','{self.district}','{self.city}','{self.postal_code}')"
示例#5
0
class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    # details of the user
    title = db.Column(db.String(255), nullable=False)
    fname = db.Column(db.String(255), nullable=False)
    lname = db.Column(db.String(255), nullable=False)
    email = db.Column(db.String(255, collation='NOCASE'),
                      nullable=False,
                      unique=True)
    mobile_number = db.Column(db.String(12), nullable=False)
    password = db.Column(db.String(255), nullable=False, server_default='')
    # profile image
    image_file = db.Column(db.String(20),
                           nullable=False,
                           default='default.jpg')
    # for displaying last seen
    last_seen = db.Column(db.DateTime, default=datetime.utcnow)
    # to find the user roles
    roles = db.relationship('Role', secondary='user_roles')
    # user type ready for inheritance
    user_type = db.Column(db.String(32), nullable=False, server_default='user')
    # for messaging funciton
    messages_sent = db.relationship('Message',
                                    foreign_keys='Message.sender_id',
                                    backref='author',
                                    lazy='dynamic')
    messages_received = db.relationship('Message',
                                        foreign_keys='Message.recipient_id',
                                        backref='recipient',
                                        lazy='dynamic')
    last_message_read_time = db.Column(db.DateTime)
    # showing notifications badge
    notifications = db.relationship('Notification',
                                    backref='user',
                                    lazy='dynamic')
    # email confirmation
    confirmed = db.Column(db.Boolean, nullable=False, default=False)
    confirmed_on = db.Column(db.DateTime, nullable=True)

    # contact information
    # for home user
    home_address = db.relationship('Address',
                                   foreign_keys='Address.user_id',
                                   lazy='dynamic')
    home_number = db.Column(db.String(12))
    # for military
    designation = db.Column(db.String(255))
    office_address = db.relationship('Address',
                                     foreign_keys='Address.user_id',
                                     lazy='dynamic')
    office_number = db.Column(db.String(12))
    # for camps
    total_number = db.Column(db.String(255))
    occupied_number = db.Column(db.String(255))
    camp_name = db.Column(db.String(255))
    camp_number = db.Column(db.String(12))
    camp_address = db.relationship('Address',
                                   foreign_keys='Address.user_id',
                                   backref='user_address',
                                   lazy='dynamic')
    camp_needs = db.Column(db.String(255))

    # generatin reset token for password
    def get_reset_token(self, expires_sec=1800):
        s = Serializer(current_app.config['SECRET_KEY'], expires_sec)
        return s.dumps({'user_id': self.id}).decode('utf-8')

    def generate_confirmation_token(self):
        serializer = URLSafeTimedSerializer(current_app.config['SECRET_KEY'])
        return serializer.dumps(
            self.email, salt=current_app.config['SECURITY_PASSWORD_SALT'])

    # messages
    def new_messages(self):
        last_read_time = self.last_message_read_time or datetime(1900, 1, 1)
        return Message.query.filter_by(recipient=self).filter(
            Message.timestamp > last_read_time).count()

    # notificaton

    def add_notification(self, name, data):
        self.notifications.filter_by(name=name).delete()
        n = Notification(name=name, payload_json=json.dumps(data), user=self)
        db.session.add(n)
        return n

    # verifying   password reset token
    @staticmethod
    def verify_reset_token(token):
        s = Serializer(current_app.config['SECRET_KEY'])
        try:
            user_id = s.loads(token)['user_id']
        except:
            return None
        return User.query.get(user_id)

    def __repr__(self):
        return f"User('{self.fname}','{self.lname}', '{self.email}', '{self.image_file}','{self.confirmed}','{self.confirmed_on}')"