class MyModel(models.Model): color = CharEnumField(Color, max_length=1) taste = IntegerEnumField(Taste, default=Taste.SWEET) taste_null_default = IntegerEnumField(Taste, null=True, blank=True, default=None) default_none = IntegerEnumField(Taste, default=None, null=True, blank=True) nullable = IntegerEnumField(Taste, null=True, blank=True) random_code = models.TextField(null=True, blank=True) zero_field = IntegerEnumField(ZeroEnum, null=True, default=None, blank=True) int_enum = IntegerEnumField(IntegerEnum, null=True, default=None, blank=True) sub_int_enum = IntegerEnumSubField('int_enum', SubIntegerEnum, null=True, default=None, blank=True) zero2 = IntegerEnumField(ZeroEnum, default=ZeroEnum.ZERO) labeled_enum = CharEnumField(LabeledEnum, blank=True, null=True) state = IntegerEnumField(StateFlow, default=StateFlow.START) any_first_state = IntegerEnumField(StateFlowAnyFirst, default=StateFlowAnyFirst.START)
class CommandLog(CommandLogStrMixin, Log): """ Represents a log of a command run. Attributes: start: Date and time when command was started. stop: Date and time when command finished. time: Command processing time in miliseconds. name: Name of the command. options: Arguments/options the command was run with. is_executed_from_command_line: Flag that indicates if command was run from the command line. output: Standard and error output of the command. is_successful: Flag that indicates if command finished successfully. """ name = models.CharField( max_length=250, blank=False, null=False, editable=False, db_index=True ) input = models.TextField( blank=False, null=False, editable=False ) is_executed_from_command_line = models.BooleanField( blank=False, null=False, default=False, editable=False ) output = models.TextField( blank=True, null=True, editable=False ) state = IntegerEnumField( null=False, blank=False, enum=CommandState, default=CommandState.ACTIVE, db_index=True ) related_objects = MultipleDBGenericManyToManyField() objects = BaseLogQuerySet.as_manager() class Meta: ordering = ('-start',)
class RequestLog(Log): host = models.CharField( max_length=255, null=False, blank=False, db_index=True ) method = models.SlugField( max_length=7, null=False, blank=False, db_index=True ) path = models.CharField( max_length=2000, null=False, blank=True, db_index=True ) queries = models.JSONField( null=True, blank=True, encoder=DjangoJSONEncoder ) is_secure = models.BooleanField( default=False, null=False, blank=False ) # Request information request_headers = models.JSONField( null=True, blank=True, encoder=DjangoJSONEncoder ) request_body = models.TextField( null=True, blank=True ) # Response information response_code = models.PositiveSmallIntegerField( null=True, blank=True ) response_headers = models.JSONField( null=True, blank=True, encoder=DjangoJSONEncoder ) response_body = models.TextField( null=True, blank=True ) state = IntegerEnumField( enum=RequestLogState, null=False, blank=False, default=RequestLogState.INCOMPLETE ) def __str__(self): return ' '.join( (force_text(v) for v in ( self.slug, self.response_code, localtime(self.start.replace(microsecond=0)) ) if v) ) class Meta: abstract = True
class CeleryTaskRunLog(CeleryTaskRunLogStrMixin, Log): celery_task_id = models.UUIDField( max_length=250, db_index=True, null=True, blank=True ) name = models.CharField( null=False, blank=False, max_length=250, db_index=True ) queue_name = models.CharField( null=True, blank=True, max_length=250 ) input = models.TextField( blank=True, null=True, editable=False ) task_args = models.JSONField( null=True, blank=True, editable=False, encoder=DjangoJSONEncoder ) task_kwargs = models.JSONField( null=True, blank=True, editable=False, encoder=DjangoJSONEncoder ) state = IntegerEnumField( null=False, blank=False, enum=CeleryTaskRunLogState, default=CeleryTaskRunLogState.ACTIVE, db_index=True ) result = models.JSONField( blank=True, null=True, editable=False, encoder=DjangoJSONEncoder ) output = models.TextField( blank=True, null=True, editable=False ) retries = models.PositiveSmallIntegerField( null=False, blank=False, default=0 ) estimated_time_of_next_retry = models.DateTimeField( null=True, blank=True ) waiting_time = models.FloatField( null=True, blank=True ) related_objects = MultipleDBGenericManyToManyField() objects = BaseLogQuerySet.as_manager() class Meta: ordering = ('-start',) def __str__(self): return '{} ({})'.format(self.name, self.get_state_display()) def get_task_invocation_logs(self): return CeleryTaskInvocationLog.objects.filter(celery_task_id=self.celery_task_id)
class CeleryTaskInvocationLog(CeleryTaskInvocationLogStrMixin, Log): celery_task_id = models.UUIDField( max_length=250, db_index=True, null=True, blank=True ) name = models.CharField( null=False, blank=False, max_length=250, db_index=True ) queue_name = models.CharField( null=True, blank=True, max_length=250 ) applied_at = models.DateTimeField( null=False, blank=False ) triggered_at = models.DateTimeField( null=True, blank=True ) is_unique = models.BooleanField() is_async = models.BooleanField() is_on_commit = models.BooleanField() input = models.TextField( blank=True, null=True, editable=False ) task_args = models.JSONField( null=True, blank=True, editable=False, encoder=DjangoJSONEncoder ) task_kwargs = models.JSONField( null=True, blank=True, editable=False, encoder=DjangoJSONEncoder ) estimated_time_of_first_arrival = models.DateTimeField( null=True, blank=True ) expires_at = models.DateTimeField( null=True, blank=True ) stale_at = models.DateTimeField( null=True, blank=True ) state = IntegerEnumField( null=False, blank=False, enum=CeleryTaskInvocationLogState, default=CeleryTaskInvocationLogState.WAITING, db_index=True ) related_objects = MultipleDBGenericManyToManyField() objects = CeleryTaskInvocationLogManager.from_queryset(BaseLogQuerySet)() class Meta: ordering = ('-start',) def __str__(self): return '{} ({})'.format(self.name, self.state.label) @property def runs(self): return CeleryTaskRunLog.objects.filter(celery_task_id=self.celery_task_id) @property def last_run(self): return CeleryTaskRunLog.objects.filter(celery_task_id=self.celery_task_id).first() @property def first_run(self): return CeleryTaskRunLog.objects.filter(celery_task_id=self.celery_task_id).last()
def test_django_admin_lookup_value_for_integer_enum_field(): field = IntegerEnumField(Taste) assert field.get_prep_value( str(Taste.BITTER.value )) == 3, "get_prep_value should be able to convert from strings"
class LegalReason(SmartModel): objects = LegalReasonManager.from_queryset(LegalReasonQuerySet)() issued_at = models.DateTimeField( verbose_name=_('issued at'), null=False, blank=False, ) expires_at = models.DateTimeField(verbose_name=_('expires at'), null=True, blank=True, db_index=True) tag = models.CharField(verbose_name=_('tag'), null=True, blank=True, max_length=100) state = IntegerEnumField(verbose_name=_('state'), null=False, blank=False, enum=LegalReasonState, default=LegalReasonState.ACTIVE, db_index=True) purpose_slug = models.CharField(verbose_name=_('purpose'), null=False, blank=False, max_length=100, db_index=True) source_object_content_type = models.ForeignKey( ContentType, verbose_name=_('source object content type'), null=False, blank=False, on_delete=models.DO_NOTHING) source_object_id = models.TextField(verbose_name=_('source object ID'), null=False, blank=False, db_index=True) source_object = GenericForeignKey('source_object_content_type', 'source_object_id') class Meta: verbose_name = _('legal reason') verbose_name_plural = _('legal reasons') ordering = ('-created_at', ) unique_together = ('purpose_slug', 'source_object_content_type', 'source_object_id') def __str__(self): return f'{self.purpose.name}' @property def is_active(self): return self.state == LegalReasonState.ACTIVE @property def purpose(self) -> Type["AbstractPurpose"]: return purpose_register.get(self.purpose_slug, None) def _anonymize_obj(self, *args, **kwargs): purpose_register[self.purpose_slug]().anonymize_obj( self.source_object, self, *args, **kwargs) def _deanonymize_obj(self, *args, **kwargs): purpose_register[self.purpose_slug]().deanonymize_obj( self.source_object, *args, **kwargs) def expire(self): """Anonymize obj and set state as expired.""" with transaction.atomic(): self._anonymize_obj() self.change_and_save(state=LegalReasonState.EXPIRED) def deactivate(self): """Deactivate obj and run anonymization.""" with transaction.atomic(): self._anonymize_obj() self.change_and_save(state=LegalReasonState.DEACTIVATED) def renew(self): with transaction.atomic(): self.change_and_save( expires_at=timezone.now() + purpose_register[self.purpose_slug]().expiration_timedelta, state=LegalReasonState.ACTIVE) self._deanonymize_obj()