diff --git a/CHANGELOG.md b/CHANGELOG.md index defcb4db..4b3dbcda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - Add traditional chinese (zh-Hant) translation. - Add Jitsi to our supported videoconference apps list - Add tags field to CSV reports. +- Improve history (and email) comments created by all the GitHub actions ### Misc - New contrib plugin for letschat (by Δndrea Stagi) diff --git a/taiga/hooks/github/event_hooks.py b/taiga/hooks/github/event_hooks.py index 6ccac3da..5dfecb7b 100644 --- a/taiga/hooks/github/event_hooks.py +++ b/taiga/hooks/github/event_hooks.py @@ -36,14 +36,13 @@ class PushEventHook(BaseEventHook): if self.payload is None: return - github_user = self.payload.get('sender', {}).get('id', None) + github_user = self.payload.get('sender', {}) commits = self.payload.get("commits", []) for commit in commits: - message = commit.get("message", None) - self._process_message(message, github_user) + self._process_commit(commit, github_user) - def _process_message(self, message, github_user): + def _process_commit(self, commit, github_user): """ The message we will be looking for seems like TG-XX #yyyyyy @@ -51,6 +50,8 @@ class PushEventHook(BaseEventHook): XX: is the ref for us, issue or task yyyyyy: is the status slug we are setting """ + message = commit.get("message", None) + if message is None: return @@ -59,9 +60,9 @@ class PushEventHook(BaseEventHook): if m: ref = m.group(1) status_slug = m.group(2) - self._change_status(ref, status_slug, github_user) + self._change_status(ref, status_slug, github_user, commit) - def _change_status(self, ref, status_slug, github_user): + def _change_status(self, ref, status_slug, github_user, commit): if Issue.objects.filter(project=self.project, ref=ref).exists(): modelClass = Issue statusClass = IssueStatus @@ -84,9 +85,31 @@ class PushEventHook(BaseEventHook): element.status = status element.save() + github_user_id = github_user.get('id', None) + github_user_name = github_user.get('login', None) + github_user_url = github_user.get('html_url', None) + commit_id = commit.get("id", None) + commit_url = commit.get("url", None) + commit_message = commit.get("message", None) + + if (github_user_id and github_user_name and github_user_url and + commit_id and commit_url and commit_message): + comment = _("Status changed by [@{github_user_name}]({github_user_url} " + "\"See @{github_user_name}'s GitHub profile\") " + "from GitHub commit [#{commit_id}]({commit_url} " + "\"See commit '#{commit_id}: {commit_message}'\").").format( + github_user_name=github_user_name, + github_user_url=github_user_url, + commit_id=commit_id[:7], + commit_url=commit_url, + commit_message=commit_message) + + else: + comment = _("Status changed from GitHub commit.") + snapshot = take_snapshot(element, - comment=_("Status changed from GitHub commit"), - user=get_github_user(github_user)) + comment=comment, + user=get_github_user(github_user_id)) send_notifications(element, history=snapshot) @@ -103,11 +126,17 @@ class IssuesEventHook(BaseEventHook): if self.payload.get('action', None) != "opened": return + number = self.payload.get('issue', {}).get('number', None) subject = self.payload.get('issue', {}).get('title', None) - description = self.payload.get('issue', {}).get('body', None) github_url = self.payload.get('issue', {}).get('html_url', None) - github_user = self.payload.get('issue', {}).get('user', {}).get('id', None) + github_user_id = self.payload.get('issue', {}).get('user', {}).get('id', None) + github_user_name = self.payload.get('issue', {}).get('user', {}).get('login', None) + github_user_url = self.payload.get('issue', {}).get('user', {}).get('html_url', None) project_url = self.payload.get('repository', {}).get('html_url', None) + description = self.payload.get('issue', {}).get('body', None) + description = replace_github_references(project_url, description) + + user = get_github_user(github_user_id) if not all([subject, github_url, project_url]): raise ActionSyntaxException(_("Invalid issue information")) @@ -115,17 +144,31 @@ class IssuesEventHook(BaseEventHook): issue = Issue.objects.create( project=self.project, subject=subject, - description=replace_github_references(project_url, description), + description=description, status=self.project.default_issue_status, type=self.project.default_issue_type, severity=self.project.default_severity, priority=self.project.default_priority, external_reference=['github', github_url], - owner=get_github_user(github_user) + owner=user ) - take_snapshot(issue, user=get_github_user(github_user)) + take_snapshot(issue, user=user) - snapshot = take_snapshot(issue, comment=_("Created from GitHub"), user=get_github_user(github_user)) + if number and subject and github_user_name and github_user_url: + comment = _("Issue created by [@{github_user_name}]({github_user_url} " + "\"See @{github_user_name}'s GitHub profile\") " + "from GitHub.\nOrigin GitHub issue: [{number}: {subject}]({github_url} " + "\"Go to '{number}: {subject}'\"):\n\n" + "{description}").format(github_user_name=github_user_name, + github_user_url=github_user_url, + number=number, + subject=subject, + github_url=github_url, + description=description) + else: + comment = _("Issue created from GitHub.") + + snapshot = take_snapshot(issue, comment=comment, user=user) send_notifications(issue, history=snapshot) @@ -134,12 +177,18 @@ class IssueCommentEventHook(BaseEventHook): if self.payload.get('action', None) != "created": raise ActionSyntaxException(_("Invalid issue comment information")) + number = self.payload.get('issue', {}).get('number', None) + subject = self.payload.get('issue', {}).get('title', None) github_url = self.payload.get('issue', {}).get('html_url', None) - comment_message = self.payload.get('comment', {}).get('body', None) - github_user = self.payload.get('sender', {}).get('id', None) + github_user_id = self.payload.get('sender', {}).get('id', None) + github_user_name = self.payload.get('sender', {}).get('login', None) + github_user_url = self.payload.get('sender', {}).get('html_url', None) project_url = self.payload.get('repository', {}).get('html_url', None) + comment_message = self.payload.get('comment', {}).get('body', None) comment_message = replace_github_references(project_url, comment_message) + user = get_github_user(github_user_id) + if not all([comment_message, github_url, project_url]): raise ActionSyntaxException(_("Invalid issue comment information")) @@ -148,7 +197,19 @@ class IssueCommentEventHook(BaseEventHook): uss = UserStory.objects.filter(external_reference=["github", github_url]) for item in list(issues) + list(tasks) + list(uss): - snapshot = take_snapshot(item, - comment=_("From GitHub:\n\n{}".format(comment_message)), - user=get_github_user(github_user)) + if number and subject and github_user_name and github_user_url: + comment = _("Comment by [@{github_user_name}]({github_user_url} " + "\"See @{github_user_name}'s GitHub profile\") " + "from GitHub.\nOrigin GitHub issue: [{number}: {subject}]({github_url} " + "\"Go to '{number}: {subject}'\")\n\n" + "{message}").format(github_user_name=github_user_name, + github_user_url=github_user_url, + number=number, + subject=subject, + github_url=github_url, + message=comment_message) + else: + comment = _("Comment From GitHub:\n\n{message}").format(message=comment_message) + + snapshot = take_snapshot(item, comment=comment, user=user) send_notifications(item, history=snapshot) diff --git a/taiga/locale/en/LC_MESSAGES/django.po b/taiga/locale/en/LC_MESSAGES/django.po index ea2e36cf..5b1c0804 100644 --- a/taiga/locale/en/LC_MESSAGES/django.po +++ b/taiga/locale/en/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: taiga-back\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-04 18:39+0200\n" +"POT-Creation-Date: 2015-05-06 15:07+0200\n" "PO-Revision-Date: 2015-03-25 20:09+0100\n" "Last-Translator: Taiga Dev Team \n" "Language-Team: Taiga Dev Team \n" @@ -615,12 +615,12 @@ msgid "The payload is not valid" msgstr "" #: taiga/hooks/bitbucket/event_hooks.py:81 -#: taiga/hooks/github/event_hooks.py:75 taiga/hooks/gitlab/event_hooks.py:74 +#: taiga/hooks/github/event_hooks.py:76 taiga/hooks/gitlab/event_hooks.py:74 msgid "The referenced element doesn't exist" msgstr "" #: taiga/hooks/bitbucket/event_hooks.py:88 -#: taiga/hooks/github/event_hooks.py:82 taiga/hooks/gitlab/event_hooks.py:81 +#: taiga/hooks/github/event_hooks.py:83 taiga/hooks/gitlab/event_hooks.py:81 msgid "The status doesn't exist" msgstr "" @@ -628,27 +628,58 @@ msgstr "" msgid "Status changed from BitBucket commit" msgstr "" -#: taiga/hooks/github/event_hooks.py:88 -msgid "Status changed from GitHub commit" +#: taiga/hooks/github/event_hooks.py:97 +#, python-brace-format +msgid "" +"Status changed by [@{github_user_name}]({github_user_url} \"See " +"@{github_user_name}'s GitHub profile\") from GitHub commit [#{commit_id}]" +"({commit_url} \"See commit '#{commit_id}: {commit_message}'\")." msgstr "" -#: taiga/hooks/github/event_hooks.py:113 taiga/hooks/gitlab/event_hooks.py:114 +#: taiga/hooks/github/event_hooks.py:108 +msgid "Status changed from GitHub commit." +msgstr "" + +#: taiga/hooks/github/event_hooks.py:142 taiga/hooks/gitlab/event_hooks.py:114 msgid "Invalid issue information" msgstr "" -#: taiga/hooks/github/event_hooks.py:128 -msgid "Created from GitHub" +#: taiga/hooks/github/event_hooks.py:158 +#, python-brace-format +msgid "" +"Issue created by [@{github_user_name}]({github_user_url} \"See " +"@{github_user_name}'s GitHub profile\") from GitHub.\n" +"Origin GitHub issue: [{number}: {subject}]({github_url} \"Go to '{number}: " +"{subject}'\"):\n" +"\n" +"{description}" msgstr "" -#: taiga/hooks/github/event_hooks.py:135 taiga/hooks/github/event_hooks.py:144 +#: taiga/hooks/github/event_hooks.py:169 +msgid "Issue created from GitHub." +msgstr "" + +#: taiga/hooks/github/event_hooks.py:178 taiga/hooks/github/event_hooks.py:193 msgid "Invalid issue comment information" msgstr "" -#: taiga/hooks/github/event_hooks.py:152 +#: taiga/hooks/github/event_hooks.py:201 +#, python-brace-format msgid "" -"From GitHub:\n" +"Comment by [@{github_user_name}]({github_user_url} \"See " +"@{github_user_name}'s GitHub profile\") from GitHub.\n" +"Origin GitHub issue: [{number}: {subject}]({github_url} \"Go to '{number}: " +"{subject}'\")\n" "\n" -"{}" +"{message}" +msgstr "" + +#: taiga/hooks/github/event_hooks.py:212 +#, python-brace-format +msgid "" +"Comment From GitHub:\n" +"\n" +"{message}" msgstr "" #: taiga/hooks/gitlab/event_hooks.py:87 @@ -1920,48 +1951,48 @@ msgstr "" msgid "Mail sended successful!" msgstr "" -#: taiga/users/api.py:134 taiga/users/api.py:139 +#: taiga/users/api.py:133 taiga/users/api.py:138 msgid "Token is invalid" msgstr "" -#: taiga/users/api.py:160 +#: taiga/users/api.py:159 msgid "Current password parameter needed" msgstr "" -#: taiga/users/api.py:163 +#: taiga/users/api.py:162 msgid "New password parameter needed" msgstr "" -#: taiga/users/api.py:166 +#: taiga/users/api.py:165 msgid "Invalid password length at least 6 charaters needed" msgstr "" -#: taiga/users/api.py:169 +#: taiga/users/api.py:168 msgid "Invalid current password" msgstr "" -#: taiga/users/api.py:185 +#: taiga/users/api.py:184 msgid "Incomplete arguments" msgstr "" -#: taiga/users/api.py:190 +#: taiga/users/api.py:189 msgid "Invalid image format" msgstr "" -#: taiga/users/api.py:243 +#: taiga/users/api.py:242 msgid "Duplicated email" msgstr "" -#: taiga/users/api.py:245 +#: taiga/users/api.py:244 msgid "Not valid email" msgstr "" -#: taiga/users/api.py:265 taiga/users/api.py:271 +#: taiga/users/api.py:264 taiga/users/api.py:270 msgid "" "Invalid, are you sure the token is correct and you didn't use it before?" msgstr "" -#: taiga/users/api.py:298 taiga/users/api.py:306 taiga/users/api.py:309 +#: taiga/users/api.py:297 taiga/users/api.py:305 taiga/users/api.py:308 msgid "Invalid, are you sure the token is correct?" msgstr "" @@ -2107,7 +2138,7 @@ msgid "" "

We built it to be beautiful, elegant, simple to use and fun - " "without forsaking flexibility and power.

\n" " The taiga Team\n" -" \n" " " msgstr "" diff --git a/tests/integration/test_hooks_github.py b/tests/integration/test_hooks_github.py index 32412d0b..d9861f89 100644 --- a/tests/integration/test_hooks_github.py +++ b/tests/integration/test_hooks_github.py @@ -337,15 +337,15 @@ def test_issue_comment_event_on_existing_issue_task_and_us(client): issue_history = get_history_queryset_by_model_instance(issue) assert issue_history.count() == 1 - assert issue_history[0].comment == "From GitHub:\n\nTest body" + assert "Test body" in issue_history[0].comment task_history = get_history_queryset_by_model_instance(task) assert task_history.count() == 1 - assert task_history[0].comment == "From GitHub:\n\nTest body" + assert "Test body" in issue_history[0].comment us_history = get_history_queryset_by_model_instance(us) assert us_history.count() == 1 - assert us_history[0].comment == "From GitHub:\n\nTest body" + assert "Test body" in issue_history[0].comment assert len(mail.outbox) == 3