70 lines
2.4 KiB
Python
70 lines
2.4 KiB
Python
|
from django import forms
|
||
|
from orchestra.forms.widgets import DynamicHelpTextSelect
|
||
|
|
||
|
from django.core.exceptions import ValidationError
|
||
|
from django.utils.translation import gettext_lazy as _
|
||
|
from django.utils.encoding import force_str
|
||
|
|
||
|
from orchestra.contrib.webapps.models import WebApp, WebAppOption
|
||
|
from orchestra.contrib.webapps.options import AppOption
|
||
|
from orchestra.contrib.webapps.types import AppType
|
||
|
|
||
|
from orchestra.contrib.musician.settings import MUSICIAN_EDIT_ENABLE_PHP_OPTIONS
|
||
|
|
||
|
|
||
|
|
||
|
class WebappOptionForm(forms.ModelForm):
|
||
|
|
||
|
OPTIONS_HELP_TEXT = {
|
||
|
op.name: force_str(op.help_text) for op in AppOption.get_plugins()
|
||
|
}
|
||
|
|
||
|
class Meta:
|
||
|
model = WebAppOption
|
||
|
fields = ("name", "value")
|
||
|
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
try:
|
||
|
self.webapp = kwargs.pop('webapp')
|
||
|
super().__init__(*args, **kwargs)
|
||
|
except:
|
||
|
super().__init__(*args, **kwargs)
|
||
|
self.webapp = self.instance.webapp
|
||
|
|
||
|
target = 'this.id.replace("name", "value")'
|
||
|
self.fields['name'].widget.attrs = DynamicHelpTextSelect(target, self.OPTIONS_HELP_TEXT).attrs
|
||
|
|
||
|
def save(self, commit=True):
|
||
|
instance = super().save(commit=False)
|
||
|
instance.webapp = self.webapp
|
||
|
if commit:
|
||
|
super().save(commit=True)
|
||
|
self.webapp.save()
|
||
|
return instance
|
||
|
|
||
|
|
||
|
class WebappOptionCreateForm(WebappOptionForm):
|
||
|
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super().__init__(*args, **kwargs)
|
||
|
plugin = AppType.get(self.webapp.type)
|
||
|
choices = list(plugin.get_group_options_choices())
|
||
|
for grupo, opciones in enumerate(choices):
|
||
|
if isinstance(opciones[1], list):
|
||
|
nueva_lista = [opc for opc in opciones[1] if opc[0] in MUSICIAN_EDIT_ENABLE_PHP_OPTIONS]
|
||
|
choices[grupo] = (opciones[0], nueva_lista)
|
||
|
self.fields['name'].widget.choices = choices
|
||
|
|
||
|
def clean(self):
|
||
|
cleaned_data = super().clean()
|
||
|
name = self.cleaned_data.get("name")
|
||
|
if WebAppOption.objects.filter(webapp=self.webapp, name=name).exists():
|
||
|
raise ValidationError(_("This option already exist."))
|
||
|
return cleaned_data
|
||
|
|
||
|
class WebappOptionUpdateForm(WebappOptionForm):
|
||
|
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super().__init__(*args, **kwargs)
|
||
|
self.fields['name'].widget.choices = [(self.initial['name'], self.initial['name'])]
|