mybuddy/core/widgets.py

50 lines
1.6 KiB
Python
Raw Normal View History

from django.forms import Media
2022-02-15 09:13:35 +00:00
from typing import Any, Dict, Optional
from django.forms import Widget
2022-02-27 20:12:01 +00:00
from . import models
2022-02-27 19:00:12 +00:00
2022-03-02 21:38:25 +00:00
2022-02-15 09:13:35 +00:00
class TagsEditor(Widget):
class Media:
js = ("babybuddy/js/tags_editor.js",)
2022-02-27 19:36:31 +00:00
input_type = "hidden"
template_name = "core/widget_tag_editor.html"
2022-02-15 09:13:35 +00:00
@staticmethod
def __unpack_tag(tag: models.Tag):
2022-02-27 19:36:31 +00:00
return {"name": tag.name, "color": tag.color}
2022-02-15 09:13:35 +00:00
def format_value(self, value: Any) -> Optional[str]:
if value is not None and not isinstance(value, str):
value = [self.__unpack_tag(tag) for tag in value]
return value
2022-02-27 19:36:31 +00:00
def build_attrs(self, base_attrs, extra_attrs=None):
attrs = super().build_attrs(base_attrs, extra_attrs)
2022-02-27 19:36:31 +00:00
class_string = attrs.get("class", "")
2022-02-26 14:50:38 +00:00
class_string = class_string.replace("form-control", "")
2022-02-27 19:36:31 +00:00
attrs["class"] = class_string + " babybuddy-tags-editor"
return attrs
2022-02-27 19:36:31 +00:00
2022-02-15 09:13:35 +00:00
def get_context(self, name: str, value: Any, attrs) -> Dict[str, Any]:
most_tags = models.Tag.objects.order_by("-last_used").all()[:256]
2022-02-15 09:13:35 +00:00
result = super().get_context(name, value, attrs)
2022-02-27 19:36:31 +00:00
tag_names = set(
x["name"] for x in (result.get("widget", {}).get("value", None) or [])
)
quick_suggestion_tags = [t for t in most_tags if t.name not in tag_names][:5]
2022-02-15 09:13:35 +00:00
2022-02-27 19:36:31 +00:00
result["widget"]["tag_suggestions"] = {
"quick": [
self.__unpack_tag(t)
for t in quick_suggestion_tags
2022-02-15 09:13:35 +00:00
if t.name not in tag_names
],
2022-02-27 19:36:31 +00:00
"most": [self.__unpack_tag(t) for t in most_tags],
2022-02-15 09:13:35 +00:00
}
return result