diff --git a/redmine-scripts/config.py b/redmine-scripts/config.py new file mode 100644 index 0000000..5f5c97e --- /dev/null +++ b/redmine-scripts/config.py @@ -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) diff --git a/redmine-scripts/move_developpeur_to_gestion_de_projet.py b/redmine-scripts/move_developpeur_to_gestion_de_projet.py new file mode 100644 index 0000000..0272fa2 --- /dev/null +++ b/redmine-scripts/move_developpeur_to_gestion_de_projet.py @@ -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])