1from gitlab import types
2from gitlab.base import RequiredOptional, RESTManager, RESTObject
3from gitlab.mixins import (
4    CRUDMixin,
5    DeleteMixin,
6    ListMixin,
7    MemberAllMixin,
8    ObjectDeleteMixin,
9    RetrieveMixin,
10    SaveMixin,
11)
12
13__all__ = [
14    "GroupBillableMember",
15    "GroupBillableMemberManager",
16    "GroupBillableMemberMembership",
17    "GroupBillableMemberMembershipManager",
18    "GroupMember",
19    "GroupMemberManager",
20    "GroupMemberAllManager",
21    "ProjectMember",
22    "ProjectMemberManager",
23    "ProjectMemberAllManager",
24]
25
26
27class GroupMember(SaveMixin, ObjectDeleteMixin, RESTObject):
28    _short_print_attr = "username"
29
30
31class GroupMemberManager(MemberAllMixin, CRUDMixin, RESTManager):
32    _path = "/groups/%(group_id)s/members"
33    _obj_cls = GroupMember
34    _from_parent_attrs = {"group_id": "id"}
35    _create_attrs = RequiredOptional(
36        required=("access_level", "user_id"), optional=("expires_at",)
37    )
38    _update_attrs = RequiredOptional(
39        required=("access_level",), optional=("expires_at",)
40    )
41    _types = {"user_ids": types.ListAttribute}
42
43
44class GroupBillableMember(ObjectDeleteMixin, RESTObject):
45    _short_print_attr = "username"
46    _managers = (("memberships", "GroupBillableMemberMembershipManager"),)
47
48
49class GroupBillableMemberManager(ListMixin, DeleteMixin, RESTManager):
50    _path = "/groups/%(group_id)s/billable_members"
51    _obj_cls = GroupBillableMember
52    _from_parent_attrs = {"group_id": "id"}
53    _list_filters = ("search", "sort")
54
55
56class GroupBillableMemberMembership(RESTObject):
57    _id_attr = "user_id"
58
59
60class GroupBillableMemberMembershipManager(ListMixin, RESTManager):
61    _path = "/groups/%(group_id)s/billable_members/%(user_id)s/memberships"
62    _obj_cls = GroupBillableMemberMembership
63    _from_parent_attrs = {"group_id": "group_id", "user_id": "id"}
64
65
66class GroupMemberAllManager(RetrieveMixin, RESTManager):
67    _path = "/groups/%(group_id)s/members/all"
68    _obj_cls = GroupMember
69    _from_parent_attrs = {"group_id": "id"}
70
71
72class ProjectMember(SaveMixin, ObjectDeleteMixin, RESTObject):
73    _short_print_attr = "username"
74
75
76class ProjectMemberManager(MemberAllMixin, CRUDMixin, RESTManager):
77    _path = "/projects/%(project_id)s/members"
78    _obj_cls = ProjectMember
79    _from_parent_attrs = {"project_id": "id"}
80    _create_attrs = RequiredOptional(
81        required=("access_level", "user_id"), optional=("expires_at",)
82    )
83    _update_attrs = RequiredOptional(
84        required=("access_level",), optional=("expires_at",)
85    )
86    _types = {"user_ids": types.ListAttribute}
87
88
89class ProjectMemberAllManager(RetrieveMixin, RESTManager):
90    _path = "/projects/%(project_id)s/members/all"
91    _obj_cls = ProjectMember
92    _from_parent_attrs = {"project_id": "id"}
93