From da156401b01204499a381d4de60ef6040a00b09f Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 21 Jan 2015 15:06:32 +0100 Subject: [PATCH 1/2] Adding name to webhooks and logs_counter to webhooks API --- .../webhooks/migrations/0002_webhook_name.py | 20 +++++++++++++++++++ taiga/webhooks/models.py | 2 ++ taiga/webhooks/serializers.py | 5 +++++ tests/factories.py | 1 + .../test_webhooks_resources.py | 2 ++ 5 files changed, 30 insertions(+) create mode 100644 taiga/webhooks/migrations/0002_webhook_name.py diff --git a/taiga/webhooks/migrations/0002_webhook_name.py b/taiga/webhooks/migrations/0002_webhook_name.py new file mode 100644 index 00000000..9def6115 --- /dev/null +++ b/taiga/webhooks/migrations/0002_webhook_name.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('webhooks', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='webhook', + name='name', + field=models.CharField(max_length=250, default='webhook', verbose_name='name'), + preserve_default=False, + ), + ] diff --git a/taiga/webhooks/models.py b/taiga/webhooks/models.py index af802535..e4a418c1 100644 --- a/taiga/webhooks/models.py +++ b/taiga/webhooks/models.py @@ -23,6 +23,8 @@ from django_pgjson.fields import JsonField class Webhook(models.Model): project = models.ForeignKey("projects.Project", null=False, blank=False, related_name="webhooks") + name = models.CharField(max_length=250, null=False, blank=False, + verbose_name=_("name")) url = models.URLField(null=False, blank=False, verbose_name=_("URL")) key = models.TextField(null=False, blank=False, verbose_name=_("secret key")) diff --git a/taiga/webhooks/serializers.py b/taiga/webhooks/serializers.py index 388e4d5f..7bc08e0f 100644 --- a/taiga/webhooks/serializers.py +++ b/taiga/webhooks/serializers.py @@ -34,9 +34,14 @@ class HistoryDiffField(serializers.Field): class WebhookSerializer(serializers.ModelSerializer): + logs_counter = serializers.SerializerMethodField("get_logs_counter") class Meta: model = Webhook + def get_logs_counter(self, obj): + return obj.logs.count() + + class WebhookLogSerializer(serializers.ModelSerializer): request_data = JsonField() diff --git a/tests/factories.py b/tests/factories.py index 9c96224e..14f120a8 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -205,6 +205,7 @@ class WebhookFactory(Factory): project = factory.SubFactory("tests.factories.ProjectFactory") url = "http://localhost:8080/test" key = "factory-key" + name = "Factory-name" class WebhookLogFactory(Factory): diff --git a/tests/integration/resources_permissions/test_webhooks_resources.py b/tests/integration/resources_permissions/test_webhooks_resources.py index ab5cad17..9514fc88 100644 --- a/tests/integration/resources_permissions/test_webhooks_resources.py +++ b/tests/integration/resources_permissions/test_webhooks_resources.py @@ -137,6 +137,7 @@ def test_webhook_create(client, data): ] create_data = json.dumps({ + "name": "Test", "url": "http://test.com", "key": "test", "project": data.project1.pk, @@ -145,6 +146,7 @@ def test_webhook_create(client, data): assert results == [401, 403, 201] create_data = json.dumps({ + "name": "Test", "url": "http://test.com", "key": "test", "project": data.project2.pk, From 5b7cb4b13bbe83d86a7acd7eb02012d57b713ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Thu, 22 Jan 2015 11:48:12 +0100 Subject: [PATCH 2/2] Add extra data to the WebhookLog model (headers, duration, and creation date) --- .../migrations/0003_auto_20150122_1021.py | 40 +++++++++++++++++++ taiga/webhooks/models.py | 4 ++ taiga/webhooks/tasks.py | 20 ++++++++-- 3 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 taiga/webhooks/migrations/0003_auto_20150122_1021.py diff --git a/taiga/webhooks/migrations/0003_auto_20150122_1021.py b/taiga/webhooks/migrations/0003_auto_20150122_1021.py new file mode 100644 index 00000000..fa565ba3 --- /dev/null +++ b/taiga/webhooks/migrations/0003_auto_20150122_1021.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import datetime +import django_pgjson.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('webhooks', '0002_webhook_name'), + ] + + operations = [ + migrations.AddField( + model_name='webhooklog', + name='created', + field=models.DateTimeField(default=datetime.datetime(2015, 1, 22, 10, 21, 17, 188643), auto_now_add=True), + preserve_default=False, + ), + migrations.AddField( + model_name='webhooklog', + name='duration', + field=models.FloatField(default=0, verbose_name='Duration'), + preserve_default=True, + ), + migrations.AddField( + model_name='webhooklog', + name='request_headers', + field=django_pgjson.fields.JsonField(default={}, verbose_name='Request headers'), + preserve_default=True, + ), + migrations.AddField( + model_name='webhooklog', + name='response_headers', + field=django_pgjson.fields.JsonField(default={}, verbose_name='Response headers'), + preserve_default=True, + ), + ] diff --git a/taiga/webhooks/models.py b/taiga/webhooks/models.py index e4a418c1..0fd212dd 100644 --- a/taiga/webhooks/models.py +++ b/taiga/webhooks/models.py @@ -35,4 +35,8 @@ class WebhookLog(models.Model): url = models.URLField(null=False, blank=False, verbose_name=_("URL")) status = models.IntegerField(null=False, blank=False, verbose_name=_("Status code")) request_data = JsonField(null=False, blank=False, verbose_name=_("Request data")) + request_headers = JsonField(null=False, blank=False, verbose_name=_("Request headers"), default={}) response_data = models.TextField(null=False, blank=False, verbose_name=_("Response data")) + response_headers = JsonField(null=False, blank=False, verbose_name=_("Response headers"), default={}) + duration = models.FloatField(null=False, blank=False, verbose_name=_("Duration"), default=0) + created = models.DateTimeField(auto_now_add=True) diff --git a/taiga/webhooks/tasks.py b/taiga/webhooks/tasks.py index 652b9f56..c65543e6 100644 --- a/taiga/webhooks/tasks.py +++ b/taiga/webhooks/tasks.py @@ -62,17 +62,29 @@ def _send_request(webhook_id, url, key, data): signature = _generate_signature(serialized_data, key) headers = { "X-TAIGA-WEBHOOK-SIGNATURE": signature, + "Content-Type": "application/json" } + request = requests.Request('POST', url, data=serialized_data, headers=headers) + prepared_request = request.prepare() + + session = requests.Session() try: - response = requests.post(url, data=serialized_data, headers=headers) + response = session.send(prepared_request) WebhookLog.objects.create(webhook_id=webhook_id, url=url, status=response.status_code, request_data=data, - response_data=response.content) - except RequestException: + request_headers=dict(prepared_request.headers), + response_data=response.content, + response_headers=dict(response.headers), + duration=response.elapsed.total_seconds()) + except RequestException as e: WebhookLog.objects.create(webhook_id=webhook_id, url=url, status=0, request_data=data, - response_data="error-in-request") + request_headers=dict(prepared_request.headers), + response_data="error-in-request: {}".format(str(e)), + response_headers={}, + duration=0) + session.close() ids = [webhook_log.id for webhook_log in WebhookLog.objects.filter(webhook_id=webhook_id).order_by("-id")[10:]] WebhookLog.objects.filter(id__in=ids).delete()