Commit 5a3b07528969bf43b145d4f641a0c22f736ab0fd

Authored by macartur
2 parents 0fb8e6a1 0daa3607

Merge branch 'signals_community_noosfero' into 'master'

Signals community noosfero

See merge request !130
src/colab-spb-plugin/src/colab_spb/apps.py
1   -
2 1 from django.apps import AppConfig
  2 +from colab.signals.signals import connect_signal, register_signal
  3 +from celery.utils.log import get_task_logger
  4 +from colab_spb.tasks import list_group_and_repository_creation
  5 +
  6 +logger = get_task_logger(__name__)
3 7  
4 8  
5 9 class SpbAppConfig(AppConfig):
6 10 name = 'colab_spb'
7 11 verbose_name = 'SPB'
  12 + short_name = 'spb'
8 13 namespace = 'spb'
  14 +
  15 + signals_list = ['create_repo', 'create_mail_list']
  16 +
  17 + def register_signal(self):
  18 + logger.info('Signals from {0} registed '.format(self.short_name))
  19 + register_signal(self.short_name, self.signals_list)
  20 +
  21 + def connect_signal(self):
  22 + connect_signal('community_creation', 'noosfero',
  23 + list_group_and_repository_creation)
... ...
src/colab-spb-plugin/src/colab_spb/tasks.py 0 → 100644
... ... @@ -0,0 +1,162 @@
  1 +import requests
  2 +from unicodedata import normalize, category
  3 +
  4 +from django.conf import settings
  5 +
  6 +from celery.utils.log import get_task_logger
  7 +from colab.accounts.utils.mailman import create_list
  8 +from colab.celery import app
  9 +from colab_gitlab.models import GitlabGroup
  10 +
  11 +logger = get_task_logger(__name__)
  12 +
  13 +
  14 +def normalize_name(name):
  15 + """
  16 + Removes letters' accents, replaces whitespaces for dash (-), and lowercases
  17 + all letters
  18 + """
  19 + name = name.replace(' ', '-')
  20 +
  21 + if not isinstance(name, unicode):
  22 + name = unicode(name, 'utf-8')
  23 +
  24 + name = ''.join(c for c in normalize('NFD', name) if category(c) != 'Mn')
  25 +
  26 + return name.lower()
  27 +
  28 +
  29 +def create_group_from_community(noosfero_community):
  30 + """ Create a group into Gitlab from a Noosfero's Community"""
  31 +
  32 + group_name = normalize_name(noosfero_community.name)
  33 +
  34 + # If project already exist
  35 + group = GitlabGroup.objects.filter(name=group_name)
  36 + if group:
  37 + return group[0].id
  38 +
  39 + app_config = settings.COLAB_APPS.get('colab_gitlab', {})
  40 + private_token = app_config.get('private_token')
  41 + upstream = app_config.get('upstream', '').rstrip('/')
  42 + verify_ssl = app_config.get('verify_ssl', False)
  43 +
  44 + error_msg = u'Error trying to create group "%s" on Gitlab. Reason: %s'
  45 +
  46 + users_endpoint = '{}/api/v3/groups'.format(upstream)
  47 +
  48 + params = {
  49 + 'name': group_name,
  50 + 'path': noosfero_community.identifier,
  51 + 'private_token': private_token
  52 + }
  53 + group_id = None
  54 + try:
  55 + response = requests.post(users_endpoint, params=params,
  56 + verify=verify_ssl)
  57 + except Exception as excpt:
  58 + reason = 'Request to API failed ({})'.format(excpt)
  59 + logger.error(error_msg, group_name, reason)
  60 + return
  61 +
  62 + if response.status_code != 201:
  63 + if response.status_code is 404:
  64 + pass # TODO: should request the existing group id if error 404
  65 + reason = 'Unknown [{}].'.format(response.status_code)
  66 + logger.error(error_msg, group_name, reason)
  67 + return
  68 + else:
  69 + group_id = response.json().get('id')
  70 + logger.info('Group {0} created'.format(group_name))
  71 +
  72 + return group_id
  73 +
  74 +
  75 +def include_members_into_group(admins, group_id):
  76 + """ Include members from a Noosfero's Community into a Gitlab's group """
  77 +
  78 + app_config = settings.COLAB_APPS.get('colab_gitlab', {})
  79 + private_token = app_config.get('private_token')
  80 + upstream = app_config.get('upstream', '').rstrip('/')
  81 + verify_ssl = app_config.get('verify_ssl', False)
  82 + error_msg = u'Error to include "%s" to create group "%s" on Gitlab. \
  83 + Reason: %s'
  84 +
  85 + user_id = None
  86 + users_endpoint = '{}/api/v3/users'.format(upstream)
  87 + for admin in admins:
  88 + params = {'search': admin.username,
  89 + 'private_token': private_token}
  90 + response = requests.get(users_endpoint, params=params,
  91 + verify=verify_ssl)
  92 + users = response.json()
  93 + # Be sure to get only one
  94 + for user in users:
  95 + if user['username'] == admin.username:
  96 + user_id = user['id']
  97 + break
  98 +
  99 + users_endpoint = '{}/api/v3/groups/{}/members'.format(
  100 + upstream, group_id)
  101 + params = {
  102 + 'user_id': user_id,
  103 + 'access_level': 50, # OWNER = 50
  104 + 'private_token': private_token
  105 + }
  106 + try:
  107 + response = requests.post(users_endpoint, params=params,
  108 + verify=verify_ssl)
  109 + except Exception as excpt:
  110 + reason = 'Request to API failed ({})'.format(excpt)
  111 + logger.error(error_msg, admin.username, reason)
  112 + return
  113 + logger.info('Members included')
  114 +
  115 +
  116 +def create_project(project_name, group_id):
  117 + """ Create a project into Gitlab group """
  118 +
  119 + project_name = normalize_name(project_name)
  120 +
  121 + app_config = settings.COLAB_APPS.get('colab_gitlab', {})
  122 + private_token = app_config.get('private_token')
  123 + upstream = app_config.get('upstream', '').rstrip('/')
  124 + verify_ssl = app_config.get('verify_ssl', False)
  125 + error_msg = u'Error to create project "%s" into Gitlab. Reason: %s'
  126 +
  127 + users_endpoint = '{}/api/v3/projects'.format(upstream)
  128 + params = {
  129 + 'name': project_name,
  130 + 'public': True,
  131 + 'visibility_level': 20, # show to all
  132 + 'namespace_id': group_id,
  133 + 'private_token': private_token
  134 + }
  135 + try:
  136 + requests.post(users_endpoint, params=params,
  137 + verify=verify_ssl)
  138 + except Exception as excpt:
  139 + reason = 'Request to API failed ({})'.format(excpt)
  140 + logger.error(error_msg, project_name, reason)
  141 + return
  142 + logger.info('Project created')
  143 +
  144 +
  145 +@app.task(bind=True)
  146 +def list_group_and_repository_creation(self, **kwargs):
  147 + logger.info('Community created: {0}'.format(''.join(kwargs)))
  148 +
  149 + noosfero_community = kwargs['community']
  150 + admins = noosfero_community.admins.all()
  151 + if not len(admins):
  152 + logger.error('Failed to create list, the software does not '
  153 + 'have an admin.')
  154 + return -1
  155 +
  156 + group_id = create_group_from_community(noosfero_community)
  157 + include_members_into_group(admins, group_id)
  158 + create_project(noosfero_community.name, group_id)
  159 + listname = normalize_name(noosfero_community.name)
  160 + create_list(listname, admins[0])
  161 +
  162 + return 0
... ...