File: groups.py

package info (click to toggle)
lava 2026.02-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 31,436 kB
  • sloc: python: 83,095; javascript: 16,658; sh: 1,364; makefile: 328
file content (100 lines) | stat: -rw-r--r-- 3,690 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# Copyright (C) 2023 Linaro Limited
#
# Author: Rémi Duraffort <remi.duraffort@linaro.org>
#
# SPDX-License-Identifier: GPL-2.0-or-later

import xmlrpc

from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.db import IntegrityError

from lava_scheduler_app.api import check_perm
from linaro_django_xmlrpc.models import ExposedV2API


class GroupsAPI(ExposedV2API):
    @check_perm("auth.add_group")
    def add(self, name):
        try:
            group = Group.objects.create(name=name)
        except (IntegrityError, ValidationError) as exc:
            raise xmlrpc.client.Fault(400, "Bad request: group already exists?")

    @check_perm("auth.change_group")
    def delete(self, name):
        try:
            Group.objects.get(name=name).delete()
        except Group.DoesNotExist:
            raise xmlrpc.client.Fault(404, "Bad request: group does not exists")

    @check_perm("auth.view_group")
    def list(self):
        return [g.name for g in Group.objects.all().order_by("name")]

    @check_perm("auth.view_group")
    def show(self, name):
        try:
            group = Group.objects.get(name=name)
            return {
                "id": group.id,
                "name": group.name,
                "permissions": [
                    f"{p.content_type.app_label}.{p.content_type.model}.{p.codename}"
                    for p in group.permissions.all()
                ],
                "users": [u.username for u in group.user_set.all()],
            }
        except Group.DoesNotExist:
            raise xmlrpc.client.Fault(404, "Group '%s' was not found." % name)


class GroupsPermissionsAPI(ExposedV2API):
    @check_perm("auth.change_group")
    def add(self, name, app, model, codename):
        try:
            group = Group.objects.get(name=name)
        except Group.DoesNotExist:
            raise xmlrpc.client.Fault(404, "Group '%s' was not found." % name)
        try:
            ct = ContentType.objects.get(app_label=app, model=model)
        except ContentType.DoesNotExist:
            raise xmlrpc.client.Fault(404, "Invalid app.model '%s.%s'" % (app, model))
        try:
            perm = Permission.objects.get(content_type=ct, codename=codename)
        except Permission.DoesNotExist:
            raise xmlrpc.client.Fault(404, "Invalid permission '%s'" % (codename))
        group.permissions.add(perm)

    @check_perm("auth.view_group")
    def list(self, name):
        try:
            group = Group.objects.get(name=name)
        except Group.DoesNotExist:
            raise xmlrpc.client.Fault(404, "Group '%s' was not found." % name)
        return [
            {
                "app": p.content_type.app_label,
                "model": p.content_type.model,
                "codename": p.codename,
            }
            for p in group.permissions.all()
        ]

    @check_perm("auth.change_group")
    def delete(self, name, app, model, codename):
        try:
            group = Group.objects.get(name=name)
        except Group.DoesNotExist:
            raise xmlrpc.client.Fault(404, "Group '%s' was not found." % name)
        try:
            ct = ContentType.objects.get(app_label=app, model=model)
        except ContentType.DoesNotExist:
            raise xmlrpc.client.Fault(404, "Invalid app.model '%s.%s'" % (app, model))
        try:
            perm = Permission.objects.get(content_type=ct, codename=codename)
        except Permission.DoesNotExist:
            raise xmlrpc.client.Fault(404, "Invalid permission '%s'" % (codename))
        group.permissions.remove(perm)