Compare commits
base: retoor/devplacepy:016d2d1c76142818f0f5fc10a3152a579cd0d416
retoor/devplacepy:master
retoor/devplacepy:typosaurus/169-implement-links-to-the-official-ios-app-in-the-web-app
retoor/devplacepy:typosaurus/162-add-non-color-indicator-to-vote-button-state
retoor/devplacepy:typosaurus/132-missing-notification-when-another-user-comments-on-a-post-th
retoor/devplacepy:typosaurus/134-cosmetic-title-replaces-clickable-username-on-leaderboard
retoor/devplacepy:typosaurus/157-add-badge-earned-info-to-user-profile-badges-api-response
retoor/devplacepy:typosaurus/ticket-150
retoor/devplacepy:typosaurus/ticket-152
retoor/devplacepy:typosaurus/ticket-148
retoor/devplacepy:typosaurus/ticket-146
retoor/devplacepy:typosaurus/112-expose-level-progress-percentage-in-profile-api-response
retoor/devplacepy:typosaurus/113-fix-badge-names-returning-null-in-profile-endpoint
retoor/devplacepy:typosaurus/138-fix-navigation-bar-link-icons-and-text-appearing-on-separate
retoor/devplacepy:typosaurus/ticket-138
retoor/devplacepy:typosaurus/ticket-135
retoor/devplacepy:typosaurus/ticket-132
retoor/devplacepy:typosaurus/ticket-110
retoor/devplacepy:typosaurus/ticket-116
retoor/devplacepy:typosaurus/ticket-113
retoor/devplacepy:typosaurus/ticket-114
retoor/devplacepy:typosaurus/ticket-111
retoor/devplacepy:typosaurus/ticket-112
retoor/devplacepy:typosaurus/ticket-106
retoor/devplacepy:typosaurus/ticket-104
retoor/devplacepy:typosaurus/ticket-84
retoor/devplacepy:typosaurus/ticket-93
retoor/devplacepy:typosaurus/ticket-73
retoor/devplacepy:typosaurus/ticket-89
retoor/devplacepy:typosaurus/ticket-85
retoor/devplacepy:typosaurus/ticket-86
retoor/devplacepy:typosaurus/ticket-88
retoor/devplacepy:typosaurus/ticket-105
retoor/devplacepy:typosaurus/ticket-95
retoor/devplacepy:typosaurus/ticket-102
retoor/devplacepy:typosaurus/ticket-91
retoor/devplacepy:typosaurus/ticket-90
retoor/devplacepy:typosaurus/ticket-87
retoor/devplacepy:typosaurus/ticket-72
retoor/devplacepy:typosaurus/ticket-81
retoor/devplacepy:typosaurus/ticket-83
retoor/devplacepy:typosaurus/ticket-78
retoor/devplacepy:typosaurus/ticket-74
retoor/devplacepy:typosaurus/ticket-82
retoor/devplacepy:typosaurus/ticket-97
retoor/devplacepy:typosaurus/ticket-99
retoor/devplacepy:typosaurus/ticket-68
retoor/devplacepy:typosaurus/ticket-66
retoor/devplacepy:typosaurus/ticket-75
retoor/devplacepy:typosaurus/ticket-61
retoor/devplacepy:typosaurus/ticket-44
retoor/devplacepy:typosaurus/ticket-57
retoor/devplacepy:typosaurus/ticket-48
retoor/devplacepy:typosaurus/ticket-64
retoor/devplacepy:typosaurus/ticket-94
retoor/devplacepy:typosaurus/ticket-103
retoor/devplacepy:typosaurus/ticket-26
retoor/devplacepy:typosaurus/ticket-71
retoor/devplacepy:typosaurus/ticket-7
retoor/devplacepy:typosaurus/ticket-70
retoor/devplacepy:typosaurus/ticket-10
retoor/devplacepy:typosaurus/ticket-65
retoor/devplacepy:typosaurus/ticket-69
retoor/devplacepy:typosaurus/ticket-67
retoor/devplacepy:typosaurus/ticket-76
retoor/devplacepy:typosaurus/ticket-21
retoor/devplacepy:production
..
compare: retoor/devplacepy:741d7aade6308eb4e5fb5d3d7252abae50914ccf
retoor/devplacepy:master
retoor/devplacepy:typosaurus/169-implement-links-to-the-official-ios-app-in-the-web-app
retoor/devplacepy:typosaurus/162-add-non-color-indicator-to-vote-button-state
retoor/devplacepy:typosaurus/132-missing-notification-when-another-user-comments-on-a-post-th
retoor/devplacepy:typosaurus/134-cosmetic-title-replaces-clickable-username-on-leaderboard
retoor/devplacepy:typosaurus/157-add-badge-earned-info-to-user-profile-badges-api-response
retoor/devplacepy:typosaurus/ticket-150
retoor/devplacepy:typosaurus/ticket-152
retoor/devplacepy:typosaurus/ticket-148
retoor/devplacepy:typosaurus/ticket-146
retoor/devplacepy:typosaurus/112-expose-level-progress-percentage-in-profile-api-response
retoor/devplacepy:typosaurus/113-fix-badge-names-returning-null-in-profile-endpoint
retoor/devplacepy:typosaurus/138-fix-navigation-bar-link-icons-and-text-appearing-on-separate
retoor/devplacepy:typosaurus/ticket-138
retoor/devplacepy:typosaurus/ticket-135
retoor/devplacepy:typosaurus/ticket-132
retoor/devplacepy:typosaurus/ticket-110
retoor/devplacepy:typosaurus/ticket-116
retoor/devplacepy:typosaurus/ticket-113
retoor/devplacepy:typosaurus/ticket-114
retoor/devplacepy:typosaurus/ticket-111
retoor/devplacepy:typosaurus/ticket-112
retoor/devplacepy:typosaurus/ticket-106
retoor/devplacepy:typosaurus/ticket-104
retoor/devplacepy:typosaurus/ticket-84
retoor/devplacepy:typosaurus/ticket-93
retoor/devplacepy:typosaurus/ticket-73
retoor/devplacepy:typosaurus/ticket-89
retoor/devplacepy:typosaurus/ticket-85
retoor/devplacepy:typosaurus/ticket-86
retoor/devplacepy:typosaurus/ticket-88
retoor/devplacepy:typosaurus/ticket-105
retoor/devplacepy:typosaurus/ticket-95
retoor/devplacepy:typosaurus/ticket-102
retoor/devplacepy:typosaurus/ticket-91
retoor/devplacepy:typosaurus/ticket-90
retoor/devplacepy:typosaurus/ticket-87
retoor/devplacepy:typosaurus/ticket-72
retoor/devplacepy:typosaurus/ticket-81
retoor/devplacepy:typosaurus/ticket-83
retoor/devplacepy:typosaurus/ticket-78
retoor/devplacepy:typosaurus/ticket-74
retoor/devplacepy:typosaurus/ticket-82
retoor/devplacepy:typosaurus/ticket-97
retoor/devplacepy:typosaurus/ticket-99
retoor/devplacepy:typosaurus/ticket-68
retoor/devplacepy:typosaurus/ticket-66
retoor/devplacepy:typosaurus/ticket-75
retoor/devplacepy:typosaurus/ticket-61
retoor/devplacepy:typosaurus/ticket-44
retoor/devplacepy:typosaurus/ticket-57
retoor/devplacepy:typosaurus/ticket-48
retoor/devplacepy:typosaurus/ticket-64
retoor/devplacepy:typosaurus/ticket-94
retoor/devplacepy:typosaurus/ticket-103
retoor/devplacepy:typosaurus/ticket-26
retoor/devplacepy:typosaurus/ticket-71
retoor/devplacepy:typosaurus/ticket-7
retoor/devplacepy:typosaurus/ticket-70
retoor/devplacepy:typosaurus/ticket-10
retoor/devplacepy:typosaurus/ticket-65
retoor/devplacepy:typosaurus/ticket-69
retoor/devplacepy:typosaurus/ticket-67
retoor/devplacepy:typosaurus/ticket-76
retoor/devplacepy:typosaurus/ticket-21
retoor/devplacepy:production
6
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
741d7aade6 |
docs: add block/mute user relations, emoji-sync CLI, and uid indexes
DevPlace CI / test (push) Failing after 2m7s
- Add `/block`, `/mute` endpoints with block/unblock and mute/unmute functionality in `routers/relations.py`, hiding blocked users' content everywhere except their own profile while muting only suppresses notifications - Introduce `devplace emoji-sync` CLI command to regenerate `static/js/emoji-shortcodes.js` from the emoji library, documented in `CLAUDE.md` and wired in `cli.py` - Create `get_blocked_uids()` database helper and apply it in `content.py` `load_detail()` to filter blocked users' posts from detail views - Implement `_uid_index()` and `_drop_index()` helpers in `database.py` for unique uid indexes across tables, with `user_relations` added to `SOFT_DELETE_TABLES` - Document new routes in `AGENTS.md` and `README.md`, including emoji shortcodes rendering behavior distinct from the emoji picker |
||
|
|
f3a4667fce |
feat: add AI markdown reformatting and usage metering to NewsService
Add AI-powered body reformatting for valid articles in the news pipeline, converting raw text walls into clean Markdown with paragraphs, headings, and lists. Introduce `news_usage` database table and `add_news_usage`/`get_news_usage` helpers to track per-cycle gateway costs (calls, tokens, latency, USD) from response headers, reported on the admin Services page. Remove unused `.sidebar-more` CSS and apply `render_title()` to poll question/label fields. |
||
|
|
6ceca3d0d4 |
docs: document server-side rendering pipeline, response timing middleware, and Telegram pairing API
- Add comprehensive documentation for backend content rendering in AGENTS.md, detailing the new `render_content` and `render_title` Jinja globals built on mistune with media processing, emoji shortcodes, and XSS protection
- Document the `X-Response-Time` header and bottom-left render time indicator in README.md
- Update bot token pricing documentation to clarify fallback vs gateway cost headers
- Add `email_accounts` to soft-delete tables and `idx_users_role` composite index in database schema
- Implement `telegram_pairings` and `telegram_links` table creation with column migration and indexes
- Add `/profile/{username}/telegram` endpoint to docs API with request/unpair actions
- Register `TelegramService` in main.py lifespan and add `response_timing` middleware emitting `X-Response-Time` header
- Introduce `TelegramPairForm` model and `guard_public_host_sync` synchronous host validation function
|
||
|
|
95dca73291 |
feat: add DevPlace agent, auth token service, and form-data dependency modules
Add DevPlace agent configuration with dynamic OpenAPI schema fetching, implement access token issuance/resolution/revocation with configurable expiry, and create generic FastAPI dependency for JSON or form-encoded data validation against Pydantic models. Include comprehensive unit tests for form-data parsing and token lifecycle operations. |
||
|
|
9598a1b867 |
feat: add wildcard token support for allowed extensions and access token CLI commands
Introduce WILDCARD_TOKENS set in attachments.py to treat "*", ".*", "*.*" as wildcards that fall back to ALLOWED_UPLOAD_TYPES. Add cmd_token_issue and cmd_token_list CLI commands for issuing and listing DevPlace access tokens. Register access_tokens table in SOFT_DELETE_TABLES and initialize its columns and indexes in init_db. Replace Form() with Depends(json_or_form(...)) in admin backup, container, notification, settings, and user routers to support both JSON and form data. |
||
|
|
217210e02f |
feat: add featured/locked columns and auto-rotation logic to news pipeline
- Add `ai_grade`, `featured`, `featured_locked`, `landing_locked`, `author`, `article_published`, `image_url`, `has_unique_image` columns to news table - Extend `news_images` schema with `alt_text`, `phash`, `width`, `height`, `is_placeholder` columns - Create `idx_news_featured` index for efficient featured queries - Update admin toggle endpoints to set `featured_locked`/`landing_locked` when manually toggling - Propagate `featured` and `image_url` fields through landing page, news list, and detail page rendering - Update `get_featured_news` to return `featured` and `image_url` fields - Document in AGENTS.md the full zero-maintenance pipeline: image perceptual hashing, placeholder detection, AI grading on cleaned text, reliability gate, effective score computation, and post-loop landing rotation - Update README.md service description to reflect automatic image comparison and landing rotation capabilities - Clarify docs_api.py summaries that toggling featured/landing now locks articles from auto-rotation |