def pre_save(sender, instance, raw, using, update_fields, **kwargs): """https://docs.djangoproject.com/es/1.10/ref/signals/#post-save""" if raw: # Return if loading Fixtures return if instance.pk is None: # avoid many to many errors return try: with transaction.atomic(): if not should_audit(instance): return False object_json_repr = serializers.serialize("json", [instance]) if instance.pk is None: # avoid many to many errors return else: created = False # created or updated? if not created: old_model = sender.objects.get(pk=instance.pk) delta = model_delta(old_model, instance) changed_fields = json.dumps(delta) event_type = CRUDEvent.UPDATE # user try: user = get_current_user() # validate that the user still exists user = get_user_model().objects.get(pk=user.pk) except: user = None if isinstance(user, AnonymousUser): user = None # callbacks kwargs['request'] = get_current_request() # make request available for callbacks create_crud_event = all(callback(instance, object_json_repr, created, raw, using, update_fields, **kwargs) for callback in CRUD_DIFFERENCE_CALLBACKS if callable(callback)) # create crud event only if all callbacks returned True if create_crud_event and not created: crud_event = CRUDEvent.objects.create( event_type=event_type, object_repr=str(instance), object_json_repr=object_json_repr, changed_fields=changed_fields, content_type=ContentType.objects.get_for_model(instance), object_id=instance.pk, user=user, datetime=timezone.now(), user_pk_as_string=str(user.pk) if user else user ) except Exception: logger.exception('easy audit had a pre-save exception.')
def pre_save(sender, instance, raw, using, update_fields, **kwargs): """https://docs.djangoproject.com/es/1.10/ref/signals/#post-save""" if raw: # Return if loading Fixtures return try: with transaction.atomic(using=using): if not should_audit(instance): return False try: object_json_repr = serializers.serialize("json", [instance]) object_json_repr = scrub_sensitive_fields_object_json_repr( object_json_repr) except Exception: # We need a better way for this to work. ManyToMany will fail on pre_save on create return None if instance.pk is None: created = True else: created = False # created or updated? if not created: try: old_model = sender.objects.get(pk=instance.pk) delta = model_delta(old_model, instance) if not delta and getattr( settings, "DJANGO_EASY_AUDIT_CRUD_EVENT_NO_CHANGED_FIELDS_SKIP", False): return False changed_fields = json.dumps(delta) event_type = CRUDEvent.UPDATE except ObjectDoesNotExist: created = True # user try: user = get_current_user() # validate that the user still exists user = get_user_model().objects.get(pk=user.pk) except: user = None if isinstance(user, AnonymousUser): user = None # callbacks kwargs['request'] = get_current_request( ) # make request available for callbacks create_crud_event = all( callback(instance, object_json_repr, created, raw, using, update_fields, **kwargs) for callback in CRUD_DIFFERENCE_CALLBACKS if callable(callback)) # create crud event only if all callbacks returned True if create_crud_event and not created: c_t = ContentType.objects.get_for_model(instance) def crud_flow(): try: # atomicity based on the easyaudit database alias with transaction.atomic(using=DATABASE_ALIAS): crud_event = audit_logger.crud({ 'event_type': event_type, 'object_repr': str(instance), 'object_json_repr': object_json_repr, 'changed_fields': changed_fields, 'content_type_id': c_t.id, 'object_id': instance.pk, 'user_id': getattr(user, 'id', None), 'datetime': timezone.now(), 'user_pk_as_string': str(user.pk) if user else user }) except Exception as e: try: logger.exception( "easy audit had a pre_save exception on CRUDEvent creation. instance: {}, instance pk: {}" .format(instance, instance.pk)) except Exception: pass if getattr(settings, "TEST", False): crud_flow() else: transaction.on_commit(crud_flow, using=using) except Exception: logger.exception('easy audit had a pre-save exception.')
def pre_save(sender, instance, raw, using, update_fields, **kwargs): """https://docs.djangoproject.com/es/1.10/ref/signals/#post-save""" if raw: # Return if loading Fixtures return try: with transaction.atomic(): if not should_audit(instance): return False try: object_json_repr = serializers.serialize("json", [instance]) except Exception: # We need a better way for this to work. ManyToMany will fail on pre_save on create return None if instance.pk is None: created = True else: created = False # created or updated? if not created: old_model = sender.objects.get(pk=instance.pk) delta = model_delta(old_model, instance) changed_fields = json.dumps(delta) event_type = CRUDEvent.UPDATE # user try: user = get_current_user() # validate that the user still exists user = get_user_model().objects.get(pk=user.pk) except: user = None if isinstance(user, AnonymousUser): user = None # callbacks kwargs['request'] = get_current_request( ) # make request available for callbacks create_crud_event = all( callback(instance, object_json_repr, created, raw, using, update_fields, **kwargs) for callback in CRUD_DIFFERENCE_CALLBACKS if callable(callback)) # create crud event only if all callbacks returned True if create_crud_event and not created: c_t = ContentType.objects.get_for_model(instance) sid = transaction.savepoint() try: with transaction.atomic(): if any( isinstance(instance, model) for model in REGISTERED_CLASSES_BIGINTEGER): crud_model = CRUDEventBigInteger elif any( isinstance(instance, model) for model in REGISTERED_CLASSES_UUID): crud_model = CRUDEventUUID else: crud_model = CRUDEvent crud_event = crud_model.objects.create( event_type=event_type, object_repr=str(instance), object_json_repr=object_json_repr, changed_fields=changed_fields, content_type_id=c_t.id, object_id=instance.pk, user_id=getattr(user, 'id', None), datetime=timezone.now(), user_pk_as_string=str(user.pk) if user else user) except Exception as e: logger.exception( "easy audit had a pre-save exception on CRUDEvent creation. instance: {}, instance pk: {}" .format(instance, instance.pk)) transaction.savepoint_rollback(sid) except Exception: logger.exception('easy audit had a pre-save exception.')
def pre_save(sender, instance, raw, using, update_fields, **kwargs): """https://docs.djangoproject.com/es/1.10/ref/signals/#post-save""" if raw: # Return if loading Fixtures return # ignore this signal if it is intended for a DB we want to ignore if using in IGNORED_DB_ALIASES: return False try: with transaction.atomic(using=using): if not should_audit(instance): return False object_json_repr = serializers.serialize("json", [instance]) if instance.pk is None: created = True else: created = False # created or updated? if not created: old_model = sender.objects.using(using).get(pk=instance.pk) delta = model_delta(old_model, instance) changed_fields = json.dumps(delta) if IGNORE_EMPTY_UPDATES and (not changed_fields or changed_fields == 'null'): return False event_type = CRUDEvent.UPDATE # user try: user = get_current_user() # validate that the user still exists if USER_MODEL_IS_ONLY_IN_DEFAULT_DB: user = get_user_model().objects.get(pk=user.pk) else: user = get_user_model().objects.using(using).get( pk=user.pk) except: user = None if isinstance(user, AnonymousUser): user = None # callbacks kwargs['request'] = get_current_request( ) # make request available for callbacks create_crud_event = all( callback(instance, object_json_repr, created, raw, using, update_fields, **kwargs) for callback in CRUD_DIFFERENCE_CALLBACKS if callable(callback)) # create crud event only if all callbacks returned True if create_crud_event and not created: crud_event = CRUDEvent.objects.using(using).create( event_type=event_type, object_repr=str(instance), object_json_repr=object_json_repr, changed_fields=changed_fields, content_type=ContentType.objects.get_for_model(instance), object_id=instance.pk, user=user if using == DEFAULT_DB_ALIAS and USER_MODEL_IS_ONLY_IN_DEFAULT_DB else None, datetime=timezone.now(), user_pk_as_string=str(user.pk) if user else user) except Exception: logger.exception('easy audit had a pre-save exception.')