# Copyright © 2022 Aravinth Manivannan # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from django.shortcuts import render, redirect, get_object_or_404 from django.utils.http import urlencode from django.contrib.auth import authenticate, login, logout from django.contrib.auth import get_user_model from django.contrib.auth.decorators import login_required from django.http import HttpResponse from django.views.decorators.csrf import csrf_protect from django.urls import reverse from .models import Instance, InstanceConfiguration from accounts.decorators import confirm_access def default_ctx(title: str, username: str): """ Default context for all dashboard pages """ return { "title": title, "username": username, "open_instances": "open", } @login_required def home(request): """ Dashboard homepage view """ PAGE_TITLE = "Home" user = request.user ctx = default_ctx(title=PAGE_TITLE, username=user.username) instances = Instance.objects.filter(owned_by=user) if instances: ctx["instances"] = instances return render(request, "dash/home/index.html", context=ctx) @login_required @csrf_protect def create_instance(request): """ Create instance view """ PAGE_TITLE = "Create Instance" user = request.user def get_ctx(): ctx = default_ctx(title=PAGE_TITLE, username=user.username) configurations = InstanceConfiguration.objects.all() ctx["configurations"] = InstanceConfiguration.objects.all() return ctx if request.method == "GET": ctx = get_ctx() return render(request, "dash/instances/new/index.html", context=ctx) name = request.POST["name"] if Instance.objects.filter(name=name).exists(): ctx = get_ctx() ctx["error"] = { "title": "Can't create instance", "reason": "Instance name exists, please try again with a different name", } print(ctx["error"]["reason"]) return render(request, "dash/instances/new/index.html", status=400, context=ctx) configuration = request.POST["configuration"] if not InstanceConfiguration.objects.filter(name=configuration).exists(): ctx = get_ctx() ctx["error"] = { "title": "Can't create instance", "reason": "Configuration doesn't exist, please try again.", } print(ctx["error"]["reason"]) return render(request, "dash/instances/new/index.html", status=400, context=ctx) configuration = get_object_or_404(InstanceConfiguration, name=configuration) instance = Instance( name=name, configuration_id=configuration, owned_by=request.user ) instance.save() return redirect(reverse("billing.invoice.generate", args=(instance.name,))) @login_required def list_instances(request): PAGE_TITLE = "My Instances" user = request.user instances = Instance.objects.filter(owned_by=user) ctx = default_ctx(title=PAGE_TITLE, username=user.username) ctx["instances"] = instances return render(request, "dash/instances/list/index.html", context=ctx) @login_required def view_instance(request, name: str): PAGE_TITLE = f"Hostea Instance: {name}" user = request.user instance = get_object_or_404(Instance, owned_by=user, name=name) ctx = default_ctx(title=PAGE_TITLE, username=user.username) instance.configuration = instance.configuration_id ctx["instance"] = instance return render(request, "dash/instances/view/index.html", context=ctx) @login_required @csrf_protect @confirm_access def delete_instance(request, name): PAGE_TITLE = f"Delete Instance {name}" user = request.user instance = get_object_or_404(Instance, name=name, owned_by=user) if request.method == "GET": ctx = default_ctx(title=PAGE_TITLE, username=user.username) ctx["instance"] = instance return render(request, "dash/instances/delete/index.html", context=ctx) instance.delete() return redirect(reverse("dash.home"))