예제 #1
0
    def get(self, request, class_id):
        params = {}
        user = request.user
        c = class_exists(class_id)
        if c is None:
            params["message"] = f"Class with id {class_id} does not exist"
            params["status"] = 404
            return Response(params, status=params["status"])

        student, is_in_class = _is_student(user, c)
        teacher, teaches_class = _is_teacher(user, c)

        if is_in_class is True or teaches_class is True:
            print(c.teacher_set.all())
            params["teacher(s)"] = []
            for teach in c.teacher_set.all():
                params["teacher(s)"].append(teach.user.last_name + ", " +
                                            teach.user.first_name)
            params["name"] = c.name
            params["droplet_image"] = c.droplet_image
            params["droplet_size"] = c.droplet_size
            params["droplet_region"] = c.droplet_region
            params["droplet_limit"] = c.droplet_student_limit
        if teaches_class is True:
            params["created_at"] = c.created_at
            params["prefix"] = c.prefix
            params["priv_net"] = c.droplet_priv_net
            params["ipv6"] = c.droplet_ipv6
            params["user_data"] = c.droplet_user_data

        return Response(params, status=200)
예제 #2
0
    def get(self, request, class_id):
        params = {}
        request_user = request.user
        user_data = get_user_role(request_user)[1]

        if user_data["is_student"] is False:
            params[
                "message"] = "User is not a student, therefore cannot be enrolled in a class"
            params["status"] = 401
            return Response(params, params["status"])

        c = class_exists(class_id)
        if c is None:
            params["message"] = f"Class with id {class_id} does not exist"
            params["status"] = 404
            return Response(params, status=params["status"])

        if c in user_data["user"].classes.all():
            params["message"] = "Student is enrolled."
            params["status"] = 200
        else:
            params["message"] = "Student is not enrolled."
            params["status"] = 401

        return Response(params, params["status"])
예제 #3
0
    def post(self, request):
        params = {}

        class_id = request.data.get("id")

        class_obj = class_exists(class_id)
        if class_obj is None:
            params["message"] = f"Class with id {class_id} does not exist"
            params["status"] = 404
            return Response(params, status=params["status"])

        class_dict = model_to_dict(class_obj)
        # Droplet count not updating....why?
        class_dict.update(request.data)
        clas = ClassSerializer(class_obj, data=class_dict)
        if clas.is_valid() is True:
            class_obj_save = clas.save()
            params["status"] = 200
            params["message"] = "Class was updated successfully"
            params["info"] = model_to_dict(class_obj_save)
        else:
            params[
                "message"] = "Invalid parameters passed. You must data for every class field."
            params["status"] = 400
            params["errors"] = clas.errors
        return Response(params, status=params.get("status", 200))
예제 #4
0
    def get(self, request, class_id):
        params = {}
        request_user = request.user

        clas = class_exists(class_id)
        if clas is None:
            params["message"] = "Invalid class"
            params["status"] = 404
            return Response(params, status=params["status"])

        user_data = get_user_role(request_user, clas)

        if user_data[0] is False:
            return Response(user_data[1], status=user_data[1]["status"])

        user_data = user_data[1]
        if (
            user_data["is_in_class"] is not True
            and user_data["teaches_class"] is not True
        ):
            params[
                "message"
            ] = "Only teachers of the class or students in the class can view droplet count"
            params["status"] = 403
            return Response(params, status=params["status"])

        droplets = Droplet.objects.filter(class_id=clas)
        params["droplet_count"] = len(droplets)

        return Response(params, status=params.get("status", 200))
예제 #5
0
    def delete(self, request, class_id):
        params = {}
        class_obj = class_exists(class_id)
        if class_obj is None:
            params["message"] = "Invalid class"
            params["status"] = 404
            return Response(params, status=params["status"])

        class_obj.delete()
        params["message"] = "Class was successfully deleted"
        params["status"] = 200

        return Response(params, status=params.get("status", 200))
예제 #6
0
    def get(self, request, class_id):
        params = {}
        request_user = request.user

        clas = class_exists(class_id)
        if clas is None:
            params["message"] = "Invalid class"
            params["status"] = 404
            return Response(params, status=params["status"])

        user_data = get_user_role(request_user, clas)

        if user_data[0] is False:
            return Response(user_data[1], status=user_data[1]["status"])

        user_data = user_data[1]
        user = user_data["user"]
        if user_data["is_teacher"] is not True:
            params["message"] = "Only teachers can view class droplets"
            params["status"] = 403
            return Response(params, status=params["status"])

        if user_data["teaches_class"] is not True:
            params["message"] = "Only official class teachers can view class droplets"
            params["status"] = 403
            return Response(params, status=params["status"])

        droplets = Droplet.objects.filter(class_id=clas)
        params["droplets"] = []
        for droplet in droplets:
            params["droplets"].append(
                {
                    "name": droplet.name,
                    "owner": str(droplet.owner),
                    "owner_email": droplet.owner.email,
                    "owner_id": droplet.owner.id,
                    "initial_password": droplet.initial_password,
                    "ip_addr": droplet.ip_addr,
                    "class": str(droplet.class_id),
                    "class_id": droplet.class_id.id,
                    "droplet_id": droplet.droplet_id,
                }
            )

        return Response(params, status=params.get("status", 200))
예제 #7
0
    def post(self, request):
        params = {}
        request_user = request.user
        class_id = request.data.get("class_id", None)
        passcode = request.data.get("passcode", None)

        if class_id is None or passcode is None:
            params["message"] = "Missing parameters class_id or passcode"
            params["status"] = 400
            return Response(params, params["status"])

        try:
            class_id = int(class_id)
        except ValueError:
            params["message"] = "class_id must be numerical"
            params["status"] = 400
            return Response(params, params["status"])

        c = class_exists(class_id)
        if c is None:
            params["message"] = f"Class with id {class_id} does not exist"
            params["status"] = 404
            return Response(params, status=params["status"])

        if c.allow_registration is False:
            params["message"] = "Class not configured for registration"
            params["status"] = 403
            return Response(params, params["status"])

        user_data = get_user_role(request_user, c)[1]

        print(user_data)

        if user_data["teaches_class"] is True:
            params[
                "message"] = "User teaches this class, therefore cannot enroll"
            params["status"] = 401
            return Response(params, params["status"])

        if user_data["is_in_class"] is True:
            params["message"] = "User is already enrolled in this class"
            params["status"] = 401
            return Response(params, params["status"])

        if user_data["is_student"] is False:
            if user_data["user"] is None:
                student = Student.objects.create(user=request_user)
                student.classes.add(c)
                student.save()
                params["message"] = "User was enrolled in class"
                params["status"] = 200
            elif user_data["is_teacher"] is True:
                student = Student.objects.create(user=user_data["user"].user)
                student.classes.add(c)
                student.save()
                params["message"] = "User was enrolled in class"
                params["status"] = 200
        else:
            student = Student.objects.get(user=user_data["user"].user)
            student.classes.add(c)
            student.save()
            params["message"] = "User was enrolled in class"
            params["status"] = 200

        return Response(params, params["status"])
예제 #8
0
    def get(
        self, request, droplet_id, user_id, class_id,
    ):
        params = {}
        request_user = request.user
        user_data = get_user_role(request_user)
        if user_data[0] is False:
            return Response(user_data[1], status=user_data[1]["status"])

        user_data = user_data[1]
        user = user_data["user"]

        if user_data["is_teacher"] is False:
            params["message"] = "Only Teachers can assign resources"
            params["status"] = 403
            return Response(params, status=params["status"])

        try:
            droplet = Droplet.objects.get(droplet_id=droplet_id)
        except Droplet.DoesNotExist:
            params["message"] = "Droplet does not exist"
            params["status"] = 404
            return Response(params, status=params["status"])

        user_is_student = False
        user_is_teacher = False

        student = None
        teacher = None
        try:
            usr = User.objects.get(id=user_id)
        except User.DoesNotExist:
            params["message"] = "Invalid user"
            params["status"] = 400
            return Response(params, status=params["status"])

        try:
            student = Student.objects.get(user=usr)
            user_is_student = True
        except Student.DoesNotExist:
            pass

        try:
            teacher = Teacher.objects.get(user=usr)
            user_is_teacher = True
        except Teacher.DoesNotExist:
            pass

        if user_is_student is False and user_is_teacher is False:
            params["message"] = "Invalid user"
            params["status"] = 404
            return Response(params, status=params["status"])

        clas = class_exists(class_id)
        if clas is None:
            params["message"] = "Invalid class"
            params["status"] = 404
            return Response(params, status=params["status"])

        if clas not in user.classes.all():
            params["message"] = "Only the official class teacher can assign droplets"
            params["status"] = 403
            return Response(params, status=params["status"])

        recipient = None
        if teacher is None:
            recipient = student
        else:
            recipient = teacher

        if clas not in recipient.classes.all():
            params["message"] = "Recipient is not in specified class"
            params["status"] = 400
            return Response(params, status=params["status"])

        droplet.owner = recipient.user
        droplet.save()

        params["message"] = "Droplet successfully reassigned"
        params["status"] = 200
        return Response(params, status=params["status"])
예제 #9
0
    def get(self, request, class_id, count=1):
        """
        Create a droplet inside a specific class
        """
        params = {}
        request_user = request.user

        user_data = get_user_role(request_user)

        # If user data is False then the user is neither a teacher or student
        # and cannot create a droplet.
        if user_data[0] is False:
            return Response(user_data[1], status=user_data[1]["status"])

        user_data = user_data[1]
        user = user_data["user"]

        if count < 1 or count > 20:
            params[
                "message"
            ] = "Invalid amount for count. Can't be less than 1 or greater than 20"
            params["status"] = 400
            return Response(params, status=params["status"])

        clas = class_exists(class_id)
        if clas is None:
            params["message"] = "Invalid class"
            params["status"] = 404
            return Response(params, status=params["status"])

        if clas in user.classes.all():
            droplets = Droplet.objects.filter(owner=user.user, class_id=clas.id)
            if user_data["is_teacher"]:
                if count + len(droplets) > user.droplet_limit:
                    params["status"] = 403
                    params["message"] = "Max number of droplets reached"
                    return Response(params, status=params["status"])
            else:
                if count + len(droplets) > clas.droplet_student_limit:
                    params["status"] = 403
                    params["message"] = "Max number of droplets reached"
                    return Response(params, status=params["status"])

            params["droplets"] = []
            for i in range(0, count):
                droplet = Droplet(owner=user.user, class_id=clas)
                droplet.save()
                droplet_info = model_to_dict(droplet)
                del droplet_info["image"]
                del droplet_info["id"]
                del droplet_info["owner"]
                droplet_info["class"] = droplet.class_id.name
                params["droplets"].append(droplet_info)
                params["droplet_count"] = count

            params["message"] = "Droplet(s) created"
            params["status"] = 200
            # params["droplet-id"].append(droplet_id)
        else:
            params["message"] = "User is not in the class"
            params["status"] = 400
        return Response(params, status=params["status"])