from crispy_forms.helper import FormHelper from crispy_forms.layout import Column, HTML, Layout, Row, Submit from django import forms from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from .models import ClusterSettings, Worker class WorkerForm(forms.ModelForm): class Meta: model = Worker fields = ['name', 'enabled', 'ip_lock', 'ip_address', 'country', 'city', 'hostname'] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['name'].label = _("Name") self.fields['enabled'].label = _("Enabled") self.fields['ip_lock'].label = _("IP Lock") self.fields['ip_address'].label = _("IP Address") self.fields['country'].label = _("Country") self.fields['city'].label = _("City") self.fields['hostname'].label = _("Hostname") back_label = _("Back") delete_label = _("Delete") self.helper = FormHelper() self.helper.form_method = 'post' if self.instance.pk: delete_html = f"{delete_label}" else: delete_html = '' self.helper.layout = Layout( Row( Column('name', css_class='form-group col-md-6 mb-0'), Column('enabled', css_class='form-group col-md-6 mb-0'), css_class='form-row' ), Row( Column('ip_lock', css_class='form-group col-md-6 mb-0'), Column('ip_address', css_class='form-group col-md-6 mb-0'), css_class='form-row' ), Row( Column('country', css_class='form-group col-md-4 mb-0'), Column('city', css_class='form-group col-md-4 mb-0'), Column('hostname', css_class='form-group col-md-4 mb-0'), css_class='form-row' ), Row( Column( Submit('submit', _('Save'), css_class='btn btn-success'), HTML(f' {back_label} '), HTML(delete_html), css_class='col-md-12'), css_class='form-row' ) ) def clean(self): cleaned_data = super().clean() name = cleaned_data.get('name') ip_lock = cleaned_data.get('ip_lock') ip_address = cleaned_data.get('ip_address') if Worker.objects.filter(name=name).exclude(pk=self.instance.pk if self.instance else None).exists(): raise ValidationError(_("A worker with that name already exists.")) if ip_lock and not ip_address: raise ValidationError(_("IP Address is required when IP Lock is enabled.")) return cleaned_data class ClusterSettingsForm(forms.ModelForm): class Meta: model = ClusterSettings fields = [ 'enabled', 'primary_enable_wireguard', 'stats_sync_interval', 'stats_cache_interval', 'cluster_mode', 'restart_mode', 'worker_display' ] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['enabled'].label = _("Cluster Enabled") self.fields['primary_enable_wireguard'].label = _("Primary Enable WireGuard") self.fields['stats_sync_interval'].label = _("Stats Sync Interval (seconds)") self.fields['stats_cache_interval'].label = _("Stats Cache Interval (seconds)") self.fields['cluster_mode'].label = _("Cluster Mode") self.fields['restart_mode'].label = _("Restart Mode") self.fields['worker_display'].label = _("Worker Display") back_label = _("Back") self.helper = FormHelper() self.helper.form_method = 'post' self.helper.layout = Layout( Row( Column('enabled', css_class='form-group col-md-6 mb-0'), Column('primary_enable_wireguard', css_class='form-group col-md-6 mb-0'), css_class='form-row' ), Row( Column('stats_sync_interval', css_class='form-group col-md-6 mb-0'), Column('stats_cache_interval', css_class='form-group col-md-6 mb-0'), css_class='form-row' ), Row( Column('cluster_mode', css_class='form-group col-md-6 mb-0'), Column('restart_mode', css_class='form-group col-md-6 mb-0'), css_class='form-row' ), Row( Column('worker_display', css_class='form-group col-md-12 mb-0'), css_class='form-row' ), Row( Column( Submit('submit', _('Save'), css_class='btn btn-success'), HTML(f' {back_label} '), css_class='col-md-12'), css_class='form-row' ) ) def clean(self): cleaned_data = super().clean() stats_sync_interval = cleaned_data.get('stats_sync_interval') stats_cache_interval = cleaned_data.get('stats_cache_interval') if stats_sync_interval and stats_sync_interval < 10: raise ValidationError(_("Stats sync interval must be at least 10 seconds.")) if stats_cache_interval and stats_cache_interval < 10: raise ValidationError(_("Stats cache interval must be at least 10 seconds.")) return cleaned_data