class ItemModel(db.Model): __tablename__ = 'items' id = db.Column(db.Integer, primary_key=True) vegeName = db.Column(db.String(100)) vegeQuantity = db.Column(db.Integer) vegePrice = db.Column(db.Integer) FarmerID = db.Column(db.Integer, db.ForeignKey('farmers.id'))
class DepartmentsModel(db.Model): __tablename__ = "Departments" _id = db.Column(db.Integer, primary_key=True) code = db.Column(db.String, nullable=False) name = db.Column(db.String, nullable=False) def json(self) -> Dict: return {"_id": self._id, "code": self.code, "name": self.name}
class CourseInPlanModel(db.Model): __tablename__ = "CoursesInPlans" plan_id = db.Column(db.Integer, db.ForeignKey("Plans._id"), primary_key=True) course_id = db.Column(db.Integer, db.ForeignKey("Courses._id"), primary_key=True) def json(self) -> Dict: return {"plan_id": self.plan_id, "course_id": self.course_id}
class Series(db.Model): __tablename__ = 'series' id = db.Column(db.Integer, primary_key=True) work_item_id = db.Column(db.Integer, db.ForeignKey('work_items.id')) uid = db.Column(db.String, index=True) # Series Instance UID plane = db.Column(db.String, db.Enum('axial', 'sagittal', 'coronal')) created_on = db.Column(db.DateTime, server_default=db.func.now(), index=True) updated_on = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now()) massive_bleeding = db.Column(db.Boolean, default=False) findings = db.relationship('Finding', order_by='Finding.order') def __repr__(self): return "<Series(uid='{}', plane='{}', massive_bleeding={})>".format( self.uid, self.plane, self.massive_bleeding) def to_json_dict(self): return { 'uid': self.uid, 'plane': self.plane, 'massiveBleeding': self.massive_bleeding }
class Book(db.Model): __tablename__ = 'books' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(50)) year = db.Column(db.Integer) author_id = db.Column(db.Integer, db.ForeignKey('authors.id'), nullable=False) def __init__(self, title, year, author_id=None): self.title = title self.year = year self.author_id = author_id def create(self): db.session.add(self) db.session.commit() return self
class RouteModel(db.Model): __tablename__ = 'routes' id = db.Column(db.Integer, primary_key=True) date = db.Column(db.String) finish = db.Column(db.Integer) cost = db.Column(db.Float) totalProfit = db.Column(db.Float) jsonData = db.Column(db.JSON) FarmerID = db.Column(db.Integer)
class Authors(db.Model): __tablename__ = 'authors' id = db.Column(db.Integer, primary_key=True, autoincrement=True) first_name = db.Column(db.String(20)) last_name = db.Column(db.String(20)) created = db.Column(db.DateTime, server_default=db.func.now()) books = db.relationship('Book', backref='Authors', cascade="all, delete-orphan") def __init__(self, first_name, last_name, books=[]): self.first_name = first_name self.last_name = last_name self.books = books def create(self): db.session.add(self) db.session.commit() return self
class FarmerModel(db.Model): __tablename__ = 'farmers' id = db.Column(db.Integer, primary_key = True) username = db.Column(db.String(32), index = True) name = db.Column(db.String(32)) password_hash = db.Column(db.String(64)) email = db.Column(db.String(50)) address = db.Column(db.String(100)) cellphone = db.Column(db.String(15)) latitude = db.Column(db.String(50)) longitude = db.Column(db.String(50)) def hash_password(self, password): self.password_hash = pwd_context.encrypt(password) def verify_password(self, password): return pwd_context.verify(password, self.password_hash)
class DriverModel(db.Model): __tablename__ = 'drivers' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(32), index=True) licensePlate = db.Column(db.String(15)) carCapacity = db.Column(db.Float) dynamicAddress = db.Column(db.String(100)) dynamicLocation = db.Column(db.String(100))
class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(120), unique=True, nullable=False) password = db.Column(db.String(120), nullable=False) def create(self): db.session.add(self) db.session.commit() return self @classmethod def find_by_username(cls, username): return cls.query.filter_by(username=username).first() @staticmethod def generate_hash(password): return sha256.hash(password) @staticmethod def verify_hash(password, hash): return sha256.verify(password, hash)
class DynamicData(db.Model): __tablename__ = 'dynamic_data' id = db.Column(db.Integer, primary_key = True) static_data_id = db.Column(db.Integer, db.ForeignKey('static_data.id'), nullable=False) static_data = db.relationship('StaticData', back_populates='snap_shots') time_stamp = db.Column(db.String(255)) upload_speed = db.Column(db.Integer) download_speed = db.Column(db.Integer) active_connection = db.Column(db.Boolean)
class StaticData(db.Model): __tablename__ = 'static_data' id = db.Column(db.Integer, primary_key = True) host_name = db.Column(db.String(255)) device_type = db.Column(db.String(255)) operating_system = db.Column(db.String(255)) mac_address = db.Column(db.String(255), unique=True) ip_address = db.Column(db.String(255)) snap_shots = db.relationship('DynamicData', back_populates='static_data')
class Device(db.Model): __tablename__ = 'devices' id = db.Column(db.Integer, primary_key=True) host_name = db.Column(db.String(255)) device_type = db.Column(db.String(255)) operating_system = db.Column(db.String(255)) mac_address = db.Column(db.String(255), unique=True) ip_address = db.Column(db.String(255)) upload_speed = db.Column(db.Integer) download_speed = db.Column(db.Integer) active_connection = db.Column(db.Boolean) def __init__(self, host_name, device_type, operating_system, mac_address, ip_address, upload_speed, download_speed, active_connection): self.host_name = host_name self.device_type = device_type self.operating_system = operating_system self.mac_address = mac_address self.ip_address = ip_address self.upload_speed = upload_speed self.download_speed = download_speed self.active_connection = active_connection def update(self): self.update_active_connection() self.update_upload_download() db.session.commit() def update_active_connection(self): if random.randint(1, 5) > 4: self.active_connection = not self.active_connection def update_upload_download(self): if self.active_connection: self.upload_speed = random.randint(0, 12) self.download_speed = random.randint(0, 70) else: self.upload_speed = 0 self.download_speed = 0
class UserModel(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(32), index=True) name = db.Column(db.String(32)) password_hash = db.Column(db.String(64)) email = db.Column(db.String(50)) address = db.Column(db.String(100)) cellphone = db.Column(db.String(15)) permission = db.Column(db.Integer, default=0) order = db.relationship('OrderModel') def hash_password(self, password): self.password_hash = pwd_context.encrypt(password) def verify_password(self, password): return pwd_context.verify(password, self.password_hash)
class OrderModel(db.Model): __tablename__ = 'orders' id = db.Column(db.Integer, primary_key=True) arrivalTime = db.Column(db.String(100)) orderDate = db.Column(db.String(100)) status = db.Column(db.Integer) address = db.Column(db.String(100)) sequence = db.Column(db.Integer) foodName = db.Column(db.String(100)) foodQuantity = db.Column(db.Float) foodPrice = db.Column(db.Float) profit = db.Column(db.Float) UserID = db.Column(db.Integer, db.ForeignKey('users.id')) FarmerID = db.Column(db.Integer, db.ForeignKey('farmers.id')) RouteID = db.Column(db.Integer, db.ForeignKey('routes.id'))
class OrderModel(db.Model): __tablename__ = 'orders' id = db.Column(db.Integer, primary_key=True) arrivalTime = db.Column(db.String(100)) status = db.Column(db.Integer) objectID = db.Column(db.Integer) weight = db.Column(db.Float) profit = db.Column(db.Float) location = db.Column(db.String(100)) address = db.Column(db.String(100)) sequence = db.Column(db.Integer) UserID = db.Column(db.Integer, db.ForeignKey('users.id')) RouteID = db.Column(db.Integer, db.ForeignKey('routes.id'))
class User(db.Model, UserMixin): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) name = db.Column(db.String(80)) password = db.Column(Password) role = db.Column(db.String(20), server_default='user', nullable=False) email = db.Column(db.String(120)) load_finding_files = db.Column(Boolean, server_default='1', nullable=False) created_on = db.Column(db.DateTime) last_login_on = db.Column(db.DateTime) last_login_from = db.Column(db.String(80)) worklist = db.relationship('WorkItem', order_by='WorkItem.id') def __init__(self, username, name, password, created_on, email, role='user', load_finding_files=True): self.username = username self.name = name self.password = password self.role = role self.email = email self.created_on = created_on self.load_finding_files = load_finding_files def __repr__(self): return "<User(username='******', name='%s')>" % (self.username, self.name) @validates('password') def _validate_password(self, key, password): return getattr(type(self), key).type.validator(password) @property def is_admin(self): return self.role == 'admin' def to_json_dict(self): last_login = "******" if self.last_login_on is None else self.last_login_on.strftime( '%Y-%m-%d') created_on = "Not Available" if self.created_on is None else self.created_on.strftime( '%Y-%m-%d') last_login_from = "Not Available" if self.last_login_from is None else self.last_login_from email = "" if self.email is None else self.email load_finding_files = self.load_finding_files return { 'id': self.id, 'username': self.username, 'name': self.name, 'role': self.role, 'created_on': created_on, 'last_login_on': last_login, 'email': email, 'last_login_from': last_login_from, 'load_finding_files': load_finding_files }
class CourseModel(db.Model): __tablename__ = "Courses" _id = db.Column(db.Integer, primary_key=True) term = db.Column(db.String, nullable=False) code = db.Column(db.String, nullable=False) title = db.Column(db.String, nullable=False) section_type = db.Column(db.String, nullable=False) section_name = db.Column(db.String, nullable=False) days = db.Column(db.String) start_time = db.Column(db.String) end_time = db.Column(db.String) instructor = db.Column(db.String, nullable=False) building = db.Column(db.String, nullable=False) restrictions = db.Column(db.String) def json(self) -> Dict: return { "_id": self._id, "term": self.term, "code": self.code, "title": self.title, "section_type": self.section_type, "section_name": self.section_name, "days": self.days, "start_time": self.start_time, "end_time": self.end_time, "instructor": self.instructor, "building": self.building, "restrictions": self.restrictions }
class WorkItem(db.Model): __tablename__ = 'work_items' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) uid = db.Column(db.String) # Study Instance UID accession_number = db.Column(db.String, index=True) patient_name = db.Column(db.String) patient_id = db.Column(db.String) study_date = db.Column(db.String) study_time = db.Column(db.String) body_part = db.Column(db.String, db.Enum(*DEFAULT_WINDOW_DEFS.keys())) status = db.Column(db.String) finalized_as = db.Column(db.String, db.Enum('positive', 'negative')) created_on = db.Column(db.DateTime, server_default=db.func.now()) updated_on = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now()) comment = db.Column(db.String) massive_bleeding = db.Column(db.Boolean, default=False) favorite = db.Column(db.Boolean, default=False) analyzed_by_aidoc = db.Column(db.Boolean, default=False) location = db.Column(db.String, db.Enum(*patientLocations)) order_by = db.Column(db.Integer) series = db.relationship('Series', order_by='Series.created_on') findings = db.relationship('Finding', order_by='Finding.order') db.UniqueConstraint('user_id', 'uid', name='user_work_item_uq') def __init__(self, user_id, uid, accession_number, patient_name, patient_id, study_date, study_time, body_part, status='pending', analyzed_by_aidoc=True): self.user_id = user_id self.uid = uid self.accession_number = accession_number self.patient_name = patient_name self.patient_id = patient_id self.study_date = study_date self.study_time = study_time self.body_part = body_part self.status = status self.analyzed_by_aidoc = analyzed_by_aidoc def __repr__(self): return "<WorkItem(uid='%s', accession_number='%s', patient_name='%s', body_part='%s', status='%s')>" %\ (self.uid, self.accession_number, self.patient_name, self.body_part, self.status) def get_patient_location(self): if self.location is not None: return self.location else: def generate_patient_location(): if self.patient_name: return patientLocations[int(string2hash(self.patient_name)) % len(patientLocations)] else: return patientLocations[0] return generate_patient_location() def to_json_dict(self): dt = self.format_study_datetime() # calculate AI Findings column ai_findings = self.calc_ai_findings() return { 'uid': self.uid, 'accessionNumber': self.accession_number, 'patientName': self.patient_name, 'patientId': self.patient_id if self.patient_id else '-', 'patientLocation': self.get_patient_location(), 'studyTime': dt, 'bodyPart': self.body_part, 'status': self.status, 'massiveBleeding': self.massive_bleeding, 'favorite': self.favorite, 'finalized_as': self.finalized_as if self.finalized_as else '', 'analyzed_by_aidoc': True if self.analyzed_by_aidoc is None else self.analyzed_by_aidoc, 'ai_findings': ai_findings, 'order_by': self.order_by } def calc_ai_findings(self): ai_findings_set = set() for f in self.findings: ai_findings_set.add(f.label) if len(ai_findings_set) < 3: return ', '.join(ai_findings_set) else: return 'Multi-Trauma' def format_study_datetime(self): if self.study_date and self.study_time: try: # handle milliseconds study_time = self.study_time[0:6] dt = datetime.strptime(self.study_date + study_time, '%Y%m%d%H%M%S') dt = dt.strftime(current_app.config.get('DATETIME_FORMAT')) except Exception: dt = '-' else: dt = '-' return dt
class Finding(db.Model): __tablename__ = 'findings' id = db.Column(db.Integer, primary_key=True) work_item_id = db.Column(db.Integer, db.ForeignKey('work_items.id')) series_id = db.Column(db.Integer, db.ForeignKey('series.id')) finding_uid = db.Column(db.Integer) status = db.Column(db.String) label = db.Column(db.String(50)) key_slice = db.Column(db.Integer) visualization_type = db.Column(db.String) locations = db.Column(db.String) original_locations = db.Column(db.String) order = db.Column(db.Integer) comment = db.Column(db.String) input_source_index = db.Column(Integer, server_default='0', nullable=False) contour = db.Column(db.String, server_default=None) def __init__(self, work_item_id, series_id, finding_uid, status, label, key_slice, visualization_type, locations, order, original_locations=None, comment=None, input_source_index=0, contour=None): self.work_item_id = work_item_id self.series_id = series_id self.finding_uid = finding_uid self.status = status self.label = label self.key_slice = key_slice self.visualization_type = visualization_type self.locations = locations self.order = order self.original_locations = original_locations self.comment = comment self.input_source_index = input_source_index self.contour = contour def __repr__(self): return "<Finding(finding_uid='{}', status='{}', key_slice='{}')>".format( self.finding_uid, self.status, self.key_slice) def to_json_dict(self): return { 'id': self.id, 'series_id': self.series_id, 'finding_uid': self.finding_uid, 'label': self.label, 'status': self.status, 'key_slice': self.key_slice, 'visualization_type': self.visualization_type, 'locations': json.loads(self.locations), 'original_locations': None if self.original_locations is None else json.loads( self.original_locations), 'comment': self.comment, 'order': self.order, 'input_source_index': self.input_source_index, 'contour': None if self.contour is None else json.loads(self.contour) }