def get_query_set(self, *args, **kwargs): rev = kwargs.get('rev', None) bypass_filter = kwargs.get('bypass_filter', False) if self.related_model_instance is not None and hasattr(self.related_model_instance, '_versions_revision'): rev = self.related_model_instance._versions_revision if rev is not None and not bypass_filter: data = revision.version(self.related_model_instance, rev=rev) pks = data['related'].get(self.related_model_attname, []) self.core_filters = {'pk__in': pks} return super(VersionsRelatedManager, self).get_query_set(*args, **kwargs)
def get_query_set(self, *args, **kwargs): rev = kwargs.get('rev', None) bypass_filter = kwargs.get('bypass_filter', False) if self.related_model_instance is not None and hasattr( self.related_model_instance, '_versions_revision'): rev = self.related_model_instance._versions_revision if rev is not None and not bypass_filter: data = revision.version(self.related_model_instance, rev=rev) pks = data['related'].get(self.related_model_attname, []) self.core_filters = {'pk__in': pks} return super(VersionsRelatedManager, self).get_query_set(*args, **kwargs)
def commit(self): if self._versions_status == VERSIONS_STATUS_STAGED_DELETE: self._versions_status = VERSIONS_STATUS_DELETED elif self._versions_status == VERSIONS_STATUS_STAGED_EDITS: self._versions_status = VERSIONS_STATUS_PUBLISHED # We don't want to call our main save method, because we want to delay # staging the state of this model until we set the state of all unpublihsed manytomany edits. self._save_base() if self._versions_revision is None: data = revision.data(self) else: data = revision.version(self, rev=self._versions_revision) for name, ids in data['related'].items(): try: field = self._meta.get_field_by_name(name)[0] except: pass else: if isinstance(field, related.ManyToManyField): related_manager = getattr(self, name) if issubclass(related_manager.model, VersionsModel): existing_ids = set( list( related_manager.get_query_set( bypass=True, bypass_filter=True).values_list( 'pk', flat=True))) else: existing_ids = set( list(related_manager.values_list('pk', flat=True))) if self in revision._state.pending_related_updates and name in revision._state.pending_related_updates[ self]: updated_ids = revision._state.pending_related_updates[ self][name] else: updated_ids = ids if existing_ids.symmetric_difference(updated_ids): setattr(self, name, updated_ids) revision.stage(self)
def commit(self): if self._versions_status == VERSIONS_STATUS_STAGED_DELETE: self._versions_status = VERSIONS_STATUS_DELETED elif self._versions_status == VERSIONS_STATUS_STAGED_EDITS: self._versions_status = VERSIONS_STATUS_PUBLISHED # We don't want to call our main save method, because we want to delay # staging the state of this model until we set the state of all unpublihsed manytomany edits. self._save_base() if self._versions_revision is None: data = revision.data(self) else: data = revision.version(self, rev=self._versions_revision) for name, ids in data['related'].items(): try: field = self._meta.get_field_by_name(name)[0] except: pass else: if isinstance(field, related.ManyToManyField): related_manager = getattr(self, name) if issubclass(related_manager.model, VersionsModel): existing_ids = set(list(related_manager.get_query_set(bypass=True, bypass_filter=True).values_list('pk', flat=True))) else: existing_ids = set(list(related_manager.values_list('pk', flat=True))) if self in revision._state.pending_related_updates and name in revision._state.pending_related_updates[self]: updated_ids = revision._state.pending_related_updates[self][name] else: updated_ids = ids if existing_ids.symmetric_difference(updated_ids): setattr(self, name, updated_ids) revision.stage(self)