models.py (3529B)
1 from datetime import datetime, timedelta 2 from email.policy import default 3 from typing import Optional 4 from flask_login import UserMixin 5 6 from .app import db, login_manager 7 8 9 class User(db.Model, UserMixin): 10 id: int = db.Column(db.Integer, primary_key=True) 11 admin: bool = db.Column(db.Boolean, nullable=False, default=False) 12 email: str = db.Column(db.String(120), unique=True, nullable=False) 13 name: str = db.Column(db.String(20), unique=True, nullable=False) 14 password: str = db.Column(db.String(60), nullable=False) 15 image_file: str = db.Column(db.String(20), nullable=False, 16 default='default.jpg') 17 phone: str = db.Column(db.Text, nullable=False) 18 address: Optional[str] = db.Column(db.Text) 19 20 contact: Optional[int] = db.Column( 21 db.Integer, db.ForeignKey('user.id')) # set if user 22 23 def contact_class(self): 24 return User.query.filter_by(id=self.contact).first() 25 26 27 class Trap(db.Model): 28 id: int = db.Column(db.Integer, primary_key=True) 29 token: str = db.Column(db.String(16), unique=True, nullable=False) 30 owner: Optional[int] = db.Column(db.Integer, db.ForeignKey('user.id')) 31 owned_date: Optional[datetime] = db.Column(db.DateTime) 32 name: str = db.Column(db.Text, nullable=False, default='n/a') 33 34 last_status: datetime = db.Column(db.DateTime, nullable=False) 35 caught: bool = db.Column(db.Boolean, nullable=False, default=False) 36 battery: int = db.Column(db.Integer, nullable=False, default=0) 37 charging: bool = db.Column(db.Boolean, nullable=False, default=False) 38 temperature: int = db.Column(db.Integer, nullable=False, default=0) 39 location_search: bool = db.Column(db.Boolean, nullable=False, default=True) 40 location_searching: bool = db.Column( 41 db.Boolean, nullable=False, default=True) 42 location_acc: float = db.Column(db.Float, nullable=False, default=0) 43 location_lat: Optional[float] = db.Column(db.Float) 44 location_lon: Optional[float] = db.Column(db.Float) 45 location_satellites: Optional[int] = db.Column(db.Integer) 46 47 def owner_class(self) -> Optional[User]: 48 return User.query.get(self.owner) 49 50 def offline(self): 51 return datetime.now() - self.last_status > timedelta(minutes=10) 52 53 def to_json(self): 54 owner = self.owner_class() 55 owner_name = owner.name if owner else 'n/a' 56 57 return dict( 58 id=self.id, 59 name=self.name, 60 offline=self.offline(), 61 locationSearch=self.location_search, 62 locationSearching=self.location_searching, 63 latitude=self.location_lat, 64 longitude=self.location_lon, 65 accuracy=round(self.location_acc, 1), 66 satellites=self.location_satellites, 67 activated=self.caught, 68 owner=owner_name, 69 battery=self.battery, 70 charging=self.charging, 71 temperature=self.temperature, 72 lastStatus=self.last_status.strftime('%d-%m-%y %H:%M'), 73 ownedDate=self.owned_date.strftime( 74 '%d-%m-%y %H:%M') if self.owned_date else '-' 75 ) 76 77 78 class Statistic(db.Model): 79 id: int = db.Column(db.Integer, primary_key=True) 80 user: int = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) 81 trap: int = db.Column(db.Integer, db.ForeignKey('trap.id'), nullable=False) 82 date: datetime = db.Column(db.DateTime, nullable=False) 83 84 85 @login_manager.user_loader 86 def load_user(user_id: int) -> User: 87 return User.query.get(user_id)