From 5fe84f6f5ddff12b0d7e52d40adee82e822b94bc Mon Sep 17 00:00:00 2001 From: Gust Date: Mon, 6 Apr 2015 18:59:46 -0300 Subject: [PATCH] Add gitlab code at colab_gitlab --- colab_gitlab/__init__.py | 3 +++ colab_gitlab/apps.py | 25 +++++++++++++++++++++++++ colab_gitlab/data_api.py | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab_gitlab/diazo.xml | 18 ++++++++++++++++++ colab_gitlab/migrations/0001_initial.py | 28 ++++++++++++++++++++++++++++ colab_gitlab/migrations/0002_auto_20150205_1220.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab_gitlab/migrations/0003_auto_20150211_1203.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab_gitlab/migrations/__init__.py | 0 colab_gitlab/models.py | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab_gitlab/search_indexes.py | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab_gitlab/templates/proxy/gitlab.html | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ colab_gitlab/tests/__init__.py | 0 colab_gitlab/tests/test_gitlab.py | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ colab_gitlab/urls.py | 9 +++++++++ colab_gitlab/views.py | 7 +++++++ 15 files changed, 853 insertions(+), 0 deletions(-) create mode 100644 colab_gitlab/__init__.py create mode 100644 colab_gitlab/apps.py create mode 100644 colab_gitlab/data_api.py create mode 100644 colab_gitlab/diazo.xml create mode 100644 colab_gitlab/migrations/0001_initial.py create mode 100644 colab_gitlab/migrations/0002_auto_20150205_1220.py create mode 100644 colab_gitlab/migrations/0003_auto_20150211_1203.py create mode 100644 colab_gitlab/migrations/__init__.py create mode 100644 colab_gitlab/models.py create mode 100644 colab_gitlab/search_indexes.py create mode 100644 colab_gitlab/templates/proxy/gitlab.html create mode 100644 colab_gitlab/tests/__init__.py create mode 100644 colab_gitlab/tests/test_gitlab.py create mode 100644 colab_gitlab/urls.py create mode 100644 colab_gitlab/views.py diff --git a/colab_gitlab/__init__.py b/colab_gitlab/__init__.py new file mode 100644 index 0000000..6d5b4eb --- /dev/null +++ b/colab_gitlab/__init__.py @@ -0,0 +1,3 @@ +__version__ = '0.1.2' + +default_app_config = 'colab_gitlab.apps.ProxyGitlabAppConfig' diff --git a/colab_gitlab/apps.py b/colab_gitlab/apps.py new file mode 100644 index 0000000..9db3bed --- /dev/null +++ b/colab_gitlab/apps.py @@ -0,0 +1,25 @@ + +from django.utils.translation import ugettext_lazy as _ + +from colab.plugins.utils.apps import ColabProxiedAppConfig + + +class ProxyGitlabAppConfig(ColabProxiedAppConfig): + name = 'colab_gitlab' + verbose_name = 'Gitlab Proxy' + + menu = { + 'title': _('Code'), + 'links': ( + (_('Public Projects'), 'public/projects'), + ), + 'auth_links': ( + (_('Profile'), 'profile'), + (_('New Project'), 'projects/new'), + (_('Projects'), 'dashboard/projects'), + (_('Groups'), 'profile/groups'), + (_('Issues'), 'dashboard/issues'), + (_('Merge Requests'), 'dashboard/merge_requests'), + + ), + } diff --git a/colab_gitlab/data_api.py b/colab_gitlab/data_api.py new file mode 100644 index 0000000..a32c8a9 --- /dev/null +++ b/colab_gitlab/data_api.py @@ -0,0 +1,205 @@ +import json +import urllib +import urllib2 +import logging + +from dateutil.parser import parse + +from django.conf import settings +from django.db.models.fields import DateTimeField + +from colab_gitlab.models import (GitlabProject, GitlabMergeRequest, + GitlabComment, GitlabIssue) +from colab.plugins.utils.proxy_data_api import ProxyDataAPI + +LOGGER = logging.getLogger('colab.plugin.gitlab') + + +class GitlabDataAPI(ProxyDataAPI): + + def get_request_url(self, path, **kwargs): + proxy_config = settings.PROXIED_APPS.get(self.app_label, {}) + + upstream = proxy_config.get('upstream') + kwargs['private_token'] = proxy_config.get('private_token') + params = urllib.urlencode(kwargs) + + if upstream[-1] == '/': + upstream = upstream[:-1] + + return u'{}{}?{}'.format(upstream, path, params) + + def get_json_data(self, api_url, page, pages=1000): + url = self.get_request_url(api_url, per_page=pages, + page=page) + + try: + data = urllib2.urlopen(url, timeout=10) + json_data = json.load(data) + except urllib2.URLError: + LOGGER.exception("Connection timeout: " + url) + json_data = [] + + return json_data + + def fill_object_data(self, element, _object): + for field in _object._meta.fields: + try: + if field.name == "user": + _object.update_user( + element["author"]["username"]) + continue + if field.name == "project": + _object.project_id = element["project_id"] + continue + + if isinstance(field, DateTimeField): + value = parse(element[field.name]) + else: + value = element[field.name] + + setattr(_object, field.name, value) + except KeyError: + continue + + return _object + + def fetch_projects(self): + page = 1 + projects = [] + + while True: + json_data = self.get_json_data('/api/v3/projects/all', page) + page = page + 1 + + if not len(json_data): + break + + for element in json_data: + project = GitlabProject() + self.fill_object_data(element, project) + projects.append(project) + + return projects + + def fetch_merge_request(self, projects): + all_merge_request = [] + + for project in projects: + page = 1 + while True: + url = '/api/v3/projects/{}/merge_requests'.format(project.id) + json_data_mr = self.get_json_data(url, page) + page = page + 1 + + if len(json_data_mr) == 0: + break + + for element in json_data_mr: + single_merge_request = GitlabMergeRequest() + self.fill_object_data(element, single_merge_request) + all_merge_request.append(single_merge_request) + + return all_merge_request + + def fetch_issue(self, projects): + all_issues = [] + + for project in projects: + page = 1 + while True: + url = '/api/v3/projects/{}/issues'.format(project.id) + json_data_issue = self.get_json_data(url, page) + page = page + 1 + + if len(json_data_issue) == 0: + break + + for element in json_data_issue: + single_issue = GitlabIssue() + self.fill_object_data(element, single_issue) + all_issues.append(single_issue) + + return all_issues + + def fetch_comments(self): + all_comments = [] + all_comments.extend(self.fetch_comments_MR()) + all_comments.extend(self.fetch_comments_issues()) + + return all_comments + + def fetch_comments_MR(self): + all_comments = [] + all_merge_requests = GitlabMergeRequest.objects.all() + + for merge_request in all_merge_requests: + page = 1 + while True: + url = '/api/v3/projects/{}/merge_requests/{}/notes'.format( + merge_request.project_id, merge_request.id) + json_data_mr = self.get_json_data(url, page) + page = page + 1 + + if len(json_data_mr) == 0: + break + + for element in json_data_mr: + single_comment = GitlabComment() + self.fill_object_data(element, single_comment) + single_comment.project = merge_request.project + single_comment.issue_comment = False + single_comment.parent_id = merge_request.id + all_comments.append(single_comment) + + return all_comments + + def fetch_comments_issues(self): + all_comments = [] + all_issues = GitlabIssue.objects.all() + + for issue in all_issues: + page = 1 + while True: + url = '/api/v3/projects/{}/issues/{}/notes'.format( + issue.project_id, issue.id) + json_data_mr = self.get_json_data(url, page) + page = page + 1 + + if len(json_data_mr) == 0: + break + + for element in json_data_mr: + single_comment = GitlabComment() + self.fill_object_data(element, single_comment) + single_comment.project = issue.project + single_comment.issue_comment = True + single_comment.parent_id = issue.id + all_comments.append(single_comment) + + return all_comments + + def fetch_data(self): + LOGGER.info("Importing Projects") + projects = self.fetch_projects() + for datum in projects: + datum.save() + + LOGGER.info("Importing Merge Requests") + merge_request_list = self.fetch_merge_request(projects) + for datum in merge_request_list: + datum.save() + + LOGGER.info("Importing Issues") + issue_list = self.fetch_issue(projects) + for datum in issue_list: + datum.save() + + LOGGER.info("Importing Comments") + comments_list = self.fetch_comments() + for datum in comments_list: + datum.save() + + @property + def app_label(self): + return 'gitlab' diff --git a/colab_gitlab/diazo.xml b/colab_gitlab/diazo.xml new file mode 100644 index 0000000..34ffbbe --- /dev/null +++ b/colab_gitlab/diazo.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/colab_gitlab/migrations/0001_initial.py b/colab_gitlab/migrations/0001_initial.py new file mode 100644 index 0000000..516d858 --- /dev/null +++ b/colab_gitlab/migrations/0001_initial.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='GitlabProject', + fields=[ + ('id', models.IntegerField(serialize=False, primary_key=True)), + ('description', models.TextField()), + ('public', models.BooleanField(default=True)), + ('name', models.TextField()), + ('name_with_namespace', models.TextField()), + ('created_at', models.DateTimeField(blank=True)), + ('last_activity_at', models.DateTimeField(blank=True)), + ], + options={ + }, + bases=(models.Model,), + ), + ] diff --git a/colab_gitlab/migrations/0002_auto_20150205_1220.py b/colab_gitlab/migrations/0002_auto_20150205_1220.py new file mode 100644 index 0000000..23ec44a --- /dev/null +++ b/colab_gitlab/migrations/0002_auto_20150205_1220.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.db.models.deletion +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('colab_gitlab', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='GitlabComment', + fields=[ + ('id', models.IntegerField(serialize=False, primary_key=True)), + ('body', models.TextField()), + ('created_at', models.DateTimeField(blank=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, null=True)), + ], + options={ + 'verbose_name': 'Gitlab Comments', + 'verbose_name_plural': 'Gitlab Comments', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='GitlabIssue', + fields=[ + ('id', models.IntegerField(serialize=False, primary_key=True)), + ('title', models.TextField()), + ('description', models.TextField()), + ('state', models.TextField()), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, to='colab_gitlab.GitlabProject', null=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, null=True)), + ], + options={ + 'verbose_name': 'Gitlab Collaboration', + 'verbose_name_plural': 'Gitlab Collaborations', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='GitlabMergeRequest', + fields=[ + ('id', models.IntegerField(serialize=False, primary_key=True)), + ('target_branch', models.TextField()), + ('source_branch', models.TextField()), + ('description', models.TextField()), + ('title', models.TextField()), + ('state', models.TextField()), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, to='colab_gitlab.GitlabProject', null=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, null=True)), + ], + options={ + 'verbose_name': 'Gitlab Merge Request', + 'verbose_name_plural': 'Gitlab Merge Requests', + }, + bases=(models.Model,), + ), + migrations.AlterModelOptions( + name='gitlabproject', + options={'verbose_name': 'Gitlab Project', 'verbose_name_plural': 'Gitlab Projects'}, + ), + ] diff --git a/colab_gitlab/migrations/0003_auto_20150211_1203.py b/colab_gitlab/migrations/0003_auto_20150211_1203.py new file mode 100644 index 0000000..6f8c5d3 --- /dev/null +++ b/colab_gitlab/migrations/0003_auto_20150211_1203.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('colab_gitlab', '0002_auto_20150205_1220'), + ] + + operations = [ + migrations.AlterModelOptions( + name='gitlabissue', + options={'verbose_name': 'Gitlab Issue', 'verbose_name_plural': 'Gitlab Issues'}, + ), + migrations.AddField( + model_name='gitlabcomment', + name='issue_comment', + field=models.BooleanField(default=True), + preserve_default=True, + ), + migrations.AddField( + model_name='gitlabcomment', + name='parent_id', + field=models.IntegerField(null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='gitlabcomment', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, to='colab_gitlab.GitlabProject', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='gitlabissue', + name='created_at', + field=models.DateTimeField(null=True, blank=True), + preserve_default=True, + ), + migrations.AddField( + model_name='gitlabmergerequest', + name='created_at', + field=models.DateTimeField(null=True, blank=True), + preserve_default=True, + ), + migrations.AddField( + model_name='gitlabproject', + name='path_with_namespace', + field=models.TextField(null=True, blank=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='gitlabcomment', + name='created_at', + field=models.DateTimeField(null=True, blank=True), + preserve_default=True, + ), + ] diff --git a/colab_gitlab/migrations/__init__.py b/colab_gitlab/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab_gitlab/migrations/__init__.py diff --git a/colab_gitlab/models.py b/colab_gitlab/models.py new file mode 100644 index 0000000..b6ed1c3 --- /dev/null +++ b/colab_gitlab/models.py @@ -0,0 +1,143 @@ +from django.db import models +from django.utils.translation import ugettext_lazy as _ +from colab.plugins.utils.models import Collaboration +from hitcounter.models import HitCounterModelMixin + + +class GitlabProject(models.Model, HitCounterModelMixin): + + id = models.IntegerField(primary_key=True) + description = models.TextField() + public = models.BooleanField(default=True) + name = models.TextField() + name_with_namespace = models.TextField() + created_at = models.DateTimeField(blank=True) + last_activity_at = models.DateTimeField(blank=True) + path_with_namespace = models.TextField(blank=True, null=True) + + @property + def url(self): + return u'/gitlab/{}'.format(self.path_with_namespace) + + class Meta: + verbose_name = _('Gitlab Project') + verbose_name_plural = _('Gitlab Projects') + + +class GitlabMergeRequest(Collaboration): + + id = models.IntegerField(primary_key=True) + target_branch = models.TextField() + source_branch = models.TextField() + project = models.ForeignKey(GitlabProject, null=True, + on_delete=models.SET_NULL) + description = models.TextField() + title = models.TextField() + state = models.TextField() + created_at = models.DateTimeField(blank=True, null=True) + + @property + def modified(self): + return self.created_at + + @property + def tag(self): + return self.state + + type = u'merge_request' + icon_name = u'file' + + @property + def url(self): + return u'/gitlab/{}/merge_requests/{}'.format( + self.project.path_with_namespace, self.id) + + def get_author(self): + return self.user + + class Meta: + verbose_name = _('Gitlab Merge Request') + verbose_name_plural = _('Gitlab Merge Requests') + + +class GitlabIssue(Collaboration): + + id = models.IntegerField(primary_key=True) + project = models.ForeignKey(GitlabProject, null=True, + on_delete=models.SET_NULL) + title = models.TextField() + description = models.TextField() + + state = models.TextField() + created_at = models.DateTimeField(blank=True, null=True) + + icon_name = u'align-right' + type = u'gitlab_issue' + + @property + def modified(self): + return self.created_at + + @property + def url(self): + return u'/gitlab/{}/issues/{}'.format( + self.project.path_with_namespace, self.id) + + class Meta: + verbose_name = _('Gitlab Issue') + verbose_name_plural = _('Gitlab Issues') + + +class GitlabComment(Collaboration): + + id = models.IntegerField(primary_key=True) + body = models.TextField() + created_at = models.DateTimeField(blank=True, null=True) + issue_comment = models.BooleanField(default=True) + + project = models.ForeignKey(GitlabProject, null=True, + on_delete=models.SET_NULL) + + parent_id = models.IntegerField(null=True) + type = u'comment' + + @property + def modified(self): + return self.created_at + + @property + def title(self): + if self.issue_comment: + issue = GitlabIssue.objects.get(id=self.parent_id) + return issue.title + else: + merge_request = GitlabMergeRequest.objects.get(id=self.parent_id) + return merge_request.title + + icon_name = u'align-right' + + @property + def description(self): + return self.body + + @property + def tag(self): + if self.issue_comment: + issue = GitlabIssue.objects.get(id=self.parent_id) + return issue.state + else: + merge_request = GitlabMergeRequest.objects.get(id=self.parent_id) + return merge_request.state + + @property + def url(self): + if self.issue_comment: + return u'/gitlab/{}/issues/{}#notes_{}'.format( + self.project.path_with_namespace, self.parent_id, self.id) + else: + return u'/gitlab/{}/merge_requests/{}#notes_{}'.format( + self.project.path_with_namespace, self.parent_id, self.id) + + class Meta: + verbose_name = _('Gitlab Comments') + verbose_name_plural = _('Gitlab Comments') diff --git a/colab_gitlab/search_indexes.py b/colab_gitlab/search_indexes.py new file mode 100644 index 0000000..01f1b4a --- /dev/null +++ b/colab_gitlab/search_indexes.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +import string + +from haystack import indexes +from haystack.utils import log as logging + +from .models import (GitlabProject, GitlabMergeRequest, + GitlabIssue, GitlabComment) + + +logger = logging.getLogger('haystack') + +# The string maketrans always return a string encoded with latin1 +# http://stackoverflow.com/questions/1324067/how-do-i-get-str-translate-to-work-with-unicode-strings +table = string.maketrans( + string.punctuation, + '.' * len(string.punctuation) +).decode('latin1') + + +class GitlabProjectIndex(indexes.SearchIndex, indexes.Indexable): + text = indexes.CharField(document=True, use_template=False, stored=False) + title = indexes.CharField(model_attr='name') + description = indexes.CharField(model_attr='description', null=True) + tag = indexes.CharField() + url = indexes.CharField(model_attr='url', indexed=False) + icon_name = indexes.CharField() + type = indexes.CharField() + created = indexes.DateTimeField(model_attr='created_at', null=True) + + def prepare_tag(self, obj): + return "{}".format(obj.name_with_namespace.split('/')[0].strip()) + + def prepare_icon_name(self, obj): + return u'file' + + def get_ful_name(self): + self.objs.name + + def get_model(self): + return GitlabProject + + def prepare_type(self, obj): + return u'gitlab' + + +class GitlabMergeRequestIndex(indexes.SearchIndex, indexes.Indexable): + + text = indexes.CharField(document=True, use_template=False, stored=False) + title = indexes.CharField(model_attr='title') + description = indexes.CharField(model_attr='description') + tag = indexes.CharField(model_attr='state') + url = indexes.CharField(model_attr='url', indexed=False) + icon_name = indexes.CharField() + type = indexes.CharField(model_attr='type') + + modified_by = indexes.CharField(model_attr='modified_by', null=True) + modified_by_url = indexes.CharField(model_attr='modified_by_url', + null=True) + modified = indexes.DateTimeField(model_attr='created_at', null=True) + + def get_model(self): + return GitlabMergeRequest + + def prepare_icon_name(self, obj): + return u'file' + + def prepare_type(self, obj): + return u'merge_request' + + +class GitlabIssueIndex(indexes.SearchIndex, indexes.Indexable): + + text = indexes.CharField(document=True, use_template=False, stored=False) + title = indexes.CharField(model_attr='title') + description = indexes.CharField(model_attr='description') + tag = indexes.CharField(model_attr='state') + url = indexes.CharField(model_attr='url', indexed=False) + icon_name = indexes.CharField() + type = indexes.CharField(model_attr='type') + + modified_by = indexes.CharField(model_attr='modified_by', null=True) + modified_by_url = indexes.CharField(model_attr='modified_by_url', + null=True) + modified = indexes.DateTimeField(model_attr='created_at', null=True) + + def get_model(self): + return GitlabIssue + + def prepare_icon_name(self, obj): + return u'align-right' + + def prepare_type(self, obj): + return u'merge_request' + + +class GitlabCommentIndex(indexes.SearchIndex, indexes.Indexable): + + text = indexes.CharField(document=True, use_template=False, stored=False) + title = indexes.CharField(model_attr='title') + description = indexes.CharField(model_attr='description') + tag = indexes.CharField() + url = indexes.CharField(model_attr='url', indexed=False) + icon_name = indexes.CharField() + type = indexes.CharField(model_attr='type') + + modified_by = indexes.CharField(model_attr='modified_by', null=True) + modified_by_url = indexes.CharField(model_attr='modified_by_url', + null=True) + modified = indexes.DateTimeField(model_attr='created_at', null=True) + + def get_model(self): + return GitlabComment + + def prepare_icon_name(self, obj): + return u'align-right' + + def prepare_tag(self, obj): + return obj.tag diff --git a/colab_gitlab/templates/proxy/gitlab.html b/colab_gitlab/templates/proxy/gitlab.html new file mode 100644 index 0000000..1d55f9f --- /dev/null +++ b/colab_gitlab/templates/proxy/gitlab.html @@ -0,0 +1,51 @@ +{% extends 'base.html' %} +{% load static from staticfiles %} + +{% block head_css %} + +{% endblock %} + +{% block head_js %} + + + + +{% endblock %} diff --git a/colab_gitlab/tests/__init__.py b/colab_gitlab/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab_gitlab/tests/__init__.py diff --git a/colab_gitlab/tests/test_gitlab.py b/colab_gitlab/tests/test_gitlab.py new file mode 100644 index 0000000..5a75720 --- /dev/null +++ b/colab_gitlab/tests/test_gitlab.py @@ -0,0 +1,114 @@ +""" +Test User class. +Objective: Test parameters, and behavior. +""" +from datetime import datetime + + +from django.test import TestCase, Client +from colab.accounts.models import User +from colab_gitlab.models import GitlabProject, \ + GitlabIssue, GitlabComment, GitlabMergeRequest + + +class GitlabTest(TestCase): + + def setUp(self): + self.user = self.create_user() + self.client = Client() + self.create_gitlab_data() + + super(GitlabTest, self).setUp() + + def tearDown(self): + pass + + def test_data_integrity(self): + self.assertEqual(GitlabProject.objects.all().count(), 1) + self.assertEqual(GitlabMergeRequest.objects.all().count(), 1) + self.assertEqual(GitlabIssue.objects.all().count(), 1) + self.assertEqual(GitlabComment.objects.all().count(), 2) + + def test_project_url(self): + self.assertEqual(GitlabProject.objects.get(id=1).url, + '/gitlab/softwarepublico/colab') + + def test_merge_request_url(self): + self.assertEqual(GitlabMergeRequest.objects.get(id=1).url, + '/gitlab/softwarepublico/colab/merge_requests/1') + + def test_issue_url(self): + self.assertEqual(GitlabIssue.objects.get(id=1).url, + '/gitlab/softwarepublico/colab/issues/1') + + def test_comment_on_mr_url(self): + url = '/gitlab/softwarepublico/colab/merge_requests/1#notes_1' + self.assertEqual(GitlabComment.objects.get(id=1).url, url) + + def test_comment_on_issue_url(self): + self.assertEqual(GitlabComment.objects.get(id=2).url, + '/gitlab/softwarepublico/colab/issues/1#notes_2') + + def create_gitlab_data(self): + g = GitlabProject() + g.id = 1 + g.name = "colab" + g.name_with_namespace = "Software Public / Colab" + g.path_with_namespace = "softwarepublico/colab" + g.created_at = datetime.now() + g.last_activity_at = datetime.now() + g.save() + + mr = GitlabMergeRequest() + mr.id = 1 + mr.project = g + mr.title = "Include plugin support" + mr.description = "Merge request for plugin support" + mr.state = "Closed" + mr.created_at = datetime.now() + mr.update_user(self.user.username) + mr.save() + + i = GitlabIssue() + i.id = 1 + i.project = g + i.title = "Issue for colab" + i.description = "Issue reported to colab" + i.created_at = datetime.now() + i.state = "Open" + i.update_user(self.user.username) + i.save() + + c1 = GitlabComment() + c1.id = 1 + c1.parent_id = mr.id + c1.project = g + c1.body = "Comment to merge request" + c1.created_at = datetime.now() + c1.issue_comment = False + c1.update_user(self.user.username) + c1.save() + + c2 = GitlabComment() + c2.id = 2 + c2.parent_id = i.id + c2.project = g + c2.body = "Comment to issue" + c2.created_at = datetime.now() + c2.issue_comment = True + c2.update_user(self.user.username) + c2.save() + + def create_user(self): + user = User() + user.username = "USERtestCoLaB" + user.set_password("123colab4") + user.email = "usertest@colab.com.br" + user.id = 1 + user.twitter = "usertestcolab" + user.facebook = "usertestcolab" + user.first_name = "USERtestCoLaB" + user.last_name = "COLAB" + user.save() + + return user diff --git a/colab_gitlab/urls.py b/colab_gitlab/urls.py new file mode 100644 index 0000000..fa2ec6b --- /dev/null +++ b/colab_gitlab/urls.py @@ -0,0 +1,9 @@ + +from django.conf.urls import patterns, url + +from .views import GitlabProxyView + +urlpatterns = patterns('', + # Gitlab URLs + url(r'^(?P.*)$', GitlabProxyView.as_view(), name='gitlab'), +) diff --git a/colab_gitlab/views.py b/colab_gitlab/views.py new file mode 100644 index 0000000..24d8427 --- /dev/null +++ b/colab_gitlab/views.py @@ -0,0 +1,7 @@ + +from colab.plugins.utils.views import ColabProxyView + + +class GitlabProxyView(ColabProxyView): + app_label = 'gitlab' + diazo_theme_template = 'proxy/gitlab.html' -- libgit2 0.21.2