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