コード例 #1
0
def test_dump_basic_model():
    """Test ``serializers.dump_model`` for model with only basic fields"""
    model = _basic_model()
    dumped = serializer.dump_model(model)
    assert len(dumped) == len(model._meta.fields)
    names = [x.name for x in model._meta.fields]
    assert set(names) == set(dumped.keys())
コード例 #2
0
    def save(self, *args, **kwargs):
        """Saves changes made on model instance if ``request`` or
        ``track_token`` keyword are provided.
        """
        from tracked_model.models import History, RequestInfo
        if self.pk:
            action = ActionType.UPDATE
            changes = None
        else:
            action = ActionType.CREATE
            changes = serializer.dump_model(self)

        request = kwargs.pop('request', None)
        track_token = kwargs.pop('track_token', None)

        super().save(*args, **kwargs)
        if not changes:
            changes = self._tracked_model_diff()

        if changes:
            hist = History()
            hist.model_name = self._meta.model.__name__
            hist.app_label = self._meta.app_label
            hist.table_name = self._meta.db_table
            hist.table_id = self.pk
            hist.change_log = serializer.to_json(changes)
            hist.action_type = action
            if request:
                if request.user.is_authenticated():
                    hist.revision_author = request.user
                req_info = RequestInfo.create_or_get_from_request(request)
                hist.revision_request = req_info
            elif track_token:
                hist.revision_author_id = track_token.user_pk
                hist.revision_request_id = track_token.request_pk

            hist.save()

        self._tracked_model_initial_state = serializer.dump_model(self)
コード例 #3
0
    def _tracked_model_diff(self):
        """Returns changes made to model instance.
        Returns None if no changes were made.
        """
        initial_state = self._tracked_model_initial_state
        current_state = serializer.dump_model(self)
        if current_state == initial_state:
            return None

        change_log = {}
        for field in initial_state:
            old_value = initial_state[field][Field.VALUE]
            new_value = current_state[field][Field.VALUE]
            if old_value == new_value:
                continue
            field_data = initial_state.copy()[field]
            del field_data[Field.VALUE]
            field_data[Field.OLD] = old_value
            field_data[Field.NEW] = new_value
            change_log[field] = field_data

        return change_log or None
コード例 #4
0
    def delete(self, *args, **kwargs):
        """Saves history of model instance deletion"""
        from tracked_model.models import History, RequestInfo
        hist = History()
        hist.model_name = self._meta.model.__name__
        hist.app_label = self._meta.app_label
        hist.table_name = self._meta.db_table
        hist.table_id = self.pk
        hist.action_type = ActionType.DELETE
        state = serializer.dump_model(self)
        hist.change_log = serializer.to_json(state)
        request = kwargs.pop('request', None)
        track_token = kwargs.pop('track_token', None)
        if request:
            if request.user.is_authenticated():
                hist.revision_author = request.user
            req_info = RequestInfo.create_or_get_from_request(request)
            hist.revision_request = req_info
        elif track_token:
            hist.revision_author_id = track_token.user_pk
            hist.revision_request_id = track_token.request_pk

        hist.save()
        super().delete(*args, **kwargs)
コード例 #5
0
def test_dump_m2m_model():
    """Test ``serializers.dump_model`` for model with m2m relation"""
    model = _m2m_model()
    dumped = serializer.dump_model(model)
    assert len(dumped['bunch'][defs.Field.VALUE]) == model.bunch.count()
コード例 #6
0
def test_dump_foreign_key_model():
    """Test ``serializers.dump_model`` for model with FK relation"""
    model = _fk_model()
    dumped = serializer.dump_model(model)
    assert len(dumped) == len(model._meta.fields)
コード例 #7
0
 def __init__(self, *args, **kwargs):
     super().__init__(*args, **kwargs)
     self._tracked_model_initial_state = serializer.dump_model(self)