30 lines
937 B
Python
30 lines
937 B
Python
from typing import Any, Callable, Dict, List
|
|
|
|
from szurubooru import errors, model, rest
|
|
|
|
|
|
def get_serialization_options(ctx: rest.Context) -> List[str]:
|
|
return ctx.get_param_as_list("fields", default=[])
|
|
|
|
|
|
class BaseSerializer:
|
|
_fields = {} # type: Dict[str, Callable[[model.Base], Any]]
|
|
|
|
def serialize(self, options: List[str]) -> Any:
|
|
field_factories = self._serializers()
|
|
if not options:
|
|
options = list(field_factories.keys())
|
|
ret = {}
|
|
for key in options:
|
|
if key not in field_factories:
|
|
raise errors.ValidationError(
|
|
"Invalid key: %r. Valid keys: %r."
|
|
% (key, list(sorted(field_factories.keys())))
|
|
)
|
|
factory = field_factories[key]
|
|
ret[key] = factory()
|
|
return ret
|
|
|
|
def _serializers(self) -> Dict[str, Callable[[], Any]]:
|
|
raise NotImplementedError()
|