You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

302 lines
7.2 KiB

from datetime import timedelta as td
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseBadRequest, HttpResponseForbidden
from django.shortcuts import get_object_or_404, redirect, render
from django.utils import timezone
from hc.api.decorators import uuid_or_400
from hc.api.models import Channel, Check, Ping
from hc.front.forms import AddChannelForm, TimeoutForm
@login_required
def my_checks(request):
checks = Check.objects.filter(user=request.user).order_by("created")
ctx = {
"page": "checks",
"checks": checks,
"now": timezone.now()
}
return render(request, "front/my_checks.html", ctx)
def index(request):
if request.user.is_authenticated():
return redirect("hc-checks")
if "welcome_code" not in request.session:
check = Check()
check.save()
code = str(check.code)
request.session["welcome_code"] = code
else:
code = request.session["welcome_code"]
check = Check.objects.get(code=code)
ctx = {
"page": "welcome",
"check": check,
"ping_url": check.url()
}
return render(request, "front/welcome.html", ctx)
def pricing(request):
return render(request, "front/pricing.html", {"page": "pricing"})
def docs(request):
if "welcome_code" in request.session:
code = request.session["welcome_code"]
check = Check.objects.get(code=code)
else:
check = Check(code="uuid-goes-here")
ctx = {
"page": "docs",
"ping_endpoint": settings.PING_ENDPOINT,
"check": check,
"ping_url": check.url()
}
return render(request, "front/docs.html", ctx)
def about(request):
return render(request, "front/about.html", {"page": "about"})
@login_required
def add_check(request):
assert request.method == "POST"
check = Check(user=request.user)
check.save()
check.assign_all_channels()
return redirect("hc-checks")
@login_required
@uuid_or_400
def update_name(request, code):
assert request.method == "POST"
check = get_object_or_404(Check, code=code)
if check.user != request.user:
return HttpResponseForbidden()
check.name = request.POST["name"]
check.save()
return redirect("hc-checks")
@login_required
@uuid_or_400
def update_timeout(request, code):
assert request.method == "POST"
check = get_object_or_404(Check, code=code)
if check.user != request.user:
return HttpResponseForbidden()
form = TimeoutForm(request.POST)
if form.is_valid():
check.timeout = td(seconds=form.cleaned_data["timeout"])
check.grace = td(seconds=form.cleaned_data["grace"])
check.save()
return redirect("hc-checks")
@login_required
@uuid_or_400
def email_preview(request, code):
""" A debug view to see how email will look.
Will keep it around until I'm happy with email stying.
"""
check = Check.objects.get(code=code)
if check.user != request.user:
return HttpResponseForbidden()
ctx = {
"check": check,
"checks": check.user.check_set.all(),
"now": timezone.now()
}
return render(request, "emails/alert/body.html", ctx)
@login_required
@uuid_or_400
def remove_check(request, code):
assert request.method == "POST"
check = get_object_or_404(Check, code=code)
if check.user != request.user:
return HttpResponseForbidden()
check.delete()
return redirect("hc-checks")
@login_required
@uuid_or_400
def log(request, code):
check = get_object_or_404(Check, code=code)
if check.user != request.user:
return HttpResponseForbidden()
pings = Ping.objects.filter(owner=check).order_by("-created")[:100]
ctx = {
"check": check,
"pings": pings
}
return render(request, "front/log.html", ctx)
@login_required
def channels(request):
if request.method == "POST":
code = request.POST["channel"]
try:
channel = Channel.objects.get(code=code)
except Channel.DoesNotExist:
return HttpResponseBadRequest()
if channel.user != request.user:
return HttpResponseForbidden()
new_checks = []
for key in request.POST:
if key.startswith("check-"):
code = key[6:]
try:
check = Check.objects.get(code=code)
except Check.DoesNotExist:
return HttpResponseBadRequest()
if check.user != request.user:
return HttpResponseForbidden()
new_checks.append(check)
channel.checks = new_checks
return redirect("hc-channels")
channels = Channel.objects.filter(user=request.user).order_by("created")
num_checks = Check.objects.filter(user=request.user).count()
ctx = {
"page": "channels",
"channels": channels,
"num_checks": num_checks
}
return render(request, "front/channels.html", ctx)
@login_required
def add_channel(request):
assert request.method == "POST"
form = AddChannelForm(request.POST)
if form.is_valid():
channel = form.save(commit=False)
channel.user = request.user
channel.save()
checks = Check.objects.filter(user=request.user)
channel.checks.add(*checks)
if channel.kind == "email":
channel.send_verify_link()
return redirect("hc-channels")
else:
return HttpResponseBadRequest()
@login_required
@uuid_or_400
def channel_checks(request, code):
channel = get_object_or_404(Channel, code=code)
if channel.user != request.user:
return HttpResponseForbidden()
assigned = set([check.code for check in channel.checks.all()])
checks = Check.objects.filter(user=request.user).order_by("created")
ctx = {
"checks": checks,
"assigned": assigned,
"channel": channel
}
return render(request, "front/channel_checks.html", ctx)
@uuid_or_400
def verify_email(request, code, token):
channel = get_object_or_404(Channel, code=code)
if channel.make_token() == token:
channel.email_verified = True
channel.save()
return render(request, "front/verify_email_success.html")
return render(request, "bad_link.html")
@login_required
@uuid_or_400
def remove_channel(request, code):
assert request.method == "POST"
channel = get_object_or_404(Channel, code=code)
if channel.user != request.user:
return HttpResponseForbidden()
channel.delete()
return redirect("hc-channels")
@login_required
def add_email(request):
ctx = {"page": "channels"}
return render(request, "integrations/add_email.html", ctx)
@login_required
def add_webhook(request):
ctx = {"page": "channels"}
return render(request, "integrations/add_webhook.html", ctx)
@login_required
def add_pd(request):
ctx = {"page": "channels"}
return render(request, "integrations/add_pd.html", ctx)
@login_required
def add_slack(request):
ctx = {"page": "channels"}
return render(request, "integrations/add_slack.html", ctx)
@login_required
def add_hipchat(request):
ctx = {"page": "channels"}
return render(request, "integrations/add_hipchat.html", ctx)