def revise(self, force=False, **data): revision = self.latest_revision if "arguments" in data: data["arguments_json"] = json.dumps(data.pop("arguments")) if "filter_object" in data: data["filter_object_json"] = json.dumps(data.pop("filter_object")) if revision: revisions = RecipeRevision.objects.filter(id=revision.id) revision_data = revision.data revision_data.update(data) channels = revision_data.pop("channels") revisions = filter_m2m(revisions, "channels", channels) countries = revision_data.pop("countries") revisions = filter_m2m(revisions, "countries", countries) locales = revision_data.pop("locales") revisions = filter_m2m(revisions, "locales", locales) data = revision_data revisions = revisions.filter(**data) is_clean = revisions.exists() else: channels = data.pop("channels", []) countries = data.pop("countries", []) locales = data.pop("locales", []) is_clean = False if not is_clean or force: logger.info( f"Creating new revision for recipe ID [{self.id}]", extra={"code": INFO_CREATE_REVISION}, ) if revision and revision.approval_status == RecipeRevision.PENDING: revision.approval_request.delete() self.latest_revision = RecipeRevision.objects.create( recipe=self, parent=revision, **data ) for channel in channels: self.latest_revision.channels.add(channel) for country in countries: self.latest_revision.countries.add(country) for locale in locales: self.latest_revision.locales.add(locale) self.save()
def revise(self, force=False, **data): revision = self.latest_revision if "arguments" in data: data["arguments_json"] = json.dumps(data.pop("arguments")) if "filter_object" in data: data["filter_object_json"] = json.dumps(data.pop("filter_object")) if revision: revisions = RecipeRevision.objects.filter(id=revision.id) revision_data = revision.data revision_data.update(data) channels = revision_data.pop("channels") revisions = filter_m2m(revisions, "channels", channels) countries = revision_data.pop("countries") revisions = filter_m2m(revisions, "countries", countries) locales = revision_data.pop("locales") revisions = filter_m2m(revisions, "locales", locales) data = revision_data revisions = revisions.filter(**data) is_clean = revisions.exists() else: channels = data.pop("channels", []) countries = data.pop("countries", []) locales = data.pop("locales", []) is_clean = False if not is_clean or force: logger.info( f"Creating new revision for recipe ID [{self.id}]", extra={"code": INFO_CREATE_REVISION}, ) if revision and revision.approval_status == RecipeRevision.PENDING: revision.approval_request.delete() self.latest_revision = RecipeRevision.objects.create( recipe=self, parent=revision, **data) for channel in channels: self.latest_revision.channels.add(channel) for country in countries: self.latest_revision.countries.add(country) for locale in locales: self.latest_revision.locales.add(locale) self.save()
def update(self, force=False, **data): revision = self.latest_revision if 'arguments' in data: data['arguments_json'] = json.dumps(data.pop('arguments')) if revision: revisions = RecipeRevision.objects.filter(id=revision.id) revision_data = revision.data revision_data.update(data) channels = revision_data.pop('channels') revisions = filter_m2m(revisions, 'channels', channels) countries = revision_data.pop('countries') revisions = filter_m2m(revisions, 'countries', countries) locales = revision_data.pop('locales') revisions = filter_m2m(revisions, 'locales', locales) data = revision_data revisions = revisions.filter(**data) is_clean = revisions.exists() else: channels = data.pop('channels', []) countries = data.pop('countries', []) locales = data.pop('locales', []) is_clean = False if not is_clean or force: logger.info( f'Creating new revision for recipe ID [{self.id}]', extra={'code': INFO_CREATE_REVISION} ) self.latest_revision = RecipeRevision.objects.create( recipe=self, parent=revision, **data) for channel in channels: self.latest_revision.channels.add(channel) for country in countries: self.latest_revision.countries.add(country) for locale in locales: self.latest_revision.locales.add(locale) self.save()