restrictions.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from typing import TYPE_CHECKING, Optional
  2. from yandex_music import DiscreteScale, Enum, YandexMusicModel
  3. from yandex_music.utils import model
  4. if TYPE_CHECKING:
  5. from yandex_music import ClientType, JSONType, MapTypeToDeJson
  6. _TYPE_TO_DE_JSON_DEF: 'MapTypeToDeJson' = {'enum': Enum.de_json, 'discrete-scale': DiscreteScale.de_json}
  7. @model
  8. class Restrictions(YandexMusicModel):
  9. """Класс, представляющий ограничения для настроек станции.
  10. Attributes:
  11. language (:obj:`yandex_music.Enum`): Перечисление значений для языков.
  12. diversity (:obj:`yandex_music.Enum`): Перечисление значений для разнообразия (треков).
  13. mood (:obj:`yandex_music.DiscreteScale`, optional): Ограничение для значений настроения.
  14. energy (:obj:`yandex_music.DiscreteScale`, optional): Ограничение для значений энергичности.
  15. mood_energy (:obj:`yandex_music.Enum`, optional): Значения для настроения.
  16. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  17. """
  18. language: Optional['Enum']
  19. diversity: Optional['Enum']
  20. mood: Optional['DiscreteScale'] = None
  21. energy: Optional['DiscreteScale'] = None
  22. mood_energy: Optional['Enum'] = None
  23. client: Optional['ClientType'] = None
  24. def __post_init__(self) -> None:
  25. self._id_attrs = (self.language, self.diversity)
  26. @classmethod
  27. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['Restrictions']:
  28. """Десериализация объекта.
  29. Args:
  30. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  31. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  32. Returns:
  33. :obj:`yandex_music.Restrictions`: Ограничения для настроек станции.
  34. """
  35. if not cls.is_dict_model_data(data):
  36. return None
  37. cls_data = cls.cleanup_data(data, client)
  38. for key, value in data.items():
  39. type_ = value.get('type') if isinstance(value, dict) else None
  40. if isinstance(type_, str) and type_ in _TYPE_TO_DE_JSON_DEF:
  41. de_json = _TYPE_TO_DE_JSON_DEF[type_]
  42. cls_data[key] = de_json(value, client)
  43. return cls(client=client, **cls_data) # type: ignore