mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 11:16:47 +00:00
- An administrator could block, delete or demote (unset Active or Superuser on) their own account, and with it the last one, leaving the panel without anyone to undo it. These are now refused. - The user form showed "No password set." for users who have one: its password field never read the user's password. Its "Set password" link went to ../password/, a page this panel does not have. The form now says whether a password is set and links the page that sets it. - "Staff status" said "can log into this admin site"; here it lets a user change and delete the template VMs given to them, and is now called Template editor. - A quota of 0 counted as no limit, like -1, so a user's quota could not be taken away. Now -1 has no limit and 0 allows none; the help says so, and the labels give the units: memory in MiB, disk in GiB. - A user's page for a user that does not exist answered with a server error instead of not found. - The user list said "None" for a user who never logged in; it says "never", and dates fit their column. - The password form's labels no longer break mid-word.
96 lines
2.9 KiB
Python
96 lines
2.9 KiB
Python
from django.contrib.auth.models import User
|
|
from django.core.validators import MinValueValidator
|
|
from django.db import models
|
|
from django.utils.translation import gettext_lazy as _
|
|
from instances.models import Instance
|
|
from knox.models import AbstractAuthToken
|
|
|
|
|
|
class UserInstanceManager(models.Manager):
|
|
def get_queryset(self):
|
|
return super().get_queryset().select_related("instance", "user")
|
|
|
|
|
|
class UserInstance(models.Model):
|
|
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
|
instance = models.ForeignKey(Instance, on_delete=models.CASCADE)
|
|
is_change = models.BooleanField(default=False)
|
|
is_delete = models.BooleanField(default=False)
|
|
is_vnc = models.BooleanField(default=False)
|
|
|
|
objects = UserInstanceManager()
|
|
|
|
def __str__(self):
|
|
return _('Instance "%(inst)s" of user %(user)s') % {
|
|
"inst": self.instance,
|
|
"user": self.user,
|
|
}
|
|
|
|
class Meta:
|
|
unique_together = ["user", "instance"]
|
|
|
|
|
|
class UserSSHKey(models.Model):
|
|
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
|
keyname = models.CharField(_("key name"), max_length=25)
|
|
keypublic = models.TextField(_("public key"), max_length=16384)
|
|
|
|
def __str__(self):
|
|
return self.keyname
|
|
|
|
|
|
class UserAttributes(models.Model):
|
|
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
|
can_clone_instances = models.BooleanField(default=True)
|
|
must_change_password = models.BooleanField(default=False)
|
|
max_instances = models.IntegerField(
|
|
_("max instances"),
|
|
default=2,
|
|
help_text=_("-1: no limit; 0: none allowed"),
|
|
validators=[MinValueValidator(-1)],
|
|
)
|
|
max_cpus = models.IntegerField(
|
|
_("max CPUs"),
|
|
default=2,
|
|
help_text=_("-1: no limit; 0: none allowed"),
|
|
validators=[MinValueValidator(-1)],
|
|
)
|
|
max_memory = models.IntegerField(
|
|
_("max memory (MiB)"),
|
|
default=2048,
|
|
help_text=_("-1: no limit; 0: none allowed"),
|
|
validators=[MinValueValidator(-1)],
|
|
)
|
|
max_disk_size = models.IntegerField(
|
|
_("max disk size (GiB)"),
|
|
default=20,
|
|
help_text=_("-1: no limit; 0: none allowed"),
|
|
validators=[MinValueValidator(-1)],
|
|
)
|
|
|
|
def __str__(self):
|
|
return self.user.username
|
|
|
|
|
|
class PermissionSet(models.Model):
|
|
"""
|
|
Dummy model for holding set of permissions we need to be automatically added by Django
|
|
"""
|
|
|
|
class Meta:
|
|
default_permissions = ()
|
|
permissions = (("change_password", _("Can change password")),)
|
|
|
|
managed = False
|
|
|
|
|
|
class ApiToken(AbstractAuthToken):
|
|
"""A token for the REST API, kept as a digest (django-rest-knox); the
|
|
name says what uses it."""
|
|
LIMIT = 10 # per user, expired ones not counted
|
|
|
|
name = models.CharField(_("name"), max_length=64)
|
|
last_used = models.DateTimeField(_("last used"), null=True, blank=True)
|
|
|
|
class Meta:
|
|
ordering = ["-created"]
|