Exemplo n.º 1
0
    def test_pre_delete_async(self, settings, save_model_action, extract_content_data, cache, extract_process_data):
        settings.RUN_ASYNC = True
        model = TestModel(
            string_field='Test',
            integer_field=1,
            float_field=1.0,
        )
        old_object = serialize_model_instance(model)
        model.string_field = None
        model.integer_field = None
        model.float_field = None
        model.id = None
        new_object = serialize_model_instance(model)
        content = signals._extract_content_data(old_object, new_object)
        extract_content_data.return_value = content

        signals._pre_delete(model, instance=model)

        # Check that extract process and access was done successfully
        self.assertEqual(cache.get_last_access.call_count, 1)
        self.assertEqual(cache.get_process.call_count, 1)
        self.assertEqual(extract_process_data.call_count, 1)

        # Check that was called asynchronously
        self.assertEqual(save_model_action.call_count, 0)
        self.assertEqual(save_model_action.apply_async.call_count, 1)
Exemplo n.º 2
0
    def test_post_save_async(self, settings, save_model_action, extract_content_data, cache, extract_process_data):
        settings.RUN_ASYNC = True
        model = TestModel(
            string_field='Test',
            integer_field=1,
            float_field=1.0,
        )
        old_object = serialize_model_instance(model)
        with patch.dict('audit_tools.audit.signals._CACHE', {id(model): old_object}):
            model.string_field = 'Modified'
            model.integer_field = 2
            model.float_field = 2.0
            new_object = serialize_model_instance(model)
            content = signals._extract_content_data(old_object, new_object)
            extract_content_data.return_value = content

            signals._post_save(model, instance=model)

            # Check that extract process and access was done successfully
            self.assertEqual(cache.get_last_access.call_count, 1)
            self.assertEqual(cache.get_process.call_count, 1)
            self.assertEqual(extract_process_data.call_count, 1)

            # Check that was called asynchronously
            self.assertEqual(save_model_action.call_count, 0)
            self.assertEqual(save_model_action.apply_async.call_count, 1)
Exemplo n.º 3
0
    def test_post_save_fail_save_model_action(self, settings, save_model_action, extract_content_data, cache,
                                              extract_process_data, logger):
        settings.RUN_ASYNC = False
        save_model_action.side_effect = Exception
        model = TestModel(
            string_field='Test',
            integer_field=1,
            float_field=1.0,
        )
        old_object = serialize_model_instance(model)
        model.string_field = 'Modified'
        model.integer_field = 2
        model.float_field = 2.0
        new_object = serialize_model_instance(model)
        content = signals._extract_content_data(old_object, new_object)
        extract_content_data.return_value = content

        signals._post_save(model, instance=model)

        # Check that extract process and access was done successfully
        self.assertEqual(cache.get_last_access.call_count, 1)
        self.assertEqual(cache.get_process.call_count, 1)
        self.assertEqual(extract_process_data.call_count, 1)

        # Check that save process wasn't done successfully
        self.assertEqual(logger.exception.call_count, 1)
Exemplo n.º 4
0
def _post_save(sender, **kwargs):
    try:
        from audit_tools.audit.models import ACTIONS
        from audit_tools.audit.tasks import save_model_action

        i = kwargs['instance']

        # Model
        model = _extract_model_data(i)

        # Old and new content
        old_data = {}
        if id(i) in _CACHE:
            old_data = _CACHE[id(i)]
            del _CACHE[id(i)]
        new_data = serialize_model_instance(i)

        content = _extract_content_data(old_data, new_data)

        # Action
        if not old_data and new_data:
            action = ACTIONS.CREATE
        else:
            action = ACTIONS.UPDATE

        # Instance
        instance = _extract_instance_data(i)

        # Timestamp
        timestamp = datetime.datetime.now()

        model_action = {
            'model': model,
            'action': action,
            'content': content,
            'instance': instance,
            'timestamp': timestamp,
        }

        # Process
        process = extract_process_data()

        try:
            # Get process
            process = cache.get_process(process)
            access = cache.get_last_access()

            if not settings.RUN_ASYNC:
                save_model_action(model_action, access, process)
            else:
                save_model_action.apply_async((model_action, access, process))
            logger.info("<%s> Model:%s ID:%s", action.capitalize(),
                        model['full_name'], instance['id'])
        except Exception:
            logger.exception("<%s> Model:%s ID:%s", action.capitalize(),
                             model['full_name'], instance['id'])
    except Exception:
        logger.exception("<Post Save>")
Exemplo n.º 5
0
    def test_content_update(self):
        model = TestModel(
            string_field='Test',
            integer_field=1,
            float_field=1.0,
        )
        old_object = serialize_model_instance(model)
        model.string_field = 'Modified'
        new_object = serialize_model_instance(model)
        keys = ['id', 'string_field', 'integer_field', 'float_field']

        content = signals._extract_content_data(old_object, new_object)

        self.assertItemsEqual(content['new'].keys(), keys)
        self.assertItemsEqual(content['old'].keys(), keys)
        self.assertEqual(content['new']['string_field'], 'Modified')
        self.assertEqual(content['old']['string_field'], 'Test')
        self.assertItemsEqual(content['changes'].keys(), ['string_field'])
Exemplo n.º 6
0
def _post_save(sender, **kwargs):
    try:
        from audit_tools.audit.models import ACTIONS
        from audit_tools.audit.tasks import save_model_action

        i = kwargs["instance"]

        # Model
        model = _extract_model_data(i)

        # Old and new content
        old_data = {}
        if id(i) in _CACHE:
            old_data = _CACHE[id(i)]
            del _CACHE[id(i)]
        new_data = serialize_model_instance(i)

        content = _extract_content_data(old_data, new_data)

        # Action
        if not old_data and new_data:
            action = ACTIONS.CREATE
        else:
            action = ACTIONS.UPDATE

        # Instance
        instance = _extract_instance_data(i)

        # Timestamp
        timestamp = datetime.datetime.now()

        model_action = {
            "model": model,
            "action": action,
            "content": content,
            "instance": instance,
            "timestamp": timestamp,
        }

        # Process
        process = extract_process_data()

        try:
            # Get process
            process = cache.get_process(process)
            access = cache.get_last_access()

            if not settings.RUN_ASYNC:
                save_model_action(model_action, access, process)
            else:
                save_model_action.apply_async((model_action, access, process))
            logger.info("<%s> Model:%s ID:%s", action.capitalize(), model["full_name"], instance["id"])
        except Exception:
            logger.exception("<%s> Model:%s ID:%s", action.capitalize(), model["full_name"], instance["id"])
    except Exception:
        logger.exception("<Post Save>")
Exemplo n.º 7
0
def _pre_save(sender, **kwargs):
    try:
        i = kwargs['instance']
        if i.pk:
            try:
                original_instance = sender.objects.get(pk=i.pk)
                _CACHE[id(i)] = serialize_model_instance(original_instance)
            except:
                # New object.
                pass
    except Exception:
        logger.exception("<Pre Save>")
Exemplo n.º 8
0
def _pre_save(sender, **kwargs):
    try:
        i = kwargs["instance"]
        if i.pk:
            try:
                original_instance = sender.objects.get(pk=i.pk)
                _CACHE[id(i)] = serialize_model_instance(original_instance)
            except:
                # New object.
                pass
    except Exception:
        logger.exception("<Pre Save>")
Exemplo n.º 9
0
    def test_content_create(self):
        model = TestModel()
        model.string_field = 'Test'
        model.integer_field = 1
        model.float_field = 1.0
        new_object = serialize_model_instance(model)
        keys = ['id', 'string_field', 'integer_field', 'float_field']

        content = signals._extract_content_data(None, new_object)

        self.assertItemsEqual(content['new'].keys(), keys)
        self.assertIsNone(content['old'])
        self.assertEqual(content['new']['string_field'], 'Test')
        self.assertEqual(content['new']['integer_field'], 1)
        self.assertEqual(content['new']['float_field'], 1.0)
        self.assertItemsEqual(content['changes'].keys(), keys)
Exemplo n.º 10
0
    def test_content_delete(self):
        model = TestModel(
            string_field='Test',
            integer_field=1,
            float_field=1.0,
        )
        old_object = serialize_model_instance(model)
        model.string_field = None
        model.integer_field = None
        model.float_field = None
        model.id = None
        keys = ['id', 'string_field', 'integer_field', 'float_field']

        content = signals._extract_content_data(old_object, None)

        self.assertIsNone(content['new'])
        self.assertItemsEqual(content['old'].keys(), keys)
        self.assertEqual(content['old']['string_field'], 'Test')
        self.assertEqual(content['old']['integer_field'], 1)
        self.assertEqual(content['old']['float_field'], 1.0)
        self.assertItemsEqual(content['changes'].keys(), keys)
Exemplo n.º 11
0
    def test_serialize_model_instance(self, model_to_dict):
        model_to_dict.return_value = {
            'date': datetime.date(2014, 12, 31),
            'time': datetime.time(0, 0, 0),
            'decimal': Decimal(1.0),
            'str': b'str',
            'unicode': 'unicode',
            'file': FieldFile(instance=None, field=MagicMock(), name='foo')
        }

        expected_result = {
            'date': datetime.datetime(2014, 12, 31),
            'time': datetime.datetime(1, 1, 1, 0, 0, 0),
            'decimal': 1.0,
            'str': 'str',
            'unicode': 'unicode',
            'file': 'foo'
        }

        serialized_instance = utils.serialize_model_instance(None)

        self.assertDictEqual(expected_result, serialized_instance)