forked from uncloud/uncloud
84 lines
4 KiB
Python
84 lines
4 KiB
Python
import tldextract
|
|
|
|
from django import forms
|
|
from django.forms import ModelForm
|
|
from django.utils.translation import get_language, ugettext_lazy as _
|
|
from django.core.exceptions import ValidationError
|
|
from .validators import domain_name_validator
|
|
from .models import VMInstance
|
|
from uncloud_pay.models import BillingAddress
|
|
|
|
|
|
class DomainNameField(forms.CharField):
|
|
description = 'Domain name form field'
|
|
default_validators = [domain_name_validator, ]
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(DomainNameField, self).__init__(*args, **kwargs)
|
|
|
|
class MainModelForm(ModelForm):
|
|
def __init__(self, *args, **kwargs):
|
|
super(MainModelForm, self).__init__(*args, **kwargs)
|
|
for visible in self.visible_fields():
|
|
visible.field.widget.attrs['class'] = 'form-control'
|
|
|
|
class MainForm(forms.Form):
|
|
def __init__(self, *args, **kwargs):
|
|
super(MainForm, self).__init__(*args, **kwargs)
|
|
for visible in self.visible_fields():
|
|
if (isinstance(visible.field.widget, forms.TextInput)):
|
|
visible.field.widget.attrs['class'] = 'form-control'
|
|
elif (isinstance(visible.field.widget, forms.CheckboxInput)):
|
|
visible.field.widget.attrs['class'] = 'custom-control-input'
|
|
|
|
|
|
class InitialRequestForm(MainForm):
|
|
cores = forms.IntegerField(label='CPU', min_value=1, max_value=48, initial=1)
|
|
memory = forms.IntegerField(label='RAM', min_value=2, max_value=200, initial=2)
|
|
storage = forms.IntegerField(label='Storage', min_value=100, max_value=10000, initial=100)
|
|
pricing_name = forms.CharField(required=True)
|
|
|
|
class RequestDomainsNamesForm(MainForm):
|
|
homeserver_name = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Homeserver Name *'}))
|
|
webclient_name = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Webclient Name *'}))
|
|
is_open_registration = forms.BooleanField(required=False, initial=False)
|
|
|
|
def clean_homeserver_name(self):
|
|
homeserver_name = self.cleaned_data['homeserver_name']
|
|
if VMInstance.objects.filter(homeserver_domain=f"{homeserver_name}.matrix.ungleich.cloud").exists():
|
|
raise ValidationError("homeserver name already exists")
|
|
return homeserver_name
|
|
|
|
def clean_webclient_name(self):
|
|
webclient_name = self.cleaned_data['webclient_name']
|
|
if VMInstance.objects.filter(webclient_domain=f"{webclient_name}.matrix.0co2.cloud").exists():
|
|
raise ValidationError("webclient name already exists")
|
|
return webclient_name
|
|
|
|
class RequestDomainsForm(MainForm):
|
|
matrix_domain = DomainNameField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Matrix Domain *'}))
|
|
homeserver_domain = DomainNameField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Homeserver Domain *'}))
|
|
webclient_domain = DomainNameField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Webclient Domain *'}))
|
|
is_open_registration = forms.BooleanField(required=False, initial=False)
|
|
|
|
def clean(self):
|
|
homeserver_domain = self.cleaned_data.get('homeserver_domain', False)
|
|
webclient_domain = self.cleaned_data.get('webclient_domain', False)
|
|
if homeserver_domain and webclient_domain:
|
|
# Homserver-Domain and Webclient-Domain cannot be below the same second level domain (i.e. homeserver.abc.ch and webclient.def.cloud are ok,
|
|
# homeserver.abc.ch and webclient.abc.ch are not ok
|
|
homeserver_base = tldextract.extract(homeserver_domain).domain
|
|
webclient_base = tldextract.extract(webclient_domain).domain
|
|
if homeserver_base == webclient_base:
|
|
self._errors['webclient_domain'] = self.error_class([
|
|
'Homserver-Domain and Webclient-Domain cannot be below the same second level domain'])
|
|
return self.cleaned_data
|
|
|
|
|
|
class BillingAddressForm(MainModelForm):
|
|
class Meta:
|
|
model = BillingAddress
|
|
fields = ['full_name', 'street',
|
|
'city', 'postal_code', 'country', 'vat_number', 'active', 'owner']
|
|
|
|
|