From 0d68c75fef702baa3094b0c4c196c09aa24e681f Mon Sep 17 00:00:00 2001 From: Victor Andersson Date: Sun, 9 Nov 2025 14:05:28 +0100 Subject: [PATCH] Log project changes during approvals --- claims/models.py | 2 +- claims/tests.py | 5 ++- claims/views.py | 6 ++++ locale/en/LC_MESSAGES/django.mo | Bin 14368 -> 15091 bytes locale/en/LC_MESSAGES/django.po | 54 ++++++++++++++++++-------------- 5 files changed, 41 insertions(+), 26 deletions(-) diff --git a/claims/models.py b/claims/models.py index f08af18..9f97cbd 100644 --- a/claims/models.py +++ b/claims/models.py @@ -122,6 +122,7 @@ class ClaimLog(models.Model): CREATED = "created", _("Submitted") STATUS_CHANGED = "status_changed", _("Status changed") MARKED_PAID = "marked_paid", _("Marked as paid") + PROJECT_CHANGED = "project_changed", _("Project changed") claim = models.ForeignKey(Claim, related_name="logs", on_delete=models.CASCADE) action = models.CharField(max_length=32, choices=Action.choices) @@ -147,4 +148,3 @@ class ClaimLog(models.Model): def __str__(self): return f"{self.get_action_display()} ({self.created_at:%Y-%m-%d %H:%M})" - diff --git a/claims/tests.py b/claims/tests.py index 7fc67ac..5dbd6c0 100644 --- a/claims/tests.py +++ b/claims/tests.py @@ -9,7 +9,7 @@ from django.urls import reverse from django.utils import timezone from .forms import ClaimDecisionForm -from .models import Claim, Project +from .models import Claim, ClaimLog, Project from .validators import validate_receipt_file from .views import SubmitClaimView @@ -144,3 +144,6 @@ class DashboardViewTests(TestCase): self.assertEqual(response.status_code, 200) claim.refresh_from_db() self.assertEqual(claim.project, project_new) + self.assertTrue( + claim.logs.filter(action=ClaimLog.Action.PROJECT_CHANGED, note__icontains="Project updated").exists() + ) diff --git a/claims/views.py b/claims/views.py index e556eca..363e211 100644 --- a/claims/views.py +++ b/claims/views.py @@ -221,6 +221,12 @@ class ClaimDashboardView(LoginRequiredMixin, PermissionRequiredMixin, ListView): to_status=claim.status, note=decision_note, ) + if project_changed: + claim.add_log( + action=ClaimLog.Action.PROJECT_CHANGED, + performed_by=request.user, + note=_("Project updated during decision."), + ) return redirect(request.get_full_path()) def _handle_payment(self, request): diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index 1f2c5a61bed6f9c98d4f6b2e568dc84280c95d9f..b56925e0ed708df1b6c124a9f5c69ebb7a967884 100644 GIT binary patch delta 4621 zcma*peQ;FO8OQMx2rmL5l0X8%$R#1~A-n`A#)!NX1Qm#gKm_Scb_p??P2Am(Mv60|)yj6l03!$Y+J5$nsDE+*n4Ov0sjC%V=H=rbm2-lQ;y3-g9~4J$B{`WhUF8?g^=!F=3~Bk&~h z&z$3Da)L3JkTIDgMl}O7Q3G7XPk(I06l_Kfct`Af)R?^#@;I>%`Db3_$HCW8H-3bg zQNnO7Gzy>tlG{tRm7zenBoSJXh>AIbXb z#(vyImd$8X!wIMx%drL*+w-SU?O(uhyo6uC^b9X!i?N9MN@O3K%}5f=PSlzoL}ltY zYIFW5gZwK4J)DrecpqLsKaLsgb-WpQmf3}quoJbWe?$%F3Toh*wmMF-rr=iU>8SQk zqn7SCuEXvqg)$0R%T?ybJ_Z?cRgzUO+g(cI9`KPYX<5q7>fm1gv!h^)cI!AgIjSe?m_LDk5M0-WEyMj zGf{hC3hFs!ct75Q+JEK%g;q}V;0!Eh9ke?)pfa-?m6;Cf348sQsF}WoEWddJ@5Sq= zC0LN{4P*^!=JmJ>BdCESj$<-B-=tB{8U;{m)P$O0D{3irVlnn0t6|h~(%kw77r_n&=ZX0WhK-mJ1dhI&8;YCxw@GdhFn@Kx-K zZ=iPlTd3FYebhkn^O+eg!+!WI>b?`mYMUNgzm!k@`*7kdPH?Yz8?}jsvf%1C6FyJ1`NSLkCZwCiFYx%{FhN?n@{l|4PZgB5zGnP!Af1 zWXF`^0IWo^W~y)^Zo?JWjT&eQ)0Sg!Ar_-HV>8}?J5ZT8hkD-2_WH#rg$FqCF4C8o zJ>L631W^xeL5;K(`Ba!~s1zQt=U>G6)Gwem)o?b9Hf=5r!fB|bn}yoc%TbvNp!$h! zq@V}w!y$MClkgu;jo@4un$*G08UMs3b?TOW-Bsb{0Uw8i)! z*2K=U{=F3VLuW4FRJ@GpFk`Z30cy>rqc+uS)RN4{7F>kMcn$~SMGW9&oPrh1LT}d= z)a!c`HPExzpXZz3P`DXiMRoKJI(QA$a3sBG01ghrLL83esF_uu+Et=bT!k7)1E$~x zTYm~msJG)vd?cNd`^P=VS5)i@jgU6$tbZ)$Rpc zgTJ=t$KPhmUDV4^6Z$Hu{gbHn?Z`LC9EwuNr|>fBQ+y58a0E}&moW=9vm8`vOR)ya zZ2ch4q~3|@_zEVV23Z#tYTfnv>2s^KeU>;x==eU75i5E7 zxnP|4>^r0DI%LVv6v5Q!2&xvhBlsD#+V}mWtx9Uy!E>TJBAPy5g zB1n9XI7p-rj}l)a;zuckY~q>t3EW4t+WH95#J(5rPP(MFskl8LVnI!cJgVkQ3nul$drvXK}}3?n8HI_~m_ z{g&}Nm3Ww#O{^h)O!OhTi9y5)B7QtbVL7puc!D@h+(zj5A+a!4;=7>rf6`XIjbn*4 zTiF;G7_`PBipw!R?j)VrZNf5`Ru!%n!N-l_6O+<>p-Ga3}r zqNc%D*LyhlnQdqi^w+t*lD5X2;;wPYYy0M^&tPq^CcMrKM*Ja4PVeE6Q%l8h>ms%5 zHGq<~*8H@#{VBV0n<9bU!!=%;kl*J9wCngo#0)8;*Q3CfAAITX*BG z|DKrJl{O+{Kv8wXsb(xSexF$qYIxXBy{XaXM*Kd<*AyF{&tF{|u5AdGbQRt*|0efF zzM5T|GoM4L(XIVdB0hc9ZEOrRtoMITi;!Orr$tv|PD)>AiQ7`|4@Mlu<_joIwP7dN z5OMrLw<m7fso(zwRqXNF`TYp1wTzFTpSFvIPn2^_k^8lvQp*$pBuW) R7e3y<;Qvp^+)01x{~weiJ@Wtn delta 3923 zcmY+`32;qU0LJkXA(0>?LWGJXB#}tOzDvZugjh;!p_YVNBVsA~h$RROLRzY%Rkhak zqB`1|YDbmUXfbr!QPXM4n6b2@wYD?;fA^kD^^7mSbI*J4p7p-xVQ$GB&(9$hw;IZE z@)9{z$(RS&r3!y2PlAl8iBC~Y)v6m)8^bXG6R{$8!fKd=NtkNgfRnkth=JIuhWoy* zSl<|r89=2nFHFMzAbFUM1;|HD89FOs zUk~8!jcE@-me{mKO=uYEK9f=RDL@aCGh3+W279pqo<#0tu46dfL!Ax(Fn4L2pk~}2 z^|_v?fec4|ZW^)(#)Eoa5vrdO%tEhiuUCit*9T(iFiY%)?Qt<`sk|76pCRYc+(E`- z9-#KtkI`wRLQsb=9G$JQM&nT06LAWzK;8Ea^3OaBXZ>4JsaDtB%Ouo*2BAhi8Fk}q z>wL`TdNFG6ee1bf7lKo{u8*B?HEIjaU?VI;fAnJ+HQ*prKeaqm^g^6%Xl?C>TEg+D z8Rej6yaaVd)>yZrw%`zIk3Yo(yohu0Z&Zh~ISA1>A6Y!J6LlZYNh<2-JZeTaPy@Pa zum7~K`*IR>qcCd(>itboH)>Aylu>OVq^lt(g7TaS& zFclL}d$R;JkjmtZ08MGd4q8~if%Lv7J6)E4bS&Ab$~6{oQ|-b3bS>PEUN-VrO% zze%N{j?z#|pMf(m6LsUOH~?>;ZrrSiFF+WVWR8{fxg_}sQX;!S!AD#f@< zpNxK74?%5NI%=h|V_1JZUQ21vO!AN?%M_zNa11r$k5Nnh1*+q#NMGhx)QSai!V)nA z)3FC?U^}e)u|L-zq0X33EGvkiv8;b3Dnn@qz;x6bCgKRp#X$TP)zNj-z-}T>mbrym zDc?A^JretH9g7<9T+|_4iGjEUwMDy7hwy}licaSR)Qx^Zb@UuH179{uXQKwH!wA&- zJKOews1+M+uXC|7*DFvfy53rX>aY~Gg6FX+dVZjy8UKc}@d@e;Q{&zC1=ySGb=Vre zM-8x2g8k-1T_>R)*FG488Mb{U>JaAI>qV#mE=SIY$E>3=hK95Dg+?v-lHocQ+hPg^ z;X-RZYO9J-XQu?UC3|oY9>VGv#et}T?QjOBU>iJwJi(?6BlP_HwRC6D6m_F`tbuK8 zdoNUnsThnSQA;@uHIvs-E0B*>u@Keq4%Eu-v)7*>b2R606h1FKQs4qdK^N8t66DKyITZ@H=Y79^2Rb*f+I@StC&QX^NgGDlMq!5RI@e zWMfUP7vo4QM0I!@b>oMq=ePpvshQV94LB0JV@uQ)=HO^7z%F)heSp9%Ow3sg7#lO3de~~WeCxLQpsS#ea&hTO*9kjx5^Q+j%e0X$$qk#sLUjX zoErbjMLm8h+sJUTT^F`^dQh21GRQu{nQ=--{%WS>Wjz&b!P{g5d5i2IOUN+NjHncl zBB#bd#@V($3$=oS$VA(=NzZ?I*-NEY`Na#ap|0<0&Ya16pQF*s>G3jBvBWX4@e2o7u_VHGKw_#Z~ji3^Xui-j5$a}KN@vy!&2)O472rY>`!zb zJz}-V3NnE-B(=yfqB7sb`Hrbd{SD&${`aL4Nv4x`iOMRHLi|Z{qB7Uze}8ki8cXs? z8p$D1L}e)9iFE$+qU#`%M0S$p?Rw@E@!={sH`O2$TU*4E4sP2Lyb(|qARhXML*Uo^cIKS p_3@sl9p>--r+)VUZ%K5pZ_(x0t=\n" "Language-Team: English\n" @@ -160,6 +160,10 @@ msgstr "Status changed" msgid "Marked as paid" msgstr "Marked as paid" +#: claims/models.py:125 +msgid "Project changed" +msgstr "Project changed" + #: claims/templates/claims/base.html:8 msgid "Claims" msgstr "Claims" @@ -840,7 +844,7 @@ msgstr "" msgid "Kunde inte spara utläggen. Kontrollera formuläret." msgstr "" -#: claims/views.py:182 claims/views.py:231 +#: claims/views.py:182 claims/views.py:237 #, fuzzy #| msgid "Ge behörighet att besluta utlägg" msgid "Du har inte behörighet att uppdatera utlägg." @@ -856,71 +860,73 @@ msgstr "The claim is marked as paid. Decision/comments are locked." #: claims/views.py:208 #, python-format msgid "%(claim)s markerades som godkänd." -msgstr "" +msgstr "%(claim)s was marked as approved." #: claims/views.py:211 -#, fuzzy, python-format -#| msgid "Ej markerad som betald" +#, python-format msgid "%(claim)s markerades som nekad." -msgstr "Not marked as paid" +msgstr "%(claim)s was marked as rejected." #: claims/views.py:228 +msgid "Project updated during decision." +msgstr "Project updated during decision." + +#: claims/views.py:234 msgid "Betalningshantering är inte aktiverad." -msgstr "" +msgstr "Payment handling is not enabled." -#: claims/views.py:236 +#: claims/views.py:242 msgid "Endast godkända utlägg kan markeras som betalda." -msgstr "" +msgstr "Only approved claims can be marked as paid." -#: claims/views.py:239 +#: claims/views.py:245 msgid "Detta utlägg är redan markerat som betalt." -msgstr "" +msgstr "This claim is already marked as paid." -#: claims/views.py:250 -#, fuzzy, python-format -#| msgid "Ej markerad som betald" +#: claims/views.py:256 +#, python-format msgid "%(claim)s markerades som betald." -msgstr "Not marked as paid" +msgstr "%(claim)s was marked as paid." -#: claims/views.py:316 +#: claims/views.py:322 msgid "Du saknar behörighet för åtgärden." msgstr "" -#: claims/views.py:363 +#: claims/views.py:369 #, python-format msgid "Användaren %(user)s skapades." msgstr "" -#: claims/views.py:374 +#: claims/views.py:380 msgid "Du kan inte ta bort din egen staff-status." msgstr "" -#: claims/views.py:380 +#: claims/views.py:386 #, python-format msgid "Behörigheter uppdaterades för %(user)s." msgstr "" -#: claims/views.py:382 +#: claims/views.py:388 #, fuzzy #| msgid "Justera behörigheter" msgid "Kunde inte uppdatera behörigheter." msgstr "Adjust permissions" -#: claims/views.py:392 +#: claims/views.py:398 msgid "Du kan inte ta bort ditt eget konto." msgstr "" -#: claims/views.py:394 +#: claims/views.py:400 msgid "Du kan inte ta bort en superuser via detta gränssnitt." msgstr "" -#: claims/views.py:397 +#: claims/views.py:403 #, fuzzy #| msgid "Användare" msgid "Användaren togs bort." msgstr "Users" -#: claims/views.py:400 +#: claims/views.py:406 msgid "Okänd åtgärd." msgstr ""