feat(import_list_if): migracja z long_running na django-liveops#616
Open
mpasternak wants to merge 4 commits into
Open
feat(import_list_if): migracja z long_running na django-liveops#616mpasternak wants to merge 4 commits into
mpasternak wants to merge 4 commits into
Conversation
…racja) Faza 1 migracji import_list_if z legacy long_running na django-liveops 0.4: - ImportListIf dziedziczy wprost po liveops.models.LiveOperation; wchłania z retirowanego import_common.ImportOperation pola/logikę (plik_xls, get_xls_import_file, get_validation_form_class, ignore_bad_rows). - perform() przepisane na run(self, p): postęp/anulowanie przez obiekt Progress; ciało owinięte w transaction.atomic() dla parytetu z legacy task_perform (all-or-nothing) — OperationCancelled cofa zapisane wiersze. p.result(...) poza blokiem (defer push przez transaction.on_commit). - on_reset() -> on_restart() (hook liveops RestartView). - Skasowany abstrakcyjny import_common.models.ImportOperation (jedyny użytkownik); ImportRowMixin zostaje (używa go import_pracownikow). - Nowa migracja delta 0005_liveops (pola liveops, usunięcie last_updated_on, owner related_name="+", ordering -created_on) — mirror import_pracownikow 0010, bez stan/RunPython. - Testy modelu przepisane na liveops.testing.MockProgress; nowy test anulowania (raises OperationCancelled + 0 wierszy) i finalizacji operacji. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Faza 2 migracji import_list_if — domyka cutover (dopiero tu apka działa): - views.py przepisane na liveops: ListaImportowView (owner-scoped ListView), NowyImportView(CreateLiveOperationView), ImportListIfResultsView (owner-scoped ListView z paginate_by=25 i object=parent_object). Bramka grupy przez braces GroupRequiredMixin (GR_WPROWADZANIE_DANYCH z bpp.const, nie literał) — liveops nie ma REQUIRED_GROUP w BPP. - urls.py: zostają index/new/importlistif-results; usunięte router, detale i regen (restart) — strona live idzie przez centralny liveops:live, restart przez centralny liveops:restart. - Szablony: nowy host import_list_if.html (hx-headers CSRF + live_operation), nowy import_list_if_result.html (panel wyniku + link do wyników). Naprawiony importlistif_list.html (link → get_absolute_url, breadcrumb import_list_if zamiast import_pracownikow). Oczyszczony importlistifrow_list.html (bez include long_running/operation_details). Usunięty martwy load render_table i skasowany importlistif_detail.html (zastąpiony host template). - get_details_set() sortuje po id (kolejność w pliku) → deterministyczna paginacja tabeli wyników. - test_views.py: create POST → redirect na liveops:live + 4 wiersze (eager), bramka grupy (302 redirect_to_login + brak side-effectu, NIE 403), owner-scoping tabeli wyników (cudzy import → Http404). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Faza 3: sprzątanie + newsfragment. Potwierdzone: poza historycznymi komentarzami i nietykalną migracją 0001, import_list_if/import_common nie odwołują się już do long_running/ImportOperation; sama aplikacja long_running zostaje (używa jej 10+ innych modułów). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…on-gate Review PR #616: ImportListIfResultsView.parent_object używał .get(pk=...), co dla nieistniejącego pk dawało 500 zamiast 404 — parytet z get_object_or_404 we wzorcu import_pracownikow. Dodany test regresji 404 oraz test anon→302 (nie 500) na gejtowanym liveops CreateView (potwierdza brak kolizji handle_no_permission, którą ma raport_slotow). Poprawiony mylący komentarz o transaction.on_commit w run(). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Co się zmienia
Migracja aplikacji
import_list_ifz legacy stackulong_runningnadjango-liveops 0.4 — postęp importu na żywo przez WebSocket, spójny z
import_punktacji_zrodel/import_pracownikow. Wzorzec 1:1 na już-scalonymimport_punktacji_zrodel.ImportListIfdziedziczy wprost poliveops.models.LiveOperation.import_common.models.ImportOperation— był to jegojedyny użytkownik; pola/logika (
plik_xls,get_xls_import_file,get_validation_form_class,ignore_bad_rows) wchłonięte doImportListIf.ImportRowMixinzostaje (używa goimport_pracownikow). Sama aplikacjalong_runningzostaje (10+ innych modułów na niej stoi).perform()→run(self, p): postęp/anulowanie przez obiektProgress.Ciało owinięte w
transaction.atomic()dla parytetu z legacytask_perform(all-or-nothing) —
OperationCancelled/XLSParseErrorcofa zapisane wiersze;p.result(...)poza blokiem (defer push przeztransaction.on_commit).on_reset()→on_restart()(hookRestartView).ListView(lista),CreateLiveOperationView(nowy import), owner-scoped
ResultsView(paginate_by=25,object=parent_object). Bramka grupy przez bracesGroupRequiredMixin(
GR_WPROWADZANIE_DANYCH) — liveops nie maREQUIRED_GROUPw BPP.index/new/importlistif-results; usunięterouter/detale/regen(strona live → centralnyliveops:live, restart →centralny
liveops:restart).import_list_if.html(wrapperhx-headersz CSRF wokół{% live_operation object %}), nowyimport_list_if_result.html(panelwyniku). Naprawiony
importlistif_list.html(link →get_absolute_url,breadcrumb
import_list_if:indexzamiast błędnegoimport_pracownikow:index).Oczyszczony
importlistifrow_list.html(bezlong_running/operation_details),usunięty martwy
{% load render_table %}i skasowanyimportlistif_detail.html.0005_liveops.py(pola liveops, usunięcielast_updated_on,owner related_name="+",ordering=-created_on).Fazy
MockProgress).Testy (lokalnie, testcontainers PG/Redis)
src/import_list_if/— 10 passed (model: run/finalize/anulowanie zrollbackiem/on_restart; widoki: create→redirect
liveops:live+4 wiersze,bramka grupy 302 redirect_to_login bez side-effectu, owner-scoping→Http404).
src/import_common/+src/import_punktacji_zrodel/— 406 passed(bezpieczeństwo retire
ImportOperation).src/import_pracownikow/— 658 passed (drugi konsumentImportRowMixin).manage.py check— bez uwag;pre-commitna zmienionych plikach — zielono.makemigrations --check --dry-run import_list_if import_pracownikow import_punktacji_zrodel— No changes detected (brak driftu).Baseline
make baseline-updateprzy merge (nowa migracjaschematu
0005_liveops). Świadomie NIE odświeżany w tym branchu (reguła:baseline raz, przy scalaniu do
dev— równoległe branche = nierozwiązywalnykonflikt na jednym pliku).
🤖 Generated with Claude Code