Projet

Général

Profil

0003-api-provide-a-profile-type-management-endpoint-60082.patch

Paul Marillonnet, 07 février 2022 17:34

Télécharger (8,58 ko)

Voir les différences:

Subject: [PATCH 3/3] api: provide a profile type management endpoint (#60082)

 src/authentic2/api_views.py |  36 ++++++++
 tests/test_api.py           | 177 ++++++++++++++++++++++++++++++++++++
 2 files changed, 213 insertions(+)
src/authentic2/api_views.py
1051 1051
user_profiles = UserProfilesAPI.as_view()
1052 1052

  
1053 1053

  
1054
class ProfileTypeSerializer(serializers.ModelSerializer):
1055
    slug = serializers.SlugField(
1056
        required=False,
1057
        allow_blank=False,
1058
        max_length=256,
1059
        default=SlugFromNameDefault(),
1060
    )
1061
    allowed_services = serializers.SlugRelatedField(
1062
        required=False,
1063
        many=True,
1064
        default=SlugFromNameDefault(),
1065
        queryset=Service.objects.all(),
1066
        slug_field='slug',
1067
    )
1068

  
1069
    class Meta:
1070
        model = ProfileType
1071
        fields = (
1072
            'slug',
1073
            'name',
1074
            'allowed_services',
1075
            'uuid',
1076
            'id',
1077
        )
1078

  
1079

  
1080
class ProfileTypesAPI(api_mixins.GetOrCreateMixinView, ExceptionHandlerMixin, ModelViewSet):
1081
    permission_classes = (DjangoPermission('custom_user.manage_profile_type'),)
1082
    serializer_class = ProfileTypeSerializer
1083
    lookup_field = 'uuid'
1084

  
1085
    def get_queryset(self):
1086
        return ProfileType.objects.all()
1087

  
1088

  
1054 1089
class RoleMembershipAPI(ExceptionHandlerMixin, APIView):
1055 1090
    permission_classes = (permissions.IsAuthenticated,)
1056 1091

  
......
1190 1225
router.register(r'users', UsersAPI, basename='a2-api-users')
1191 1226
router.register(r'ous', OrganizationalUnitAPI, basename='a2-api-ous')
1192 1227
router.register(r'roles', RolesAPI, basename='a2-api-roles')
1228
router.register(r'profile-types', ProfileTypesAPI, basename='a2-api-profile-types')
1193 1229

  
1194 1230

  
1195 1231
class CheckPasswordSerializer(serializers.Serializer):
tests/test_api.py
2707 2707
    assert not Profile.objects.filter(user=user, profile_type=profile_type)
2708 2708

  
2709 2709
    app.delete('/api/users/%s/profiles/one-type/' % user.uuid, status=404)
2710

  
2711

  
2712
def test_profile_type_get(app, superuser):
2713
    app.authorization = ('Basic', (superuser.username, superuser.username))
2714

  
2715
    resp = app.get('/api/profile-types/')
2716
    assert not resp.json['count']
2717
    assert not resp.json['results']
2718

  
2719
    profile_type = ProfileType.objects.create(slug='one-type', name='One Type')
2720
    resp = app.get('/api/profile-types/')
2721
    assert resp.json['count'] == 1
2722
    assert len(resp.json['results']) == 1
2723
    assert resp.json['results'][0] == {
2724
        'id': profile_type.id,
2725
        'slug': 'one-type',
2726
        'uuid': profile_type.uuid,
2727
        'name': 'One Type',
2728
        'allowed_services': [],
2729
    }
2730

  
2731
    service = Service.objects.create(name='My Service', slug='my-service')
2732
    profile_type2 = ProfileType.objects.create(slug='other-type', name='Other Type')
2733
    profile_type2.allowed_services.add(service)
2734
    profile_type2.save()
2735

  
2736
    resp = app.get('/api/profile-types/')
2737
    assert resp.json['count'] == 2
2738
    assert len(resp.json['results']) == 2
2739
    assert resp.json['results'] == [
2740
        {
2741
            'id': profile_type.id,
2742
            'slug': 'one-type',
2743
            'uuid': profile_type.uuid,
2744
            'name': 'One Type',
2745
            'allowed_services': [],
2746
        },
2747
        {
2748
            'id': profile_type2.id,
2749
            'slug': 'other-type',
2750
            'uuid': profile_type2.uuid,
2751
            'name': 'Other Type',
2752
            'allowed_services': ['my-service'],
2753
        },
2754
    ]
2755

  
2756
    resp = app.get('/api/profile-types/%s/' % profile_type.uuid)
2757
    assert resp.json == {
2758
        'id': profile_type.id,
2759
        'slug': 'one-type',
2760
        'uuid': profile_type.uuid,
2761
        'name': 'One Type',
2762
        'allowed_services': [],
2763
    }
2764

  
2765
    service2 = Service.objects.create(name='My Service 2', slug='my-service-2')
2766
    profile_type2.allowed_services.add(service2)
2767
    profile_type2.save()
2768

  
2769
    resp = app.get('/api/profile-types/%s/' % profile_type2.uuid)
2770
    assert resp.json == {
2771
        'id': profile_type2.id,
2772
        'slug': 'other-type',
2773
        'uuid': profile_type2.uuid,
2774
        'name': 'Other Type',
2775
        'allowed_services': ['my-service', 'my-service-2'],
2776
    }
2777

  
2778

  
2779
def test_profile_type_post(app, superuser):
2780
    app.authorization = ('Basic', (superuser.username, superuser.username))
2781

  
2782
    payload = {
2783
        'slug': 'one-type',
2784
        'name': 'One Type',
2785
        'allowed_services': [],
2786
    }
2787

  
2788
    assert not ProfileType.objects.filter(slug='one-type')
2789

  
2790
    resp = app.post_json('/api/profile-types/', params=payload)
2791
    profile_type = ProfileType.objects.get(slug='one-type')
2792

  
2793
    assert resp.json['slug'] == 'one-type'
2794
    assert resp.json['name'] == 'One Type'
2795
    assert resp.json['allowed_services'] == []
2796
    assert resp.json['uuid'] == profile_type.uuid
2797
    assert resp.json['id'] == profile_type.id
2798

  
2799
    Service.objects.create(name='My Service', slug='my-service')
2800
    Service.objects.create(name='My Service 2', slug='my-service-2')
2801

  
2802
    payload = {
2803
        'slug': 'other-type',
2804
        'name': 'Other Type',
2805
        'allowed_services': ['my-service', 'my-service-2'],
2806
    }
2807

  
2808
    assert not ProfileType.objects.filter(slug='other-type')
2809

  
2810
    resp = app.post_json('/api/profile-types/', params=payload)
2811
    profile_type = ProfileType.objects.get(slug='other-type')
2812

  
2813
    assert resp.json['slug'] == 'other-type'
2814
    assert resp.json['name'] == 'Other Type'
2815
    assert resp.json['allowed_services'] == ['my-service', 'my-service-2']
2816
    assert resp.json['uuid'] == profile_type.uuid
2817
    assert resp.json['id'] == profile_type.id
2818

  
2819

  
2820
def test_profile_type_get_or_create(app, superuser):
2821
    app.authorization = ('Basic', (superuser.username, superuser.username))
2822

  
2823
    payload = {
2824
        'slug': 'one-type',
2825
        'name': 'One Type',
2826
        'allowed_services': [],
2827
    }
2828

  
2829
    assert not ProfileType.objects.filter(slug='one-type')
2830

  
2831
    resp = app.post_json('/api/profile-types/?get_or_create=slug', params=payload)
2832
    profile_type = ProfileType.objects.get(slug='one-type')
2833
    number_of_profiles = len(ProfileType.objects.all())
2834

  
2835
    assert resp.json['slug'] == 'one-type'
2836
    assert resp.json['name'] == 'One Type'
2837
    assert resp.json['allowed_services'] == []
2838
    assert resp.json['uuid'] == profile_type.uuid
2839
    assert resp.json['id'] == profile_type.id
2840

  
2841
    app.post_json('/api/profile-types/?get_or_create=slug', params=payload)
2842
    ProfileType.objects.get(slug='one-type')
2843
    assert number_of_profiles == len(ProfileType.objects.all())
2844

  
2845

  
2846
def test_profile_type_update_or_create(app, superuser):
2847
    app.authorization = ('Basic', (superuser.username, superuser.username))
2848

  
2849
    payload = {
2850
        'slug': 'one-type',
2851
        'name': 'One Type',
2852
        'allowed_services': [],
2853
    }
2854

  
2855
    assert not ProfileType.objects.filter(slug='one-type')
2856

  
2857
    resp = app.post_json('/api/profile-types/?update_or_create=slug', params=payload)
2858
    profile_type = ProfileType.objects.get(slug='one-type')
2859
    number_of_profiles = len(ProfileType.objects.all())
2860

  
2861
    assert resp.json['slug'] == 'one-type'
2862
    assert resp.json['name'] == 'One Type'
2863
    assert resp.json['allowed_services'] == []
2864
    assert resp.json['uuid'] == profile_type.uuid
2865
    assert resp.json['id'] == profile_type.id
2866

  
2867
    payload['name'] = 'Not the same type name'
2868
    app.post_json('/api/profile-types/?update_or_create=slug', params=payload)
2869
    profile_type = ProfileType.objects.get(slug='one-type')
2870
    assert number_of_profiles == len(ProfileType.objects.all())
2871
    assert profile_type.name == 'Not the same type name'
2872

  
2873

  
2874
def test_profile_type_delete(app, superuser):
2875
    app.authorization = ('Basic', (superuser.username, superuser.username))
2876

  
2877
    profile_type = ProfileType.objects.create(slug='one-type', name='One Type')
2878
    profile_type2 = ProfileType.objects.create(slug='other-type', name='Other Type')
2879

  
2880
    resp = app.delete('/api/profile-types/%s/' % profile_type.uuid)
2881
    assert resp.status_code == 204
2882
    assert not ProfileType.objects.filter(slug='one-type')
2883

  
2884
    resp = app.delete('/api/profile-types/%s/' % profile_type2.uuid)
2885
    assert resp.status_code == 204
2886
    assert not ProfileType.objects.filter(slug='other-type')
2710
-