Example #1
0
class TimestampMixin(object):
    created_at = db.Column(db.DateTime(timezone=True),
                           nullable=False,
                           server_default=func.now())
    modified_at = db.Column(db.DateTime(timezone=True),
                            nullable=False,
                            server_default=func.now(),
                            onupdate=func.now())
Example #2
0
class Campaign(SAFRSMixin, db.Model, RoleMixin, TimestampMixin, UpdateMixin):
    __tablename__ = "campaigns"

    custom_decorators = [role_policy(default="Sales Executive", view="Shopper"), login_required]

    # columns are listed in groups by which page in the campaign creator they are filled in
    id = db.Column(db.Integer, primary_key=True)
    _status = db.Column(db.String, default="Active")
    complete = db.Column(db.Boolean, default=False)

    name = db.Column(db.String, unique=True)
    company_name = db.Column(db.String)
    start_date = db.Column(db.DateTime(timezone=True))
    end_date = db.Column(db.DateTime(timezone=True))

    storefront_pricing = db.Column(db.Boolean)
    company_allowance = db.Column(db.Float)
    company_allowance_personal_pay = db.Column(db.String)
    items_count_limit = db.Column(db.Integer)
    price_limit = db.Column(db.Float)
    email_shopper = db.Column(db.Boolean)

    checkout_fields = db.Column(db.JSON)
    departments = db.Column(db.JSON)
    managers = db.Column(db.JSON)

    message = db.Column(db.String)
    bfl_cost = db.Column(db.Float, default=0)
    distributor_po = db.Column(db.String)
    pick_pack_partner_message = db.Column(db.String)

    # relationships
    created_by_id = db.Column(db.Integer, db.ForeignKey("accounts.id"), nullable=True)
    created_by = db.relationship("Account", foreign_keys=[created_by_id])

    pick_pack_partner_id = db.Column(db.Integer, db.ForeignKey("vendors.id"))
    pick_pack_partner = db.relationship("Vendor", foreign_keys=[pick_pack_partner_id])

    distributor_id = db.Column(db.Integer, db.ForeignKey("distributors.id"))
    distributor = db.relationship("Distributor", foreign_keys=[distributor_id])

    campaign_product_variants = db.relationship(
        "CampaignProductVariant", cascade="delete", backref="campaign"
    )
    orders = db.relationship("Order", cascade="delete", backref="campaign")
    locations = db.relationship("Location", cascade="delete", backref="campaign")

    def __init__(self, *args, **kwargs):
        # set the default value of created_by_id to the account.id of the currently-logged in user.
        # if you are creating a Campaign model in e.g., the flask shell, you will have to manually
        # specify created_by_id in the kwargs, or this will raise (as g.account.id does not exist)
        if "created_by_id" not in kwargs or kwargs["created_by_id"] is None:
            kwargs["created_by_id"] = g.account.id

        super().__init__(*args, **kwargs)

    @validates("name")
    def validate_name(self, key, name):
        if not name or not name.replace(" ", ""):
            raise ValidationError("Campaign name is not valid")

        campaign = Campaign.query.filter_by(name=name).one_or_none()

        if campaign is not None:
            raise ValidationError("Campaign name already exists")

        return name

    @validates("end_date")
    def validate_end_date(self, key, end_date):
        if self.start_date and self.start_date > end_date:
            raise ValidationError("Start date cannot occur before end date")

        return end_date

    @hybrid_property
    def status(self):
        return self._status