Esempio n. 1
0
class MaterialForecast(db.Model):
    __tablename__ = 'material_forecasts'
    id = db.Column(db.Integer, primary_key=True)
    inventory_id = db.Column(db.Integer,
                             db.ForeignKey('inventories.id'),
                             index=True)
    material_id = db.Column(db.Integer,
                            db.ForeignKey('materials.id'),
                            nullable=True,
                            index=True)
    type = db.Column(db.SmallInteger, nullable=False)
    # 0 = diet plan
    # 1 = consumption plan (periodic)
    # 2 = other plan (one time demand)
    plan_date_start = db.Column(db.DateTime(timezone=True), nullable=True)
    plan_date_end = db.Column(db.DateTime(timezone=True), nullable=True)
    quantity = db.Column(db.Float, nullable=True)
    quantity_per_day = db.Column(db.Float, nullable=True)
    quantity_uom = db.Column(db.String(5),
                             db.ForeignKey('units_of_measures.uom'),
                             nullable=True)
    diet_plan_item_id = db.Column(db.Integer,
                                  db.ForeignKey('diet_plan_items.id'),
                                  nullable=True)
    created = db.Column(db.DateTime, default=datetime.datetime.utcnow)

    inventory = db.relationship("Inventory",
                                foreign_keys=[inventory_id],
                                back_populates="material_forecasts")
    material = db.relationship("Material")
    uom = db.relationship("UOM")

    inventory_item = db.relationship(
        "InventoryItem",
        foreign_keys=[inventory_id, material_id],
        primaryjoin=
        "and_(MaterialForecast.inventory_id==InventoryItem.inventory_id, MaterialForecast.material_id==InventoryItem.material_id)",
        backref='forecasts')

    @property
    def serialize(self):
        return {
            'id': self.id,
            'inventory_id': self.inventory_id,
            'material_id': self.material_id,
            'plan_date': self.plan_date,
            'plan_date_start': self.plan_date_start,
            'plan_date_end': self.plan_date_end,
            'quantity': self.quantity,
            'quantity_uom': self.quantity_uom
        }
Esempio n. 2
0
class DietPlanItem(db.Model):
    __tablename__ = 'diet_plan_items'
    id = db.Column(db.Integer, primary_key=True)
    diet_plan_id = db.Column(db.Integer,
                             db.ForeignKey('diet_plans.id'),
                             nullable=False)
    meal_id = db.Column(db.Integer, db.ForeignKey('meals.id'), nullable=False)
    plan_date = db.Column(db.DateTime(timezone=True), nullable=False)
    portions = db.Column(db.SmallInteger, default=0, nullable=True)
    consumed = db.Column(db.Boolean, nullable=True)
    material_id = db.Column(
        db.Integer, db.ForeignKey('materials.id'), nullable=True
    )  # TODO: Allow individual food items to be placed in a dietplan, like an apple a day keeps the doctor away
    created = db.Column(db.DateTime, default=datetime.datetime.utcnow)

    dietplan = db.relationship("DietPlan")
    meal = db.relationship("Meal", back_populates="diet_plans")
    material = db.relationship("Material")

    @property
    def serialize(self):
        return {
            'id': self.id,
            'diet_plan_id': self.diet_plan_id,
            'plan_date': self.plan_date,
            'meal_id': self.meal_id,
            'material_id': self.material_id,
            'meal': self.meal.title,
            'portions': self.portions,
            'consumed': self.consumed,
        }
Esempio n. 3
0
class ShoppingOrderItem(db.Model):
    __tablename__ = 'shopping_order_items'
    id = db.Column(db.Integer, primary_key=True)
    inventory_id = db.Column(db.Integer, db.ForeignKey('inventories.id'))
    material_id = db.Column(db.Integer,
                            db.ForeignKey('materials.id'),
                            nullable=True,
                            index=True)
    shopping_order_id = db.Column(db.Integer,
                                  db.ForeignKey('shopping_orders.id'))
    title = db.Column(db.String(80), nullable=True)  # TODO: obsolete
    uom_stock_id = db.Column(db.String(5),
                             db.ForeignKey('units_of_measures.uom'),
                             nullable=True)
    quantity_required = db.Column(db.Float, default=0, nullable=True)
    quantity_purchased = db.Column(db.Float, default=0, nullable=True)
    in_basket = db.Column(db.Boolean, default=False)
    in_basket_time = db.Column(db.DateTime(timezone=True), nullable=True)
    in_basket_geo_lon = db.Column(db.Float, nullable=True)
    in_basket_geo_lat = db.Column(db.Float, nullable=True)
    sort_order = db.Column(db.SmallInteger, nullable=True)
    item_photo = db.Column(db.String, nullable=True)
    barcode_photo = db.Column(db.String, nullable=True)
    ingredients_photo = db.Column(db.String, nullable=True)
    trade_item_id = db.Column(db.Integer,
                              db.ForeignKey('trade_items.id'),
                              nullable=True)
    created = db.Column(db.DateTime, default=datetime.datetime.utcnow)

    material = db.relationship("Material")
    shopping_order = db.relationship("ShoppingOrder")

    shopping_order = db.relationship(
        "ShoppingOrder",
        foreign_keys=[shopping_order_id],
        primaryjoin="ShoppingOrderItem.shopping_order_id==ShoppingOrder.id",
        backref=db.backref("shopping_order_items",
                           cascade="all, delete-orphan"))

    trade_item = db.relationship("TradeItem")
    inventory_item = db.relationship(
        "InventoryItem",
        foreign_keys=[inventory_id, material_id],
        primaryjoin=
        "and_(ShoppingOrderItem.inventory_id==InventoryItem.inventory_id, ShoppingOrderItem.material_id==InventoryItem.material_id)",
        backref='shopping_order_items')
Esempio n. 4
0
class ShoppingOrder(db.Model):
    __tablename__ = 'shopping_orders'
    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.SmallInteger,
                     nullable=False)  # 1: shopping list, 2: purchase order
    plan_forecast_days = db.Column(db.SmallInteger, nullable=False)
    status = db.Column(db.SmallInteger, nullable=False,
                       default=1)  # 1: open, 2: closed
    closed = db.Column(db.DateTime(timezone=True), nullable=True)
    place_id = db.Column(db.Integer, db.ForeignKey('places.id'), nullable=True)
    receipt_photo = db.Column(db.String, nullable=True)
    creator_id = db.Column(db.Integer,
                           db.ForeignKey('users.id'),
                           nullable=False)
    user_group_id = db.Column(db.Integer,
                              db.ForeignKey('user_groups.id'),
                              nullable=True)
    created = db.Column(db.DateTime, default=datetime.datetime.utcnow)

    creator = db.relationship(
        "User",
        back_populates="shopping_orders",
        primaryjoin='User.id == ShoppingOrder.creator_id')
Esempio n. 5
0
class InventoryItem(db.Model):
    __tablename__ = 'inventory_items'
    id = db.Column(
        db.Integer, primary_key=True
    )  # TODO: Each item is per definition a SKU (Stock keeping unit), consider renaming
    inventory_id = db.Column(db.Integer,
                             db.ForeignKey('inventories.id'),
                             index=True)
    material_id = db.Column(db.Integer,
                            db.ForeignKey('materials.id'),
                            nullable=True,
                            index=True)
    titleEN = db.Column(db.String(160), nullable=True)
    title = db.Column(db.String(160), nullable=True)
    uom_stock_id = db.Column(db.String(5),
                             db.ForeignKey('units_of_measures.uom'),
                             nullable=True)
    uom_base_id = db.Column(db.String(5),
                            db.ForeignKey('units_of_measures.uom'),
                            nullable=False)
    quantity_stock = db.Column(db.Float, default=0, nullable=True)
    quantity_stock_user = db.Column(db.Float, nullable=True)
    quantity_base = db.Column(db.Float, default=0, nullable=True)
    quantity_base_user = db.Column(
        db.Float, nullable=True
    )  # save the quantity entered by the user to recover it from auto toggle setting
    quantity_conversion_factor = db.Column(
        db.Float, nullable=True)  # to calculate issue units from stock units
    level = db.Column(
        db.Float, default=0,
        nullable=True)  # TODO: should be renamed to stock (on hand)
    re_order_level = db.Column(db.Integer, default=0, nullable=True)
    re_order_quantity = db.Column(db.Integer, default=0, nullable=True)
    ignore_forecast = db.Column(
        db.Boolean, unique=False, default=False
    )  # Any forecast is ignored so the status will calculate to 0: No Need
    # type:
    # 0 = no regular consumption
    # 1 = every day
    # 2 = once a week
    # 3 = once a month
    # 4 = once a year
    cp_type = db.Column(db.SmallInteger, default=0, nullable=False)
    cp_quantity = db.Column(db.Float, default=0, nullable=True)
    cp_plan_date = db.Column(db.DateTime(timezone=True),
                             nullable=True)  # TODO: obsolete
    cp_plan_date_start = db.Column(db.DateTime(timezone=True), nullable=True)
    cp_plan_date_end = db.Column(db.DateTime(timezone=True), nullable=True)
    cp_period = db.Column(db.SmallInteger, nullable=True)
    # 0 = daily
    # 1 = weekly
    # 2 = monthly
    # 3 = yearly
    cp_weekday = db.Column(db.SmallInteger, nullable=True)
    cp_day_in_month = db.Column(db.SmallInteger, nullable=True)
    cp_end_date = db.Column(db.DateTime(timezone=True),
                            nullable=True)  # TODO: depreciated

    op_plan_date_start = db.Column(db.DateTime(timezone=True), nullable=True)
    op_plan_date_end = db.Column(db.DateTime(timezone=True), nullable=True)
    op_quantity = db.Column(db.Float, default=0, nullable=True)

    created = db.Column(db.DateTime, default=datetime.datetime.utcnow)

    inventory = db.relationship("Inventory",
                                foreign_keys=[inventory_id],
                                back_populates="items")
    material = db.relationship("Material")
    uom_base = db.relationship("UOM", foreign_keys=[uom_base_id])
    uom_stock = db.relationship("UOM", foreign_keys=[uom_stock_id])
Esempio n. 6
0
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    email = db.Column(db.String(120), nullable=False, unique=True)
    picture = db.Column(db.String(250), nullable=True)
    provider = db.Column(db.String(20), nullable=True)
    provider_id = db.Column(db.String(120), nullable=True)
    active = db.Column(db.Boolean(), default=True)
    confirmed_at = db.Column(db.DateTime())
    password_hash = db.Column(db.String(255))
    language = db.Column(db.String(6), nullable=False)
    default_diet_plan_id = db.Column(
        db.Integer, db.ForeignKey('diet_plans.id'), nullable=True, unique=True
    )  # TODO: fix this when multiple users share one diet_plan and inventory
    default_inventory_id = db.Column(db.Integer,
                                     db.ForeignKey('inventories.id'),
                                     nullable=True,
                                     unique=True)
    default_portions = db.Column(db.SmallInteger, nullable=True)
    street = db.Column(db.String(120), nullable=True)
    city = db.Column(db.String(120), nullable=True)
    state = db.Column(db.String(120), nullable=True)
    zip = db.Column(db.String(120), nullable=True)
    created = db.Column(db.DateTime, default=datetime.datetime.utcnow)

    groups = db.relationship("UserGroupAssociation", back_populates="user")
    meals = db.relationship("Meal",
                            cascade="all, delete-orphan",
                            back_populates="owner")
    inventories = db.relationship(
        "Inventory",
        primaryjoin='User.id == Inventory.creator_id',
        back_populates="creator",
        cascade="all, delete-orphan")
    diet_plans = db.relationship("DietPlan",
                                 primaryjoin='User.id == DietPlan.creator_id',
                                 cascade="all, delete-orphan",
                                 back_populates="creator")
    default_diet_plan = db.relationship(
        "DietPlan",
        primaryjoin='User.default_diet_plan_id == DietPlan.id',
        cascade="all, delete-orphan",
        single_parent=True)
    default_inventory = db.relationship(
        "Inventory",
        primaryjoin='User.default_inventory_id == Inventory.id',
        cascade="all, delete-orphan",
        single_parent=True)
    shopping_orders = db.relationship("ShoppingOrder",
                                      cascade="all, delete-orphan")

    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)

    def generate_auth_token(self, expiration):
        s = Serializer(secret_key, expires_in=expiration)
        return s.dumps({'id': self.id})

    # defines how to print objects. Is good for debugging
    def __repr__(self):
        return '<User {}>'.format(self.name)

    @property
    def is_active(self):
        return True

    @property
    def is_authenticated(self):
        return True

    @property
    def is_anonymous(self):
        return False

    def get_id(self):
        return str(self.id)

    @property
    def serialize(self):
        # Returns object data in easily serializable format
        return {
            'user_id': self.id,
            'name': self.name,
            'email': self.email,
            'picture': self.picture,
            'provider': self.provider,
            'active': self.active,
            'language': self.language,
            'default_diet_plan_id': self.default_diet_plan_id,
            'default_inventory_id': self.default_inventory_id,
            'default_portions': self.default_portions,
            'street': self.street,
            'city': self.city,
            'state': self.state,
            'zip': self.zip,
        }