Internal
Public Access
Lets users create, edit, and complete tasks with no network connection, queued locally in IndexedDB and replayed via the existing /api/sync/ protocol once back online -- the same protocol the native Android app already uses, with zero backend changes. The service worker now routes the dashboard's offline fallback to a small client-rendered task app instead of the generic "you're offline" page; every other route keeps the generic fallback. Conflicts (server row touched elsewhere since last sync) auto-resolve as "local wins" rather than surfacing a resolution UI. Scope is title/ status/priority/due-date only -- tags, subtasks, time tracking, and recurrence editing offline are out of scope for this phase. Also adds the first real test coverage for sync/views.py (previously untested): new-item creation, soft-delete-bypasses-conflict-check, conflict detection/discarding, and both resolve_conflict paths. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
49 lines
1.8 KiB
Python
49 lines
1.8 KiB
Python
"""
|
|
URL configuration for KeepItGoing.
|
|
"""
|
|
|
|
from django.contrib import admin
|
|
from django.urls import path, include
|
|
from django.conf import settings
|
|
from django.conf.urls.static import static
|
|
from django.views.generic import TemplateView
|
|
|
|
from users.urls import api_urlpatterns as users_api_urls, web_urlpatterns as users_web_urls
|
|
from tasks.urls import api_urlpatterns as tasks_api_urls, web_urlpatterns as tasks_web_urls
|
|
from sync.urls import api_urlpatterns as sync_api_urls
|
|
from notifications.urls import api_urlpatterns as notifications_api_urls
|
|
from tasks.views_debug import debug_user_agent
|
|
from .views import api_root, manifest_webmanifest, service_worker
|
|
|
|
urlpatterns = [
|
|
# Admin
|
|
path('admin/', admin.site.urls),
|
|
|
|
# PWA
|
|
path('manifest.webmanifest', manifest_webmanifest, name='manifest'),
|
|
path('sw.js', service_worker, name='service-worker'),
|
|
path('offline/', TemplateView.as_view(template_name='offline.html'), name='offline'),
|
|
path('offline/tasks/', TemplateView.as_view(template_name='offline_tasks.html'), name='offline-tasks'),
|
|
|
|
# Debug endpoint (remove in production)
|
|
path('debug/user-agent/', debug_user_agent, name='debug-user-agent'),
|
|
|
|
# API root
|
|
path('api/', api_root, name='api-root'),
|
|
|
|
# API endpoints
|
|
path('api/users/', include(users_api_urls)),
|
|
path('api/tasks/', include(tasks_api_urls)),
|
|
path('api/sync/', include(sync_api_urls)),
|
|
path('api/notifications/', include(notifications_api_urls)),
|
|
|
|
# Web views
|
|
path('', include(tasks_web_urls)), # Dashboard at root
|
|
path('', include(users_web_urls)), # Login, register, profile
|
|
]
|
|
|
|
# Serve media files in development
|
|
if settings.DEBUG:
|
|
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
|
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|