コード例 #1
0
class Donation(db.Model):

    __tablename__ = "donations"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    hospital_id = db.Column(db.Integer,
                            db.ForeignKey('hospitals.id'),
                            nullable=False)
    donor_id = db.Column(db.Integer,
                         db.ForeignKey('donors.id'),
                         nullable=False)

    volume_of_blood = db.Column(db.Integer)
    onset_time = db.Column(db.DateTime())
    termination_time = db.Column(db.DateTime())
    torfru = db.Column(db.DateTime())

    created_at = db.Column(db.DateTime, default=db.func.now())
    updated_at = db.Column(db.DateTime, default=db.func.now())

    def _asdict(self):
        return {
            c.key: getattr(self, c.key)
            for c in db.inspect(self).mapper.column_attrs
        }

    @hybrid_method
    def update_donor_dolbd(self):
        if self.donor:
            self.donor.update_dolbd(self.created_at)
コード例 #2
0
class Deferral(db.Model):

    __tablename__ = "deferrals"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    donor_id = db.Column(db.Integer,
                         db.ForeignKey('donors.id'),
                         nullable=False)
    reason = db.Column(db.String(100))
    ndefbd = db.Column(db.DateTime())
    created_at = db.Column(db.DateTime, default=db.func.now())
    updated_at = db.Column(db.DateTime, default=db.func.now())

    def _asdict(self):
        return {
            c.key: getattr(self, c.key)
            for c in inspect(self).mapper.column_attrs
        }

    @hybrid_method
    def update_donor_ndefbd(self):
        if self.donor:
            print("UPDATE MASTER")
            self.donor.update_ndefbd(self.ndefbd)
コード例 #3
0
class User(db.Model):
    """
    User Model for storing user related details
    """
    __tablename__ = "user"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(), unique=True, nullable=False)
    password = db.Column(db.String(), nullable=False)
    bday = db.Column(db.DateTime(), nullable=False)
    fullname = db.Column(db.String(), nullable=False)
    job = db.Column(db.String(), nullable=True)
    country = db.Column(db.String(), nullable=True)
    registered_on = db.Column(db.DateTime, nullable=False)
    is_confirmed = db.Column(db.Boolean, nullable=True, default=False)
    device_list = db.relationship('DeviceList', backref='user', lazy='dynamic')

    def __init__(self,
                 email,
                 password,
                 bday,
                 fullname,
                 job=None,
                 country=None):
        self.email = email
        self.password = bcrypt.generate_password_hash(
            password, app.config.get('BCRYPT_LOG_ROUNDS')).decode()
        self.registered_on = datetime.datetime.now()
        self.bday = bday
        self.fullname = fullname
        self.country = country
        self.job = job

    @staticmethod
    def get_user_by_email(user_email):
        return User.query.filter_by(email=user_email).first()

    @staticmethod
    def get_user_by_id(user_id):
        return User.query.filter_by(id=user_id).first()

    @staticmethod
    def encode_auth_token(user_id,
                          modulus=None,
                          exponent=None,
                          main_key=None,
                          hasRoot=False):
        """
        Generates the Auth Token
        :param user_id key:
        :return: string
        """
        try:
            if main_key:
                hasRoot = True
            payload = {
                'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1),
                'iat': datetime.datetime.utcnow(),
                'sub': user_id,
                'modulus': modulus if modulus else "No modulus is available",
                'exponent':
                exponent if exponent else "No exponent is available",
                'key': main_key if main_key else "No main key is available",
                'hasRoot': hasRoot
            }
            return jwt.encode(
                payload,
                app.config.get('SECRET_KEY'),
            )
        except Exception as e:
            return e

    @staticmethod
    def decode_public_key(auth_token):
        try:
            payload = jwt.decode(auth_token, app.config.get('SECRET_KEY'))
            return payload['modulus'], payload['exponent']
        except:
            return 'Invalid auth token'

    @staticmethod
    def decode_auth_token_key(auth_token):
        try:
            payload = jwt.decode(auth_token, app.config.get('SECRET_KEY'))
            is_blacklisted_token = BlacklistToken.check_blacklist(auth_token)
            if is_blacklisted_token:
                return 'Token is blacklisted. Please login again.'
            else:
                key = [payload['modulus'], payload['exponent']]
                return payload['sub'], key
        except jwt.ExpiredSignatureError:
            return 'Signature expired. Please login again.'
        except jwt.InvalidTokenError:
            return 'Invalid token. Please login again.'

    @staticmethod
    def decode_auth_token(auth_token):
        """
        Decodes the authentication token
        :param auth_token:
        :return: integer|string
        """
        try:
            payload = jwt.decode(auth_token, app.config.get('SECRET_KEY'))
            is_blacklisted_token = BlacklistToken.check_blacklist(auth_token)
            if is_blacklisted_token:
                return 'Token is blacklisted. Please login again.'
            else:
                return payload['sub']
        except jwt.ExpiredSignatureError:
            return 'Signature expired. Please login again.'
        except jwt.InvalidTokenError:
            return 'Invalid token. Please login again.'

    @staticmethod
    def decode_auth_key(auth_token):
        try:
            payload = jwt.decode(auth_token, app.config.get('SECRET_KEY'))
            return payload['modulus'], payload['exponent']
        except jwt.ExpiredSignatureError:
            return 'Signature expired. Please login again.'
        except jwt.InvalidTokenError:
            return 'Invalid token. Please login again.'
コード例 #4
0
class Subscriber(db.Model):

    __tablename__ = "subscribers"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    sn = db.Column(db.String, unique=True, nullable=False)
    email = db.Column(db.String(100), unique=True, nullable=False)
    transfusions = db.relationship('Transfusion',
                                   backref='subscriber',
                                   lazy=True)
    hospital_id = db.Column(db.Integer,
                            db.ForeignKey('hospitals.id'),
                            nullable=False)
    medical_conditions = db.Column(db.String(100))
    current_medications = db.Column(db.String(100))
    first_name = db.Column(db.String(100))
    middle_name = db.Column(db.String(100))
    last_name = db.Column(db.String(100))
    home_address = db.Column(db.String(100))
    city = db.Column(db.String(100))
    region = db.Column(db.String(100))
    phone1 = db.Column(db.String(100))
    phone2 = db.Column(db.String(100))
    cni = db.Column(db.String(100))
    cni_doi = db.Column(db.DateTime())
    cni_poi = db.Column(db.String())
    dob = db.Column(db.DateTime())
    pob = db.Column(db.String(100))
    gender = db.Column(db.String(100))
    blood_group = db.Column(db.String(100))
    rhesus_factor = db.Column(db.String(100))
    allergies = db.Column(db.String(100))
    active = db.Column(db.Boolean(), default=True)
    created_at = db.Column(db.DateTime, default=db.func.now())
    updated_at = db.Column(db.DateTime, default=db.func.now())

    def __init__(self):
        self.active = True

    # def __init__(self, email, first_name, middle_name, last_name, home_address,
    #             city, phone1, phone2, cni, cni_doi, cni_poi, dob,
    #             pob, gender, blood_group, active=True):
    #     self.email = email
    #     self.first_name = first_name
    #     self.middle_name = middle_name
    #     self.last_name = last_name
    #     self.home_address = home_address
    #     self.city = city
    #     self.phone1 = phone1
    #     self.phone2 = phone2
    #     self.cni = cni
    #     self.cni_doi = cni_doi
    #     self.cni_poi = cni_poi
    #     self.dob = dob
    #     self.pob = pob
    #     self.gender = gender
    #     self.blood_group = blood_group
    #     self.active = active

    def generate_sn(self):
        self.sn = "DN" + self.first_name[0] + self.middle_name[0] + str(
            random.randint(10000, 99999))

    def _asdict(self):
        return {
            c.key: getattr(self, c.key)
            for c in inspect(self).mapper.column_attrs
        }

    def _return_data(self):
        from project.server.models.Donor import Donor
        sub_arr = self._asdict()
        sub_arr['transfusions'] = [
            trans._asdict() for trans in self.transfusions
        ]
        for j in range(len(self.transfusions)):
            sub_arr['transfusions'][j]['hospital'] = self.transfusions[
                j].hospital._asdict()
        match = Donor().query.filter(
            Donor.blood_group.in_(DONOR_MATCH[sub_arr['blood_group']])).all()
        sub_arr['match'] = [bg._asdict() for bg in match]
        sub_arr['done_at'] = self.done_at._asdict()

        return sub_arr
コード例 #5
0
class Donor(db.Model):

    __tablename__ = "donors"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    sn = db.Column(db.String, unique=True, nullable=False)
    email = db.Column(db.String(100), unique=True, nullable=False)
    donations = db.relationship('Donation', backref='donor', lazy=False)
    deferrals = db.relationship('Deferral', backref='donor', lazy=False)
    hospital_id = db.Column(db.Integer,
                            db.ForeignKey('hospitals.id'),
                            nullable=False)
    medical_conditions = db.Column(db.String(100))
    current_medications = db.Column(db.String(100))
    first_name = db.Column(db.String(100))
    middle_name = db.Column(db.String(100))
    last_name = db.Column(db.String(100))
    home_address = db.Column(db.String(100))
    city = db.Column(db.String(100))
    region = db.Column(db.String(100))
    phone1 = db.Column(db.String(100))
    phone2 = db.Column(db.String(100))
    cni = db.Column(db.String(100))
    cni_doi = db.Column(db.DateTime())
    cni_poi = db.Column(db.String())
    dob = db.Column(db.DateTime())
    pob = db.Column(db.String(100))
    gender = db.Column(db.String(100))
    blood_group = db.Column(db.String(100))
    allergies = db.Column(db.String(100))
    rhesus_factor = db.Column(db.String(100))
    dolbd = db.Column(db.DateTime())
    ndefbd = db.Column(db.DateTime())
    status = db.Column(db.String(100))

    referrer_id = db.Column(db.Integer, db.ForeignKey('donors.id'))
    referrees = db.relationship('Donor',
                                backref=(db.backref('referrer',
                                                    remote_side=[id])))
    active = db.Column(db.Boolean(), default=True)
    created_at = db.Column(db.DateTime, default=db.func.now())
    updated_at = db.Column(db.DateTime, default=db.func.now())

    def __init__(self):
        """intitialization here"""

    def generate_sn(self):
        self.sn = "DN" + self.first_name[0] + self.middle_name[0] + str(
            random.randint(10000, 99999))

    def update_active(self):
        self.active = True if (self.ndefbd -
                               datetime.datetime.now()).days <= 0 else False

    def update_status(self):
        if self.referrees and self.donations:
            if len(self.referrees) < 2 and len(self.donations) < 2:
                self.status = "Bronze"
            elif len(self.referrees) < 6 and len(self.donations) < 3:
                self.status = "Silver"
            elif len(self.referrees) >= 6 and len(self.donations) >= 3:
                self.status = "Gold"
        else:
            self.status = "Bronze"

        db.session.add(self)
        db.session.commit()

    def update_dolbd(self, value):
        self.dolbd = value
        self.update_ndefbd()
        self.update_status()

        db.session.add(self)
        db.session.commit()

    def update_ndefbd(self, ndefbd_t=""):
        if ndefbd_t == "":
            self.ndefbd = self.dolbd + datetime.timedelta(days=90)
            self.update_active()
        else:
            self.ndefbd = ndefbd_t
            self.update_active()

        db.session.add(self)
        db.session.commit()

    def _asdict(self):
        return {
            c.key: getattr(self, c.key)
            for c in inspect(self).mapper.column_attrs
        }

    def _return_data(self):
        from project.server.models.Subscriber import Subscriber
        donor_data = self._asdict()
        donor_data['donations'] = [don._asdict() for don in self.donations]
        for j in range(len(self.donations)):
            donor_data['donations'][j]['hospital'] = self.donations[
                j].hospital._asdict()
        match = Subscriber().query.filter(
            Subscriber.blood_group.in_(
                RECEIVE_MATCH[donor_data['blood_group']])).all()
        donor_data['match'] = [bg._asdict() for bg in match]
        donor_data['referrer'] = self.referrer._asdict(
        ) if self.referrer else None
        donor_data['deferrals'] = [
            deferral._asdict() for deferral in self.deferrals
        ]
        donor_data['referrees'] = [ref._asdict() for ref in self.referrees]
        donor_data['done_at'] = self.done_at._asdict()

        return donor_data