redmine-scripts: scripts to manipulate projects memberships
This commit is contained in:
parent
5859e1c3e9
commit
91ac8e91aa
|
@ -0,0 +1,78 @@
|
||||||
|
from redminelib import Redmine
|
||||||
|
from requests.adapters import HTTPAdapter
|
||||||
|
|
||||||
|
from redminelib.resources.base import BaseResource
|
||||||
|
|
||||||
|
# make baseresource hashable
|
||||||
|
|
||||||
|
|
||||||
|
def BR__hash__(self):
|
||||||
|
return hash(int(self))
|
||||||
|
|
||||||
|
|
||||||
|
def BR__eq__(self, other):
|
||||||
|
return self.__class__ is other.__class__ and self.id == other.id
|
||||||
|
|
||||||
|
BaseResource.__hash__ = BR__hash__
|
||||||
|
BaseResource.__eq__ = BR__eq__
|
||||||
|
|
||||||
|
redmine = Redmine('https://dev.entrouvert.org/', username='bdauvergne', password='eiBubee5')
|
||||||
|
redmine.engine.session.mount('http://', HTTPAdapter(max_retries=3))
|
||||||
|
redmine.engine.session.mount('https://', HTTPAdapter(max_retries=3))
|
||||||
|
|
||||||
|
projects = list(redmine.project.all())
|
||||||
|
projects_id_map = {p.id: p for p in projects}
|
||||||
|
roles = list(redmine.role.all())
|
||||||
|
roles_id_map = {r.id: r for r in roles}
|
||||||
|
groups = list(redmine.group.all())
|
||||||
|
groups_id_map = {g.id: g for g in groups}
|
||||||
|
trackers = list(redmine.tracker.all())
|
||||||
|
|
||||||
|
projects_children = {p: [] for p in projects}
|
||||||
|
for p in projects:
|
||||||
|
if hasattr(p, 'parent'):
|
||||||
|
projects_children[projects_id_map[p.parent.id]].append(p)
|
||||||
|
|
||||||
|
for p in projects_children:
|
||||||
|
projects_children[p].sort(key=lambda p: p.name)
|
||||||
|
|
||||||
|
|
||||||
|
def get_project(name):
|
||||||
|
for p in projects:
|
||||||
|
if p.name == name:
|
||||||
|
return p
|
||||||
|
raise KeyError
|
||||||
|
|
||||||
|
|
||||||
|
def get_role(name):
|
||||||
|
for r in roles:
|
||||||
|
if r.name == name:
|
||||||
|
return r
|
||||||
|
raise KeyError
|
||||||
|
|
||||||
|
|
||||||
|
def get_group(name):
|
||||||
|
for g in groups:
|
||||||
|
if g.name == name:
|
||||||
|
return g
|
||||||
|
raise KeyError
|
||||||
|
|
||||||
|
def get_tracker(name):
|
||||||
|
for t in trackers:
|
||||||
|
if t.name == name:
|
||||||
|
return t
|
||||||
|
raise KeyError
|
||||||
|
|
||||||
|
projects.sort(key=lambda p: (len(projects_children[p]), p.name))
|
||||||
|
|
||||||
|
|
||||||
|
def map_projects(f, roots=[]):
|
||||||
|
roots = roots or [p for p in projects if not hasattr(p, 'parent')]
|
||||||
|
|
||||||
|
def helper(p, level=0):
|
||||||
|
if f(p, level):
|
||||||
|
for child in projects_children[p]:
|
||||||
|
helper(child, level=level + 1)
|
||||||
|
|
||||||
|
for root in roots:
|
||||||
|
helper(root)
|
|
@ -0,0 +1,62 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from config import *
|
||||||
|
import sys
|
||||||
|
|
||||||
|
projets_clients = get_project('Projets Clients')
|
||||||
|
entrouvert = get_group('Entr\'ouvert')
|
||||||
|
gestion_de_projet = get_role('Gestion de projet')
|
||||||
|
developpeur = get_role(u'Développeur')
|
||||||
|
developpement = get_tracker(u'Développement')
|
||||||
|
|
||||||
|
|
||||||
|
def print_tree(roots=[]):
|
||||||
|
def helper(p, level):
|
||||||
|
prefix = ''
|
||||||
|
if level > 0:
|
||||||
|
prefix += '+--'
|
||||||
|
if level > 1:
|
||||||
|
prefix += '-' * (level - 1) * 2
|
||||||
|
if developpement in list(p.trackers):
|
||||||
|
print(prefix, p.name, p.id, list(tracker.name for tracker in p.trackers))
|
||||||
|
memberships = redmine.project_membership.filter(project_id=p.id)
|
||||||
|
for m in memberships:
|
||||||
|
if hasattr(m, 'user'):
|
||||||
|
name = m.user.name
|
||||||
|
else:
|
||||||
|
name = m.group['name']
|
||||||
|
if all(r.name != 'CPF' for r in m.roles):
|
||||||
|
continue
|
||||||
|
print(' ' * len(prefix), '%30s' % name, ', '.join([r.name for r in m.roles]))
|
||||||
|
if level == 0:
|
||||||
|
return True
|
||||||
|
map_projects(helper, roots=roots)
|
||||||
|
|
||||||
|
print_tree(roots=[projets_clients])
|
||||||
|
|
||||||
|
|
||||||
|
def remove_developpeur_from_entrouvert_roles(p, level):
|
||||||
|
memberships = redmine.project_membership.filter(project_id=p.id)
|
||||||
|
|
||||||
|
for m in memberships:
|
||||||
|
if not hasattr(m, 'group'):
|
||||||
|
continue
|
||||||
|
if m.group['id'] == entrouvert.id:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
# m is Entr'ouvert membership
|
||||||
|
for role in m.roles:
|
||||||
|
if role.id == developpeur.id:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
roles = list(role for role in m.roles if not getattr(role, 'inherited', False) and role.id != developpeur.id)
|
||||||
|
roles.append(gestion_de_projet)
|
||||||
|
m.roles = roles
|
||||||
|
m.save()
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
# map_projects(remove_developpeur_from_entrouvert_roles, roots=[projets_clients])
|
Loading…
Reference in New Issue