예제 #1
0
class GiftCardSpend(db.Document):
    gift_card_spend_id = db.StringField(db_field="gift_card_spend_id",
                                        primary_key=True)
    gift_card = db.ReferenceField(GiftCard, db_field="gift_card_id")
    invoice = db.ReferenceField(Invoice, db_field="invoice_id")
    amount = db.DecimalField()
    remaining_balance = db.DecimalField()
    created_at = db.DateTimeField(default=datetime.now())
예제 #2
0
class Booking(db.Document):
    customers = db.ListField(
        db.ReferenceField(Customer, reverse_delete_rule=mongoengine.PULL))
    room_name = db.StringField()
    check_in = db.DateTimeField()
    check_out = db.DateTimeField()
    deposit = db.DecimalField()
    modified_at = db.DateTimeField()
    ppm = db.DecimalField()
    created_at = db.DateTimeField()
    created_by = db.ReferenceField(User)
    note = db.StringField()
    room_type = db.IntField()
    confirmed = db.BooleanField()
class Maintenance(db.Document):
    cost = db.DecimalField()
    title = db.StringField()
    created_by = db.ReferenceField(User)
    created_at = db.DateTimeField()
    modified_at = db.DateTimeField()
    room_name = db.StringField()
    img_url = db.StringField()
class Recipe(db.Document):
    recipe_mongo_id         = db.ReferenceField('RecipeID')
    recipe_id               = db.IntField()
    title                   = db.StringField(max_length = 50)    
    description             = db.StringField()
    category_name           = db.StringField()
    ingredients             = db.StringField()
    directions              = db.StringField()
    preparation_time        = db.IntField()
    cooking_time            = db.IntField()
    total_cooking_time      = db.IntField()
    calories                = db.DecimalField()
    protein                 = db.DecimalField()
    carbohydrates           = db.DecimalField()
    cholesterol             = db.DecimalField()
    # author_id is MongoDB ID     
    author_id               = db.ReferenceField('User')
    author                  = db.StringField(max_length = 50)
    recipe_image            = db.ImageField()
    recipe_image_name       = db.StringField(max_length = 150)
예제 #5
0
class Pet(db.Document):
    external_id = db.StringField(db_field="ei")
    name = db.StringField(db_field="n")
    species = db.StringField(db_field="s")
    breed = db.StringField(db_field="b")
    age = db.IntField(db_field="a")
    store = db.ReferenceField(Store, db_field="st")
    price = db.DecimalField(db_field="p", precision=2, rounding='ROUND_HALF_UP')
    sold = db.BooleanField(db_field="sl", default=False)
    received_date = db.DateTimeField(db_field="rd")
    sold_date = db.DateTimeField(db_field="sd")
    live = db.BooleanField(db_field="l", default=True)

    meta = {
        'indexes': [('external_id', 'live'), ('species', 'live'), ('store', 'live')]
    }
예제 #6
0
class Appts(db.Document):
    external_id = db.StringField()
    first_name = db.StringField()
    last_name = db.StringField()
    service = db.StringField()
    status = db.StringField()
    street_address = db.StringField()
    city = db.StringField()
    state = db.StringField()
    zip = db.StringField()
    phone = db.StringField()
    date = db.DateTimeField()
    price = db.DecimalField(precision=2, rounding='ROUND_HALF_UP')
    live = db.BooleanField(default=True)

    meta = {
        'indexes': [('external_id', 'live'), ('date')]
    }
예제 #7
0
class Customer(db.Document):
    customer_id = db.StringField(db_field="customer_id", primary_key=True)
    password_hash = db.StringField()
    store_id = db.ReferenceField(Store, db_field="store_id")
    currency = db.StringField(db_field="currency")
    email = db.StringField(db_field="email")
    first_name = db.StringField(db_field="first_name")
    last_name = db.StringField(db_field="last_name")
    total_spent = db.DecimalField(db_field="total_spent", default=0)
    last_order_date = db.DateTimeField(db_field="last_order_date")
    last_cart_activity_at = db.DateTimeField(db_field="last_cart_activity_at")
    last_cart_created_at = db.DateTimeField(db_field="last_cart_created_at")
    log_out_expires_at = db.DateTimeField(default=datetime.now())
    emails = db.ListField(db.EmbeddedDocumentField(Email))
    confirmed_on = db.DateTimeField()
    confirmation_token = db.StringField()
    confirmation_token_expires_at = db.DateTimeField()
    last_seen_date = db.DateTimeField(default=datetime.now())
    created_at = db.DateTimeField(default=datetime.now())
    updated_at = db.DateTimeField(default=datetime.now())
    deleted_at = db.DateTimeField()

    meta = {'indexes': [('customer_id', ), ('email', )]}

    @classmethod
    def get_customer(cls, customer_id, request):
        store = Store.objects.filter(app_id=request.headers.get('APP-ID'),
                                     deleted_at=None).first()

        return Customer.objects.filter(customer_id=customer_id,
                                       store_id=store,
                                       deleted_at=None).first()

    @classmethod
    def get_customer_by_email(cls, email, request):
        store = Store.objects.filter(app_id=request.headers.get('APP-ID'),
                                     deleted_at=None).first()

        return Customer.objects.filter(email=email,
                                       store_id=store,
                                       deleted_at=None).first()

    @classmethod
    def get_customer_by_token(cls, token):
        return Customer.objects.filter(confirmation_token=token,
                                       deleted_at=None).first()

    def add_address(self, request, is_primary=False):
        """
        adds a new address based on request

        :param request: will pull data from flask request object
        :param is_primary: set new address to primary if true
        :return: address object
        """

        new_address = Address(address_id=str(uuid.uuid4().int),
                              customer_id=self,
                              street=request.json.get("street"),
                              city=request.json.get("city"),
                              zip=request.json.get("zip"),
                              state=request.json.get("state"),
                              country=request.json.get("country")).save()

        if is_primary:
            new_address.make_primary()

        return new_address

    def get_primary_address(self):
        """

        :return: current primary address if exists
        """
        return Address.objects.filter(customer_id=self.customer_id,
                                      deleted_at=None,
                                      is_primary=True).first()

    def get_addresses(self):
        """

        :return: all not deleted customer addresses
        """
        return Address.objects.filter(customer_id=self.customer_id,
                                      deleted_at=None)

    def set_password(self, password):
        """
        creates password for user

        :param password: new password
        :return: null
        """
        self.password_hash = generate_password_hash(password)
        self.save()

    def check_password(self, password):
        """
        checks if customer password is correct

        :param password: password to check
        :return: boolean
        """
        return check_password_hash(self.password_hash, password)

    def login(self):
        """
        logs customer in

        :return: null
        """
        self.log_out_expires_at = datetime.now() + timedelta(hours=24)
        self.last_seen_date = datetime.now()
        self.save()

    def logout(self):
        """
        logs customer out

        :return: null
        """
        self.log_out_expires_at = datetime.now()
        self.save()

    def add_email(self, new_email, is_primary=False):
        """
        adds a new email

        :param new_email: new email address
        :param is_primary: true if new email address should
        :return: null
        """
        for email in self.emails:
            if is_primary:
                email.is_primary = False
            if email.email == new_email and email.deleted_at is None:
                raise DuplicateDataError

        new_email_document = Email(email_id=str(uuid.uuid4().int),
                                   email=new_email,
                                   is_primary=is_primary)

        if is_primary:
            self.email = new_email
            self.updated_at = datetime.now()

        self.emails.append(new_email_document)
        self.save()

    def get_emails(self):
        """
        return list of active emails

        :return: list of email objects
        """
        active_emails = []
        for email in self.emails:
            if email.deleted_at is None:
                active_emails.append(email)

        return active_emails

    def delete_email(self, email_to_delete):
        """
        deletes a customer email

        :param email_to_delete: email to be deleted
        :return: email object
        """
        for email in self.emails:
            if email.email == email_to_delete and email.deleted_at is None:
                email.deleted_at = datetime.now()
                email.updated_at = datetime.now()
                self.updated_at = datetime.now()
                self.save()
                return email

        return None

    def make_email_primary(self, new_primay_email):
        if new_primay_email not in [email.email for email in self.emails]:
            return None

        new_primay_email_object = None
        for email in self.emails:
            if email.email == new_primay_email:
                email.is_primary = True
                new_primay_email_object = email
            else:
                email.is_primary = False

        self.save()
        return new_primay_email_object

    def send_email(self, subject, body):
        """
        sends an email to the customers primary email

        :return: none
        """
        msg = Message(subject,
                      sender="*****@*****.**",
                      recipients=[self.email])
        msg.html = body
        mail.send(msg)

    def send_confirmation(self):
        """
        sends confirmation email

        :return: none
        """
        self.confirmation_token = str(uuid.uuid4().int)
        self.confirmation_token_expires_at = datetime.now() + timedelta(
            hours=24)
        self.save()

        subject = "Store Confirmation"
        link = "localhost/customer/confirm/" + self.confirmation_token
        html = "<html>Please click the link to confirm your registration: <a href={}>link</a></html>".format(
            link)
        self.send_email(subject=subject, body=html)