add deployment user to limit deployment

This commit is contained in:
rmanach 2023-09-24 15:35:22 +02:00
parent 4e1a2ba20b
commit 50963324f3
7 changed files with 83 additions and 7 deletions

View File

@ -1,6 +1,10 @@
from django.contrib import admin
from deployment.models import Deployment
from deployment.models import Deployment, DeploymentUser
class DeploymentUserAdmin(admin.ModelAdmin):
pass
class DeploymentAdmin(admin.ModelAdmin):
@ -8,3 +12,4 @@ class DeploymentAdmin(admin.ModelAdmin):
admin.site.register(Deployment, DeploymentAdmin)
admin.site.register(DeploymentUser, DeploymentUserAdmin)

View File

@ -9,9 +9,9 @@ def parse_channel(channel: str) -> tuple[str] | None:
parts = channel.lstrip("deployment_").split("_")
if len_part := len(parts):
if len_part == 1:
return (parts[0], "")
return (int(parts[0]), "")
if len_part == 2:
return (parts[0], parts[1])
return (int(parts[0]), parts[1])
return

View File

@ -0,0 +1,25 @@
# Generated by Django 4.2.5 on 2023-09-23 14:21
from django.conf import settings
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('deployment', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='DeploymentUser',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('credits', models.SmallIntegerField(default=1, help_text='number of deployment allowed (-1 infinite)', validators=[django.core.validators.MinValueValidator(-1, message='Value must be greater than or equal to -1')])),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@ -3,6 +3,7 @@ from typing import Any
from django.contrib.auth.models import User
from django.core.validators import MinValueValidator
from django.db import models
@ -28,6 +29,21 @@ class Status(Enum):
return [(s.name, s.value) for s in cls]
class DeploymentUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
credits = models.SmallIntegerField(
null=False,
default=1,
help_text="number of deployment allowed (-1 infinite)",
validators=[
MinValueValidator(-1, message="Value must be greater than or equal to -1"),
],
)
def __str__(self) -> str:
return f"{self.user.username} - {self.credits}"
class Deployment(models.Model):
id = models.UUIDField(primary_key=True)
name = models.TextField(null=False, blank=False)

View File

@ -2,11 +2,14 @@ from uuid import uuid4
from celery.result import AsyncResult
from celery.contrib.abortable import AbortableAsyncResult
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from django.core.paginator import Paginator
from django.http import (
HttpResponseRedirect,
HttpResponseServerError,
HttpResponseBadRequest,
HttpResponseForbidden,
)
from django.shortcuts import render, get_object_or_404
@ -16,6 +19,21 @@ from deployment.models import Deployment, Status
from deployment.tasks import deploy as launch_deploy
def check_user_credits(user: User) -> bool:
if not user.is_superuser:
try:
dep_user = user.deploymentuser
except (ObjectDoesNotExist, AttributeError):
return False
else:
if dep_user.credits < 0:
return True
deployments = Deployment.objects.filter(user=user)
return not len(deployments) >= dep_user.credits
return True
def index(request):
deployments = Deployment.objects.filter(user=request.user.id).order_by(
"-created_at"
@ -32,6 +50,7 @@ def index(request):
"page_obj": page_obj,
"range_pages": (i + 1 for i in range(page_obj.paginator.num_pages)),
"url": f"events/{request.user.id}/",
"can_create": check_user_credits(request.user),
},
)
@ -109,6 +128,11 @@ def details(request, deployment_id):
def create(request):
if request.method == "POST":
if not check_user_credits(request.user):
return HttpResponseForbidden(
"unable to launch deployment, contact administrator for support"
)
form = DeploymentForm(request.POST)
if form.is_valid():
try:

View File

@ -8,7 +8,8 @@ exclude = [
".git",
".ruff_cache",
"venv",
"settings.py"
"settings.py",
"deployment/migrations/*.py"
]
line-length = 88

View File

@ -58,9 +58,12 @@
{% endfor %}
</table>
{% include 'pagination.html' %}
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#create-deployment-modal">
<button type="button" {% if can_create %} class="btn btn-success" data-bs-toggle="modal" data-bs-target="#create-deployment-modal" {% else %} class="btn btn-danger" disabled {% endif %}>
Create
</button>
{% if not can_create %}
<p style="font-style: italic;">You can't create new deployments, contact administrator for support.</p>
{% endif %}
{% else %}
<h4 style="text-align: center;">Please log in !</h4>
{% endif %}
@ -70,7 +73,9 @@
{% endblock %}
{% block modal %}
{% include 'deployment/create_modal.html' %}
{% if can_create %}
{% include 'deployment/create_modal.html' %}
{% endif %}
{% endblock %}
{% block script %}