def delete_from_changes(self, changes): errors = [] changes_to_return = [] queryset = self.get_edit_queryset().order_by() for change in changes: try: instance = queryset.get( **dict(self.values_from_key(change["key"]))) task_args = { "user_id": self.request.user.id, "channel_id": instance.channel_id, "node_id": instance.id, } task, task_info = create_async_task("delete-node", self.request.user, **task_args) except ContentNode.DoesNotExist: # If the object already doesn't exist, as far as the user is concerned # job done! pass except Exception as e: log_sync_exception(e) change["errors"] = [str(e)] errors.append(change) return errors, changes_to_return
def handle_changes(request, viewset_class, change_type, changes): try: change_type = int(change_type) viewset = viewset_class(request=request) viewset.initial(request) if change_type in event_handlers: start = time.time() event_handler = getattr(viewset, event_handlers[change_type], None) if event_handler is None: raise ChangeNotAllowed(change_type, viewset_class) result = event_handler(changes) elapsed = time.time() - start if elapsed > SLOW_UPDATE_THRESHOLD: # This is really a warning rather than an actual error, # but using exceptions simplifies reporting it to Sentry, # so create and pass along the error but do not raise it. try: # we need to raise it to get Python to fill out the stack trace. raise SlowSyncError(change_type, elapsed, changes) except SlowSyncError as e: report_exception(e) return result except Exception as e: log_sync_exception(e) for change in changes: change["errors"] = [str(e)] return changes, None
def update_from_changes(self, changes): errors = [] changes_to_return = [] queryset = self.get_edit_queryset().order_by() for change in changes: try: instance = queryset.get(**dict(self.values_from_key(change["key"]))) serializer = self.get_serializer( instance, data=self._map_update_change(change), partial=True ) if serializer.is_valid(): self.perform_update(serializer) if serializer.changes: changes_to_return.extend(serializer.changes) else: change.update({"errors": serializer.errors}) errors.append(change) except ObjectDoesNotExist: # Should we also check object permissions here and return a different # error if the user can view the object but not edit it? change.update({"errors": ValidationError("Not found").detail}) errors.append(change) except Exception as e: log_sync_exception(e) change["errors"] = [str(e)] errors.append(change) return errors, changes_to_return
def delete_from_changes(self, changes): errors = [] changes_to_return = [] queryset = self.get_edit_queryset().order_by() for change in changes: try: instance = queryset.get(**dict(self.values_from_key(change["key"]))) self.perform_destroy(instance) except ObjectDoesNotExist: # If the object already doesn't exist, as far as the user is concerned # job done! pass except Exception as e: log_sync_exception(e) change["errors"] = [str(e)] errors.append(change) return errors, changes_to_return
def create_from_changes(self, changes): errors = [] changes_to_return = [] for change in changes: try: serializer = self.get_serializer(data=self._map_create_change(change)) if serializer.is_valid(): self.perform_create(serializer) if serializer.changes: changes_to_return.extend(serializer.changes) else: change.update({"errors": serializer.errors}) errors.append(change) except Exception as e: log_sync_exception(e) change["errors"] = [str(e)] errors.append(change) return errors, changes_to_return