|
1
|
from pages.models import Page |
|
2
|
from projects.models import Project, ProjectGroup |
|
3
|
|
|
4
|
|
|
5
|
def sidebar(request): |
|
6
|
if not request.user.is_authenticated: |
|
7
|
return {} |
|
8
|
|
|
9
|
projects = Project.objects.all().select_related("group") |
|
10
|
pages = Page.objects.filter(is_published=True) |
|
11
|
if request.user.has_perm("pages.change_page") or request.user.is_superuser: |
|
12
|
pages = Page.objects.all() |
|
13
|
|
|
14
|
# Build grouped structure for sidebar |
|
15
|
groups = ProjectGroup.objects.filter(deleted_at__isnull=True) |
|
16
|
|
|
17
|
grouped_projects = [] |
|
18
|
grouped_ids = set() |
|
19
|
for group in groups: |
|
20
|
group_projects = [p for p in projects if p.group_id == group.id] |
|
21
|
if group_projects: |
|
22
|
grouped_projects.append({"group": group, "projects": group_projects}) |
|
23
|
grouped_ids.update(p.id for p in group_projects) |
|
24
|
|
|
25
|
ungrouped_projects = [p for p in projects if p.id not in grouped_ids] |
|
26
|
|
|
27
|
# Split pages: product docs (known slugs) vs org knowledge base (user-created) |
|
28
|
PRODUCT_DOC_SLUGS = { |
|
29
|
"agentic-development", "api-reference", "architecture", |
|
30
|
"administration", "setup-guide", "getting-started", "features", |
|
31
|
"roadmap", |
|
32
|
} |
|
33
|
product_docs = [p for p in pages if p.slug in PRODUCT_DOC_SLUGS] |
|
34
|
kb_pages = [p for p in pages if p.slug not in PRODUCT_DOC_SLUGS] |
|
35
|
|
|
36
|
return { |
|
37
|
"sidebar_projects": projects, |
|
38
|
"sidebar_grouped": grouped_projects, |
|
39
|
"sidebar_ungrouped": ungrouped_projects, |
|
40
|
"sidebar_pages": pages, # Keep for backwards compat |
|
41
|
"sidebar_product_docs": product_docs, |
|
42
|
"sidebar_kb_pages": kb_pages, |
|
43
|
} |
|
44
|
|