events_views.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import datetime
  2. import time
  3. from django.utils.timezone import get_current_timezone
  4. from django.core.urlresolvers import get_script_prefix
  5. from django.http import HttpResponse
  6. from django.shortcuts import render_to_response, get_object_or_404
  7. from pytz import timezone
  8. from graphite.util import json
  9. from graphite.events import models
  10. from graphite.render.attime import parseATTime
  11. def to_timestamp(dt):
  12. return time.mktime(dt.timetuple())
  13. class EventEncoder(json.JSONEncoder):
  14. def default(self, obj):
  15. if isinstance(obj, datetime.datetime):
  16. return to_timestamp(obj)
  17. return json.JSONEncoder.default(self, obj)
  18. def view_events(request):
  19. if request.method == "GET":
  20. context = { 'events' : fetch(request),
  21. 'slash' : get_script_prefix()
  22. }
  23. return render_to_response("events.html", context)
  24. else:
  25. return post_event(request)
  26. def detail(request, event_id):
  27. e = get_object_or_404(models.Event, pk=event_id)
  28. context = { 'event' : e,
  29. 'slash' : get_script_prefix()
  30. }
  31. return render_to_response("event.html", context)
  32. def post_event(request):
  33. if request.method == 'POST':
  34. event = json.loads(request.body)
  35. assert isinstance(event, dict)
  36. values = {}
  37. values["what"] = event["what"]
  38. values["tags"] = event.get("tags", None)
  39. values["when"] = datetime.datetime.fromtimestamp(
  40. event.get("when", time.time()))
  41. if "data" in event:
  42. values["data"] = event["data"]
  43. e = models.Event(**values)
  44. e.save()
  45. return HttpResponse(status=200)
  46. else:
  47. return HttpResponse(status=405)
  48. def get_data(request):
  49. if 'jsonp' in request.REQUEST:
  50. response = HttpResponse(
  51. "%s(%s)" % (request.REQUEST.get('jsonp'),
  52. json.dumps(fetch(request), cls=EventEncoder)),
  53. mimetype='text/javascript')
  54. else:
  55. response = HttpResponse(
  56. json.dumps(fetch(request), cls=EventEncoder),
  57. mimetype="application/json")
  58. return response
  59. def fetch(request):
  60. #XXX we need to move to USE_TZ=True to get rid of naive-time conversions
  61. def make_naive(dt):
  62. if 'tz' in request.GET:
  63. tz = timezone(request.GET['tz'])
  64. else:
  65. tz = get_current_timezone()
  66. local_dt = dt.astimezone(tz)
  67. if hasattr(local_dt, 'normalize'):
  68. local_dt = local_dt.normalize()
  69. return local_dt.replace(tzinfo=None)
  70. if request.GET.get("from", None) is not None:
  71. time_from = make_naive(parseATTime(request.GET["from"]))
  72. else:
  73. time_from = datetime.datetime.fromtimestamp(0)
  74. if request.GET.get("until", None) is not None:
  75. time_until = make_naive(parseATTime(request.GET["until"]))
  76. else:
  77. time_until = datetime.datetime.now()
  78. tags = request.GET.get("tags", None)
  79. if tags is not None:
  80. tags = request.GET.get("tags").split(" ")
  81. return [x.as_dict() for x in
  82. models.Event.find_events(time_from, time_until, tags=tags)]