from flask_sqlalchemy import SQLAlchemy from flask_login import UserMixin from werkzeug.security import generate_password_hash, check_password_hash from datetime import datetime db = SQLAlchemy() # Create the extension object class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) updated_at = db.Column(db.TIMESTAMP, default=datetime.now(), onupdate=datetime.now(), nullable=False) name = db.Column(db.String(40), unique=True, nullable=False) password_hash = db.Column(db.String(256)) is_admin = db.Column(db.Boolean, default=False) is_approved = db.Column(db.Boolean, default=False) is_private = db.Column(db.Boolean, default=False) is_guest = db.Column(db.Boolean, default=False) def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) def my_owned_lists(self, with_inactive=False): if with_inactive: return ListOfItems.query.filter_by(owner_user_id=self.id).all() return ListOfItems.query.filter_by(owner_user_id=self.id, is_active=True).all() def all_my_lists(self): result = self.my_owned_lists() for s in Shared.query.filter_by(user_id=self.id).all(): l = ListOfItems.query.filter_by(id=s.listofitem_id, is_active=True).first() if l: result.append(l) return result def shares_in_list(self, listofitem_id): shared = Shared.query.filter_by(user_id=self.id, listofitem_id=listofitem_id).first() return True if shared else False class ListOfItems(db.Model): id = db.Column(db.Integer, primary_key=True) updated_at = db.Column(db.TIMESTAMP, default=datetime.now(), onupdate=datetime.now(), nullable=False) owner_user_id = db.Column(db.Integer, nullable=False) name = db.Column(db.String(40), unique=True, nullable=False) is_active = db.Column(db.Boolean, default=False) def items_left(self): return len(Item.query.filter_by(listofitems_id=self.id, is_checked=False, is_suggestion=False).all()) def items_total(self): return len(Item.query.filter_by(listofitems_id=self.id, is_suggestion=False).all()) class Item(db.Model): id = db.Column(db.Integer, primary_key=True) updated_at = db.Column(db.TIMESTAMP, default=datetime.now(), onupdate=datetime.now(), nullable=False) listofitems_id = db.Column(db.Integer, nullable=False) label = db.Column(db.String(40), nullable=False) quantity = db.Column(db.Integer, default=0) unit = db.Column(db.String(10)) label_alt1 = db.Column(db.String(40)) label_alt2 = db.Column(db.String(40)) is_checked = db.Column(db.Boolean, default=False) is_suggestion = db.Column(db.Boolean, default=False) category = db.Column(db.String(20)) class Shared(db.Model): user_id = db.Column(db.Integer, primary_key=True) listofitem_id = db.Column(db.Integer, primary_key=True)