music-kraken-core/src/music_kraken/objects/parents.py

80 lines
2.4 KiB
Python
Raw Normal View History

2023-03-09 17:19:49 +00:00
from typing import Optional, Dict, Type
2022-12-01 12:15:30 +00:00
import uuid
2023-03-02 06:59:53 +00:00
from ..utils.shared import (
2023-02-25 21:16:32 +00:00
SONG_LOGGER as LOGGER
2022-12-01 12:15:30 +00:00
)
2022-12-06 22:44:42 +00:00
2022-12-01 12:15:30 +00:00
class DatabaseObject:
2023-03-03 11:13:23 +00:00
COLLECTION_ATTRIBUTES: tuple = tuple()
SIMPLE_ATTRIBUTES: tuple = tuple()
2023-02-25 21:16:32 +00:00
def __init__(self, _id: str = None, dynamic: bool = False, **kwargs) -> None:
if _id is None and not dynamic:
"""
generates a random UUID
https://docs.python.org/3/library/uuid.html
"""
_id = str(uuid.uuid4())
2023-03-02 15:23:02 +00:00
LOGGER.info(f"id for {type(self).__name__} isn't set. Setting to {_id}")
2023-02-25 21:16:32 +00:00
# The id can only be None, if the object is dynamic (self.dynamic = True)
self.id: Optional[str] = _id
2023-02-10 12:52:18 +00:00
2022-12-12 18:30:18 +00:00
self.dynamic = dynamic
2023-03-03 11:13:23 +00:00
2023-03-09 17:19:49 +00:00
@property
def indexing_values(self) -> Dict[str, object]:
"""
returns a map of the name and values of the attributes.
This helps in comparing classes for equal data (eg. being the same song but different attributes)
Returns:
Dict[str, object]: the key is the name of the attribute, and the value its value
"""
return dict()
2023-03-03 11:13:23 +00:00
def merge(self, other, override: bool = False):
2023-03-03 13:22:46 +00:00
if isinstance(other, type(self)):
2023-03-03 11:32:08 +00:00
LOGGER.warning(f"can't merge \"{type(other)}\" into \"{type(self)}\"")
return
for collection in type(self).COLLECTION_ATTRIBUTES:
getattr(self, collection).extend(collection)
for simple_attribute in type(self).SIMPLE_ATTRIBUTES:
if getattr(other, simple_attribute) is None:
continue
if override or getattr(self, simple_attribute) is None:
setattr(self, simple_attribute, getattr(other, simple_attribute))
2022-12-12 18:30:18 +00:00
2023-02-25 21:16:32 +00:00
class MainObject(DatabaseObject):
"""
This is the parent class for all "main" data objects:
- Song
- Album
- Artist
- Label
2022-12-01 12:15:30 +00:00
2023-02-25 21:16:32 +00:00
It has all the functionality of the "DatabaseObject" (it inherits from said class)
but also some added functions as well.
"""
2023-03-03 11:13:23 +00:00
2023-02-25 21:16:32 +00:00
def __init__(self, _id: str = None, dynamic: bool = False, **kwargs):
2023-03-06 14:20:26 +00:00
DatabaseObject.__init__(self, _id=_id, dynamic=dynamic, **kwargs)
2022-12-01 12:15:30 +00:00
2023-02-25 21:16:32 +00:00
self.additional_arguments: dict = kwargs
2022-12-06 13:45:18 +00:00
2023-02-09 08:40:57 +00:00
def get_options(self) -> list:
return []
def get_option_string(self) -> str:
return ""
2023-02-10 12:52:18 +00:00
options = property(fget=get_options)
options_str = property(fget=get_option_string)