def prepare_translatable_model(sender, **kwargs): model = sender if not issubclass(model, TranslatableModel) or model._meta.abstract: return if model._meta.proxy: model._meta.translations_accessor = model._meta.concrete_model._meta.translations_accessor model._meta.translations_model = model._meta.concrete_model._meta.translations_model model._meta.translations_cache = model._meta.concrete_model._meta.translations_cache if not hasattr(model._meta, 'translations_model'): raise ImproperlyConfigured( "No TranslatedFields found on %r, subclasses of " "TranslatableModel must define TranslatedFields." % model) #### Now we have to work #### # Ensure _base_manager cannot be TranslationManager despite use_for_related_fields # 1- it is useless unless default_class is overriden # 2- in that case, _base_manager is used for saving objects and must not be # translation aware. base_mgr = getattr(model, '_base_manager', None) if base_mgr is None or isinstance(base_mgr, TranslationManager): assert django.VERSION < (1, 10) model.add_to_class('_base_manager', Manager()) # Replace get_field_by_name with one that warns for common mistakes if django.VERSION < (1, 9) and not isinstance( model._meta.get_field_by_name, SmartGetFieldByName): model._meta.get_field_by_name = MethodType( SmartGetFieldByName(model._meta.get_field_by_name), model._meta) if not isinstance(model._meta.get_field, SmartGetField): model._meta.get_field = MethodType( SmartGetField(model._meta.get_field), model._meta)
def test_invalid_manager(self): attrs = { 'objects': Manager(), '__module__': 'hvad.test_utils.project.app', } self.assertRaises(ImproperlyConfigured, type, 'InvalidModel', (TranslatableModel, ), attrs)
class WeeklyFieldIndicators(models.Model): class Meta: constraints = [ models.UniqueConstraint(fields=["field_id", "date_observed"], name="unique weekly field indicators row") ] field_id = models.UUIDField(editable=True, unique=False) user_id = models.CharField(max_length=30, blank=False) date_observed = models.DateField(blank=False) field_ndvi = models.FloatField(blank=True, null=True) field_ndwi = models.FloatField(blank=True, null=True) field_precipitation = models.FloatField(blank=True, null=True) field_temperature = models.FloatField(blank=True, null=True) field_evapotranspiration = models.FloatField(blank=True, null=True) deleted = models.BooleanField(default=False) objects = SoftDeleteManager( ) # https://www.youtube.com/watch?v=nlZHpGPkfbQ all_objects = Manager() def restore(self): self.deleted = False self.save() def soft_delete(self): self.deleted = True self.save() def delete(self): raise Error()
class SingletonModel(models.Model): class Meta: abstract = True # override defualt manager and user privet manager objects = None __objects = Manager() def __str__(self): return 'Singleton Object' def set_cache(self): cache.set(self.__class__.__name__, self) def save(self, *args, **kwargs): self.pk = 1 super(SingletonModel, self).save(*args, **kwargs) self.set_cache() def delete(self, *args, **kwargs): pass @classmethod def load(cls, **kwargs): if cache.get(cls.__name__) is None: obj, created = cls.__objects.get_or_create(pk=1, defaults=kwargs) if not created: obj.set_cache() return cache.get(cls.__name__)
def _prepare(cls): # TODO: How do we extend the parent classes classmethod properly? # super(CachedModel, cls)._prepare() errors opts = cls._meta opts._prepare(cls) if opts.order_with_respect_to: cls.get_next_in_order = curry(cls._get_next_or_previous_in_order, is_next=True) cls.get_previous_in_order = curry( cls._get_next_or_previous_in_order, is_next=False) setattr(opts.order_with_respect_to.rel.to, 'get_%s_order' % cls.__name__.lower(), curry(method_get_order, cls)) setattr(opts.order_with_respect_to.rel.to, 'set_%s_order' % cls.__name__.lower(), curry(method_set_order, cls)) # Give the class a docstring -- its definition. if cls.__doc__ is None: cls.__doc__ = "%s(%s)" % (cls.__name__, ", ".join( [f.attname for f in opts.fields])) if hasattr(cls, 'get_absolute_url'): cls.get_absolute_url = curry(get_absolute_url, opts, cls.get_absolute_url) cls.add_to_class('objects', CacheManager()) cls.add_to_class('nocache', Manager()) cls.add_to_class('_default_manager', cls.nocache) signals.class_prepared.send(sender=cls)
def prepare_translatable_model(sender, **kwargs): model = sender if not issubclass(model, TranslatableModel) or model._meta.abstract: return if not isinstance(model._default_manager, TranslationManager): raise ImproperlyConfigured( "The default manager on a TranslatableModel must be a " "TranslationManager instance or an instance of a subclass of " "TranslationManager, the default manager of %r is not." % model) # If this is a proxy model, get the concrete one concrete_model = model._meta.concrete_model if model._meta.proxy else model # Find the instance of TranslatedFields in the concrete model's dict found = None for relation in list(concrete_model.__dict__.keys()): try: obj = getattr(model, relation) shared_model = obj.related.model._meta.shared_model except AttributeError: continue if shared_model is concrete_model: if found: raise ImproperlyConfigured( "A TranslatableModel can only define one set of " "TranslatedFields, %r defines more than one: %r to %r " "and %r to %r and possibly more" % (model, obj, obj.related.model, found, found.related.model)) # Mark as found but keep looking so we catch duplicates and raise found = obj if not found: raise ImproperlyConfigured( "No TranslatedFields found on %r, subclasses of " "TranslatableModel must define TranslatedFields." % model ) #### Now we have to work #### contribute_translations(model, found.related) # Ensure _base_manager cannot be TranslationManager despite use_for_related_fields # 1- it is useless unless default_class is overriden # 2- in that case, _base_manager is used for saving objects and must not be # translation aware. base_mgr = getattr(model, '_base_manager', None) if base_mgr is None or isinstance(base_mgr, TranslationManager): model.add_to_class('_base_manager', Manager()) # Replace get_field_by_name with one that warns for common mistakes if not isinstance(model._meta.get_field_by_name, SmartGetFieldByName): smart_get_field_by_name = SmartGetFieldByName(model._meta.get_field_by_name) model._meta.get_field_by_name = MethodType(smart_get_field_by_name , model._meta) # Attach save_translations post_save.connect(model.save_translations, sender=model, weak=False)
class Brand(DCFModel["Brand"], Serializable): objects: Manager["Brand"] = Manager() name = m.CharField(max_length=100, unique=True, null=True) priority = m.IntegerField(default=1) products: RelatedManager[Product] @classmethod def get_serializer_class(cls, version: str | None, context: Any) -> Type[BrandSerializer]: return BrandSerializer
class File(models.Model): id = models.CharField(max_length=16, primary_key=True) user = models.ForeignKey(User) filename = models.TextField() filesize = models.IntegerField() mimetype = models.CharField(max_length=64) url = models.URLField() objects = Manager() manager = FileManager()
class BookInfo(models.Model): btitle = models.CharField(max_length=100) bpubdate = models.DateField() bread = models.IntegerField() bcomment = models.IntegerField() isdelete = models.BooleanField() bookinfo_manager1 = Manager() bookinfo_manager2 = BookInfo_Manager() def __str__(self): return self.btitle
class GroupMeUser(BaseModel): users = Manager() name = models.CharField(max_length=64) group_me_id = models.CharField(max_length=32, unique=True) token = models.CharField(max_length=32, unique=True) def __str__(self): return self.name @property def is_authenticated(self): response = request_current_user(self.token) return response["meta"]["code"] == 200
class OneTimePassword(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='otp_set') signature = models.CharField(max_length=32, db_index=True) send_counter = models.PositiveIntegerField(default=0) last_send = models.DateTimeField(default=timezone.now) check_counter = models.PositiveIntegerField(default=0) last_check = models.DateTimeField(default=timezone.now) objects = Manager() def save(self, *args, **kwargs): if not self.pk or not self.signature: self.refresh_signature() super(OneTimePassword, self).save(*args, **kwargs) def refresh_signature(self, commit=False): self.signature = generate_signature(self.user_id) if commit: self.save() def can_request_otp(self): now = timezone.now() duration = get_duration(self.last_send, now) if duration > OTP_INTERVAL.OTP_REQUEST: allowed = True self.send_counter = 1 else: self.send_counter += 1 allowed = self.send_counter <= OTP_LIMIT.OTP_REQUEST if allowed: self.last_send = now self.save() return allowed def can_check_otp(self): now = timezone.now() duration = get_duration(self.last_check, now) if duration > OTP_INTERVAL.OTP_CHECK: allowed = True self.check_counter = 1 else: self.check_counter += 1 allowed = self.check_counter <= OTP_LIMIT.OTP_CHECK if allowed: self.last_check = now self.save() return allowed
class AbstractOffer(AbstractImg): created_date = models.DateTimeField(_("Created date"), default=now) start_date = models.DateTimeField(_("Start date"), default=now) end_date = models.DateTimeField(_("End date"), default=now) title = std_text_field(_('Title')) text = models.TextField(verbose_name=_("Offer text"), blank=True) enabled = models.BooleanField(verbose_name=_("Enabled"), default=False) slug = models.CharField(verbose_name=_('URL-identifier'), max_length=100, blank=True) position = models.PositiveSmallIntegerField(verbose_name=_('Priority'), db_index=True, default=0, blank=True) objects = Manager() class Meta: verbose_name = _('Special Offer') verbose_name_plural = _('Special Offers') abstract = True
class AgentPercent(models.Model): hotel = models.ForeignKey(Hotel) date = models.DateField(verbose_name=_("From date"), db_index=True) percent = models.DecimalField(verbose_name=_('Percent'), blank=True, decimal_places=1, max_digits=4, default=0, db_index=True) class Meta: verbose_name = _("Agent Percent") verbose_name_plural = _("Agent Percents") ordering = ("hotel",) objects = Manager() def __str__(self): return _("For %(hotel)s on date %(date)s percent is %(percent)s") % dict(hotel=self.hotel.name, date=self.date, percent=self.percent)
class BasePage(SoftDeletableModel): title = models.CharField(max_length=50) content = RichTextField(blank=True) creator = models.ForeignKey(Account) creation_date = models.DateTimeField(auto_now_add=True) group_id = models.UUIDField(primary_key=False, default=uuid.uuid4, editable=False) version = models.IntegerField() changelog = models.CharField(max_length=50, blank=True) objects = Manager() active_pages = SoftDeletableManager() class Meta: abstract = True @property def category(self): return self.__class__.__name__
class Plan(models.Model): """ Model base plan object """ GRAPH_TYPE = 0 TABLE_TYPE = 1 TYPES = ((GRAPH_TYPE, 'Graph view of plan'), (TABLE_TYPE, 'Table view of plan')) name = models.CharField(max_length=140) slug = models.SlugField(max_length=140, db_index=True, null=True, blank=True) description = models.CharField(max_length=200, blank=True, null=True) version = models.PositiveSmallIntegerField() type = models.PositiveIntegerField(choices=TYPES) date_creation = models.DateTimeField(auto_now_add=True) author = models.ForeignKey(User, on_delete=models.CASCADE) last_update = models.DateTimeField(auto_now=True) # Managers objects = Manager() graph_plan_objects = GraphPlanManager() table_plan_objects = TablePlanManager() def __str__(self): return f'{self.author.__str__()} - {self.name} ({self.version})' def save(self, *args, **kwargs): self.slug = hashlib.md5((self.name + self.author.get_full_name() + str(self.version)).encode()).hexdigest() super(Plan, self).save(*args, **kwargs) def get_absolute_url(self): if self.type == self.GRAPH_TYPE: return reverse('graph:to_plan', args=(self.slug, )) else: return reverse('table:to_plan', args=(self.slug, )) class Meta: unique_together = ('author', 'slug', 'version') verbose_name = 'Plan' verbose_name_plural = 'Plans'
class Category(MPTTModel, TimeStampedModel, SoftDeletableModel): parent = TreeForeignKey('self', null=True, blank=True, related_name='children', verbose_name=_('parent category'), on_delete=models.SET_NULL) name = models.CharField(_('name'), max_length=255, unique=True) cover = models.OneToOneField('covers.Cover', verbose_name=_('cover'), blank=True, null=True, on_delete=models.SET_NULL) slug = AutoSlugField(populate_from='name', max_length=255, allow_unicode=True, unique=True) description = models.TextField(_('description'), blank=True) objects = Manager() tree = TreeManager() class Meta: verbose_name = _('Category') verbose_name_plural = _('Categories') class MPTTMeta: order_insertion_by = ['created'] def __str__(self): return self.name
class Color(models.Model): """ Base color model """ BASE_COLOR = 0 CUSTOM_COLOR = 1 TYPES = ((BASE_COLOR, 'Base color'), (CUSTOM_COLOR, 'User color')) type = models.PositiveIntegerField(choices=TYPES) # String color in hex hex = models.CharField(max_length=6) name = models.CharField(max_length=20) description = models.CharField(max_length=100, null=True, blank=True) author = models.ForeignKey(User, on_delete=models.CASCADE) # color manages objects = Manager() base_colors = BaseColorManager() custom_color = UserColorManager() def __str__(self): return f'{self.author.__str__()} - {super().__str__()}' class Meta: ordering = ('name', )
class OrderBookSwaps(models.Model): STATE_CREATED = 'created' STATE_ACTIVE = 'active' STATE_EXPIRED = 'expired' STATE_POSTPONED = 'postponed' STATE_DONE = 'done' STATE_CANCELLED = 'cancelled' STATE_HIDDEN = 'hidden' ORDER_STATES = ( (STATE_CREATED, 'CREATED'), (STATE_ACTIVE, 'ACTIVE'), (STATE_EXPIRED, 'EXPIRED'), (STATE_POSTPONED, 'POSTPONED'), (STATE_DONE, 'DONE'), (STATE_CANCELLED, 'CANCELLED'), (STATE_HIDDEN, 'HIDDEN'), ) name = models.CharField(max_length=512, null=True, default='') memo_contract = models.CharField(max_length=70, null=True, default=_get_memo) network = models.ForeignKey(Network, on_delete=models.PROTECT, related_name='orders', default=1) contract_address = models.CharField(max_length=255, verbose_name='Contract address', default='') # base_coin_id = models.IntegerField(default=0) base_address = models.CharField(max_length=50, null=True, default='') base_limit = models.DecimalField( max_digits=50, decimal_places=18, ) # quote_coin_id = models.IntegerField(default=0) quote_address = models.CharField(max_length=50, null=True, default='') quote_limit = models.DecimalField( max_digits=50, decimal_places=18, ) user = models.ForeignKey( User, on_delete=models.PROTECT, related_name='orders', ) owner_address = models.CharField(max_length=50, null=True, default='') exchange_user = models.CharField(max_length=512, null=True, default='') broker_fee = models.BooleanField(default=False) broker_fee_address = models.CharField(max_length=50, null=True, default='') broker_fee_base = models.FloatField(null=True, default=0) broker_fee_quote = models.FloatField(null=True, default=0) min_base_wei = models.CharField(max_length=512, null=True, default='') min_quote_wei = models.CharField(max_length=512, null=True, default='') base_amount_contributed = models.DecimalField(max_digits=MAX_WEI_DIGITS, decimal_places=0, default=0) base_amount_total = models.DecimalField(max_digits=MAX_WEI_DIGITS, decimal_places=0, default=0) quote_amount_contributed = models.DecimalField(max_digits=MAX_WEI_DIGITS, decimal_places=0, default=0) quote_amount_total = models.DecimalField(max_digits=MAX_WEI_DIGITS, decimal_places=0, default=0) public = models.BooleanField(default=True) unique_link = models.CharField(max_length=50, null=True, unique=True, default=_get_unique_link) created_date = models.DateTimeField(auto_now_add=True) stop_date = models.DateTimeField(default=timezone.now) contract_state = models.CharField( max_length=63, choices=ORDER_STATES, default=STATE_CREATED, ) state = models.CharField( max_length=63, choices=ORDER_STATES, default=STATE_CREATED, ) state_changed_at = models.DateTimeField(auto_now_add=True) whitelist = models.BooleanField(default=False) whitelist_address = models.CharField(max_length=50, null=True) swap_ether_contract = models.ForeignKey(Contract, null=True) is_exchange = models.BooleanField(default=False) notification = models.BooleanField(default=False) notification_email = models.CharField(max_length=50, null=True, default='') notification_telegram_name = models.CharField(max_length=50, null=True, default='') comment = models.TextField(default='') is_rubic_order = models.BooleanField(default=False) rubic_initialized = models.BooleanField(default=False) is_displayed = models.BooleanField(default=True) is_closed_by_limiter = models.BooleanField(default=False) # ! --- swaped_on_uniswap = models.BooleanField(default=False) # -- # !--- Managers objects = Manager() public_active_orders = PublicActiveOrdersManager(state=STATE_ACTIVE) # --- class Meta: indexes = (models.Index(fields=[ 'id', 'unique_link', ]), ) def __str__(self): return f'Order "{self.name}" (unique link: {self.unique_link})' @check_transaction def msg_deployed(self): self.state = self.STATE_ACTIVE self.contract_state = self.STATE_ACTIVE self.save() if self.user.email: swaps_link = '{protocol}://{url}/public-v3/{unique_link}'.format( protocol=SITE_PROTOCOL, unique_link=self.unique_link, url=SWAPS_URL) sendEMail(swaps_deploed_subject, swaps_deploed_message.format(swaps_link=swaps_link), [self.user.email]) def finalized(self): self.state = self.STATE_DONE self.contract_state = self.STATE_DONE self.state_changed_at = datetime.utcnow() self.save() def cancelled(self): self.state = self.STATE_CANCELLED self.contract_state = self.STATE_CANCELLED self.state_changed_at = datetime.utcnow() self.save() def deposit_order(self, message): msg_amount = message['amount'] base_address = self.base_address.lower() quote_address = self.quote_address.lower() if message['token'] == base_address or message[ 'token'] == quote_address: if message['token'] == self.base_address: self.base_amount_contributed += msg_amount self.base_amount_total += msg_amount else: self.quote_amount_contributed += msg_amount self.quote_amount_total += msg_amount self.save() def refund_order(self, message): msg_amount = message['amount'] base_address = self.base_address.lower() quote_address = self.quote_address.lower() if message['token'] == base_address or message[ 'token'] == quote_address: if message['token'] == self.base_address: self.base_amount_contributed -= msg_amount else: self.quote_amount_contributed -= msg_amount self.save() def save(self, *args, **kwargs): self.base_address = self.base_address.lower() self.quote_address = self.quote_address.lower() self.owner_address = self.owner_address.lower() self.broker_fee_address = self.broker_fee_address.lower() return super().save(*args, **kwargs)
class _ModelWithObjectsManagerAndDefaultMetaOptionsABC(Model): # docs.djangoproject.com/en/dev/ref/models/class/#objects objects: Manager = Manager() # docs.djangoproject.com/en/dev/ref/models/options/#model-meta-options class Meta: # pylint: disable=too-few-public-methods """Metadata.""" # docs.djangoproject.com/en/dev/ref/models/options/#abstract abstract: bool = True # docs.djangoproject.com/en/dev/ref/models/options/#app-label # app_label: str = '...' # docs.djangoproject.com/en/dev/ref/models/options/#base-manager-name base_manager_name: str = 'objects' # docs.djangoproject.com/en/dev/ref/models/options/#db-table # docs.djangoproject.com/en/dev/ref/models/options/#table-names # db_table: str = '...' # docs.djangoproject.com/en/dev/ref/models/options/#db-tablespace db_tablespace: str = '' # docs.djangoproject.com/en/dev/ref/models/options/#default-manager-name default_manager_name: str = 'objects' # docs.djangoproject.com/en/dev/ref/models/options/#default-related-name # default_related_name: str = '...' # docs.djangoproject.com/en/dev/ref/models/options/#get-latest-by # get_latest_by: Union[str, Sequence[str]] = ... # docs.djangoproject.com/en/dev/ref/models/options/#managed managed: bool = True # docs.djangoproject.com/en/dev/ref/models/options/#order-with-respect-to # order_with_respect_to: str = '...' # docs.djangoproject.com/en/dev/ref/models/options/#ordering ordering: Sequence[str] = () # docs.djangoproject.com/en/dev/ref/models/options/#permissions permissions: Sequence[tuple[str, str]] = () # docs.djangoproject.com/en/dev/ref/models/options/#default-permissions default_permissions: Sequence[str] = 'add', 'change', 'delete', 'view' # docs.djangoproject.com/en/dev/ref/models/options/#proxy proxy: bool = False # docs.djangoproject.com/en/dev/ref/models/options/#required-db-features required_db_features: Sequence[str] = () # docs.djangoproject.com/en/dev/ref/models/options/#required-db-vendor # required_db_vendor: str = '...' # docs.djangoproject.com/en/dev/ref/models/options/#select-on-save select_on_save: bool = False # docs.djangoproject.com/en/dev/ref/models/options/#indexes indexes: Sequence[Index] = () # DEPRECATED # docs.djangoproject.com/en/dev/ref/models/options/#unique-together # unique_together: Sequence[Union[str, Sequence[str]]] = () # DEPRECATED # docs.djangoproject.com/en/dev/ref/models/options/#index-together # index_together: Sequence[Union[str, Sequence[str]]] = () # docs.djangoproject.com/en/dev/ref/models/options/#constraints constraints: Sequence[BaseConstraint] = () # docs.djangoproject.com/en/dev/ref/models/options/#verbose-name # verbose_name: str = '...' # docs.djangoproject.com/en/dev/ref/models/options/#verbose-name-plural # verbose_name_plural: str = '...' def __str__(self) -> str: # pylint: disable=no-member return f'{self._meta.verbose_name} #{self.pk}'
def test_supports(self): assert DjangoBackend.supports(QuerySet()) assert DjangoBackend.supports(Manager()) assert not DjangoBackend.supports(Q())
class _ModelWithObjectsManagerAndDefaultMetaOptionsMixInABC(Model): # https://docs.djangoproject.com/en/dev/ref/models/class/#objects # https://docs.djangoproject.com/en/dev/ref/models/class/#django.db.models.Model.objects objects = Manager() # https://docs.djangoproject.com/en/dev/ref/models/options/#model-meta-options class Meta: # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.abstract abstract = True # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.app_label # TODO: *** Django 2 Cannot Interpolate %(app_label), etc. *** # *** so must explicitly set this in non-abstract sub-classes *** # app_label = '%(app_label)s' # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.base_manager_name base_manager_name = 'objects' # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.db_table # https://docs.djangoproject.com/en/dev/ref/models/options/#table-names # TODO: *** Django 2 Cannot Interpolate %(app_label), etc. *** # *** so must explicitly set this in non-abstract sub-classes *** db_table = '"%(app_label)s_%(object_name)s"' # note: except for Oracle, quotes have no effect # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.db_tablespace db_tablespace = None # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.default_manager_name default_manager_name = 'objects' # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.default_related_name # TODO: *** Django 2 Cannot Interpolate %(app_label), etc. *** # *** so must explicitly set this in non-abstract sub-classes *** default_related_name = '%(model_name)ss' # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.get_latest_by get_latest_by = None # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.managed managed = True # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.order_with_respect_to order_with_respect_to = None # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.ordering ordering = None # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.permissions permissions = () # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.default_permissions default_permissions = \ 'add', \ 'change', \ 'delete', \ 'view' # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.proxy proxy = False # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.required_db_features required_db_features = () # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.required_db_vendor required_db_vendor = 'postgresql' # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.select_on_save select_on_save = False # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.indexes indexes = () # (MAY BE DEPRECATED) # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.unique_together # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.index_together # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.constraints constraints = () # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.verbose_name # TODO: *** Django 2 Cannot Interpolate %(app_label), etc. *** verbose_name = '%(object_name)s' # https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.verbose_name_plural # TODO: *** Django 2 Cannot Interpolate '%(app_label)', etc. *** # *** so must explicitly set this in non-abstract sub-classes *** verbose_name_plural = '%(object_name)ss'
class Room(AbstractName): option = models.ManyToManyField(RoomOption, verbose_name=_('Availability options'), blank=True) hotel = models.ForeignKey(Hotel, verbose_name=_('Hotel'), null=True, blank=True) places = models.IntegerField(_("Place Count"), choices=PLACES_CHOICES, default=PLACES_UNKNOWN, db_index=True) typefood = models.IntegerField(_("Type of food"), choices=TYPEFOOD, default=TYPEFOOD_RO, db_index=True) surface_area = models.PositiveSmallIntegerField( verbose_name=_('Surface area (m2)'), default=0, db_index=True) class Meta: verbose_name = _("Room") verbose_name_plural = _("Rooms") objects = Manager() def __str__(self): try: return _("%(room)s :: %(places)s :: %(hotel)s") % { 'room': self.get_name, 'places': self.places, 'hotel': self.hotel.get_name } except: return self.name @property def metadesc(self): r = self.description if get_language() == 'en' and self.description_en: r = self.description_en return r.split('. ')[0] + '.' @property def min_current_amount(self): return self.amount_on_date(now()) def amount_on_date(self, on_date, guests=None): result = PlacePrice.objects.filter(settlement__room=self, settlement__enabled=True, date=on_date).\ aggregate(Min('amount')) amount = result['amount__min'] if amount: return amount return 0 def amount_date_guests(self, on_date, guests): # noinspection PyBroadException try: s = SettlementVariant.objects.select_related().filter(room=self, enabled=True, settlement__gte=guests).\ order_by('settlement')[0] return s.amount_on_date(on_date) except: return None def discount_on_date(self, on_date): # noinspection PyBroadException try: return Discount.objects.get(room=self, date=on_date).discount except: return None def settlement_on_date_for_guests(self, on_date, guests): result = SettlementVariant.objects.filter(room=self, enabled=True, settlement__gte=guests).\ aggregate(Min('settlement')) return result['settlement__min'] def active_settlements(self): return SettlementVariant.objects.filter( room=self, enabled=True).order_by('settlement') def get_absolute_url(self): return reverse('room_detail', kwargs={ 'city': self.hotel.city.slug, 'slug': self.hotel.slug, 'pk': self.pk }) def active_discounts(self): discounts = RoomDiscount.objects.filter(room=self, discount__enabled=True).\ values_list('discount__pk', flat=True).distinct() return Discount.objects.filter(pk__in=discounts).order_by('pk') def inactive_discounts(self): discounts = RoomDiscount.objects.filter(room=self, discount__enabled=True).\ values_list('discount__pk', flat=True).distinct() return Discount.objects.filter(hotel=self.hotel).exclude( pk__in=discounts).order_by('pk') @property def simple_discount(self): result, created = SimpleDiscount.objects.get_or_create(room=self) return result
class Hotel(AbstractName, AbstractGeo, HotelPoints): register_date = models.DateTimeField(_("Register from"), default=now) email = models.CharField(verbose_name=_("Email"), blank=True, max_length=75) phone = models.CharField(max_length=100, verbose_name=_('Phone'), blank=True) fax = models.CharField(max_length=100, verbose_name=_('Fax'), blank=True) website = models.URLField(max_length=150, verbose_name=_('Website'), blank=True) contact_email = models.CharField(verbose_name=_("Contact Email"), blank=True, max_length=75) contact_name = models.CharField(max_length=100, verbose_name=_('Contact Name'), blank=True) room_count = models.IntegerField(_('Count of Rooms'), blank=True, default=0) option = models.ManyToManyField(HotelOption, verbose_name=_('Hotel Options'), blank=True) starcount = models.IntegerField(_("Count of Stars"), choices=STAR_CHOICES, default=UNKNOWN_STAR, db_index=True) choice = models.IntegerField(_("Type of Hotel"), choices=HOTEL_CHOICES, default=HOTEL_HOTEL, editable=False, db_index=True) admins = models.ManyToManyField(settings.AUTH_USER_MODEL, verbose_name=_('Hotel Admins'), blank=True) point = models.DecimalField(_("Point of hotel"), editable=False, default=0, decimal_places=1, max_digits=4, db_index=True) best_offer = models.BooleanField(verbose_name=_("Best offer"), default=False, db_index=True) in_top10 = models.BooleanField(verbose_name=_("In top 10"), default=False, db_index=True) current_amount = models.DecimalField(verbose_name=_('Current amount'), default=0, max_digits=20, decimal_places=3, db_index=True) booking_terms = models.TextField(verbose_name=_("Booking terms"), blank=True) schema_transit = models.TextField(verbose_name=_("Schema of transit"), blank=True) booking_terms_en = models.TextField( verbose_name=_("Booking terms(English)"), blank=True) schema_transit_en = models.TextField( verbose_name=_("Schema of transit(English)"), blank=True) payment_method = models.ManyToManyField(PaymentMethod, verbose_name=_('Payment methods'), blank=True) updated_date = models.DateTimeField(_("Updated date"), null=True, blank=True) condition_cancellation = models.TextField( verbose_name=_("Condition cancellation"), blank=True) condition_cancellation_en = models.TextField( verbose_name=_("Condition cancellation(English)"), blank=True) paid_services = models.TextField(verbose_name=_("Paid services"), blank=True) paid_services_en = models.TextField( verbose_name=_("Paid services(English)"), blank=True) time_on = models.CharField(max_length=5, verbose_name=_('Time on'), blank=True) time_off = models.CharField(max_length=5, verbose_name=_('Time off'), blank=True) work_on_request = models.BooleanField(verbose_name=_("Work on request"), default=False, db_index=True) hoteltype = models.ForeignKey(HotelType, verbose_name=_('Hotel type'), null=True, blank=True, db_index=True) addon_city = models.ForeignKey(City, verbose_name=_('Main city'), related_name='main_city', null=True, blank=True, db_index=True) class Meta: verbose_name = _("Hotel") verbose_name_plural = _("Hotels") ordering = ("name", ) objects = Manager() def get_address(self): if get_language() == 'en': if self.address_en: return self.address_en return self.address def get_schema_transit(self): if get_language() == 'en': if self.schema_transit_en: return self.schema_transit_en return self.schema_transit def get_booking_terms(self): if get_language() == 'en': if self.booking_terms_en: return self.booking_terms_en return self.booking_terms def get_condition_cancellation(self): if get_language() == 'en': if self.condition_cancellation_en: return self.condition_cancellation_en return self.condition_cancellation def get_paid_services(self): if get_language() == 'en': if self.paid_services_en: return self.paid_services_en return self.paid_services @property def metadesc(self): r = self.description if get_language() == 'en' and self.description_en: r = self.description_en return r.split('. ')[0] + '.' def get_count_stars_hotels(self): qs = Hotel.objects.filter(city=self.city) two = qs(starcount=TWO_STAR).count() three = qs(starcount=THREE_STAR).count() four = qs(starcount=FOUR_STAR).count() five = qs(starcount=FIVE_STAR).count() return [two, three, four, five] def fulladdress(self): return "%s, %s" % (self.address, self.city.name) def in_city(self): return Hotel.objects.filter(city=self.city).count() def in_system(self): return Hotel.objects.all().count() def stars(self): if self.starcount == -10: return None elif self.starcount == -1: return 'apartaments' elif self.starcount == -2: return 'hostel' elif not self.starcount: return 'mini' else: return range(0, int(self.starcount)) def all_room_options(self): return RoomOption.objects.filter( enabled=True, room__hotel=self).select_related().order_by( 'category', 'position', 'name').distinct() def get_absolute_url(self): return reverse('hotel_detail', kwargs={ 'city': self.city.slug, 'slug': self.slug }) def get_cabinet_url(self): return reverse('cabinet_info', kwargs={ 'city': self.city.slug, 'slug': self.slug }) def get_current_percent(self): try: return AgentPercent.objects.filter(hotel=self).filter( date__lte=now()).order_by('-date')[0].percent except IndexError as ierr: return None def get_percent_on_date(self, on_date): return AgentPercent.objects.filter(hotel=self).filter( date__lte=on_date).order_by('-date')[0].percent @property def min_current_amount(self): return self.amount_on_date(now()) def amount_on_date(self, on_date): result = PlacePrice.objects.filter(settlement__room__hotel=self, settlement__enabled=True, date=on_date).\ aggregate(Min('amount')) amount = result['amount__min'] if amount: return amount return 0 def save(self, *args, **kwargs): if not self.slug: if not self.pk: super(Hotel, self).save(*args, **kwargs) self.slug = self.pk else: self.slug = self.slug.strip().replace(' ', '-') if Hotel.objects.filter( slug=self.slug, city=self.city).exclude(pk=self.pk).count(): self.slug = self.pk self.updated_date = now() super(Hotel, self).save(*args, **kwargs) def update_hotel_amount(self): amount = self.min_current_amount if amount: self.current_amount = amount else: self.current_amount = 0 self.save() def tourism_places(self): places = Tourism.objects.raw( places_near_object(self, settings.TOURISM_PLACES_RADIUS, 'address_tourism')) all_places = [] for p in places: all_places.append(p.id) return Tourism.objects.filter(pk__in=all_places).order_by('category') def complete_booking_users_id(self): # TODO Check status of bookings users_id = Booking.objects.filter(hotel=self).values_list('user', flat=True) return users_id def __str__(self): # noinspection PyBroadException try: return _("%(hotel)s :: %(city)s") % { 'hotel': self.get_name, 'city': self.city.get_name, } except: return self.name def available_rooms_for_guests_in_period(self, guests, from_date, to_date): # Find available rooms for this guests count and for searched dates need_days = (to_date - from_date).days date_period = (from_date, to_date - timedelta(days=1)) rooms_with_amount = SettlementVariant.objects.filter(enabled=True, settlement__gte=guests, room__hotel=self, placeprice__date__range=date_period, placeprice__amount__gt=0).\ annotate(num_days=Count('pk')).\ filter(num_days__gte=need_days).order_by('room__pk').values_list('room__pk', flat=True).distinct() room_not_avail = Room.objects.filter(pk__in=rooms_with_amount, availability__date__range=date_period, availability__min_days__gt=need_days).\ annotate(num_days=Count('pk')).filter(num_days__gt=0).order_by('pk').\ values_list('pk', flat=True).distinct() rooms = Room.objects.exclude(pk__in=room_not_avail).filter(pk__in=rooms_with_amount, availability__date__range=date_period, availability__placecount__gt=0).\ annotate(num_days=Count('pk')).filter(num_days__gte=need_days) return rooms
def test_get_backend(self): assert isinstance(get_backend(QuerySet()), DjangoBackend) assert isinstance(get_backend(Manager()), DjangoBackend)
class InvalidModel(TranslatableModel): translations = TranslatedFields(translated=models.CharField( max_length=250)) object = Manager()
class ModelWithMultipleManagers(models.Model): gender = models.SmallIntegerField() objects = Manager() men = MenManager() women = WomenManager()
class Booking(MoneyBase, AbstractIP): user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('User'), blank=True, null=True) date = models.DateTimeField(verbose_name=_("Creation date"), default=now) system_id = models.IntegerField(_("ID in system"), default=0) from_date = models.DateField(_("From")) to_date = models.DateField(_("To")) settlement = models.ForeignKey(SettlementVariant, verbose_name=_('Settlement Variant'), null=True, on_delete=models.SET_NULL) settlement_txt = models.CharField( verbose_name=_("Settlement Variant in text"), max_length=255, blank=True) hotel = models.ForeignKey(Hotel, verbose_name=_('Hotel'), blank=True, null=True, on_delete=models.SET_NULL) hotel_txt = models.CharField(verbose_name=_("Hotel in text"), max_length=255, blank=True) status = models.IntegerField(_("Booking status"), choices=STATUS_CHOICES, default=STATUS_UNKNOWN) first_name = models.CharField(verbose_name=_("First name"), max_length=100) middle_name = models.CharField(verbose_name=_("Middle name"), max_length=100, blank=True) last_name = models.CharField(verbose_name=_("Last name"), max_length=100) phone = models.CharField(max_length=100, verbose_name=_('Phone'), blank=True) email = models.CharField(_('E-mail'), blank=True, max_length=100) uuid = models.CharField(verbose_name=_("Unique ID"), max_length=64, blank=True, editable=False) commission = models.DecimalField(verbose_name=_('Commission'), default=0, max_digits=20, decimal_places=3) hotel_sum = models.DecimalField(verbose_name=_('Hotel Sum'), default=0, max_digits=20, decimal_places=3) card_number = models.CharField(verbose_name=_("Card number"), max_length=16, blank=True) card_valid = models.CharField(verbose_name=_("Card valid to"), max_length=5, blank=True) card_holder = models.CharField(verbose_name=_("Card holder"), max_length=50, blank=True) card_cvv2 = models.CharField( verbose_name=_("Card verification value(CVV2)"), max_length=4, blank=True) payment_method = models.ForeignKey(PaymentMethod, verbose_name=_('Payment method'), null=True) enabled = models.BooleanField(verbose_name=_('Enabled'), default=False, db_index=True) guests = models.PositiveSmallIntegerField(_("Guests"), db_index=True, default=0) btype = models.IntegerField(_("Booking type"), choices=BOOKING_CHOICES, default=BOOKING_UNKNOWN) bdiscount = models.PositiveSmallIntegerField( verbose_name=_('Discount percent'), default=0, db_index=True) typefood = models.IntegerField(_("Type of food"), choices=TYPEFOOD, db_index=True, null=True) freecancel = models.PositiveSmallIntegerField( verbose_name=_('Free cancel days'), default=0, db_index=True) penaltycancel = models.DecimalField( verbose_name=_('Penalty for cancellation'), default=0, max_digits=20, decimal_places=3) comment = models.TextField(verbose_name=_("Client comment"), blank=True, default='') amount_no_discount = models.DecimalField( verbose_name=_('Amount without discount'), default=0, max_digits=22, decimal_places=5, db_index=True) cancel_time = models.DateTimeField( verbose_name=_("Time/date of cancellation"), blank=True, null=True) objects = Manager() class Meta: ordering = ("-date", ) verbose_name = _("Booking") verbose_name_plural = _("Bookings") def __str__(self): return "Booking - %s" % self.pk @property def days(self): return (self.to_date - self.from_date).days @property def freecancel_before(self): if self.freecancel > 0: return self.from_date - timedelta(days=self.freecancel) return False @property def allow_penalty(self): if self.freecancel_before and self.hotel and self.btype == BOOKING_GB: offset = self.hotel.city.time_offset for_time = self.hotel.time_on for_time1 = time(int(for_time[:2]), int(for_time[3:5])) if now() > datetime.combine(self.freecancel_before, for_time1) - timedelta(hours=offset): return True return False def get_absolute_url(self): if not self.uuid: self.save() return reverse('booking_hotel_detail', kwargs={'slug': self.uuid}) def get_client_url(self): if not self.uuid: self.save() return reverse('booking_user_detail', kwargs={'slug': self.uuid}) @property def room_day_cost(self): return self.amount / self.days @property def room_day_cost_no_amount(self): if self.amount_no_discount > 0: return self.amount_no_discount / self.days if self.bdiscount > 0: return ((self.amount * 100) / (100 - self.bdiscount)) / self.days return self.room_day_cost def save(self, *args, **kwargs): if not self.uuid: self.uuid = uuid4() if self.system_id < 1: new_id = random.randint(100000000, 999999999) while Booking.objects.filter(system_id=new_id).count() > 0: new_id = random.randint(100000000, 999999999) self.system_id = new_id super(Booking, self).save(*args, **kwargs)
class Event(StatusModel): """ Events * draft - totally invisible * planning - only event description is shown * active - event is scheduled, speakers also visible * archived - event passed, registration is disabled """ STATUS = Choices( 'planning', 'active', 'archived', 'draft', ) name = models.CharField(u'Название', max_length=1024) number = models.SmallIntegerField(u'Номер', blank=True, null=True) description = models.TextField(u'Описание', blank=True) image = models.ImageField(u'Изображение', upload_to='events', null=True, blank=True) date = models.DateTimeField(u'Начало', blank=True, null=True) venue = models.ForeignKey('Venue', blank=True, null=True) sponsors = models.ManyToManyField('Sponsor', verbose_name=u'Спонсоры', blank=True) registration_link = models.URLField(u'Ссылка на событие', blank=True) streaming_url = models.URLField(u'Ссылка на трансляцию', blank=True) streaming_embed = models.TextField( u'Embed трансляции', blank=True, help_text='html с ютуба или другого источника') manual_on_air = models.NullBooleanField( u'Включить трансляцию', default=None, help_text=u'Включается автоматически за полчаса до начала и идёт 4 часа.' u' Нужно, для тестирования в другое время.') # Deprecated: timepad_id = models.IntegerField(u'ID события на Timepad', blank=True, default=0, editable=False) votable = models.BooleanField(u'Включить голосование', default=False, editable=False) objects = Manager() visible = QueryManager( status__in=[STATUS.planning, STATUS.active, STATUS.archived]) future = QueryManager(status__in=[STATUS.planning, STATUS.active]) def __str__(self): if self.number: return u'{0} №{1}'.format(self.name, self.number) else: return self.name def __repr__(self): return '<Event №%s>' % self.number @permalink def get_absolute_url(self): return 'event', [self.number] @property def is_active(self): return self.status == self.STATUS.active def days_delta(self): if not self.date: return None delta = (self.date.date() - datetime.datetime.today().date()).days if delta < 0: return None # passed if delta >= 0: return delta @property def on_air(self): if self.manual_on_air is not None: return self.manual_on_air datetime_start = self.date - datetime.timedelta(minutes=30) datetime_stop = self.date + datetime.timedelta( hours=4) # Actually meetups are not that long return datetime_start <= datetime.datetime.now() <= datetime_stop def get_registration_url(self): if self.timepad_id: return 'https://moscowdjango.timepad.ru/event/%s/' % self.timepad_id if self.registration_link: return self.registration_link @classmethod def spotlight(cls, with_drafts=False): """ Last active or last planned or last archived """ try: if with_drafts: return Event.objects.latest() return Event.future.latest() except Event.DoesNotExist: return None class Meta: verbose_name = u'Событие' verbose_name_plural = u'События' get_latest_by = 'number' ordering = ['-date']
class Booking(MoneyBase, AbstractIP): user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('User'), blank=True, null=True) date = models.DateTimeField(verbose_name=_("Creation date"), default=now) system_id = models.IntegerField(_("ID in system"), default=0) from_date = models.DateField(_("From")) to_date = models.DateField(_("To")) settlement = models.ForeignKey(SettlementVariant, verbose_name=_('Settlement Variant'), null=True, on_delete=models.SET_NULL) settlement_txt = models.CharField(verbose_name=_("Settlement Variant in text"), max_length=255, blank=True) hotel = models.ForeignKey(Hotel, verbose_name=_('Hotel'), blank=True, null=True, on_delete=models.SET_NULL) hotel_txt = models.CharField(verbose_name=_("Hotel in text"), max_length=255, blank=True) status = models.IntegerField(_("Booking status"), choices=STATUS_CHOICES, default=STATUS_UNKNOWN) first_name = models.CharField(verbose_name=_("First name"), max_length=100) middle_name = models.CharField(verbose_name=_("Middle name"), max_length=100, blank=True) last_name = models.CharField(verbose_name=_("Last name"), max_length=100) phone = models.CharField(max_length=100, verbose_name=_('Phone'), blank=True) email = models.CharField(_('E-mail'), blank=True, max_length=100) uuid = models.CharField(verbose_name=_("Unique ID"), max_length=64, blank=True, editable=False) commission = models.DecimalField(verbose_name=_('Commission'), default=0, max_digits=20, decimal_places=3) hotel_sum = models.DecimalField(verbose_name=_('Hotel Sum'), default=0, max_digits=20, decimal_places=3) card_number = models.CharField(verbose_name=_("Card number"), max_length=16, blank=True) card_valid = models.CharField(verbose_name=_("Card valid to"), max_length=5, blank=True) card_holder = models.CharField(verbose_name=_("Card holder"), max_length=50, blank=True) card_cvv2 = models.CharField(verbose_name=_("Card verification value(CVV2)"), max_length=4, blank=True) payment_method = models.ForeignKey(PaymentMethod, verbose_name=_('Payment method')) enabled = models.BooleanField(verbose_name=_('Enabled'), default=False, db_index=True) guests = models.PositiveSmallIntegerField(_("Guests"), db_index=True, default=0) objects = Manager() class Meta: ordering = ("-date",) verbose_name = _("Booking") verbose_name_plural = _("Bookings") def __str__(self): return "Booking - %s" % self.pk @property def days(self): return (self.to_date - self.from_date).days @permalink def get_absolute_url(self): if not self.uuid: self.save() return 'booking_hotel_detail', (), {'slug': self.uuid} @permalink def get_client_url(self): if not self.uuid: self.save() return 'booking_user_detail', (), {'slug': self.uuid} @property def days(self): delta = self.to_date - self.from_date return delta.days def save(self, *args, **kwargs): if not self.uuid: self.uuid = uuid4() if self.system_id < 1: new_id = random.randint(100000000, 999999999) while Booking.objects.filter(system_id=new_id).count() > 0: new_id = random.randint(100000000, 999999999) self.system_id = new_id super(Booking, self).save(*args, **kwargs)
def clean_orphans(output_log=True, delete=False): """ Supprimer les fichiers orphelins du répertoire MEDIA """ from django.contrib.contenttypes.fields import ContentType # Configuration dirs = settings.ORPHAN_CHECK_DIRS apps = settings.ORPHAN_CHECK_APPS fields, db_files, deletable = [], [], [] counter, deleted = 0, 0 # Trouver tous les champs FileField for model in ContentType.objects.filter(app_label__in=apps): model_class = model.model_class() model_class.add_to_class('all_objects', Manager()) for field in model_class._meta.fields: if field.get_internal_type( ) == 'FileField' and not model_class._meta.abstract: fields.append( [model_class, field.name, model_class._meta.object_name]) # Recenser tous les liens vers des fichiers for field in fields: model, field_name = field[0], field[1] files = model.all_objects.exclude(**{ field_name: '' }).distinct().values_list(field_name, flat=True) files = [join(settings.MEDIA_ROOT, item) for item in files if item] # Supprimer les entrées liées à un fichier non existant for name in files: if not default_storage.exists(name): relative_name = relpath(name, settings.MEDIA_ROOT) with default_storage.open(name, 'w'): pass # Créer le fichier pour éviter une erreur lors de la suppression de l'instance queryset = model.all_objects.filter( **{field_name: relative_name}) queryset.delete() default_storage.delete(name) deleted += 1 db_files += files # Parcourir tous les fichiers for directory in dirs: for root, _dummy, filenames in os.walk( join(settings.MEDIA_ROOT, directory)): for filename in filenames: filepath = join(root, filename) counter += 1 if filepath not in db_files: deletable.append(filepath) deleted += 1 # Supprimer les fichiers si demandé if delete is True: for item in deletable: try: default_storage.remove(item) except (OSError, IOError): deleted -= 1 # Sortie de journalisation if output_log is True: output = render_to_string( 'core/view/orphan-log.txt', { 'counter': counter, 'deleted': deleted, 'files_delete': deletable, 'files': db_files, 'fields': fields }) logger.info(output) print(output) return output