Add PageView model + migration for successful public marketing GET hits
Wire PublicPageViewMiddleware (skips portal/admin/accounts/api/static/health/etc.; fails soft on DB errors)
Portal analytics report: last-30-day views + top pages table
Admin registration and tests
Test plan
Apply migration analytics.0002_pageview
Hit / and /about/ → rows in PageView / admin
Hit /healthz/, /portal/, /admin/ → no new pageviews
Open portal Analytics → views count + Top pages look right
uv run python site/manage.py test analytics.tests
## Summary
Closes #3.
- Add `PageView` model + migration for successful public marketing GET hits
- Wire `PublicPageViewMiddleware` (skips portal/admin/accounts/api/static/health/etc.; fails soft on DB errors)
- Portal analytics report: last-30-day views + top pages table
- Admin registration and tests
## Test plan
- [ ] Apply migration `analytics.0002_pageview`
- [ ] Hit `/` and `/about/` → rows in `PageView` / admin
- [ ] Hit `/healthz/`, `/portal/`, `/admin/` → no new pageviews
- [ ] Open portal Analytics → views count + Top pages look right
- [ ] `uv run python site/manage.py test analytics.tests`
Closes#3 — record successful public GET hits, show last-30-day views and top pages on the analytics report, and keep portal/admin/API paths out of the counts.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Closes #3.
PageViewmodel + migration for successful public marketing GET hitsPublicPageViewMiddleware(skips portal/admin/accounts/api/static/health/etc.; fails soft on DB errors)Test plan
analytics.0002_pageview/and/about/→ rows inPageView/ admin/healthz/,/portal/,/admin/→ no new pageviewsuv run python site/manage.py test analytics.tests