|
2 | 2 | import logging
|
3 | 3 | import io
|
4 | 4 |
|
5 |
| -from django.contrib.auth.models import User |
| 5 | +from django.contrib.auth.models import User, Group |
6 | 6 | from django.conf import settings
|
7 | 7 | from rest_framework import serializers
|
8 | 8 | from rest_framework.validators import UniqueValidator
|
|
16 | 16 |
|
17 | 17 |
|
18 | 18 | class UserSerializer(serializers.HyperlinkedModelSerializer):
|
19 |
| - feed = serializers.HyperlinkedRelatedField(many=True, view_name='feed-detail', |
20 |
| - read_only=True) |
21 | 19 | username = serializers.CharField(min_length=4, max_length=32,
|
22 | 20 | validators=[UniqueValidator(
|
23 | 21 | queryset=User.objects.all())])
|
24 | 22 | email = serializers.EmailField(required=True,
|
25 | 23 | validators=[UniqueValidator(
|
26 | 24 | queryset=User.objects.all())])
|
27 | 25 | password = serializers.CharField(min_length=8, max_length=100, write_only=True)
|
| 26 | + groups = serializers.HyperlinkedIdentityField(view_name='user-group-list') |
28 | 27 |
|
29 | 28 | class Meta:
|
30 | 29 | model = User
|
31 |
| - fields = ('url', 'id', 'username', 'email', 'password', 'is_staff', 'feed') |
| 30 | + fields = ('url', 'id', 'username', 'email', 'password', 'is_staff', 'groups') |
32 | 31 |
|
33 | 32 | def create(self, validated_data):
|
34 | 33 | """
|
@@ -73,3 +72,48 @@ def validate_username(self, username):
|
73 | 72 | raise serializers.ValidationError(
|
74 | 73 | ["Username %s is not available." % username])
|
75 | 74 | return username
|
| 75 | + |
| 76 | + |
| 77 | +class GroupSerializer(serializers.HyperlinkedModelSerializer): |
| 78 | + users = serializers.HyperlinkedIdentityField(view_name='group-user-list') |
| 79 | + |
| 80 | + class Meta: |
| 81 | + model = Group |
| 82 | + fields = ('url', 'id', 'name', 'users') |
| 83 | + |
| 84 | + def validate_name(self, name): |
| 85 | + """ |
| 86 | + Overriden to check that the name does not contain forward slashes. |
| 87 | + """ |
| 88 | + if '/' in name: |
| 89 | + raise serializers.ValidationError( |
| 90 | + ["This field may not contain forward slashes."]) |
| 91 | + return name |
| 92 | + |
| 93 | + |
| 94 | + |
| 95 | +class GroupUserSerializer(serializers.HyperlinkedModelSerializer): |
| 96 | + username = serializers.CharField(write_only=True, min_length=4, max_length=32) |
| 97 | + group_id = serializers.ReadOnlyField(source='group.id') |
| 98 | + group_name = serializers.ReadOnlyField(source='group.name') |
| 99 | + user_id = serializers.ReadOnlyField(source='user.id') |
| 100 | + user_username = serializers.ReadOnlyField(source='user.username') |
| 101 | + user_email = serializers.ReadOnlyField(source='user.email') |
| 102 | + group = serializers.HyperlinkedRelatedField(view_name='group-detail', read_only=True) |
| 103 | + user = serializers.HyperlinkedRelatedField(view_name='user-detail', read_only=True) |
| 104 | + |
| 105 | + class Meta: |
| 106 | + model = User.groups.through |
| 107 | + fields = ('url', 'id', 'group_id', 'group_name', 'user_id', 'user_username', |
| 108 | + 'user_email', 'group', 'user', 'username') |
| 109 | + |
| 110 | + def validate_username(self, username): |
| 111 | + """ |
| 112 | + Custom method to check whether the provided username exists in the DB. |
| 113 | + """ |
| 114 | + try: |
| 115 | + user = User.objects.get(username=username) |
| 116 | + except User.DoesNotExist: |
| 117 | + raise serializers.ValidationError( |
| 118 | + {'username': [f"Couldn't find any user with username '{username}'."]}) |
| 119 | + return user |
0 commit comments