Commit Graph
626 Commits
Author SHA1 Message Date
junv 6b967e501f Update 2026-07-30 13:25:36 +10:00
junv d857eb58c5 Add bookmarks 2026-07-30 13:25:36 +10:00
github-actions[bot] d5fd6b5cac chore: update manifest image to 1.0.377 [skip ci] 2026-07-29 03:29:43 +00:00
junv 80d0ef5da0 Update style 2026-07-29 13:23:38 +10:00
github-actions[bot] 0e333f562c chore: update manifest image to 1.0.376 [skip ci] 2026-07-29 02:01:26 +00:00
junv b1acb24d81 Update UI 2026-07-29 11:57:12 +10:00
github-actions[bot] 361bd93788 chore: update manifest image to 1.0.375 [skip ci] 2026-07-28 11:51:33 +00:00
junv 68888e01d2 Clean up logs 2026-07-28 21:47:13 +10:00
github-actions[bot] 8014e4692e chore: update manifest image to 1.0.374 [skip ci] 2026-07-28 11:46:59 +00:00
junv e5da25bb01 Update 2026-07-28 21:42:58 +10:00
github-actions[bot] 21d4bd5f47 chore: update manifest image to 1.0.373 [skip ci] 2026-07-28 11:21:00 +00:00
junv e61da159ac Update 2026-07-28 21:15:48 +10:00
github-actions[bot] 30ef51eb03 chore: update manifest image to 1.0.372 [skip ci] 2026-07-24 06:45:58 +00:00
junv 0d89072f57 update style! 2026-07-24 16:40:28 +10:00
github-actions[bot] 66b529c748 chore: update manifest image to 1.0.371 [skip ci] 2026-07-21 07:08:06 +00:00
junv 11f41abab2 Update 2026-07-21 17:03:12 +10:00
github-actions[bot] 89adf5c0d8 chore: update manifest image to 1.0.369 [skip ci] 2026-07-19 12:24:06 +00:00
junv 48050291d9 Update style for post and link details 2026-07-19 22:17:56 +10:00
github-actions[bot] 960f0c321e chore: update manifest image to 1.0.368 [skip ci] 2026-07-19 12:08:47 +00:00
junv c1ea59d23c Update UI 2026-07-19 22:03:33 +10:00
github-actions[bot] ba7ec6b8c9 chore: update manifest image to 1.0.367 [skip ci] 2026-07-19 11:37:19 +00:00
junv c8bed8300d Update image ui 2026-07-19 21:33:06 +10:00
github-actions[bot] ea1b0822b1 chore: update manifest image to 1.0.366 [skip ci] 2026-07-18 12:56:14 +00:00
junv f804be25db Update logic 2026-07-18 22:48:59 +10:00
junv 972182f385 update! 2026-07-18 22:42:27 +10:00
junv 99f09f3d05 Fix issue of ui 2026-07-18 22:39:36 +10:00
github-actions[bot] 4ad041e91d chore: update manifest image to 1.0.365 [skip ci] 2026-07-18 12:22:46 +00:00
junv 5e1c316faf Use kimi 3 to redesign home page 2026-07-18 22:16:18 +10:00
github-actions[bot] c04da67b9b chore: update manifest image to 1.0.364 [skip ci] 2026-07-16 01:29:14 +00:00
junv 174b296c62 feat(links): log CONTENT_EDIT on text changes (no content persisted)
Previously, editing a custom link's text content created a spurious
URL_CHANGE row (fixed last commit) but no audit entry at all for the
actual content change. The product requirement: a change-log row SHOULD
be created so auditors see content was edited, but should NOT persist
the content itself.

LinkUpdateView now:

- Captures self.original_text in get_initial() alongside
  self.original_url.
- After super().form_valid() writes the new text, compares old vs new
  text. If different, creates a LinkChangeLog with
  change_type=CONTENT_EDIT and metadata={'changed': True} — no content
  payload. Applies to both LINK and CUSTOM link types.
- URL-change logging behaviour is unchanged.

Tests in TestCustomLinkEditUrlChangeLog now cover:
  - custom link text edit creates CONTENT_EDIT, no URL_CHANGE
  - custom link text unchanged creates no log
  - regular link text change creates CONTENT_EDIT
  - regular link URL change still logs URL_CHANGE
2026-07-16 11:24:04 +10:00
github-actions[bot] cb620b6b4e chore: update manifest image to 1.0.363 [skip ci] 2026-07-16 01:15:52 +00:00
junv f7ac32cf4c fix(links): custom link edits spuriously logged URL changes
When editing a CUSTOM link's text content, the ViewUpdateView's
URL-change check was comparing the captured original_url (e.g.
'/custom/mynote') against form.cleaned_data['original_url'], which
for custom links is blank because the original_url input is hidden in
link_form.html and not submitted. They never matched, so every edit
produced a spurious LinkChangeLog 'URL changed' row.

Use the recomputed /custom/{alias} value (already set on
form.instance.original_url) for custom links, and only the submitted
form value for regular links. So the log now fires only when:

- a regular link's URL actually changes, or
- a custom link's alias changes (which derives a new /custom/{alias}).

Add TestCustomLinkEditUrlChangeLog covering:
  - custom link text-edit produces no URL-change log
  - regular link edit leaving URL unchanged produces no log
  - regular link URL change logs once with old/new URL
  - custom link alias change logs once with old/new derived URL
2026-07-16 11:11:25 +10:00
github-actions[bot] 82238cb7e7 chore: update manifest image to 1.0.362 [skip ci] 2026-07-16 00:34:19 +00:00
junv 74b2e72844 chore: update dependencies to clear security advisories
Python (pip-audit: 0 vulnerabilities):
  - Django 5.2.12 -> >=5.2.16  (CVEs PYSEC-2026-48..55, 197..201, 2090..2092)
  - sqlparse 0.5.1 -> >=0.5.4  (GHSA-27jp-wm6q-gp25)
  - pillow 12.2.0 -> >=12.3.0  (PYSEC-2026-2253..2257, 3451..3453)
  - transitive upgrades: idna 3.10 -> 3.15, setuptools 78.1.1 -> 83.0.0
  - refreshed uv.lock via `uv sync --upgrade`

npm (`npm audit`: 0 vulnerabilities):
  - brace-expansion, glob, picomatch bumped via `npm audit fix --legacy-peer-deps`
    (brace-expansion ReDoS, glob CLI cmd injection, picomatch ReDoS/injection)

Verified: 67/67 tests pass, Tailwind build clean, pip-audit and npm
audit both report 0 vulnerabilities.
2026-07-16 10:29:15 +10:00
github-actions[bot] 860a711f01 chore: update manifest image to 1.0.360 [skip ci] 2026-07-16 00:19:30 +00:00
junvandGitHub fbe4b77749 Merge pull request #100 from wahyd4/dependabot/uv/soupsieve-2.8.4
build(deps): bump soupsieve from 2.6 to 2.8.4
2026-07-16 10:15:47 +10:00
junvandGitHub d6f93c312c Merge pull request #87 from wahyd4/dependabot/uv/urllib3-2.7.0
build(deps): bump urllib3 from 2.6.3 to 2.7.0
2026-07-16 10:15:29 +10:00
junvandGitHub ea5aefac97 Merge pull request #96 from wahyd4/dependabot/uv/cryptography-48.0.1
build(deps): bump cryptography from 46.0.5 to 48.0.1
2026-07-16 10:14:57 +10:00
junvandGitHub 3a1d80bb86 Merge pull request #98 from wahyd4/dependabot/npm_and_yarn/multi-c4a89f1b01
build(deps-dev): bump vite and @vitejs/plugin-react
2026-07-16 10:14:05 +10:00
github-actions[bot] d356c33f8b chore: update manifest image to 1.0.355 [skip ci] 2026-07-16 00:14:00 +00:00
junvandGitHub 2980138ae0 Merge pull request #99 from wahyd4/dependabot/npm_and_yarn/echarts-6.1.0
build(deps): bump echarts from 5.6.0 to 6.1.0
2026-07-16 10:13:22 +10:00
junv bf3e2e80cf feat(links): auto-create non-existent tags on link create, lowercase all
Select2 submits raw text as the value for new tags typed into the tag
box (tags: true + createTag in link_form.html). The previous
ModelMultipleChoiceField silently dropped those values because they
were not PKs of existing tags, so new tags were never persisted.

Add TagInputField, a tolerant ModelMultipleChoiceField subclass:
  - existing tag PKs resolve as before
  - raw text is treated as a new (or case-insensitive-existing) tag
  - names are stripped and lowercased before get_or_create so the tag
    namespace stays consistent and case-insensitive duplicates are
    avoided. The Tag.save() hook still derives the slug.

LinkForm now uses TagInputField for its tags field, so both
LinkCreateView and LinkUpdateView pick up the new behaviour. The
Select2 createTag callback in link_form.html now lowercases the term
so users see immediately what will be stored.

Add 7 regression tests in TestLinkTagAutoCreate covering: new tag
created + lowercased; multiple new tags; existing tag reused (no
duplicate); mixed PK + new-text submission; no tags submitted; empty
or whitespace-only submission ignored; whitespace stripped.
2026-07-16 10:10:07 +10:00
github-actions[bot] e625ed13eb chore: update manifest image to 1.0.354 [skip ci] 2026-07-15 23:55:33 +00:00
junv 2625ef10b4 test(pricemon): pin telegram notification contract
Add integration tests covering the price-drop → Telegram alert flow:

- Sends Telegram MarkdownV2 message to global SiteSettings chat_id when
  detected price <= watcher.alert_price_threshold.
- No alert when global creds missing.
- No alert when price above threshold.
- No alert when threshold unset on watcher.
- Non-recurring watcher with an undismissed alert is not re-notified.
- Telegram API failure does not break the check (snapshot + alert row
  still persist, last_price updates).
2026-07-16 09:50:37 +10:00
github-actions[bot] b24d59a9ce chore: update manifest image to 1.0.353 [skip ci] 2026-07-15 23:41:22 +00:00
junv 4a5f0f63ee fix(pricemon): load i18n in _alerts partial and pass alerts to include
AlertsPartialView (htmx-polled every 30s from the dashboard) returned
500 because _alerts.html used {% trans %} without {% load i18n %}.
Added the load tag so the partial renders correctly.

The dashboard's inline {% include 'pricemon/_alerts.html' %} also
relied on an undefined 'alerts' context var (DashboardView sets
'active_alerts'), so the alerts panel rendered empty even when alerts
existed. Pass alerts=active_alerts explicitly via the include.

Add regression tests covering both the dashboard render with an alert
and the alerts partial endpoint.
2026-07-16 09:34:15 +10:00
github-actions[bot] d62a6cb714 chore: update manifest image to 1.0.352 [skip ci] 2026-07-15 05:56:32 +00:00
junv 3966740a4c Update 2026-07-15 15:51:37 +10:00
junv d26f332ef9 update video player! 2026-07-15 15:41:04 +10:00
junv 93f1a1ccae ui update 2026-07-15 15:37:19 +10:00