Minor fixes

remotes/origin/enhancement/email-actions
David Barragán Merino 2014-11-11 18:45:42 +01:00
parent 1822198549
commit 25bcb855c1
7 changed files with 26 additions and 28 deletions

View File

@ -66,7 +66,7 @@ def is_user_already_registered(*, username:str, email:str, github_id:int=None) -
return (True, _("Email is already in use.")) return (True, _("Email is already in use."))
if github_id and user_model.objects.filter(github_id=github_id): if github_id and user_model.objects.filter(github_id=github_id):
return (True, _("Github id is already in use")) return (True, _("GitHub id is already in use"))
return (False, None) return (False, None)

View File

@ -14,26 +14,19 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import hmac
import hashlib
from rest_framework.exceptions import ParseError
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.exceptions import APIException
from django.views.decorators.csrf import csrf_exempt
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from taiga.base.api.viewsets import GenericViewSet from taiga.base.api.viewsets import GenericViewSet
from taiga.base import exceptions as exc
from taiga.base.utils import json
from taiga.projects.models import Project from taiga.projects.models import Project
from . import event_hooks from . import event_hooks
from .exceptions import ActionSyntaxException from .exceptions import ActionSyntaxException
import hmac
class Http400(APIException): import hashlib
status_code = 400
class GitHubViewSet(GenericViewSet): class GitHubViewSet(GenericViewSet):
@ -79,17 +72,17 @@ class GitHubViewSet(GenericViewSet):
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
project = self._get_project(request) project = self._get_project(request)
if not project: if not project:
raise Http400(_("The project doesn't exist")) raise exc.BadRequest(_("The project doesn't exist"))
if not self._validate_signature(project, request): if not self._validate_signature(project, request):
raise Http400(_("Bad signature")) raise exc.BadRequest(_("Bad signature"))
event_name = request.META.get("HTTP_X_GITHUB_EVENT", None) event_name = request.META.get("HTTP_X_GITHUB_EVENT", None)
try: try:
payload = json.loads(request.body.decode("utf-8")) payload = json.loads(request.body.decode("utf-8"))
except ValueError as e: except ValueError:
raise Http400(_("The payload is not a valid json")) raise exc.BadRequest(_("The payload is not a valid json"))
event_hook_class = self.event_hook_classes.get(event_name, None) event_hook_class = self.event_hook_classes.get(event_name, None)
if event_hook_class is not None: if event_hook_class is not None:
@ -97,6 +90,6 @@ class GitHubViewSet(GenericViewSet):
try: try:
event_hook.process_event() event_hook.process_event()
except ActionSyntaxException as e: except ActionSyntaxException as e:
raise Http400(e) raise exc.BadRequest(e)
return Response({}) return Response({})

View File

@ -14,8 +14,6 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import re
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from taiga.projects.models import Project, IssueStatus, TaskStatus, UserStoryStatus from taiga.projects.models import Project, IssueStatus, TaskStatus, UserStoryStatus
@ -29,8 +27,10 @@ from taiga.projects.notifications.services import send_notifications
from .exceptions import ActionSyntaxException from .exceptions import ActionSyntaxException
from .services import get_github_user from .services import get_github_user
class BaseEventHook(object): import re
class BaseEventHook:
def __init__(self, project, payload): def __init__(self, project, payload):
self.project = project self.project = project
self.payload = payload self.payload = payload
@ -40,7 +40,6 @@ class BaseEventHook(object):
class PushEventHook(BaseEventHook): class PushEventHook(BaseEventHook):
def process_event(self): def process_event(self):
if self.payload is None: if self.payload is None:
return return
@ -93,12 +92,14 @@ class PushEventHook(BaseEventHook):
element.status = status element.status = status
element.save() element.save()
snapshot = take_snapshot(element, comment="Status changed from Github commit", user=get_github_user(github_user)) snapshot = take_snapshot(element,
comment="Status changed from GitHub commit",
user=get_github_user(github_user))
send_notifications(element, history=snapshot) send_notifications(element, history=snapshot)
def replace_github_references(project_url, wiki_text): def replace_github_references(project_url, wiki_text):
template = "\g<1>[Github#\g<2>]({}/issues/\g<2>)\g<3>".format(project_url) template = "\g<1>[GitHub#\g<2>]({}/issues/\g<2>)\g<3>".format(project_url)
return re.sub(r"(\s|^)#(\d+)(\s|$)", template, wiki_text, 0, re.M) return re.sub(r"(\s|^)#(\d+)(\s|$)", template, wiki_text, 0, re.M)
@ -129,9 +130,10 @@ class IssuesEventHook(BaseEventHook):
) )
take_snapshot(issue, user=get_github_user(github_user)) take_snapshot(issue, user=get_github_user(github_user))
snapshot = take_snapshot(issue, comment="Created from Github", user=get_github_user(github_user)) snapshot = take_snapshot(issue, comment="Created from GitHub", user=get_github_user(github_user))
send_notifications(issue, history=snapshot) send_notifications(issue, history=snapshot)
class IssueCommentEventHook(BaseEventHook): class IssueCommentEventHook(BaseEventHook):
def process_event(self): def process_event(self):
if self.payload.get('action', None) != "created": if self.payload.get('action', None) != "created":
@ -151,5 +153,7 @@ class IssueCommentEventHook(BaseEventHook):
uss = UserStory.objects.filter(external_reference=["github", github_reference]) uss = UserStory.objects.filter(external_reference=["github", github_reference])
for item in list(issues) + list(tasks) + list(uss): 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)) snapshot = take_snapshot(item,
comment="From GitHub:\n\n{}".format(comment_message),
user=get_github_user(github_user))
send_notifications(item, history=snapshot) send_notifications(item, history=snapshot)

View File

@ -15,7 +15,7 @@ def create_github_system_user(apps, schema_editor):
user = User.objects.using(db_alias).create( user = User.objects.using(db_alias).create(
username="github-{}".format(random_hash), username="github-{}".format(random_hash),
email="github-{}@taiga.io".format(random_hash), email="github-{}@taiga.io".format(random_hash),
full_name="Github", full_name="GitHub",
is_active=False, is_active=False,
is_system=True, is_system=True,
bio="", bio="",

View File

@ -0,0 +1 @@
# This file is needed to load migrations

View File

@ -21,7 +21,7 @@ class SemiSaneListExtension(markdown.Extension):
the sane_lists extension, GitHub will mix list types if they're not the sane_lists extension, GitHub will mix list types if they're not
separated by multiple newlines. separated by multiple newlines.
Github also recognizes lists that start in the middle of a paragraph. This GitHub also recognizes lists that start in the middle of a paragraph. This
is currently not supported by this extension, since the Python parser has a is currently not supported by this extension, since the Python parser has a
deeply-ingrained belief that blocks are always separated by multiple deeply-ingrained belief that blocks are always separated by multiple
newlines. newlines.

View File

@ -131,7 +131,7 @@ from taiga.projects.notifications.api import NotifyPolicyViewSet
router.register(r"notify-policies", NotifyPolicyViewSet, base_name="notifications") router.register(r"notify-policies", NotifyPolicyViewSet, base_name="notifications")
# Github webhooks # GitHub webhooks
from taiga.github_hook.api import GitHubViewSet from taiga.github_hook.api import GitHubViewSet
router.register(r"github-hook", GitHubViewSet, base_name="github-hook") router.register(r"github-hook", GitHubViewSet, base_name="github-hook")