class Invoice(mongoengine.Document): number = mongoengine.IntField(unique=True) date = mongoengine.DateTimeField() bill_to = mongoengine.StringField() project = mongoengine.ReferenceField(Project) rate = mongoengine.DecimalField() tax = mongoengine.DecimalField(default=0.0) @classmethod def next_invoice_number(cls): invoices = cls.objects.order_by("number") count = invoices.count() if count: return invoices[count - 1].number + 1 return 1 def __str__(self): return str(self.number) def total_duration(self): timesheets = Timesheet.objects(invoice=self) return sum(t.duration for t in timesheets) def total_fee(self): timesheets = Timesheet.objects(invoice=self) return sum(t.fee for t in timesheets) def total(self): total = self.total_fee() return total + total * self.tax * Decimal('.01')
class UserInBattle(me.Document): UserId = me.ReferenceField(User) NumOfShots = me.DecimalField(min_value=0, max_value=100) NumOfShotsOnTarget = me.DecimalField(min_value=0, max_value=100) GivenDamage = me.DecimalField(min_value=0, max_value=1000) GetDamage = me.DecimalField(min_value=0, max_value=1000) OpponentHp = me.DecimalField(min_value=0, max_value=1000)
class Message(mongoengine.Document): message_type = mongoengine.StringField() state = mongoengine.StringField(default=config.MESSAGE_STATE_INITIAL) imei = mongoengine.StringField() message_datastring = mongoengine.StringField() latitude = mongoengine.DecimalField() longitude = mongoengine.DecimalField() created = mongoengine.DateTimeField(default=datetime.datetime.utcnow) @classmethod def dequeue_response(self, imei): collection = mongoengine.connection.get_db()['message'] resp = collection.find_and_modify( query={ 'imei': imei, 'state': config.MESSAGE_STATE_INITIAL }, sort={'created': 1}, update={'$set': { 'state': config.MESSAGE_STATE_SENT }}, ) if resp: return Message(**resp) def __str__(self): return u'Message type: %s, IMEI: %s, state: %s' % ( self.message_type, self.imei, self.state)
class Timesheet(mongoengine.Document): date = mongoengine.DateTimeField() duration = mongoengine.DecimalField() project = mongoengine.ReferenceField('Project') type = mongoengine.ReferenceField('ProjectType') description = mongoengine.StringField() invoice = mongoengine.ReferenceField('Invoice') archived_rate = mongoengine.DecimalField() #FIXME: These properties have not been defined @property def rate(self): if self.archived_rate: return self.archived_rate if self.invoice and self.invoice.rate: return self.invoice.rate if self.type and self.type.rate: return self.type.rate if self.project and self.project.rate: return self.project.rate return 0 @property def fee(self): return self.rate * self.duration @classmethod def for_date(cls, date): start = datetime.datetime(date.year, date.month, date.day) end = datetime.datetime(date.year, date.month, date.day, 23, 59, 59) return Timesheet.objects(date__gte=start, date__lte=end)
class Client(me.EmbeddedDocument): first_name = me.StringField(max_length=50) last_name = me.StringField(max_length=50) age = me.IntField() initial_weight = me.DecimalField() height = me.DecimalField() info = me.StringField(max_length=300) measures = me.ListField(me.EmbeddedDocumentField(Measure))
class Dues(mongoengine.EmbeddedDocument): total = mongoengine.DecimalField(required=True) discount = mongoengine.DecimalField(required=True) paid = mongoengine.DecimalField(required=True) meta = { 'db_alias': 'default', }
class Indoor_Weather(mongoengine.Document): indoor_temp = mongoengine.DecimalField() indoor_humidity = mongoengine.DecimalField() def __str__(self): return f"Indoor Temp: {self.indoor_temp}. Indoor Humidity: {self.indoor_humidity}" def convert_to_json(self): indoor = {"temp": self.indoor_temp, "humidity": self.indoor_humidity} return json.dumps(indoor)
class Activity(me.Document): phone_no = me.IntField(required=True) item = me.StringField(required=True) calorie = me.DecimalField(default=0) protein = me.DecimalField(default=0) quantity = me.DecimalField() sugar = me.DecimalField(default=0) category = me.StringField() recorded_at = me.DateTimeField(default=datetime.utcnow()) def __str__(self): return "Activity(item={},phone_no={})".format(self.item, self.phone_no)
class UndoneTrade(mongoengine.Document): user_id: mongoengine.LongField() calculation_start_date = mongoengine.DateField() undue_trades_count = mongoengine.IntField() past_due_trades_count_with_less_than_30_day_delays = mongoengine.IntField() arrear_trades_count_with_more_than_30_day_delays = mongoengine.IntField() undue_trades_total_balance_of_last_year = mongoengine.DecimalField() past_due_trades_total_balance_of_last_year = mongoengine.DecimalField() arrear_trades_total_balance_of_last_year = mongoengine.DecimalField() meta = {'db_alias': 'core', 'collection': 'undoneTrades'}
class MarketDay(mongoengine.EmbeddedDocument): marketday_id = mongoengine.ObjectIdField(default=ObjectId) date = mongoengine.DateTimeField(required=True) members = mongoengine.ListField(mongoengine.ReferenceField(Member), required=False) additional_workers = mongoengine.ListField(required=False) traded = mongoengine.BooleanField(required=True, default=True) income = mongoengine.DecimalField(required=True, default=0) expenses = mongoengine.DecimalField(required=True, default=0) meta = { 'db_alias': 'default', 'collection': 'marketdays' }
class Loan(mongoengine.Document): user_id = mongoengine.LongField() loans_total_count = mongoengine.IntField() past_due_loans_total_count = mongoengine.IntField() arrear_loans_total_count = mongoengine.IntField() suspicious_loans_total_count = mongoengine.IntField() monthly_installments_total_balance = mongoengine.DecimalField() overdue_loans_total_balance = mongoengine.DecimalField() past_due_loans_total_balance = mongoengine.DecimalField() arrear_loans_total_balance = mongoengine.DecimalField() suspicious_loans_total_balance = mongoengine.DecimalField() meta = {'db_alias': 'core', 'collection': 'loans'}
class CartItem(me.EmbeddedDocument): product = me.ReferenceField('Product') quantity = me.IntField(min_value=1, default=1) is_archived = me.BooleanField(default=False) _order_product_price = me.DecimalField() @property def product_price(self): if self.is_archived: return self._order_product_price else: return self.product.get_price() @property def item_subsum(self): return self.product_price * self.quantity def __contains__(self, item): return self.product == item.product def __eq__(self, other): return self.product == other.product def archive(self): self._order_product_price = self.product.get_price() self.is_archived = True
class Item(mongoengine.DynamicDocument): item_id = mongoengine.StringField(required=True, primary_key=True) shop_id = mongoengine.StringField() item_name = mongoengine.StringField() item_description = mongoengine.StringField() channel = mongoengine.StringField() price_min = mongoengine.DecimalField() price_max = mongoengine.DecimalField() currency = mongoengine.StringField() categories = mongoengine.ListField(mongoengine.StringField()) variant_ids = mongoengine.ListField(mongoengine.StringField()) item_brand = mongoengine.StringField() item_sold = mongoengine.IntField() item_rating = mongoengine.DecimalField() item_stock = mongoengine.IntField() meta = {'collection': 'items'}
class Transaction(mdb.Document): """Describes a single transaction event""" # dollar amount amount = mdb.DecimalField(required=True) # descriptive account name (human readable) account = mdb.ReferenceField(Account, required=True) # date of transaction date = mdb.DateTimeField(required=True) # full description either from original statement or provided by user description = mdb.StringField(required=False, max_length=80) category = mdb.ReferenceField(Category) # TODO - not sure if this date index works meta = { 'ordering': ['-date'], 'indexes': ['date'], } def csv_row(self): return ",".join([ self.date.strftime(config.time_format), self.category.label, self.account.description, self.description, '{:.2f}'.format(self.amount), ]) + '\n' @staticmethod def csv_header(): return ",".join([ 'date (YYYY-MM-DD)', 'category', 'account', 'description', 'amount', ]) + '\n' @staticmethod def query(start_date, end_date, category_filters=None): """Returns a list of filtered and mutated objects""" if category_filters: categories = Category.objects( label__in=category_filters) results = Transaction.objects( date__gte=start_date, date__lt=end_date, category__in=categories) else: results = Transaction.objects( date__gte=start_date, date__lt=end_date) return results
class ProjectType(mongoengine.Document): project = mongoengine.ReferenceField(Project) type = mongoengine.StringField() rate = mongoengine.DecimalField(default=0) def __str__(self): return self.type
class Movie(me.Document): title = me.StringField() year = me.IntField() has_sequel = me.BooleanField() imdb_url = me.URLField() cast = me.EmbeddedDocumentListField(Star) score = me.DecimalField()
class Product(me.Document): title = me.StringField(min_length=2, max_length=128, required=True) description = me.StringField(max_length=1024) price = me.DecimalField(force_string=True, required=True, min_value=0) discount = me.IntField(min_value=0, max_value=100, default=0) in_stock = me.BooleanField(default=True) category = me.ReferenceField(Category) supplier = me.ReferenceField('Supplier') image = me.FileField() parameters = me.EmbeddedDocumentField(Parameters) @classmethod def get_discount_products(cls): return cls.objects(discount__gt=0) def get_products_parameters(self): if self.parameters: return f'Характеристики :\n' \ f'ширина - {self.parameters.width} см.\n' \ f'высота - {self.parameters.height} см.\n' \ f'вес - {self.parameters.weight} кг.\n' \ f'мощность - {self.parameters.power} Вт' return f'Характеристики : нет данных' def get_product_info(self): product_info = f'{self.title}\n' \ f'Описание :\n' \ f'{self.description}\n' \ f' {self.get_products_parameters()}' if self.discount > 0: discount_price = (self.price - (self.price / 100) * self.discount) return product_info + f'\nСтарая цена : {self.price}\nЦена со скидкой : {discount_price}' return product_info + f'\nЦена : {self.price}'
class Account(mongoengine.Document): name = mongoengine.StringField(required=True, choices=('charity', 'admin')) initial_balance = mongoengine.DecimalField(required=True) transactions = mongoengine.EmbeddedDocumentListField(Transaction) meta = { 'db_alias': 'default', 'collection': 'accounts', 'allow_inheritance': True } def current_balance(self, month=None): start_balance = Balance(self.transactions[0].trans_date, self.initial_balance) end_balance = Balance(self.transactions[-1].trans_date, start_balance.amount) got_start = False for t in self.transactions: if got_start and t.report_month != month: break if t.report_month == month and not got_start: got_start = True start_balance.amount = end_balance.amount start_balance.date = t.trans_date end_balance.alter(t.trans_type, t.amount) end_balance.date = t.trans_date return (start_balance, end_balance) def transaction_list(self, reverse=True, month=None): l = [(n,f'{c.trans_date:%d/%m/%y} {c.trans_type.capitalize()}: {c.description} (R{c.amount:.2f})') for (n,c) in enumerate(self.transactions) if (month == None) or (c.report_month == month)] if reverse: l.reverse() return l
class Bill(me.Document): recipient_username = me.StringField(max_length=50, required=True, unique=False) project_id = me.StringField(max_length=20, required=False, unique=False, validation=_not_empty) hw_used = me.DictField() # maps hw_set_name to quantity checked in bill_subtotal = me.DecimalField( min_value=0, force_string=True, precision=2 ) # store as a string, can also force it to round a certain way if needed amount_due = me.DecimalField(min_value=0, force_string=True, precision=2) bill_paid = me.BooleanField(default=False) timestamp = me.IntField(required=True) paid_timestamp = me.IntField(required=False)
class Transaction(mongoengine.Document): trans_to = mongoengine.StringField() trans_from = mongoengine.StringField() trans_otp = mongoengine.StringField() trans_time = mongoengine.DateTimeField(default=datetime.datetime.now()) trans_status = mongoengine.BooleanField(default=False) trans_value = mongoengine.DecimalField() trans_lock_id = mongoengine.ObjectIdField()
class Customer(mongoengine.Document): name = mongoengine.StringField() email = mongoengine.EmailField() hashed_password = mongoengine.StringField() mobile = mongoengine.StringField() login_otp = mongoengine.StringField() wallet_bal = mongoengine.DecimalField(default=0.0) trans_history = mongoengine.ListField(mongoengine.ObjectIdField())
class Business(mongoengine.Document): business_id = mongoengine.StringField() name = mongoengine.StringField() address = mongoengine.StringField() city = mongoengine.StringField() state = mongoengine.StringField() postal_code = mongoengine.StringField() latitude = mongoengine.DecimalField() longitude = mongoengine.DecimalField() stars = mongoengine.FloatField() review_count = mongoengine.IntField() is_open = mongoengine.IntField() attributes = mongoengine.ListField() categories = mongoengine.ListField() hours = mongoengine.ListField() recommended_reviews = mongoengine.ListField(ReferenceField('Review')) meta = {'collection': 'businesses', 'indexes': ['name', 'business_id']}
class Project(mongoengine.Document): name = mongoengine.StringField(primary_key=True) rate = mongoengine.DecimalField(default=0) def __str__(self): return self.name def project_types(self): return ProjectType.objects(project=self)
class Producto(mongoengine.Document): sku = mongoengine.StringField( max_length=8, min_length=8, primary_key=True, unique=True) nombre = mongoengine.StringField(max_length=120) marca = mongoengine.StringField(max_length=50) precio = mongoengine.DecimalField(min_value=0.00) categoria = mongoengine.ReferenceField('Categoria') detalles = mongoengine.DictField() historial_precios = mongoengine.ListField(PrecioPasado())
class Products(me.Document): title = me.StringField(min_length=1, max_length=512) description = me.StringField(min_length=2, max_length=4096) created = me.DateField(default=datetime.datetime.now()) price = me.DecimalField(required=True) in_stock = me.BooleanField(default=True) discount = me.IntField(min_value=0, max_value=100) image = me.FileField(required=True) category = me.ReferenceField(Category)
class Price(me.EmbeddedDocument): amount = me.DecimalField(required=True) currency = me.StringField(required=True) def __repr__(self): return f"{self.price!r} {self.currency!r})" def __str__(self): return f"{self.amount} {self.currency}"
class Book(mongoengine.Document): isbn = mongoengine.StringField(max_length=30, primary_key=True) name = mongoengine.StringField(max_length=20) author = mongoengine.StringField(max_length=20) press = mongoengine.StringField(max_length=20) category = mongoengine.StringField(max_length=6) count = mongoengine.IntField() press_date = mongoengine.DateField() buy_data = mongoengine.StringField(max_length=40) price = mongoengine.DecimalField()
class Merchant(mongoengine.Document): name = mongoengine.StringField() email = mongoengine.EmailField() hashed_password = mongoengine.StringField() mobile = mongoengine.StringField() address = mongoengine.StringField() login_otp = mongoengine.StringField() wallet_bal = mongoengine.DecimalField(default=0.0) verified = mongoengine.StringField() trans_history = mongoengine.ListField(mongoengine.ObjectIdField())
class Tomato(mongoengine.EmbeddedDocument): meter = mongoengine.IntField() image = mongoengine.StringField() rating = mongoengine.IntField() reviews = mongoengine.IntField() fresh = mongoengine.IntField() consensus = mongoengine.StringField() userMeter = mongoengine.IntField() userRating = mongoengine.DecimalField() userReviews = mongoengine.IntField()
class Goods(me.Document): name = me.StringField(min_length=2, max_length=256) price = me.DecimalField(min_value=0) in_stock = me.BooleanField(default=True) quantity = me.IntField(min_value=0) category = me.ReferenceField(Category) views = me.IntField(min_value=0) created = me.DateTimeField(default=datetime.datetime.utcnow()) product_description = me.StringField(max_length=4096)