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__()
|
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)
|
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},
)
}
''',
}
|