def test_count_versions_with_multiple_objects(self):
     article = self.Article(name=u'Some article')
     self.session.add(article)
     article2 = self.Article(name=u'Some article')
     self.session.add(article2)
     self.session.commit()
     assert count_versions(article) == 1
 def test_count_versions_with_multiple_versions(self):
     article = self.Article(name=u'Some article')
     self.session.add(article)
     self.session.commit()
     article.name = u'Updated article'
     self.session.commit()
     assert count_versions(article) == 2
 def save_or_update_transaction(self):
     f_keys = self.get_f_keys()
     if hasattr(self.instance, 'locked'):
         if self.instance.locked:
             model_factory = self.factory_table_transaction(f_keys)
             transaction_model = self.get_transaction_by_id(model_factory)
             if transaction_model:
                 model_factory_instance = transaction_model
             else:
                 model_factory_instance = model_factory()
             model_factory_instance.entity_oid = self.instance.oid
             transaction_id = self.instance.versions[count_versions(self.instance) - 1]. \
                 transaction.id
             for f_key in f_keys:
                 f_key_oid = f_key + '_oid'
                 if not self.old_instance or \
                         (self.old_instance and
                          getattr(self.old_instance, f_key_oid) != getattr(self.instance, f_key_oid)):
                     if not getattr(self.instance, f_key_oid):
                         setattr(model_factory_instance, f_key + '_id_tr',
                                 None)
                     else:
                         setattr(model_factory_instance, f_key + '_id_tr',
                                 transaction_id)
             if not transaction_model:
                 self.session.add(model_factory_instance)
             self.session.commit()
Esempio n. 4
0
    def records(self):
        """
        Return list of records in versioning history.
        """
        class VersionedInstanceMixin(object):
            __abstract__ = True

            @property
            def previous(self):
                return self.__version__.previous

            @property
            def next(self):
                return self.__version__.next

            @property
            def index(self):
                return self.__version__.index

            def revert(self):
                self.__version__.revert()
                return

        # dynamically create new type with mixin functionality
        VersionedClass = type('{}Record'.format(self.__class__.__name__),
                              (VersionedInstanceMixin, self.__class__), {})

        # gather cols
        columns = []
        mapper = inspect(self.__class__)
        for col in mapper.attrs:
            if hasattr(col, 'columns'):
                columns.append(col.columns[0].key)

        # configure versioning
        proxies = []
        for idx in range(count_versions(self)):
            record = self.versions[idx]

            # get column data
            data = {}
            for k in columns:
                if k in record.__dict__:
                    data[k] = getattr(record, k)
                else:
                    data[k] = getattr(self, k)

            # create new abstract object
            item = VersionedClass(**data)
            item.__version__ = record
            proxies.append(item)

        return proxies
 def test_insert(self):
     item = self.TextItem()
     self.session.add(item)
     self.session.commit()
     assert count_versions(item) == 1
 def test_count_versions_with_initial_version(self):
     article = self.Article(name=u'Some article')
     self.session.add(article)
     self.session.commit()
     assert count_versions(article) == 1
 def test_count_versions_without_versions(self):
     article = self.Article(name=u'Some article')
     assert count_versions(article) == 0
 def test_insert(self):
     item = self.TextItem()
     self.session.add(item)
     self.session.commit()
     assert count_versions(item) == 1
Esempio n. 9
0
 def modified(self):
     """
     Return boolean describing if object has been modified.
     """
     return count_versions(self) > 0