game-server-docker/ACC/instances/InstanceForm.py
2023-09-27 14:42:25 +01:00

120 lines
4.7 KiB
Python

from django import forms
from accservermanager.settings import CAR_GROUPS
from cfgs.confEdit import createLabel
from cfgs.confSelect import getCfgsField
from accservermanager import settings
class BaseForm(forms.Form):
def __init__(self, data):
super().__init__(data)
for key in self.fields:
if key == 'cfg': continue
# generate better label
self.fields[key].label = createLabel(key)
# add help text if available
if key in settings.MESSAGES:
self.fields[key].help_text = settings.MESSAGES[key]
# use default values from the 'data' object
if key in data:
self.fields[key].initial = data[key]
class SettingsForm(BaseForm):
"""
Form around settings.json
"""
serverName = forms.CharField(max_length=100)
password = forms.CharField(max_length=100, required=False)
spectatorPassword = forms.CharField(max_length=100, required=False)
adminPassword = forms.CharField(max_length=100, required=False)
carGroup = forms.ChoiceField(widget=forms.Select, choices=CAR_GROUPS)
trackMedalsRequirement = forms.IntegerField(max_value=3, min_value=0, required=False)
safetyRatingRequirement = forms.IntegerField(max_value=99, min_value=-1, required=False)
racecraftRatingRequirement = forms.IntegerField(max_value=99, min_value=-1, required=False)
maxCarSlots = forms.IntegerField(max_value=1000, min_value=0, required=False)
isRaceLocked = forms.BooleanField(required=False)
allowAutoDQ = forms.BooleanField(required=False)
shortFormationLap = forms.BooleanField(required=False)
dumpEntryList = forms.BooleanField(required=False)
dumpLeaderboards = forms.BooleanField(required=False)
randomizeTrackWhenEmpty = forms.BooleanField(required=False)
ignorePrematureDisconnects = forms.BooleanField(required=False)
class ConfigurationForm(BaseForm):
"""
Form around configuration.json
"""
udpPort = forms.IntegerField(max_value=None, min_value=1000)
tcpPort = forms.IntegerField(max_value=None, min_value=1000)
maxConnections = forms.IntegerField(max_value=1000, min_value=0, required=False)
registerToLobby = forms.BooleanField(required=False)
lanDiscovery = forms.BooleanField(required=False)
class AssistRulesForm(BaseForm):
"""
Form around assistRules.json
"""
stabilityControlLevelMax = forms.IntegerField(max_value=100, min_value=0, required=False)
disableIdealLine = forms.BooleanField(required=False)
disableAutosteer = forms.BooleanField(required=False)
disableAutoPitLimiter = forms.BooleanField(required=False)
disableAutoGear = forms.BooleanField(required=False)
disableAutoClutch = forms.BooleanField(required=False)
disableAutoEngineStart = forms.BooleanField(required=False)
disableAutoWiper = forms.BooleanField(required=False)
disableAutoLights = forms.BooleanField(required=False)
class EventRulesForm(BaseForm):
"""
Form around eventRules.json
"""
qualifyStandingType = forms.IntegerField(min_value=0, required=False)
pitWindowLengthSec = forms.IntegerField(required=False)
driverStintTimeSec = forms.IntegerField(required=False)
mandatoryPitstopCount = forms.IntegerField(min_value=0, required=False)
maxTotalDrivingTime = forms.IntegerField(required=False)
maxDriversCount = forms.IntegerField(min_value=0, required=False)
isRefuellingAllowedInRace = forms.BooleanField(required=False)
isRefuellingTimeFixed = forms.BooleanField(required=False)
isMandatoryPitstopRefuellingRequired = forms.BooleanField(required=False)
isMandatoryPitstopTyreChangeRequired = forms.BooleanField(required=False)
isMandatoryPitstopSwapDriverRequired = forms.BooleanField(required=False)
tyreSetCount = forms.IntegerField(min_value=0, required=False)
class InstanceForm(forms.Form):
"""
Form used to fire up a new server instance
"""
instanceName = forms.CharField(
max_length=100,
widget=forms.TextInput(attrs={"onkeyup": "nospaces(this)"}))
def __init__(self, data):
super().__init__(data)
self.settings = SettingsForm(data)
self.configuration = ConfigurationForm(data)
self.assistRules = AssistRulesForm(data)
self.eventRules = EventRulesForm(data)
# There is an issue with the 'required' error, so set this field
# to not-required. This is ok, since it is always pre-filled.
# This field has to be instantiated here in order to pick-up new configs.
self.fields['event'] = getCfgsField(label='Event', required=False)
def is_valid(self):
return self.settings.is_valid() and self.configuration.is_valid() and self.assistRules.is_valid() and self.eventRules.is_valid()