Skip to content

Commit

Permalink
Linting
Browse files Browse the repository at this point in the history
  • Loading branch information
rabstejnek committed Jan 27, 2025
1 parent cd8621e commit 0ef92b5
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 39 deletions.
1 change: 1 addition & 0 deletions hawc/apps/common/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,7 @@ def validate(self, value):
if not form.is_valid():
raise forms.ValidationError(self.error_messages["invalid"])


class NewDynamicFormField(DynamicFormField):
widget = widgets.NewDynamicFormWidget

Expand Down
15 changes: 9 additions & 6 deletions hawc/apps/common/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,26 +148,28 @@ def add_prefix(self, field_name):

def format_value(self, value):
"""Value used in rendering."""
if value is not None and not isinstance(value,dict):
if value is not None and not isinstance(value, dict):
value = json.loads(value)
if value:
value = {self.add_prefix(k): v for k, v in value.items()}
return self.form_class(data=value, **self.form_kwargs)

def value_from_datadict(self, data, files, name):
"""Parse value from POST request."""
self.form_kwargs.pop("prefix",None)
form = self.form_class(data=data,prefix=name, **self.form_kwargs)
self.form_kwargs.pop("prefix", None)
form = self.form_class(data=data, prefix=name, **self.form_kwargs)
form.full_clean()
return form.cleaned_data

class Media:
js = ["js/udf.js"]


class NewDynamicFormWidget(DynamicFormWidget):
"""Dynamic form widget that uses name instead of prefix."""

def get_context(self, name, value, attrs):
if value is not None and not isinstance(value,dict):
if value is not None and not isinstance(value, dict):
value = json.loads(value)
if value:
value = {f"{name}-{k}": v for k, v in value.items()}
Expand All @@ -185,10 +187,11 @@ def get_context(self, name, value, attrs):

def value_from_datadict(self, data, files, name):
"""Parse value from POST request."""
self.form_kwargs.pop("prefix",None)
form = self.form_class(data=data,prefix=name, **self.form_kwargs)
self.form_kwargs.pop("prefix", None)
form = self.form_class(data=data, prefix=name, **self.form_kwargs)
form.full_clean()
return form.cleaned_data


class ColorInput(TextInput):
input_type = "color"
72 changes: 39 additions & 33 deletions hawc/apps/udf/forms.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from copy import deepcopy

from crispy_forms import layout as cfl
from django import forms
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.db import transaction
from django.db.models import F, Value
Expand All @@ -11,19 +11,19 @@
from ..assessment.models import Assessment
from ..common.autocomplete.forms import AutocompleteSelectMultipleWidget
from ..common.dynamic_forms.schemas import Schema
from ..common.forms import BaseFormHelper, PydanticValidator, form_actions_big, NewDynamicFormField
from ..common.forms import BaseFormHelper, NewDynamicFormField, PydanticValidator, form_actions_big
from ..common.helper import get_current_user
from ..common.views import create_object_log
from ..lit.models import ReferenceFilterTag
from ..myuser.autocomplete import UserAutocomplete
from . import cache, constants, models

class ArrayWidget(forms.MultiWidget):

class ArrayWidget(forms.MultiWidget):
template_name = "udf/widget.html"

def __init__(self, default_widget, attrs=None):
super(forms.MultiWidget,self).__init__(attrs)
super(forms.MultiWidget, self).__init__(attrs)
self.default_widget = default_widget
self.suffix = "[]"
self.widgets_names = []
Expand All @@ -32,14 +32,16 @@ def __init__(self, default_widget, attrs=None):
def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
# TODO handle this more like in super?
context["default_widget"] = self.default_widget.get_context(name+self.suffix, None, attrs)["widget"]
context["default_widget"] = self.default_widget.get_context(
name + self.suffix, None, attrs
)["widget"]
return context

def initialize_widgets(self, widgets:list):
def initialize_widgets(self, widgets: list):
self.widgets_names = [self.suffix for _ in range(len(widgets))]
self.widgets = [w() if isinstance(w, type) else w for w in widgets]

def initialize_widgets_from_fields(self, fields:list):
def initialize_widgets_from_fields(self, fields: list):
widgets = [field.widget for field in fields]
self.initialize_widgets(widgets)

Expand All @@ -49,29 +51,29 @@ def value_from_datadict(self, data, files, name):
except AttributeError:
getter = data.get

keys = [_ for _ in data.keys() if _.startswith(name+self.suffix)]
keys = [_ for _ in data.keys() if _.startswith(name + self.suffix)]
lists = [getter(key) for key in keys]
values = [{(name + k.removeprefix(name+self.suffix)):v[i] for i,k in enumerate(keys)} for v in zip(*lists)]
values = [
{(name + k.removeprefix(name + self.suffix)): v[i] for i, k in enumerate(keys)}
for v in zip(*lists, strict=False)
]

if values:
return [
self.default_widget.value_from_datadict(value, files, name)
for value in values
]

return [self.default_widget.value_from_datadict(value, files, name) for value in values]

return getter(name) or []

def value_omitted_from_data(self, data, files, name):
try:
getter = data.getlist
except AttributeError:
getter = data.get
values = {index:value for index, value in enumerate(getter(name+self.suffix) or [])}
values = {index: value for index, value in enumerate(getter(name + self.suffix) or [])}
return all(
widget.value_omitted_from_data(values, files, index)
for index, widget in enumerate(self.widgets)
)

def decompress(self, value):
# no need to decompress; value should always be a list
return value
Expand All @@ -84,12 +86,12 @@ def __init__(self, field, *, require_all_fields=True, **kwargs):
widget = kwargs.get("widget") or self.widget
if isinstance(widget, type):
kwargs["widget"] = widget(default_widget=field.widget)
super(forms.MultiValueField,self).__init__(**kwargs)
super(forms.MultiValueField, self).__init__(**kwargs)
self.require_all_fields = require_all_fields
self.field = field
self.fields = []

def initialize_fields(self, fields:list):
def initialize_fields(self, fields: list):
for f in fields:
f.error_messages.setdefault("incomplete", self.error_messages["incomplete"])
if self.disabled:
Expand All @@ -103,7 +105,7 @@ def initialize_fields(self, fields:list):

self.widget.initialize_widgets_from_fields(self.fields)

def initialize_fields_from_value(self, value:list):
def initialize_fields_from_value(self, value: list):
fields = [deepcopy(self.field) for _ in value]
self.initialize_fields(fields)

Expand Down Expand Up @@ -157,9 +159,10 @@ def helper(self):
)
return helper


class ConditionForm(forms.Form):
subject = forms.CharField(required=False)
observers = forms.CharField(required=False) # make array, test
observers = forms.CharField(required=False) # make array, test
# comparison = select field
# comparison_value = anything (not sure how to do this, maybe conditional logic)
# behavior = select field
Expand All @@ -172,14 +175,18 @@ def helper(self):


class SchemaForm(forms.Form):
fields = ArrayField(NewDynamicFormField(prefix="schema_builder-fields",form_class=FieldForm))
#conditions = ArrayField(NewDynamicFormField(required=False,prefix="schema_builder-conditions",form_class=ConditionForm))
fields = ArrayField(NewDynamicFormField(prefix="schema_builder-fields", form_class=FieldForm))
# conditions = ArrayField(NewDynamicFormField(required=False,prefix="schema_builder-conditions",form_class=ConditionForm))

def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.fields["fields"].initialize_fields_from_value(self.fields["fields"].widget.value_from_datadict(self.data, None, 'schema_builder-fields') or [])
#self.fields["conditions"].initialize_fields_from_value(self.fields["conditions"].widget.value_from_datadict(self.data, None, "schema_builder-conditions") or [])

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["fields"].initialize_fields_from_value(
self.fields["fields"].widget.value_from_datadict(
self.data, None, "schema_builder-fields"
)
or []
)
# self.fields["conditions"].initialize_fields_from_value(self.fields["conditions"].widget.value_from_datadict(self.data, None, "schema_builder-conditions") or [])

@property
def helper(self):
Expand Down Expand Up @@ -308,25 +315,23 @@ class NewUDFForm(UDFForm):
schema_builder = NewDynamicFormField(
prefix="schema_builder",
form_class=SchemaForm,
validators=[PydanticValidator(Schema)],)
validators=[PydanticValidator(Schema)],
)

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if schema:=self.initial.get("schema"):
if schema := self.initial.get("schema"):
self.initial["schema_builder"] = schema


def clean(self):
# remove errors if schema has manually been changed
cleaned_data = super().clean()
if "schema" in self.changed_data:
self._errors.pop("schema_builder",None)
self._errors.pop("schema_builder", None)
elif "schema_builder" in cleaned_data:
cleaned_data["schema"] = cleaned_data["schema_builder"]
return cleaned_data



@property
def helper(self):
legend_text = (
Expand Down Expand Up @@ -374,6 +379,7 @@ def helper(self):
)
return helper


class SchemaPreviewForm(forms.Form):
"""Form for previewing a Dynamic Form schema."""

Expand Down

0 comments on commit 0ef92b5

Please sign in to comment.