Exemple #1
0
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)
Exemple #2
0
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)
Exemple #3
0
 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)
Exemple #5
0
 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
Exemple #6
0
 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 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)
Exemple #8
0
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)
Exemple #9
0
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)
Exemple #10
0
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)
Exemple #11
0
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)