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