File: users_groups.py

package info (click to toggle)
nc-py-api 0.19.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,320 kB
  • sloc: python: 12,415; makefile: 238; xml: 100; javascript: 56; sh: 14
file content (149 lines) | stat: -rw-r--r-- 6,289 bytes parent folder | download
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
"""Nextcloud API for working with user groups."""

import dataclasses

from ._misc import kwargs_to_params
from ._session import AsyncNcSessionBasic, NcSessionBasic


@dataclasses.dataclass
class GroupDetails:
    """User Group information."""

    def __init__(self, raw_data: dict):
        self._raw_data = raw_data

    @property
    def group_id(self) -> str:
        """ID of the group."""
        return self._raw_data["id"]

    @property
    def display_name(self) -> str:
        """A display name of the group."""
        return self._raw_data["displayname"]

    @property
    def user_count(self) -> int:
        """Number of users in the group."""
        return self._raw_data["usercount"]

    @property
    def disabled(self) -> bool:
        """Flag indicating is group disabled."""
        return bool(self._raw_data["disabled"])

    @property
    def can_add(self) -> bool:
        """Flag indicating the caller has enough rights to add users to this group."""
        return bool(self._raw_data["canAdd"])

    @property
    def can_remove(self) -> bool:
        """Flag indicating the caller has enough rights to remove users from this group."""
        return bool(self._raw_data["canRemove"])

    def __repr__(self):
        return f"<{self.__class__.__name__} id={self.group_id}, user_count={self.user_count}, disabled={self.disabled}>"


class _UsersGroupsAPI:
    """Class providing an API for managing user groups on the Nextcloud server.

    .. note:: In NextcloudApp mode, only ``get_list`` and ``get_details`` methods are available.
    """

    _ep_base: str = "/ocs/v1.php/cloud/groups"

    def __init__(self, session: NcSessionBasic):
        self._session = session

    def get_list(self, mask: str | None = None, limit: int | None = None, offset: int | None = None) -> list[str]:
        """Returns a list of user groups IDs."""
        data = kwargs_to_params(["search", "limit", "offset"], search=mask, limit=limit, offset=offset)
        response_data = self._session.ocs("GET", self._ep_base, params=data)
        return response_data["groups"] if response_data else []

    def get_details(
        self, mask: str | None = None, limit: int | None = None, offset: int | None = None
    ) -> list[GroupDetails]:
        """Returns a list of user groups with detailed information."""
        data = kwargs_to_params(["search", "limit", "offset"], search=mask, limit=limit, offset=offset)
        response_data = self._session.ocs("GET", f"{self._ep_base}/details", params=data)
        return [GroupDetails(i) for i in response_data["groups"]] if response_data else []

    def create(self, group_id: str, display_name: str | None = None) -> None:
        """Creates the users group."""
        params = {"groupid": group_id}
        if display_name is not None:
            params["displayname"] = display_name
        self._session.ocs("POST", f"{self._ep_base}", params=params)

    def edit(self, group_id: str, display_name: str) -> None:
        """Edits users group information."""
        params = {"key": "displayname", "value": display_name}
        self._session.ocs("PUT", f"{self._ep_base}/{group_id}", params=params)

    def delete(self, group_id: str) -> None:
        """Removes the users group."""
        self._session.ocs("DELETE", f"{self._ep_base}/{group_id}")

    def get_members(self, group_id: str) -> list[str]:
        """Returns a list of group users."""
        response_data = self._session.ocs("GET", f"{self._ep_base}/{group_id}")
        return response_data["users"] if response_data else {}

    def get_subadmins(self, group_id: str) -> list[str]:
        """Returns list of users who is subadmins of the group."""
        return self._session.ocs("GET", f"{self._ep_base}/{group_id}/subadmins")


class _AsyncUsersGroupsAPI:
    """Class provides an async API for managing user groups on the Nextcloud server.

    .. note:: In NextcloudApp mode, only ``get_list`` and ``get_details`` methods are available.
    """

    _ep_base: str = "/ocs/v1.php/cloud/groups"

    def __init__(self, session: AsyncNcSessionBasic):
        self._session = session

    async def get_list(self, mask: str | None = None, limit: int | None = None, offset: int | None = None) -> list[str]:
        """Returns a list of user groups IDs."""
        data = kwargs_to_params(["search", "limit", "offset"], search=mask, limit=limit, offset=offset)
        response_data = await self._session.ocs("GET", self._ep_base, params=data)
        return response_data["groups"] if response_data else []

    async def get_details(
        self, mask: str | None = None, limit: int | None = None, offset: int | None = None
    ) -> list[GroupDetails]:
        """Returns a list of user groups with detailed information."""
        data = kwargs_to_params(["search", "limit", "offset"], search=mask, limit=limit, offset=offset)
        response_data = await self._session.ocs("GET", f"{self._ep_base}/details", params=data)
        return [GroupDetails(i) for i in response_data["groups"]] if response_data else []

    async def create(self, group_id: str, display_name: str | None = None) -> None:
        """Creates the users group."""
        params = {"groupid": group_id}
        if display_name is not None:
            params["displayname"] = display_name
        await self._session.ocs("POST", f"{self._ep_base}", params=params)

    async def edit(self, group_id: str, display_name: str) -> None:
        """Edits users group information."""
        params = {"key": "displayname", "value": display_name}
        await self._session.ocs("PUT", f"{self._ep_base}/{group_id}", params=params)

    async def delete(self, group_id: str) -> None:
        """Removes the users group."""
        await self._session.ocs("DELETE", f"{self._ep_base}/{group_id}")

    async def get_members(self, group_id: str) -> list[str]:
        """Returns a list of group users."""
        response_data = await self._session.ocs("GET", f"{self._ep_base}/{group_id}")
        return response_data["users"] if response_data else {}

    async def get_subadmins(self, group_id: str) -> list[str]:
        """Returns list of users who is subadmins of the group."""
        return await self._session.ocs("GET", f"{self._ep_base}/{group_id}/subadmins")