# #python #api #gitlab #python-gitlab
Вопрос:
Мне нужно найти все проекты и общие проекты в группе Gitlab с подгруппами. Мне удалось перечислить названия всех подобных проектов:
group = gl.groups.get(11111, lazy=True)
# find all projects, also in subgroups
projects=group.projects.list(include_subgroups=True, all=True)
for prj in projects:
print(prj.attributes['name'])
print("")
Чего мне не хватает, так это перечислить также общие проекты внутри группы. Или, может быть, выразить это другими словами: узнайте все проекты, в которых участвует моя группа. Возможно ли это с помощью Python API?
Комментарии:
1. Я добился гораздо большего успеха, просто используя HTTP API с библиотекой запросов. На мой взгляд, это сработало лучше, чем использование библиотеки python..
2. К сожалению, у меня нет опыта работы с HTTP API, мне было бы намного проще работать с python. 😉
3. docs.gitlab.com/ee/api/api_resources.html <- it’s not difficult at all 🙂
Ответ №1:
Итак, вдохновленный ответом sytech, я обнаружил, что он не работал в первую очередь, так как общие проекты все еще были скрыты в подгруппах. Поэтому я придумал следующий код, который просматривает все различные уровни подгрупп, чтобы найти все общие проекты. Я предполагаю, что это можно написать намного элегантнее, но для меня это работает:
# group definition
main_group_id = 11111
# create empty list that will contain final result
list_subgroups_id_all = []
# create empty list that act as temporal storage of the results outside the function
list_subgroups_id_stored = []
# function to create a list of subgroups of a group (id)
def find_subgroups(group_id):
# retrieve group object
group = gl.groups.get(group_id)
# create empty lists to store id of subgroups
list_subgroups_id = []
#iterate through group to find id of all subgroups
for sub in group.subgroups.list():
list_subgroups_id.append(sub.id)
return(list_subgroups_id)
# function to iterate over the various groups for subgroup detection
def iterate_subgroups(group_id, list_subgroups_id_all):
# for a given id, find existing subgroups (id) and store them in a list
list_subgroups_id = find_subgroups(group_id)
# add the found items to the list storage variable, so that the results are not overwritten
list_subgroups_id_stored.append(list_subgroups_id)
# for each found subgroup_id, test if it is already part of the total id list
# if not, keep store it and test for more subgroups
for test_id in list_subgroups_id:
if test_id not in list_subgroups_id_all:
# add it to total subgroup id list (final results list)
list_subgroups_id_all.append(test_id)
# check whether test_id contains more subgroups
list_subgroups_id_tmp = iterate_subgroups(test_id, list_subgroups_id_all)
#if so, append to stored subgroup list that is currently checked
list_subgroups_id_stored.append(list_subgroups_id_tmp)
return(list_subgroups_id_all)
# find all subgroup and subsubgroups, etc... store ids in list
list_subgroups_id_all = iterate_subgroups(main_group_id , list_subgroups_id_all)
print("***ids of all subgroups***")
print(list_subgroups_id_all)
print("")
print("***names of all subgroups***")
list_names = []
for ids in list_subgroups_id_all:
group = gl.groups.get(ids)
group_name = group.attributes['name']
list_names.append(group_name)
print(list_names)
#print(list_subgroups_name_all)
print("")
# print all directly integrated projects of the main group, also those in subgroups
print("***integrated projects***")
group = gl.groups.get(main_group_id)
projects=group.projects.list(include_subgroups=True, all=True)
for prj in projects:
print(prj.attributes['name'])
print("")
# print all shared projects
print("***shared projects***")
for sub in list_subgroups_id_all:
group = gl.groups.get(sub)
for shared_prj in group.shared_projects:
print(shared_prj['path_with_namespace'])
print("")
Остается один вопрос — в самом начале я получаю основную группу по ее идентификатору (здесь: 11111), но могу ли я на самом деле также получить этот идентификатор, поискав название группы? Что-то вроде: group_id = gl.group.get(attribute={'name','foo'})
(не работает)?
Ответ №2:
Вы можете получить общие проекты по .shared_projects
атрибуту:
group = gl.groups.get(11111)
for proj in group.shared_projects:
print(proj['path_with_namespace'])
Однако вы не можете использовать lazy=True
аргумент для gl.groups.get
.
>>> group = gl.groups.get(11111, lazy=True)
>>> group.shared_projects
AttributeError: shared_projects
Комментарии:
1. К сожалению, это не работает для меня. Я получаю только те же результаты, что и раньше, то есть все проекты, но не общие проекты.