Skip to content
Snippets Groups Projects
Verified Commit 3048a6cf authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Rewrite as dataclass and support blocks and delimiters

parent 21507c67
No related branches found
No related tags found
No related merge requests found
from typing import Any, Dict, List, Optional
import json
from dataclasses import InitVar, dataclass
from typing import Any, Dict, List, Optional, Sequence, Union
from django.conf import settings
from django.forms.widgets import TextInput
......@@ -7,7 +9,16 @@ from django.forms.widgets import TextInput
__all__ = ("CleaveWidget",)
@dataclass
class CleaveWidget(TextInput):
attr_prefix: str = "data-dj-cleavejs"
blocks: Optional[Sequence[int]] = None
delimiter: Optional[Union[str, Sequence[str]]] = None
delimiter_lazy_show: bool = True
attrs: InitVar[Optional[Dict[str, str]]] = None
@property
def media(self) -> Dict[str, List[str]]:
js = ["dj_cleave.js"]
......@@ -15,9 +26,22 @@ class CleaveWidget(TextInput):
js.append(settings.get("CLEAVE_JS"))
return {"js": js}
def __init__(self, cleave_options: Dict[str, Any], attrs: Optional[Dict[str, str]] = None):
@classmethod
def _add_cleaved_attr(cls, attrs, name: str, value: Any):
attrs[f"{cls.attr_prefix}-{name}"] = json.dumps(value)
def __post_init__(self, attrs: Optional[Dict[str, str]] = None):
cleaved_attrs = {} if attrs is None else attrs.copy()
cleaved_attrs.update({f"data-dj-cleavejs-{name}": value for name, value in cleave_options.items()})
if self.blocks is not None:
self._add_cleaved_attr(cleaved_attrs, "blocks", self.blocks)
if self.delimiter is not None:
if isinstance(self.delimiter, Sequence):
if self.blocks is None or len(self.delimiter) != len(self.blocks) - 1:
raise TypeError("If delimiters are given, they must be one less than blocks and blocks must be provided.")
self._add_cleaved_attr(cleaved_attrs, "delimiters", self.delimiter)
else:
self._add_cleaved_attr(cleaved_attrs, "delimiter", self.delimiter)
self._add_cleaved_attr(cleaved_attrs, "delimiter-lazy-show", self.delimiter_lazy_show)
super().__init__(cleaved_attrs)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment