2026-03-12 14:15:14 -03:00
|
|
|
from urllib.parse import urlparse
|
|
|
|
|
|
|
|
|
|
from crispy_forms.helper import FormHelper
|
|
|
|
|
from crispy_forms.layout import Layout, Submit, HTML, Div
|
|
|
|
|
from django import forms
|
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
|
|
|
|
from app_gateway.models import (
|
|
|
|
|
Application, ApplicationHost, AccessPolicy, ApplicationPolicy, ApplicationRoute
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ApplicationForm(forms.ModelForm):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = Application
|
|
|
|
|
fields = ['name', 'display_name', 'upstream']
|
|
|
|
|
labels = {
|
|
|
|
|
'name': _('Name'),
|
|
|
|
|
'display_name': _('Display Name'),
|
|
|
|
|
'upstream': _('Upstream'),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
cancel_url = kwargs.pop('cancel_url', '#')
|
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
self.helper = FormHelper()
|
|
|
|
|
self.helper.layout = Layout(
|
|
|
|
|
Div(
|
|
|
|
|
Div('name', css_class='col-md-6'),
|
|
|
|
|
Div('display_name', css_class='col-md-6'),
|
|
|
|
|
css_class='row'
|
|
|
|
|
),
|
|
|
|
|
Div(
|
|
|
|
|
Div('upstream', css_class='col-md-12'),
|
|
|
|
|
css_class='row'
|
|
|
|
|
),
|
|
|
|
|
Div(
|
|
|
|
|
Div(
|
|
|
|
|
Submit('submit', _('Save'), css_class='btn btn-primary'),
|
|
|
|
|
HTML(f'<a href="{cancel_url}" class="btn btn-secondary">{_("Cancel")}</a>'),
|
2026-03-12 17:28:41 -03:00
|
|
|
css_class='col-md-12'
|
2026-03-12 14:15:14 -03:00
|
|
|
),
|
|
|
|
|
css_class='row'
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def clean(self):
|
|
|
|
|
cleaned_data = super().clean()
|
|
|
|
|
upstream = (cleaned_data.get("upstream") or "").strip()
|
|
|
|
|
|
|
|
|
|
if upstream:
|
|
|
|
|
if " " in upstream:
|
|
|
|
|
self.add_error("upstream", _("Upstream URL cannot contain spaces."))
|
|
|
|
|
|
|
|
|
|
parsed = urlparse(upstream)
|
|
|
|
|
is_valid = (parsed.scheme in {"http", "https"} and bool(parsed.netloc))
|
|
|
|
|
|
|
|
|
|
if not is_valid:
|
|
|
|
|
self.add_error("upstream", _("Enter a valid upstream URL starting with http:// or https://"))
|
|
|
|
|
|
|
|
|
|
return cleaned_data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ApplicationHostForm(forms.ModelForm):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = ApplicationHost
|
2026-03-12 18:41:21 -03:00
|
|
|
fields = ['hostname']
|
2026-03-12 14:15:14 -03:00
|
|
|
labels = {
|
|
|
|
|
'hostname': _('Hostname'),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
cancel_url = kwargs.pop('cancel_url', '#')
|
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
self.helper = FormHelper()
|
|
|
|
|
self.helper.layout = Layout(
|
|
|
|
|
Div(
|
2026-03-12 18:41:21 -03:00
|
|
|
Div('hostname', css_class='col-md-12'),
|
2026-03-12 14:15:14 -03:00
|
|
|
css_class='row'
|
|
|
|
|
),
|
|
|
|
|
Div(
|
|
|
|
|
Div(
|
|
|
|
|
Submit('submit', _('Save'), css_class='btn btn-primary'),
|
|
|
|
|
HTML(f'<a href="{cancel_url}" class="btn btn-secondary">{_("Cancel")}</a>'),
|
2026-03-12 17:28:41 -03:00
|
|
|
css_class='col-md-12'
|
2026-03-12 14:15:14 -03:00
|
|
|
),
|
|
|
|
|
css_class='row'
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AccessPolicyForm(forms.ModelForm):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = AccessPolicy
|
|
|
|
|
fields = ['name', 'policy_type', 'groups', 'methods']
|
|
|
|
|
labels = {
|
|
|
|
|
'name': _('Name'),
|
|
|
|
|
'policy_type': _('Policy Type'),
|
|
|
|
|
'groups': _('Allowed Groups'),
|
|
|
|
|
'methods': _('Authentication Methods'),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
cancel_url = kwargs.pop('cancel_url', '#')
|
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
self.helper = FormHelper()
|
|
|
|
|
self.helper.layout = Layout(
|
|
|
|
|
Div(
|
|
|
|
|
Div('name', css_class='col-md-6'),
|
|
|
|
|
Div('policy_type', css_class='col-md-6'),
|
|
|
|
|
css_class='row'
|
|
|
|
|
),
|
|
|
|
|
Div(
|
|
|
|
|
Div('groups', css_class='col-md-6'),
|
|
|
|
|
Div('methods', css_class='col-md-6'),
|
|
|
|
|
css_class='row'
|
|
|
|
|
),
|
|
|
|
|
Div(
|
|
|
|
|
Div(
|
|
|
|
|
Submit('submit', _('Save'), css_class='btn btn-primary'),
|
|
|
|
|
HTML(f'<a href="{cancel_url}" class="btn btn-secondary">{_("Cancel")}</a>'),
|
2026-03-12 17:28:41 -03:00
|
|
|
css_class='col-md-12'
|
2026-03-12 14:15:14 -03:00
|
|
|
),
|
|
|
|
|
css_class='row'
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ApplicationPolicyForm(forms.ModelForm):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = ApplicationPolicy
|
2026-03-12 18:41:21 -03:00
|
|
|
fields = ['default_policy']
|
2026-03-12 14:15:14 -03:00
|
|
|
labels = {
|
|
|
|
|
'default_policy': _('Default Policy'),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
cancel_url = kwargs.pop('cancel_url', '#')
|
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
self.helper = FormHelper()
|
|
|
|
|
self.helper.layout = Layout(
|
|
|
|
|
Div(
|
2026-03-12 18:41:21 -03:00
|
|
|
Div('default_policy', css_class='col-md-12'),
|
2026-03-12 14:15:14 -03:00
|
|
|
css_class='row'
|
|
|
|
|
),
|
|
|
|
|
Div(
|
|
|
|
|
Div(
|
|
|
|
|
Submit('submit', _('Save'), css_class='btn btn-primary'),
|
|
|
|
|
HTML(f'<a href="{cancel_url}" class="btn btn-secondary">{_("Cancel")}</a>'),
|
2026-03-12 17:28:41 -03:00
|
|
|
css_class='col-md-12'
|
2026-03-12 14:15:14 -03:00
|
|
|
),
|
|
|
|
|
css_class='row'
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ApplicationRouteForm(forms.ModelForm):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = ApplicationRoute
|
2026-03-12 18:41:21 -03:00
|
|
|
fields = ['name', 'path_prefix', 'policy', 'order']
|
2026-03-12 14:15:14 -03:00
|
|
|
labels = {
|
|
|
|
|
'name': _('Route Name'),
|
|
|
|
|
'path_prefix': _('Path Prefix'),
|
|
|
|
|
'policy': _('Policy'),
|
2026-03-12 18:41:21 -03:00
|
|
|
'order': _('Order'),
|
2026-03-12 14:15:14 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
cancel_url = kwargs.pop('cancel_url', '#')
|
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
self.helper = FormHelper()
|
|
|
|
|
self.helper.layout = Layout(
|
|
|
|
|
Div(
|
2026-03-12 18:41:21 -03:00
|
|
|
Div('name', css_class='col-md-12'),
|
2026-03-12 14:15:14 -03:00
|
|
|
css_class='row'
|
|
|
|
|
),
|
|
|
|
|
Div(
|
2026-03-12 18:41:21 -03:00
|
|
|
Div('path_prefix', css_class='col-xl-7'),
|
|
|
|
|
Div('order', css_class='col-xl-5'),
|
2026-03-12 14:15:14 -03:00
|
|
|
css_class='row'
|
|
|
|
|
),
|
|
|
|
|
Div(
|
|
|
|
|
Div('policy', css_class='col-md-12'),
|
|
|
|
|
css_class='row'
|
|
|
|
|
),
|
|
|
|
|
Div(
|
|
|
|
|
Div(
|
|
|
|
|
Submit('submit', _('Save'), css_class='btn btn-primary'),
|
|
|
|
|
HTML(f'<a href="{cancel_url}" class="btn btn-secondary">{_("Cancel")}</a>'),
|
2026-03-12 17:28:41 -03:00
|
|
|
css_class='col-md-12'
|
2026-03-12 14:15:14 -03:00
|
|
|
),
|
|
|
|
|
css_class='row'
|
|
|
|
|
)
|
|
|
|
|
)
|