Add user admin endpoint, import from LDAP
This commit is contained in:
parent
a15952862a
commit
94932edebe
3 changed files with 39 additions and 15 deletions
|
@ -67,12 +67,11 @@ router.register(r'admin/order', payviews.AdminOrderViewSet, basename='admin/orde
|
||||||
router.register(r'admin/vmhost', vmviews.VMHostViewSet)
|
router.register(r'admin/vmhost', vmviews.VMHostViewSet)
|
||||||
router.register(r'admin/vmcluster', vmviews.VMClusterViewSet)
|
router.register(r'admin/vmcluster', vmviews.VMClusterViewSet)
|
||||||
router.register(r'admin/vpnpool', netviews.VPNPoolViewSet)
|
router.register(r'admin/vpnpool', netviews.VPNPoolViewSet)
|
||||||
|
|
||||||
router.register(r'admin/opennebula', oneviews.VMViewSet, basename='opennebula')
|
router.register(r'admin/opennebula', oneviews.VMViewSet, basename='opennebula')
|
||||||
|
|
||||||
# User/Account
|
# User/Account
|
||||||
router.register(r'user', authviews.UserViewSet, basename='user')
|
router.register(r'user', authviews.UserViewSet, basename='user')
|
||||||
|
router.register(r'admin/user', authviews.AdminUserViewSet, basename='useradmin')
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', include(router.urls)),
|
path('', include(router.urls)),
|
||||||
|
|
|
@ -5,11 +5,12 @@ from uncloud import AMOUNT_DECIMALS, AMOUNT_MAX_DIGITS
|
||||||
|
|
||||||
class UserSerializer(serializers.ModelSerializer):
|
class UserSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
|
balance = serializers.DecimalField(max_digits=AMOUNT_MAX_DIGITS,
|
||||||
|
decimal_places=AMOUNT_DECIMALS)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = get_user_model()
|
model = get_user_model()
|
||||||
fields = ['username', 'email', 'balance', 'maximum_credit' ]
|
fields = ['username', 'email', 'balance', 'maximum_credit' ]
|
||||||
|
|
||||||
|
class ImportUserSerializer(serializers.Serializer):
|
||||||
|
username = serializers.CharField()
|
||||||
balance = serializers.DecimalField(max_digits=AMOUNT_MAX_DIGITS,
|
|
||||||
decimal_places=AMOUNT_DECIMALS)
|
|
||||||
|
|
|
@ -1,17 +1,41 @@
|
||||||
from rest_framework import viewsets, permissions, status
|
from rest_framework import viewsets, permissions, status
|
||||||
from .serializers import *
|
from .serializers import *
|
||||||
|
from django_auth_ldap.backend import LDAPBackend
|
||||||
|
from rest_framework.decorators import action
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from rest_framework import mixins
|
||||||
|
|
||||||
class UserViewSet(viewsets.ReadOnlyModelViewSet):
|
class UserViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
|
||||||
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
serializer_class = UserSerializer
|
serializer_class = UserSerializer
|
||||||
|
|
||||||
|
def list(self, request, format=None):
|
||||||
|
# This is a bit stupid: we have a user, we create a queryset by
|
||||||
|
# matching on the username. But I don't know a "nicer" way.
|
||||||
|
# Nico, 2020-03-18
|
||||||
|
user = get_user_model().objects.get(
|
||||||
|
username=self.request.user.username)
|
||||||
|
serializer = self.get_serializer(user, context = {'request': request})
|
||||||
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
class AdminUserViewSet(viewsets.ReadOnlyModelViewSet):
|
||||||
|
# FIXME: make this admin
|
||||||
permission_classes = [permissions.IsAuthenticated]
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_serializer_class(self):
|
||||||
if self.request.user.is_superuser:
|
if self.action == 'import_from_ldap':
|
||||||
obj = get_user_model().objects.all()
|
return ImportUserSerializer
|
||||||
else:
|
else:
|
||||||
# This is a bit stupid: we have a user, we create a queryset by
|
return UserSerializer
|
||||||
# matching on the username. But I don't know a "nicer" way.
|
|
||||||
# Nico, 2020-03-18
|
|
||||||
obj = get_user_model().objects.filter(username=self.request.user.username)
|
|
||||||
|
|
||||||
return obj
|
def get_queryset(self):
|
||||||
|
return get_user_model().objects.all()
|
||||||
|
|
||||||
|
@action(detail=False, methods=['post'], url_path='import_from_ldap')
|
||||||
|
def import_from_ldap(self, request, pk=None):
|
||||||
|
serializer = self.get_serializer(data=request.data)
|
||||||
|
serializer.is_valid(raise_exception=True)
|
||||||
|
ldap_username = serializer.validated_data.pop("username")
|
||||||
|
user = LDAPBackend().populate_user(ldap_username)
|
||||||
|
|
||||||
|
return Response(UserSerializer(user, context = {'request': request}).data)
|
||||||
|
|
Loading…
Reference in a new issue