create system user when creating a new hosting package

This commit is contained in:
Jan Dittberner 2015-01-22 00:19:30 +01:00
parent d4f68a155c
commit 888a2463c4
6 changed files with 110 additions and 10 deletions

View file

@ -352,4 +352,5 @@ OSUSER_MINGID = int(get_env_variable('GVA_MIN_OS_GID'))
OSUSER_USERNAME_PREFIX = get_env_variable('GVA_OSUSER_PREFIX') OSUSER_USERNAME_PREFIX = get_env_variable('GVA_OSUSER_PREFIX')
OSUSER_HOME_BASEPATH = get_env_variable('GVA_OSUSER_HOME_BASEPATH') OSUSER_HOME_BASEPATH = get_env_variable('GVA_OSUSER_HOME_BASEPATH')
OSUSER_DEFAULT_SHELL = get_env_variable('GVA_OSUSER_DEFAULT_SHELL') OSUSER_DEFAULT_SHELL = get_env_variable('GVA_OSUSER_DEFAULT_SHELL')
OSUSER_DEFAULT_GROUPS = ['sftponly']
########## END CUSTOM APP CONFIGURATION ########## END CUSTOM APP CONFIGURATION

View file

@ -96,6 +96,7 @@ class CustomerHostingPackageAdmin(admin.ModelAdmin):
CustomerMailboxOptionInline, CustomerMailboxOptionInline,
CustomerUserDatabaseOptionInline, CustomerUserDatabaseOptionInline,
] ]
list_display = ['name', 'customer', 'osuser']
def get_form(self, request, obj=None, **kwargs): def get_form(self, request, obj=None, **kwargs):
""" """

View file

@ -5,6 +5,7 @@ This module contains the hosting package models.
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
from django.conf import settings from django.conf import settings
from django.db import transaction
from django.db import models from django.db import models
from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _, ungettext from django.utils.translation import ugettext_lazy as _, ungettext
@ -13,7 +14,11 @@ from model_utils import Choices
from model_utils.models import TimeStampedModel from model_utils.models import TimeStampedModel
from managemails.models import Mailbox from managemails.models import Mailbox
from osusers.models import User as OsUser from osusers.models import (
AdditionalGroup,
Group,
User as OsUser,
)
from userdbs.models import DB_TYPES from userdbs.models import DB_TYPES
@ -175,14 +180,14 @@ class CustomerHostingPackageManager(models.Manager):
""" """
package = CustomerHostingPackage( package = CustomerHostingPackage(
customer=customer, template=template, name=name) customer=customer, template=template, name=name)
for attrname in ('description', 'diskspace', 'diskspace_unit', package.description = template.description
'mailboxcount'): package.copy_template_attributes()
setattr(package, attrname, getattr(template, attrname))
if 'commit' in kwargs and kwargs['commit'] is True: if 'commit' in kwargs and kwargs['commit'] is True:
package.save(**kwargs) package.save(**kwargs)
return package return package
@python_2_unicode_compatible
class CustomerHostingPackage(HostingPackageBase): class CustomerHostingPackage(HostingPackageBase):
""" """
This class defines customer specific hosting packages. This class defines customer specific hosting packages.
@ -208,7 +213,20 @@ class CustomerHostingPackage(HostingPackageBase):
verbose_name = _('customer hosting package') verbose_name = _('customer hosting package')
verbose_name_plural = _('customer hosting packages') verbose_name_plural = _('customer hosting packages')
def get_disk_space(self): def __str__(self):
return _("{name} for {customer}").format(
name=self.name, customer=self.customer
)
def copy_template_attributes(self):
"""
Copy the attributes of the hosting package's template to the package.
"""
for attrname in ('diskspace', 'diskspace_unit', 'mailboxcount'):
setattr(self, attrname, getattr(self.template, attrname))
def get_disk_space(self, unit=None):
""" """
Get the total disk space reserved for this hosting package and all its Get the total disk space reserved for this hosting package and all its
additional disk space options. additional disk space options.
@ -233,7 +251,16 @@ class CustomerHostingPackage(HostingPackageBase):
DISK_SPACE_FACTORS[min_unit][option.diskspace_unit] * DISK_SPACE_FACTORS[min_unit][option.diskspace_unit] *
diskspace) + option.diskspace diskspace) + option.diskspace
min_unit = option.diskspace_unit min_unit = option.diskspace_unit
if unit is None:
return DISK_SPACE_FACTORS[min_unit][0] * diskspace * 1024**2 return DISK_SPACE_FACTORS[min_unit][0] * diskspace * 1024**2
if unit > min_unit:
return DISK_SPACE_FACTORS[unit][min_unit] * diskspace
return DISK_SPACE_FACTORS[min_unit][unit] * diskspace
def get_quota(self):
soft = 1024 * self.get_disk_space(DISK_SPACE_UNITS.M)
hard = soft * 105 / 100
return (soft, hard)
def get_used_mailboxes(self): def get_used_mailboxes(self):
""" """
@ -269,6 +296,31 @@ class CustomerHostingPackage(HostingPackageBase):
number=models.Sum('number') number=models.Sum('number')
).all() ).all()
@transaction.atomic
def save(self, *args, **kwargs):
"""
Save the hosting package to the database.
If this is a new hosting package a new operating system user is
created and assigned to the hosting package.
:param args: positional arguments to be passed on to
:py:meth:`django.db.Model.save`
:param kwargs: keyword arguments to be passed on to
:py:meth:`django.db.Model.save`
:return: self
:rtype: :py:class:`CustomerHostingPackage`
"""
if self.pk is None:
self.copy_template_attributes()
self.osuser = OsUser.objects.create_user(self.customer)
for group in settings.OSUSER_DEFAULT_GROUPS:
AdditionalGroup.objects.create(
user=self.osuser, group=Group.objects.get(groupname=group)
)
return super(CustomerHostingPackage, self).save(*args, **kwargs)
class CustomerHostingPackageOption(TimeStampedModel): class CustomerHostingPackageOption(TimeStampedModel):
""" """

View file

@ -0,0 +1,31 @@
"""
Test for models.
"""
from django.test import TestCase
from hostingpackages.models import (
DISK_SPACE_UNITS,
CustomerHostingPackage,
)
class CustomerHostingPackageTest(TestCase):
def test_get_disk_space_bytes(self):
package = CustomerHostingPackage(
diskspace=10, diskspace_unit=DISK_SPACE_UNITS.G
)
self.assertEqual(package.get_disk_space(), 10 * 1024 * 1024**2)
def test_get_disk_space_mib(self):
package = CustomerHostingPackage(
diskspace=10, diskspace_unit=DISK_SPACE_UNITS.G
)
self.assertEqual(package.get_disk_space(DISK_SPACE_UNITS.M), 10 * 1024)
def test_get_quota(self):
package = CustomerHostingPackage(
diskspace=256, diskspace_unit=DISK_SPACE_UNITS.M
)
self.assertEqual(package.get_quota(), (262144, 275251))

View file

@ -5,8 +5,11 @@ This module defines views related to hosting packages.
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.shortcuts import redirect
from django.utils.translation import ugettext as _
from django.views.generic.edit import CreateView from django.views.generic.edit import CreateView
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib import messages
from braces.views import ( from braces.views import (
LoginRequiredMixin, LoginRequiredMixin,
@ -34,14 +37,26 @@ class CreateHostingPackage(
kwargs.update(self.kwargs) kwargs.update(self.kwargs)
return kwargs return kwargs
def _get_customer(self):
return get_user_model().objects.get(username=self.kwargs['user'])
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(CreateHostingPackage, self).get_context_data(**kwargs) context = super(CreateHostingPackage, self).get_context_data(**kwargs)
customer = get_user_model().objects.get(username=self.kwargs['user']) context['customer'] = self._get_customer()
context['customer'] = customer
return context return context
def get_success_url(self): def get_success_url(self):
return reverse('customer_dashboard', slug=self.kwargs['user']) return reverse(
'customer_dashboard', kwargs={'slug': self.kwargs['user']})
def form_valid(self, form): def form_valid(self, form):
return super(CreateHostingPackage, self).form_valid(form) hostingpackage = form.save(commit=False)
hostingpackage.customer = self._get_customer()
hostingpackage.save()
messages.success(
self.request,
_('Started setup of new hosting package {name}.').format(
name=hostingpackage.name)
)
return redirect(self.get_success_url())