Projet

Général

Profil

0001-WIP-add-role-creation-api-20706.patch

Paul Marillonnet, 04 janvier 2018 10:20

Télécharger (5,25 ko)

Voir les différences:

Subject: [PATCH] WIP add role creation api (#20706)

 src/authentic2/api_urls.py  |  7 +++--
 src/authentic2/api_views.py | 67 +++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 69 insertions(+), 5 deletions(-)
src/authentic2/api_urls.py
9 9
                           name='a2-api-password-change'),
10 10
                       url(r'^user/$', api_views.user,
11 11
                           name='a2-api-user'),
12
                       url(r'^roles/(?P<role_uuid>[\w+]*)/members/(?P<member_uuid>[^/]+)/$', api_views.roles,
13
                           name='a2-api-role-member'),
12
                       url(r'^roles/(?P<role_uuid>[\w+]*)/members/(?P<member_uuid>[^/]+)/$',
13
                           api_views.role_memberships, name='a2-api-role-member'),
14 14
                       url(r'^check-password/$', api_views.check_password,
15 15
                           name='a2-api-check-password'),
16
                       url(r'^ous/(?P<ou_id_or_ou_slug>[\w+]*)/roles/',
17
                           api_views.roles_in_ou, name='a2-api-role'),
16 18
)
19

  
17 20
urlpatterns += api_views.router.urls
src/authentic2/api_views.py
306 306
    return hash(tuple((at.name, at.required) for at in attributes))
307 307

  
308 308

  
309
class RoleSerializer(serializers.ModelSerializer):
310
    ou = serializers.SlugRelatedField(
311
        queryset=get_ou_model().objects.all(),
312
        slug_field='ou__slug',
313
        required=True, default=get_default_ou)
314

  
315
    class Meta:
316
        model = get_role_model()
317

  
318

  
309 319
class BaseUserSerializer(serializers.ModelSerializer):
310 320
    ou = serializers.SlugRelatedField(
311 321
        queryset=get_ou_model().objects.all(),
......
576 586
        return Response({'result': 1})
577 587

  
578 588

  
579
class RolesAPI(ExceptionHandlerMixin, APIView):
589
class RolesInOuAPI(ExceptionHandlerMixin, APIView, ModelViewSet):
590

  
591
    def initial(self, request, *args, **kwargs):
592
        super(RolesInOuAPI, self).initial(request, *args, **kwargs)
593
        Role = get_role_model()
594
        try:
595
            self.role = get_object(Role, ou__slug=kwargs['ou_id_or_ou_slug'])
596
        except MultipleObjectsReturned:
597
            try:
598
                self.role = get_object(Role, ou__id=kwargs['ou_id_or_ou_slug'])
599
            except MultipleObjectsReturned:
600
                pass
601

  
602
    def post(self, request, *args, **kwargs):
603
        logger = logging.getLogger(__name__)
604

  
605
        Role = get_role_model()
606
        try:
607
            ou_id_or_ou_slug = kwargs['ou_id_or_ou_slug']
608
            role_data = request.body.get('role_data')
609
            slug = role_data['slug']
610
            name = role_data['name']
611
            # TODO create role...
612
        except Exception as e:
613
            logger.error('Couldn\'t create role')
614
            return Response({'result': 0, 'detail': e},
615
                            status=status.HTTP_400_BAD_REQUEST)
616

  
617
        return Response({'result': 1, 'detail': _('Role created')},
618
                        status=status.HTTP_201_CREATED)
619

  
620
    def delete(self, request, *args, **kwargs):
621
        logger = logging.getLogger(__name__)
622
        Role = get_role_model()
623
        try:
624
            self.role.members.clear()
625
        except:
626
            logger.error('Couldn\'t unregister users in role %r',
627
                    self.role)
628
        try:
629
            Role.objects.filter(slug=self.role.slug).delete()
630
        except:
631
            logger.error('Couldn\'t achieve clean deletion for role %r',
632
                    self.role)
633
        else:
634
            logger.info('Successfully removed role %r', self.role)
635

  
636
roles_in_ou = RolesInOuAPI.as_view()
637

  
638

  
639
class RoleMembershipsAPI(ExceptionHandlerMixin, APIView):
580 640
    permission_classes = (permissions.IsAuthenticated,)
581 641

  
582 642
    def initial(self, request, *args, **kwargs):
583
        super(RolesAPI, self).initial(request, *args, **kwargs)
643
        super(RoleMembershipsAPI, self).initial(request, *args, **kwargs)
584 644
        Role = get_role_model()
585 645
        User = get_user_model()
586 646
        self.role = get_object_or_404(Role, uuid=kwargs['role_uuid'])
......
601 661
        return Response({'result': 1, 'detail': _('User successfully removed from role')},
602 662
                        status=status.HTTP_200_OK)
603 663

  
604
roles = RolesAPI.as_view()
664
role_memberships = RoleMembershipsAPI.as_view()
605 665

  
606 666

  
607 667
class BaseOrganizationalUnitSerializer(serializers.ModelSerializer):
......
620 680
router = SimpleRouter()
621 681
router.register(r'users', UsersAPI, base_name='a2-api-users')
622 682
router.register(r'ous', OrganizationalUnitAPI, base_name='a2-api-ous')
683
# router.register(r'roles', RolesAPO, base_name='a2-api-roles')
623 684

  
624 685

  
625 686
class CheckPasswordSerializer(serializers.Serializer):
626
-