Add extra data to the WebhookLog model (headers, duration, and creation date)

remotes/origin/enhancement/email-actions
Jesús Espino 2015-01-22 11:48:12 +01:00
parent da156401b0
commit 5b7cb4b13b
3 changed files with 60 additions and 4 deletions

View File

@ -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,
),
]

View File

@ -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)

View File

@ -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()