Python Gitlab API — список общих проектов группы/подгруппы

# #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. К сожалению, это не работает для меня. Я получаю только те же результаты, что и раньше, то есть все проекты, но не общие проекты.