diff --git a/project.py b/project.py index d688d2d..6551a4c 100644 --- a/project.py +++ b/project.py @@ -13,7 +13,7 @@ import tempfile import json import warnings import time -import dateutil +import dateutil.parser import calendar from collections import defaultdict from datetime import datetime, date @@ -2414,6 +2414,8 @@ class ProjectWorkCommit(ModelSQL, ModelView): See https://help.github.com/articles/post-receive-hooks """ NereidUser = Pool().get('nereid.user') + Activity = Pool().get('nereid.activity') + Project = Pool().get('project.work') if request.method == "POST": payload = json.loads(request.form['payload']) @@ -2434,7 +2436,7 @@ class ProjectWorkCommit(ModelSQL, ModelView): r'pull request #(\d+)', commit['message'] ) ]) - for project in projects - pull_requests: + for project in Project.browse(projects - pull_requests): local_commit_time = dateutil.parser.parse( commit['timestamp'] ) @@ -2447,7 +2449,7 @@ class ProjectWorkCommit(ModelSQL, ModelView): ]) if commit_hook: continue - cls.create({ + commit = cls.create({ 'commit_timestamp': commit_timestamp, 'project': project, 'nereid_user': nereid_users[0].id, @@ -2457,6 +2459,13 @@ class ProjectWorkCommit(ModelSQL, ModelView): 'commit_url': commit['url'], 'commit_id': commit['id'] }) + Activity.create({ + 'actor': nereid_users[0].id, + 'object_': 'project.work.commit, %d' % commit.id, + 'verb': 'made_commit', + 'target': 'project.work, %d' % project.id, + 'project': project.parent.id, + }) return 'OK' def _json(self): @@ -2465,6 +2474,12 @@ class ProjectWorkCommit(ModelSQL, ModelView): "objectType": self.__name__, "id": self.id, "updatedBy": self.nereid_user._json(), + "url": self.commit_url, + "displayName": self.commit_message, + "repository": self.repository, + "repository_url": self.repository_url, + "commit_timestamp": self.commit_timestamp, + "commit_id": self.commit_id, } @classmethod diff --git a/project.xml b/project.xml index c5eed8a..d64df95 100644 --- a/project.xml +++ b/project.xml @@ -80,6 +80,12 @@ of this repository contains the full copyright notices and license terms. --> + + ProjectWorkCommit + + + Project Admin project.admin diff --git a/tests/test_task.py b/tests/test_task.py index 416ce6c..14b1bda 100644 --- a/tests/test_task.py +++ b/tests/test_task.py @@ -10,11 +10,13 @@ import unittest import json import smtplib +import pytz from trytond.config import CONFIG CONFIG['smtp_from'] = 'test@openlabs.co.in' CONFIG['data_path'] = '.' from minimock import Mock +from datetime import datetime import trytond.tests.test_tryton from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT @@ -57,6 +59,8 @@ class TestTask(NereidTestCase): self.Tag = POOL.get('project.work.tag') self.History = POOL.get('project.work.history') self.Permission = POOL.get('nereid.permission') + self.ProjectWorkCommit = POOL.get('project.work.commit') + self.Activity = POOL.get('nereid.activity') self.xhr_header = [ ('X-Requested-With', 'XMLHttpRequest'), ] @@ -257,6 +261,8 @@ class TestTask(NereidTestCase): 'localhost/project/comment.jinja': '', 'localhost/project/tasks-by-employee.jinja': '', 'localhost/project/project-task-list.jinja': '{{ tasks|length }}', + 'localhost/project/emails/project_text_content.jinja': '{{ task }}', + 'localhost/project/emails/project_html_content.jinja': '{{ task }}', } return self.templates.get(name) @@ -1116,6 +1122,74 @@ class TestTask(NereidTestCase): response.data ) + def test_0210_github_commit_activity_stream(self): + """ + Checks activity stream generation for commit message and github hook + handler + """ + with Transaction().start(DB_NAME, USER, CONTEXT): + data = self.create_task_dafaults() + app = self.get_app() + task = data['task1'] + + login_data = { + 'email': 'email@example.com', + 'password': 'password', + } + utc = pytz.UTC + + payload = { + 'commits': [{ + 'author': {'email': 'email@example.com'}, + 'message': 'Add commit #%d' % task.id, + 'timestamp': str(utc.localize(datetime.utcnow())), + 'url': 'repo/url/1', + 'id': '54321', + }], + 'repository': { + 'name': 'ABC Repository', + 'url': 'repo/url', + } + } + + with app.test_client() as c: + response = c.post('/en_US/login', data=login_data) + + # Login Success + self.assertEqual(response.status_code, 302) + + with Transaction().set_context( + {'company': data['company'].id} + ): + self.assertEqual( + len(data['registered_user1'].activities), 0 + ) + + # Check github handler + response = c.post( + '/en_US/-project/-github-hook', + data={ + 'payload': json.dumps(payload) + } + ) + self.assertEqual(response.status_code, 200) + self.assertTrue(response.data, 'OK') + + # Activity stream is created for commit user + self.assertEqual( + len(data['registered_user1'].activities), 1 + ) + + commit, = self.ProjectWorkCommit.search([ + ('commit_id', '=', '54321') + ]) + + activities = self.Activity.search([ + ('object_', '=', 'project.work.commit, %d' % commit.id) + ]), + + self.assertEqual(len(activities), 1) + def suite(): "Nereid test suite"