From 8df7572ed07d8363a784c044d97a69e2e6334bb2 Mon Sep 17 00:00:00 2001 From: anhduy-tech Date: Thu, 8 Jan 2026 10:42:08 +0700 Subject: [PATCH] changes --- api/__pycache__/settings.cpython-313.pyc | Bin 3451 -> 3451 bytes app/__pycache__/cleardata.cpython-313.pyc | Bin 3350 -> 3752 bytes app/__pycache__/models.cpython-313.pyc | Bin 134035 -> 134845 bytes app/__pycache__/views.cpython-313.pyc | Bin 73546 -> 74521 bytes app/cleardata.py | 3 +++ app/views.py | 17 +++++++++++++++++ 6 files changed, 20 insertions(+) diff --git a/api/__pycache__/settings.cpython-313.pyc b/api/__pycache__/settings.cpython-313.pyc index 03cc6ad9bc04b2fb763b4c376502d86163bc67c8..2274696fbe615fa24ba13c2a3f7643fe094321a9 100644 GIT binary patch delta 20 acmew@^;?SjGcPX}0}w>0#&6^<-~|9ewFP1T delta 20 acmew@^;?SjGcPX}0}$+MjoZjwzzYCJx&|iz diff --git a/app/__pycache__/cleardata.cpython-313.pyc b/app/__pycache__/cleardata.cpython-313.pyc index 8cbd56372c7b576afd5ce5d2d8dc126ec1810516..10b9a35c9b97acf8d39f0db87556206767dd1182 100644 GIT binary patch delta 399 zcmbOxwL+HnGcPX}0}yEO#Ai;Q$h)0s6Z^(v&a9JPGFmZeOqOGl1+gZ}vdMu(bU-4a z`XCLcAld*V!)QF&hE1N)1gx);O@mh&rYe*<$a3;JHcLjUNsJO=iVV>&f( zJeFwt#bWG?j0%&*IhI@SIOoUvm*=Gx6=!4?+!78cO3W)xOfJdH&x?01EhU9>Ki!3@h(@S!HSf delta 285 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 A;{X5v delta 4737 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 Zsl_7fdW#seFPnQkfdAaEZiH%k@o!4rq`CkA diff --git a/app/__pycache__/views.cpython-313.pyc b/app/__pycache__/views.cpython-313.pyc index a17f72631433b7310181c1747ecb94df73916b89..10f3acd6a70519d933e84103415cf05fe9db9451 100644 GIT binary patch delta 6093 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 R8v>Va&Ql*dpFv(0{u_%<3KReU delta 5277 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 z zs+?0KOIwV))KXtBhr`&2M69P^(v^IdIFn+hs9scKAmnQZtI1Q`GiQ{`^`Qp2g7XmP z7a2TqWklA)q-`yEnL^z0amz z)d^NQ%xXec&*7tpMS&--PQXU>!PV-tD>&gAB^tZ79TQ>vwcHegh>yTT5C?&4yYT0g z^?JFnB zZ0X3LCbcwE3%J<~c>xJ!z=0c+dtD%>Gb>u_*vb(6ALRkQu_vVnBoj4wJ_X>uX) zeCz!nksbmmx;&ZXo5c8?_N~cmsgz4iLyd1};l79;?@~JsJGaRmElp!XXNp&7QX~}d z1-xP07)-o&xam4@#iMYj-b?$%o5)ZI0WVg3-Zv73nGVXR9CuRmr`+g^X{^ZDifd`@ z|43uA4JP{E1-D1bGFizOl1BStifBF+jhq@odxRr=kkK3!5i&IsO%7|CKaTFnWCaX0YmYext(pgG+_C|+fvEHmDIyZ~um_#H?qbsu5MB_SK z&TD@;i)~;|aY1&FkSMQhWW0iax*va^;MMkK8=EDuzR^RuY>q|r!Xh$kYW4*id|^H? zTAas<*zo9_JXV&nii}SujWY-=(OvjoG1D2+lpK9Ok9pg4MCTDW3HlKXAQ(z8mS8-A zc!SpwMK4|6L_n`P@c`rWwoy%3baH(}yVB{d=6eX}YUZoSJYB5fk`k?tQ^QFWrNi$d rKPiEHUG&vnERXGM|D+fDIZJmlHj|yx>!h5oBtf4ENbQ>)>|W{LSnVK! diff --git a/app/cleardata.py b/app/cleardata.py index ca0a6245..36277ca5 100644 --- a/app/cleardata.py +++ b/app/cleardata.py @@ -29,6 +29,9 @@ def data_deletion(request): Contract.objects.all().delete() Product_Booked.objects.all().delete() Transaction_File.objects.all().delete() + Co_Ownership.objects.all().delete() + Transaction_Current.objects.all().delete() + Transaction_Discount.objects.all().delete() Payment_Schedule.objects.all().delete() Transaction_Detail.objects.all().delete() Transaction.objects.all().delete() diff --git a/app/views.py b/app/views.py index e26bbfe9..0b3ed68a 100644 --- a/app/views.py +++ b/app/views.py @@ -343,7 +343,24 @@ def data_list(request, name): need_serializer = True filter_list = Q() if filter_or != None: + field_map = {f.name: f for f in Model._meta.get_fields()} for key, value in ast.literal_eval(filter_or).items(): + lookup_parts = key.split('__') + base_field_name = lookup_parts[0] + + if base_field_name not in field_map: + continue + + field_obj = field_map[base_field_name] + + if field_obj.is_relation and len(lookup_parts) == 2 and lookup_parts[1] == 'icontains': + continue + + is_numeric = isinstance(field_obj, (aggregator.IntegerField, aggregator.DecimalField, aggregator.FloatField)) + is_date = isinstance(field_obj, (aggregator.DateField, aggregator.DateTimeField)) + if (is_numeric or is_date) and key.endswith('__icontains'): + continue + filter_list.add(Q(**{key: value}), Q.OR) if filter != None: