Skip to content

Commit

Permalink
Feature/SK-510 | Create clients using studio-cli (#239)
Browse files Browse the repository at this point in the history
  • Loading branch information
niklastheman committed Jun 28, 2023
1 parent 7e4c071 commit b4b0f64
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 1 deletion.
13 changes: 13 additions & 0 deletions serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
ProjectTemplate,
ReleaseName,
)
from user.models import Client, ClientRole


class MLModelSerializer(ModelSerializer):
Expand Down Expand Up @@ -169,3 +170,15 @@ class ProjectTemplateSerializer(ModelSerializer):
class Meta:
model = ProjectTemplate
fields = "__all__"


class ClientSerializer(ModelSerializer):
class Meta:
model = Client
fields = "__all__"


class ClientRoleSerializer(ModelSerializer):
class Meta:
model = ClientRole
fields = "__all__"
5 changes: 5 additions & 0 deletions urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
from .views import (
AppInstanceList,
AppList,
ClientList,
ClientRoleList,
CustomAuthToken,
EnvironmentList,
FlavorsList,
Expand All @@ -33,10 +35,13 @@
r"projecttemplates", ProjectTemplateList, basename="projecttemplates"
)

router.register(r"clientroles", ClientRoleList, basename="clientroles")

models_router = routers.NestedSimpleRouter(
router, r"projects", lookup="project"
)
models_router.register(r"models", ModelList, basename="model")
models_router.register(r"clients", ClientList, basename="clients")
models_router.register(r"objecttype", ObjectTypeList, basename="objecttype")
models_router.register(r"members", MembersList, basename="members")
models_router.register(r"resources", ResourceList, basename="resources")
Expand Down
88 changes: 87 additions & 1 deletion views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@
import time

from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.models import User
from django.db import transaction
from django.db.models import Q
from django.http import HttpResponse
from django.utils.text import slugify
from django_filters.rest_framework import DjangoFilterBackend
from guardian.shortcuts import assign_perm
from rest_framework import generics
from rest_framework.authtoken.models import Token
from rest_framework.authtoken.views import ObtainAuthToken
Expand Down Expand Up @@ -34,11 +37,14 @@
ReleaseName,
)
from projects.tasks import create_resources_from_template, delete_project_apps
from user.models import Client, ClientRole

from .APIpermissions import AdminPermission, ProjectPermission
from .serializers import (
AppInstanceSerializer,
AppSerializer,
ClientRoleSerializer,
ClientSerializer,
EnvironmentSerializer,
FlavorsSerializer,
Metadata,
Expand Down Expand Up @@ -496,7 +502,7 @@ class AppInstanceList(
)
serializer_class = AppInstanceSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ["id", "name", "app__category"]
filterset_fields = ["id", "name", "app__category", "app__slug"]

def get_queryset(self):
return AppInstance.objects.filter(
Expand Down Expand Up @@ -866,3 +872,83 @@ def create(self, request, *args, **kwargs):
return HttpResponse(
"Created new template: {}.".format(name), status=200
)


class ClientList(
GenericViewSet,
CreateModelMixin,
RetrieveModelMixin,
UpdateModelMixin,
ListModelMixin,
):
permission_classes = (
IsAuthenticated,
ProjectPermission,
)
serializer_class = ClientSerializer
filter_backends = [DjangoFilterBackend]

def get_queryset(self):
project = Project.objects.get_project(
user=self.request.user, id=self.kwargs["project_pk"]
)

return Client.objects.filter(Q(instance__project=project))

def create(self, request, *args, **kwargs):
project = Project.objects.get(id=self.kwargs["project_pk"])
print(project)

try:
with transaction.atomic():
name = request.data["name"]
controller_id = request.data["controller"]
role = request.data["role"]

User = get_user_model()
password = User.objects.make_random_password()

user = User.objects.create_user(name, password)

user.is_client = True
user.save()

app_instance = AppInstance.objects.get(pk=controller_id)

client = Client.objects.create_client(
user=user,
name=user.username,
owner=self.request.user,
instance=app_instance,
)

client_role = ClientRole.objects.get(name=role)

client.roles.add(client_role)
client.save()
assign_perm("can_delete_clients", self.request.user, client)
assign_perm("can_update_clients", self.request.user, client)
assign_perm(
"can_refresh_client_token", self.request.user, client
)

except Exception as err:
print(err)
return HttpResponse(
"Failed to create object: incorrect input data.", 400
)

return HttpResponse(f"Created new client {name}", 200)


class ClientRoleList(
GenericViewSet,
RetrieveModelMixin,
ListModelMixin,
):
permission_classes = (IsAuthenticated,)
serializer_class = ClientRoleSerializer
filter_backends = [DjangoFilterBackend]

def get_queryset(self):
return ClientRole.objects.all()

0 comments on commit b4b0f64

Please sign in to comment.