Skip to content

tool_services

django_spire.knowledge.collection.services.tool_services

CollectionToolService

Bases: BaseDjangoModelService['Collection']

Source code in django_spire/contrib/constructor/constructor.py
def __init__(self, obj: Any = None):
    self._obj_type_name: str = str(
        next(iter(self.__class__.__annotations__.values()))
    ).split('.')[-1]

    if obj is None:
        return

    self._obj_mro_type_names = [cls.__name__ for cls in obj.__class__.__mro__]

    if self._obj_type_name not in self._obj_mro_type_names:
        message = f'{self.__class__.__name__} was instantiated with obj type "{obj.__class__.__name__}" and failed as it was expecting "{self._obj_type_name}".'
        raise ConstructorError(message)

    self._obj_type: type[TypeAny] = obj.__class__

    if self._obj_type is None or self._obj_type is ...:
        message = f'{self.__class__.__name__} top class attribute must have an annotated type.'
        raise ConstructorError(message)

    self.obj: TypeAny = obj

    if ABC not in self.__class__.__bases__:
        if not self._obj_is_valid:
            message = f'{self._obj_type_name} failed to validate on {self.__class__.__name__}'
            raise ConstructorError(message)

    self.__post_init__()

obj instance-attribute

get_children_ids

Source code in django_spire/knowledge/collection/services/tool_services.py
def get_children_ids(self, parent_id: int) -> set[int]:
    descendant_ids = set()
    current_level_ids = [parent_id]

    while current_level_ids:
        child_ids = self.obj_class.objects.by_parent_ids(
            parent_ids=current_level_ids
        ).values_list('id', flat=True)

        if not child_ids:
            break

        descendant_ids.update(child_ids)
        current_level_ids = child_ids

    return descendant_ids

get_root_collection_pk

Source code in django_spire/knowledge/collection/services/tool_services.py
def get_root_collection_pk(self) -> int:
    collection = self.obj

    while collection.parent_id:
        collection = collection.parent

    return collection.id