class CategorySerializer(ma.ModelSerializer): articles = ma.Nested('ArticleListSerializer', many=True) series = ma.Nested('SeriesListSerializer', many=True) class Meta: model = Category fields = CATEGORY_FIELDS + ('articles', 'series')
class SeriesArticleSerializer(ma.ModelSerializer): slug = ma.Nested('ArticleSerializer', attribute='article', only='slug') title = ma.Nested('ArticleSerializer', attribute='article', only='title') class Meta: model = SeriesArticle fields = ARTICLE_SERIES_FIELDS
class TagSerializer(ma.ModelSerializer): articles = ma.Nested('ArticleListSerializer', many=True) series = ma.Nested('SeriesListSerializer', many=True) class Meta: model = Tag fields = TAG_FIELDS + ('articles', 'series')
class SeriesSerializer(ma.ModelSerializer): articles = ma.Nested('ArticleListSerializer', many=True) category = ma.Nested('CategorySerializer', only=('name', 'slug')) tags = ma.Nested('TagSerializer', only=('name', 'slug'), many=True) class Meta: model = Series fields = SERIES_FIELDS
class ArticleSerializer(ma.ModelSerializer): author = ma.Nested('UserSerializer', only=('first_name', 'last_name')) category = ma.Nested('CategorySerializer', only=('name', 'slug')) series = ma.Nested('ArticleSeriesDetailSerializer', attribute='article_series') tags = ma.Nested('TagSerializer', only=('name', 'slug'), many=True) class Meta: model = Article fields = ARTICLE_FIELDS + ('html', )
class UserSerializer(ma.ModelSerializer): """ Marshmallow serializer for the :class:`User` model. """ email = ma.Email(required=True) roles = ma.Nested('RoleSerializer', only='name', many=True) class Meta: model = User exclude = ('confirmed_at', 'created_at', 'updated_at', 'user_roles') dump_only = ('active', 'roles') load_only = ('password', ) def __init__(self, *args, user_manager: UserManager = injectable, **kwargs): self.user_manager = user_manager super().__init__(*args, **kwargs) @ma.validates('email') def validate_email(self, email): existing = self.user_manager.get_by(email=email) if existing and (self.is_create() or existing != self.instance): raise ma.ValidationError('Sorry, that email is already taken.')
class ArticleSeriesDetailSerializer(ArticleSeriesSerializer): articles = ma.Nested('SeriesArticleSerializer', attribute='series.series_articles', many=True) class Meta: model = SeriesArticle fields = ARTICLE_SERIES_FIELDS + ('articles', )
class UserSerializer(ma.ModelSerializer): """ Marshmallow serializer for the :class:`User` model. """ user_manager: UserManager = injectable email = ma.Email(required=True) password = ma.String(required=True) roles = ma.Nested('RoleSerializer', only='name', many=True) class Meta: model = User exclude = ('confirmed_at', 'created_at', 'updated_at', 'user_roles') dump_only = ('active', 'roles') load_only = ('password',) @ma.validates('email') def validate_email(self, email): existing = self.user_manager.get_by(email=email) if existing and (self.is_create() or existing != self.instance): raise ma.ValidationError( _('flask_unchained.bundles.security:error.email_already_associated', email=email))
class ArticleListSerializer(ArticleSerializer): series = ma.Nested('ArticleSeriesSerializer', attribute='article_series') class Meta: model = Article fields = ARTICLE_FIELDS