dashboard/infrastructure/views.py

91 lines
3.1 KiB
Python

# Copyright © 2022 Aravinth Manivannan <realaravinth@batsense.net>
#
# 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 <http://www.gnu.org/licenses/>.
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.core.mail import send_mail
from django.urls import reverse
from accounts.decorators import confirm_access
from dash.models import Instance
from billing.utils import payment_fullfilled
from .utils import create_vm_if_not_exists, Infra
def default_ctx(title: str, username: str):
"""
Default context for all dashboard pages
"""
return {
"title": title,
"username": username,
"open_instances": "open",
}
@login_required
def create_instance(request, instance_name: str):
"""
Dashboard homepage view
"""
instance = get_object_or_404(Instance, name=instance_name, owned_by=request.user)
if not payment_fullfilled(instance=instance):
return redirect(reverse("billing.invoice.generate", args=(instance_name,)))
res = create_vm_if_not_exists(instance=instance)
if res is not None:
(gitea_password, commit) = res
send_mail(
subject="[Hostea] Gitea admin credentials",
message=f"""
Congratulations on your new Gitea instance!\n
You can use the following credentials to log into an admin account on
your new Gitea instance. Great powers come with great responsibilities,
so use the admin credentials wisely. When in doubt, consult the Gitea
docs or contact support!\n
- username : root
- password: {gitea_password}
""",
from_email="No reply Hostea<no-reply@exampl.org>", # TODO read from settings.py
recipient_list=[request.user.email],
)
ctx = {
"gitea_password": gitea_password,
"gitea_uri": Infra.get_gitea_uri(instance=instance),
}
return render(request, "infrastructure/html/create.html", ctx)
return HttpResponse()
@login_required
@confirm_access
def delete_instance(request, instance_name: str):
"""
Dashboard homepage view
"""
instance = get_object_or_404(Instance, name=instance_name, owned_by=request.user)
infra = Infra()
infra.remove_vm(instance=instance)
# TODO: push isn't implemented yet
return HttpResponse()