class ReorderSerializer(Serializer): ordering_field = fields.CharField() forward = fields.BooleanField() segment_from = fields.IntegerField() segment_to = fields.IntegerField() item = fields.IntegerField() segment_by_ordering_field = fields.BooleanField(default=False) def save(self): mapper = inspect(Model) primary_key_field = mapper.primary_key[0].name ordering_field = self.validated_data['ordering_field'] primary_key = getattr(Model, primary_key_field) ordering = getattr(Model, ordering_field) if self.validated_data.get('segment_by_ordering_field'): segment_from = self.validated_data['segment_from'] segment_to = self.validated_data['segment_to'] else: segment_from_instance = queryset.filter(primary_key == self.validated_data['segment_from']).first() segment_to_instance = queryset.filter(primary_key == self.validated_data['segment_to']).first() segment_from = getattr(segment_from_instance, ordering_field) segment_to = getattr(segment_to_instance, ordering_field) if self.validated_data['forward']: queryset.filter( ordering >= segment_from, ordering <= segment_to ).update( {ordering_field: ordering - 1} ) queryset.filter( primary_key == self.validated_data['item'] ).update( {ordering_field: segment_to} ) else: queryset.filter( ordering >= segment_from, ordering <= segment_to ).update( {ordering_field: ordering + 1} ) queryset.filter( primary_key == self.validated_data['item'] ).update( {ordering_field: segment_to} ) try: session.commit() except SQLAlchemyError as e: session.rollback() raise e
class ModelDescriptionFieldSerializer(Serializer): name = fields_.CharField() db_column = fields_.CharField() field = fields_.CharField() filterable = fields_.BooleanField() null = fields_.BooleanField() editable = fields_.BooleanField() params = fields_.JSONField() verbose_name = fields_.CharField(required=False) required = fields_.BooleanField(required=False) default_type = fields_.CharField(required=False) default_value = fields_.AnyField(required=False)
class ModelDescriptionSerializer(Serializer): model = fields_.CharField() db_table = fields_.CharField() hidden = fields_.BooleanField() primary_key_field = fields_.CharField() fields = ModelDescriptionFieldSerializer(many=True) # relations = ModelDescriptionRelationSerializer(many=True) verbose_name = fields_.CharField(required=False) verbose_name_plural = fields_.CharField(required=False) display_field = fields_.CharField(required=False) default_order_by = fields_.CharField(required=False)