Skip to content

transformation_service

django_spire.knowledge.collection.services.transformation_service

CollectionTransformationService

Bases: BaseDjangoModelService['Collection']

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

    if obj is None:
        return

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

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

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

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

    self.obj: TypeAny = obj

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

    self.__post_init__()

obj instance-attribute

to_hierarchy_json

Source code in django_spire/knowledge/collection/services/transformation_service.py
def to_hierarchy_json(self, request: WSGIRequest) -> str:
    user = request.user

    collections = (
        self.obj_class.objects
        .active()
        .select_related('parent')
    )

    if not (
            user.is_superuser or
            AppAuthController('knowledge', request).can_access_all_collections()
    ):
        collections = collections.user_has_access(user=user)

    entry_queryset = (
        collections.model._meta.fields_map.get('entry')
        .related_model
        .objects
        .active()
        .has_current_version()
        .user_has_access(user=user)
        .select_related('current_version__author')
        .order_by('order')
    )

    collections = list(
        collections.prefetch_related(Prefetch('entries', queryset=entry_queryset))
        .active()
        .order_by('order')
    )

    collection_map = {}
    for collection in collections:
        collection_map[collection.pk] = collection.services.transformation.to_dict()

    tree = []
    for collection in collections:
        if collection.parent_id and collection.parent_id in collection_map:
            collection_map[collection.parent_id]['children'].append(
                collection_map[collection.pk]
            )
        else:
            tree.append(collection_map[collection.pk])

    return json.dumps(tree)

to_dict

Source code in django_spire/knowledge/collection/services/transformation_service.py
def to_dict(self):
    site = Site.objects.get_current() if not settings.DEBUG else ''
    entries = self.obj.entries.all()

    return {
        'id': self.obj.pk,
        'name': self.obj.name,
        'description': self.obj.description,
        'children': [],
        'entries': (
            entries.model.services.transformation
            .queryset_to_navigation_list(queryset=entries)
        ),
        'delete_url': f'''
            {site}{
                reverse(
                    'django_spire:knowledge:collection:page:delete',
                    kwargs={'pk': self.obj.pk},
                )
            }
        ''',
        'edit_url': f'''
            {site}{
                reverse(
                    'django_spire:knowledge:collection:form:update',
                    kwargs={'pk': self.obj.pk},
                )
            }
        ''',
        'create_entry_url': f'''
            {site}{
                reverse(
                    'django_spire:knowledge:entry:form:create',
                    kwargs={'collection_pk': self.obj.pk},
                )
            }
        ''',
        'import_entry_url': f'''
            {site}{
                reverse(
                    'django_spire:knowledge:entry:form:import',
                    kwargs={'collection_pk': self.obj.pk},
                )
            }
        ''',
    }