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())
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)
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')] }
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')] }
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)