Commit 0be2cc87d1c458723e790d69eed64251c1ddcf79

Authored by Luiz Oliveira
1 parent ebd1de78

Created group/project when noosfero community is created

Is created a group and project when a signal is received
from a new noosfero community. The members already presents
in the community is included into the default project.

Signed-off-by: Gustavo Jaruga <darksshades@gmail.com>
Signed-off-by: Luiz Oliveira <ziuloliveira@gmail.com>
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 community_creation, community_updated
  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', community_creation)
  23 + connect_signal('community_updated', 'noosfero', community_updated)
... ...
src/colab-spb-plugin/src/colab_spb/tasks.py 0 → 100644
... ... @@ -0,0 +1,150 @@
  1 +import requests
  2 +
  3 +from django.conf import settings
  4 +
  5 +from colab.celery import app
  6 +from colab.signals.signals import send
  7 +from celery.utils.log import get_task_logger
  8 +from colab_gitlab.models import GitlabGroup
  9 +
  10 +logger = get_task_logger(__name__)
  11 +
  12 +
  13 +def create_group_from_community(noosfero_community):
  14 + """ Create a group into Gitlab from a Noosfero's Community"""
  15 +
  16 + # If project already exist
  17 + group = GitlabGroup.objects.filter(name=noosfero_community.name)
  18 + if group:
  19 + return group[0].id
  20 +
  21 + app_config = settings.COLAB_APPS.get('colab_gitlab', {})
  22 + private_token = app_config.get('private_token')
  23 + upstream = app_config.get('upstream', '').rstrip('/')
  24 + verify_ssl = app_config.get('verify_ssl', False)
  25 +
  26 + error_msg = u'Error trying to create group "%s" on Gitlab. Reason: %s'
  27 +
  28 + users_endpoint = '{}/api/v3/groups'.format(upstream)
  29 +
  30 + params = {
  31 + 'name': noosfero_community.name,
  32 + 'path': noosfero_community.identifier,
  33 + 'private_token': private_token
  34 + }
  35 + group_id = None
  36 + try:
  37 + response = requests.post(users_endpoint, params=params,
  38 + verify=verify_ssl)
  39 + except Exception as excpt:
  40 + reason = 'Request to API failed ({})'.format(excpt)
  41 + logger.error(error_msg, noosfero_community.name, reason)
  42 + return
  43 +
  44 + if response.status_code != 201:
  45 + if response.status_code is 404:
  46 + pass # TODO: should request the existing group id if error 404
  47 + reason = 'Unknown [{}].'.format(response.status_code)
  48 + logger.error(error_msg, noosfero_community.name, reason)
  49 + return
  50 + else:
  51 + group_id = response.json().get('id')
  52 + logger.info('Group {0} created'.format(noosfero_community.name))
  53 +
  54 + return group_id
  55 +
  56 +
  57 +def include_members_into_group(admins, group_id):
  58 + """ Include members from a Noosfero's Community into a Gitlab's group """
  59 +
  60 + app_config = settings.COLAB_APPS.get('colab_gitlab', {})
  61 + private_token = app_config.get('private_token')
  62 + upstream = app_config.get('upstream', '').rstrip('/')
  63 + verify_ssl = app_config.get('verify_ssl', False)
  64 + error_msg = u'Error to include "%s" to create group "%s" on Gitlab. \
  65 + Reason: %s'
  66 +
  67 + user_id = None
  68 + users_endpoint = '{}/api/v3/users'.format(upstream)
  69 + for admin in admins:
  70 + params = {'search': admin.username,
  71 + 'private_token': private_token}
  72 + response = requests.get(users_endpoint, params=params,
  73 + verify=verify_ssl)
  74 + users = response.json()
  75 + # Be sure to get only one
  76 + for user in users:
  77 + if user['username'] == admin.username:
  78 + user_id = user['id']
  79 + break
  80 +
  81 + users_endpoint = '{}/api/v3/groups/{}/members'.format(
  82 + upstream, group_id)
  83 + params = {
  84 + 'user_id': user_id,
  85 + 'access_level': 50, # OWNER = 50
  86 + 'private_token': private_token
  87 + }
  88 + try:
  89 + response = requests.post(users_endpoint, params=params,
  90 + verify=verify_ssl)
  91 + except Exception as excpt:
  92 + reason = 'Request to API failed ({})'.format(excpt)
  93 + logger.error(error_msg, admin.username, reason)
  94 + return
  95 + logger.info('Members included')
  96 +
  97 +
  98 +def create_project(project_name, group_id):
  99 + """ Create a project into Gitlab group """
  100 + app_config = settings.COLAB_APPS.get('colab_gitlab', {})
  101 + private_token = app_config.get('private_token')
  102 + upstream = app_config.get('upstream', '').rstrip('/')
  103 + verify_ssl = app_config.get('verify_ssl', False)
  104 + error_msg = u'Error to create project "%s" into Gitlab. Reason: %s'
  105 +
  106 + users_endpoint = '{}/api/v3/projects'.format(upstream)
  107 + params = {
  108 + 'name': project_name,
  109 + 'public': True,
  110 + 'visibility_level': 20, # show to all
  111 + 'namespace_id': group_id,
  112 + 'private_token': private_token
  113 + }
  114 + try:
  115 + requests.post(users_endpoint, params=params,
  116 + verify=verify_ssl)
  117 + except Exception as excpt:
  118 + reason = 'Request to API failed ({})'.format(excpt)
  119 + logger.error(error_msg, project_name, reason)
  120 + return
  121 + logger.info('Project created')
  122 +
  123 +
  124 +@app.task(bind=True)
  125 +def community_creation(self, **kwargs):
  126 + f = open('/vagrant/community_creation', 'wb')
  127 + f.write(str(kwargs))
  128 + f.close()
  129 + logger.info('Community created: {0}'.format(''.join(kwargs)))
  130 +
  131 + send('create_repo', 'spb')
  132 + send('create_mail_list', 'spb')
  133 +
  134 + noosfero_community = kwargs['community']
  135 + admins = noosfero_community.admins.all()
  136 +
  137 + group_id = create_group_from_community(noosfero_community)
  138 + include_members_into_group(admins, group_id)
  139 + create_project(noosfero_community.name, group_id)
  140 +
  141 + return 6
  142 +
  143 +
  144 +@app.task(bind=True)
  145 +def community_updated(self, **kwargs):
  146 + f = open('/vagrant/community_updated', 'wb')
  147 + f.write(str(kwargs))
  148 + f.close()
  149 + logger.info('Community updated: {0}'.format(''.join(kwargs)))
  150 + return 7
... ...