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.')
Example #2
0
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.')
Example #4
0
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.')