def apply_concurrency_check(model, fieldname, versionclass): """ Apply concurrency management to existing Models. :param model: Model class to update :type model: django.db.Model :param fieldname: name of the field :type fieldname: basestring :param versionclass: :type versionclass: concurrency.fields.VersionField subclass """ if hasattr(model, 'RevisionMetaInfo'): raise ImproperlyConfigured( "%s is already under concurrency management" % model) logger.debug('Applying concurrency check to %s' % model) ver = versionclass() ver.contribute_to_class(model, fieldname) model.RevisionMetaInfo.field = ver if not model.RevisionMetaInfo.versioned_save: _wrap_model_save(model)
def apply_concurrency_check(model, fieldname, versionclass): """ Apply concurrency management to existing Models. :param model: Model class to update :type model: django.db.Model :param fieldname: name of the field :type fieldname: basestring :param versionclass: :type versionclass: concurrency.fields.VersionField subclass """ if hasattr(model, '_concurrencymeta'): return # raise ImproperlyConfigured("%s is already under concurrency management" % model) logger.debug('Applying concurrency check to %s' % model) ver = versionclass() # import ipdb; ipdb.set_trace() ver.contribute_to_class(model, fieldname) model._concurrencymeta._field = ver if not model._concurrencymeta._versioned_save: _wrap_model_save(model)
def contribute_to_class(self, cls, name): super(VersionField, self).contribute_to_class(cls, name) if hasattr(cls, 'RevisionMetaInfo'): return setattr(cls, 'RevisionMetaInfo', RevisionMetaInfo()) _wrap_model_save(cls) cls.RevisionMetaInfo.field = self cls.RevisionMetaInfo.manually = self.manually
def class_prepared_concurrency_handler(sender, **kwargs): if hasattr(sender, 'RevisionMetaInfo') and not (sender.RevisionMetaInfo.manually): _wrap_model_save(sender) from concurrency.api import get_version, get_object_with_version setattr(sender._default_manager.__class__, 'get_object_with_version', get_object_with_version) setattr(sender, 'get_concurrency_version', get_version) else: logger.debug('Skipped concurrency for %s' % sender)
def contribute_to_class(self, cls, name): super(VersionField, self).contribute_to_class(cls, name) if hasattr(cls, 'RevisionMetaInfo'): return setattr(cls, 'RevisionMetaInfo', RevisionMetaInfo()) #TODO: allow user customization of RevisionMetaInfo cls._revisionmetainfo = cls.RevisionMetaInfo _wrap_model_save(cls) cls.RevisionMetaInfo.field = self cls.RevisionMetaInfo.manually = self.manually
def apply_concurrency_check(model, fieldname, versionclass): """ Apply concurrency management to existing Models. if django >= 1.7 you must: - copy original migrations to new location - create a custom migration like:: operations = [ # add version to django.contrib.auth.Group migrations.AddField( model_name='Group', name='version', field=IntegerVersionField(help_text=b'Version', default=1), ), ] and put in your settings.py MIGRATION_MODULES = { ... ... 'auth': '<new.migration.package>', } :param model: Model class to update :type model: django.db.Model :param fieldname: name of the field :type fieldname: basestring :param versionclass: :type versionclass: concurrency.fields.VersionField subclass """ if hasattr(model, '_concurrencymeta'): return logger.debug('Applying concurrency check to %s' % model) ver = versionclass() ver.contribute_to_class(model, fieldname) model._concurrencymeta._field = ver from concurrency.fields import class_prepared_concurrency_handler class_prepared_concurrency_handler(model) if not model._concurrencymeta._versioned_save: _wrap_model_save(model)
def class_prepared_concurrency_handler(sender, **kwargs): if hasattr(sender, '_concurrencymeta'): origin = getattr(sender._concurrencymeta._base, '_concurrencymeta') local = copy.deepcopy(origin) setattr(sender, '_concurrencymeta', local) if hasattr(sender, 'ConcurrencyMeta'): sender._concurrencymeta.enabled = getattr(sender.ConcurrencyMeta, 'enabled') if not (sender._concurrencymeta._manually): _wrap_model_save(sender) setattr(sender, 'get_concurrency_version', get_revision_of_object) else: logger.debug('Skipped concurrency for %s' % sender)
def class_prepared_concurrency_handler(sender, **kwargs): if hasattr(sender, 'RevisionMetaInfo') and not (sender.RevisionMetaInfo.manually): _wrap_model_save(sender) else: logger.debug('Skipped concurrency for %s' % sender)
app_label = 'concurrency' class TestModelGroupWithCustomSave(TestModelGroup): class Meta: app_label = 'concurrency' def save(self, force_insert=False, force_update=False, using=None): super(TestModelGroupWithCustomSave, self).save(force_insert, force_update, using) return 2222 # dummy return only for tests class TestIssue3Model(models.Model): username = models.CharField(max_length=30, blank=True, null=True) last_name = models.CharField(max_length=30, blank=True, null=True) char_field = models.CharField(max_length=30, blank=True, null=True) date_field = models.DateField(blank=True, null=True) version = models.CharField(default='abc', max_length=10, blank=True, null=True) revision = IntegerVersionField(db_column='cm_version_id') class Meta: app_label = 'concurrency' # tox requires this. for model in [TestAbstractModel0, TestModel0, ModelWithCustomSave, TestIssue3Model, AutoIncConcurrentModel, TestModelWithCustomSave]: _wrap_model_save(model, True)