forked from getsentry/sentry
/
events.py
109 lines (88 loc) · 2.95 KB
/
events.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"""
sentry.web.frontend.events
~~~~~~~~~~~~~~~~~~~~~~~~~~
:copyright: (c) 2010 by the Sentry Team, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
"""
import datetime
import urllib
from django.core.context_processors import csrf
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.views.decorators.csrf import csrf_protect
from sentry.conf import settings
from sentry.models import Event
from sentry.filters import Filter
from sentry.replays import Replayer
from sentry.web.decorators import login_required, has_access, render_to_response
from sentry.web.forms import ReplayForm
@login_required
@has_access
def event_list(request, project):
filters = []
for cls in Filter.handlers.filter(Event):
filters.append(cls(request))
try:
page = int(request.GET.get('p', 1))
except (TypeError, ValueError):
page = 1
event_list = Event.objects.filter(project=project).order_by('-datetime')
# TODO: implement separate API for messages
for filter_ in filters:
if not filter_.is_set():
continue
event_list = filter_.get_query_set(event_list)
offset = (page - 1) * settings.MESSAGES_PER_PAGE
limit = page * settings.MESSAGES_PER_PAGE
today = datetime.datetime.utcnow()
has_realtime = False
return render_to_response('sentry/events/event_list.html', {
'project': project,
'has_realtime': has_realtime,
'event_list': event_list[offset:limit],
'today': today,
'filters': filters,
}, request)
@login_required
@csrf_protect
def replay_event(request, project_id, event_id):
try:
event = Event.objects.get(pk=event_id)
except Event.DoesNotExist:
return HttpResponseRedirect(reverse('sentry'))
interfaces = event.interfaces
if 'sentry.interfaces.Http' not in interfaces:
# TODO: show a proper error
return HttpResponseRedirect(reverse('sentry'))
http = interfaces['sentry.interfaces.Http']
if http.headers:
headers = '\n'.join('%s: %s' % (k, v) for k, v in http.headers.iteritems() if k[0].upper() == k[0])
else:
headers = ''
if isinstance(http.data, dict):
data = urllib.urlencode(http.data)
else:
data = http.data
initial = {
'url': http.url,
'method': http.method,
'headers': headers,
'data': data,
}
form = ReplayForm(request.POST or None, initial=initial)
if form.is_valid():
result = Replayer(
url=form.cleaned_data['url'],
method=form.cleaned_data['method'],
data=form.cleaned_data['data'],
headers=form.cleaned_data['headers'],
).replay()
else:
result = None
context = {
'event': event,
'form': form,
'result': result,
}
context.update(csrf(request))
return render_to_response('sentry/events/replay_request.html', context, request)