diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock index 40b7ba7..c0973a9 100644 --- a/backend/Pipfile.lock +++ b/backend/Pipfile.lock @@ -205,46 +205,46 @@ }, "cryptography": { "hashes": [ - "sha256:057723b79752a142efbc609e90b0dff27b0361ccbee3bd48312d70f5cdf53b78", - "sha256:05c2385b1f5c89a17df19900cfb1345115a77168f5ed44bdf6fd3de1ce5cc65b", - "sha256:08281de408e7eb71ba3cd5098709a356bfdf65eebd7ee7633c3610f0aa80d79b", - "sha256:10d68763892a7b19c22508ab57799c4423c7c8cd61d7eee4c5a6a55a46511949", - "sha256:1655d3a76e3dedb683c982a6c3a2cbfae2d08f47a48ec5a3d58db52b3d29ea6f", - "sha256:18f8084b7ca3ce1b8d38bdfe33c48116edf9a08b4d056ef4a96dceaa36d8d965", - "sha256:2cb03a944a1a412724d15a7c051d50e63a868031f26b6a312f2016965b661942", - "sha256:4142e20c29224cec63e9e32eb1e6014fb285fe39b7be66b3564ca978a3a8afe9", - "sha256:463096533acd5097f8751115bc600b0b64620c4aafcac10c6d0041e6e68f88fe", - "sha256:48caa55c528617fa6db1a9c3bf2e37ccb31b73e098ac2b71408d1f2db551dde4", - "sha256:49af56491473231159c98c2c26f1a8f3799a60e5cf0e872d00745b858ddac9d2", - "sha256:4cc31c66411e14dd70e2f384a9204a859dc25b05e1f303df0f5326691061b839", - "sha256:501de1296b2041dccf2115e3c7d4947430585601b251b140970ce255c5cfb985", - "sha256:59c0c8f043dd376bbd9d4f636223836aed50431af4c5a467ed9bf61520294627", - "sha256:614bca7c6ed0d8ad1dce683a6289afae1f880675b4090878a0136c3da16bc693", - "sha256:61a8b1bbddd9332917485b2453d1de49f142e6334ce1d97b7916d5a85d179c84", - "sha256:7429936146063bd1b2cfc54f0e04016b90ee9b1c908a7bed0800049cbace70eb", - "sha256:7c73968fbb7698a4c5d6160859db560d3aac160edde89c751edd5a8bc6560c88", - "sha256:80303ee6a02ef38c4253160446cbeb5c400c07e01d4ddbd4ff722a89b736d95a", - "sha256:965611880c3fa8e504b7458484c0697e00ae6e937279cd6734fdaa2bc954dc49", - "sha256:9a900036b42f7324df7c7ad9569eb92ba0b613cf699160dd9c2154b24fd02f8e", - "sha256:9cfd1399064b13043082c660ddd97a0358e41c8b0dc7b77c1243e013d305c344", - "sha256:a8ec324711596fbf21837d3a5db543937dd84597d364769b46e0102250023f77", - "sha256:a9727a21957d3327cf6b7eb5ffc9e4b663909a25fea158e3fcbc49d4cdd7881b", - "sha256:b19f4b28dd2ef2e6d600307fee656c00825a2980c4356a7080bd758d633c3a6f", - "sha256:b2de529027579e43b6dc1f805f467b102fb7d13c1e54c334f1403ee2b37d0059", - "sha256:c0c000c1a09f069632d8a9eb3b610ac029fcc682f1d69b758e625d6ee713f4ed", - "sha256:cdafb86eb673c3211accffbffdb3cdffa3aaafacd14819e0898d23696d18e4d3", - "sha256:d2a90ce2f0f5b695e4785ac07c19a58244092f3c85d57db6d8eb1a2b26d2aad6", - "sha256:d784d57b958ffd07e9e226d17272f9af0c41572557604ca7554214def32c26bf", - "sha256:d891942592789fa0ab71b502550bbadb12f540d7413d7d7c4cef4b02af0f5bc6", - "sha256:dc7693573f16535428183de8fd27f0ca1ca37a51baa0b41dc5ed7b3d68fe80e2", - "sha256:ddb8d01aa900b741d6b7cc585a97aff787175f160ab975e21f880e89d810781a", - "sha256:e328357b6bbf79928363dbf13f4635b7aac0306afb7e5ad24d21d0c5761c3253", - "sha256:e86c8d54cd19a13e9081898b3c24351683fd39d726ecf8e774aaa9d8d96f5f3a", - "sha256:e9e4bdcd70216b08801e267c0b563316b787f957a46e215249921f99288456f9", - "sha256:f169469d04a23282de9d0be349499cb6683b6ff1b68901210faacac9b0c24b7d" + "sha256:00094838ecc7c6594171e8c8a9166124c1197b074cfca23645cee573910d76bc", + "sha256:050ce5209d5072472971e6efbfc8ec5a8f9a841de5a4db0ebd9c2e392cb81972", + "sha256:232954730c362638544758a8160c4ee1b832dc011d2c41a306ad8f7cccc5bb0b", + "sha256:25286aacb947286620a31f78f2ed1a32cded7be5d8b729ba3fb2c988457639e4", + "sha256:2f8f8f0b73b885ddd7f3d8c2b2234a7d3ba49002b0223f58cfde1bedd9563c56", + "sha256:38deed72285c7ed699864f964a3f4cf11ab3fb38e8d39cfcd96710cd2b5bb716", + "sha256:3ad69eeb92a9de9421e1f6685e85a10fbcfb75c833b42cc9bc2ba9fb00da4710", + "sha256:5555365a50efe1f486eed6ac7062c33b97ccef409f5970a0b6f205a7cfab59c8", + "sha256:555e5e2d3a53b4fabeca32835878b2818b3f23966a4efb0d566689777c5a12c8", + "sha256:57a6500d459e8035e813bd8b51b671977fb149a8c95ed814989da682314d0782", + "sha256:5833bb4355cb377ebd880457663a972cd044e7f49585aee39245c0d592904578", + "sha256:71320fbefd05454ef2d457c481ba9a5b0e540f3753354fff6f780927c25d19b0", + "sha256:7573d9eebaeceeb55285205dbbb8753ac1e962af3d9640791d12b36864065e71", + "sha256:92d5f428c1a0439b2040435a1d6bc1b26ebf0af88b093c3628913dd464d13fa1", + "sha256:97787952246a77d77934d41b62fb1b6f3581d83f71b44796a4158d93b8f5c490", + "sha256:9bb5bf55dcb69f7067d80354d0a348368da907345a2c448b0babc4215ccd3497", + "sha256:9cc80ce69032ffa528b5e16d217fa4d8d4bb7d6ba8659c1b4d74a1b0f4235fca", + "sha256:9e4253ed8f5948a3589b3caee7ad9a5bf218ffd16869c516535325fece163dcc", + "sha256:9eda14f049d7f09c2e8fb411dda17dd6b16a3c76a1de5e249188a32aeb92de19", + "sha256:a2b56de3417fd5f48773ad8e91abaa700b678dc7fe1e0c757e1ae340779acf7b", + "sha256:af3f92b1dc25621f5fad065288a44ac790c5798e986a34d393ab27d2b27fcff9", + "sha256:c5edcb90da1843df85292ef3a313513766a78fbbb83f584a5a58fb001a5a9d57", + "sha256:c824c9281cb628015bfc3c59335163d4ca0540d49de4582d6c2637312907e4b1", + "sha256:c92519d242703b675ccefd0f0562eb45e74d438e001f8ab52d628e885751fb06", + "sha256:ca932e11218bcc9ef812aa497cdf669484870ecbcf2d99b765d6c27a86000942", + "sha256:cb6ab89421bc90e0422aca911c69044c2912fc3debb19bb3c1bfe28ee3dff6ab", + "sha256:cfd84777b4b6684955ce86156cfb5e08d75e80dc2585e10d69e47f014f0a5342", + "sha256:d377dde61c5d67eb4311eace661c3efda46c62113ff56bf05e2d679e02aebb5b", + "sha256:d54ae41e6bd70ea23707843021c778f151ca258081586f0cfa31d936ae43d1b2", + "sha256:dc10ec1e9f21f33420cc05214989544727e776286c1c16697178978327b95c9c", + "sha256:ec21313dd335c51d7877baf2972569f40a4291b76a0ce51391523ae358d05899", + "sha256:ec64ee375b5aaa354b2b273c921144a660a511f9df8785e6d1c942967106438e", + "sha256:ed43d396f42028c1f47b5fec012e9e12631266e3825e95c00e3cf94d472dac49", + "sha256:edd6d51869beb7f0d472e902ef231a9b7689508e83880ea16ca3311a00bf5ce7", + "sha256:f22af3c78abfbc7cbcdf2c55d23c3e022e1a462ee2481011d518c7fb9c9f3d65", + "sha256:fae1e637f527750811588e4582988932c222f8251f7b7ea93739acb624e1487f", + "sha256:fed5aaca1750e46db870874c9c273cd5182a9e9deb16f06f7bdffdb5c2bde4b9" ], "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", - "version": "==45.0.2" + "version": "==45.0.3" }, "django": { "hashes": [ diff --git a/backend/api/main/views.py b/backend/api/main/views.py index f9d5d09..0303855 100644 --- a/backend/api/main/views.py +++ b/backend/api/main/views.py @@ -37,7 +37,7 @@ class NewsView(APIView): class LatestRoutesView(APIView): @handle_exceptions def get(self, request): - """Получаем последние маршруты""" + """Получаем последние актуальные маршруты""" routes = [] owner_types = dict(owner_type_choices).keys() @@ -45,7 +45,10 @@ class LatestRoutesView(APIView): for owner_type in owner_types: routes.extend( HomePageRouteSerializer( - Route.objects.filter(owner_type=owner_type).order_by('-id')[:5], + Route.objects.filter( + owner_type=owner_type, + status="actual" + ).order_by('-id')[:5], many=True ).data ) diff --git a/backend/api/search/views.py b/backend/api/search/views.py index e8416ef..0e0e137 100644 --- a/backend/api/search/views.py +++ b/backend/api/search/views.py @@ -18,8 +18,10 @@ class SearchRouteListView(generics.ListAPIView): if not owner_type or owner_type not in valid_types: raise ValidationError("Invalid or missing owner_type. Must be either 'customer' or 'mover'") - # базовый фильтр по типу владельца - queryset = Route.objects.filter(owner_type=owner_type) + # базовый фильтр по типу владельца и актуальности + queryset = Route.objects.filter( + owner_type=owner_type, + status="actual") # фильтруем по времени в зависимости от типа if owner_type == 'mover': diff --git a/backend/requirements.txt b/backend/requirements.txt index 7f61626..e4010f3 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -2,9 +2,11 @@ asgiref==3.8.1 certifi==2025.4.26 cffi==1.17.1 charset-normalizer==3.4.2 -cryptography==45.0.2 +cryptography==45.0.3 Django==5.2.1 django-cors-headers==4.7.0 +django-stubs==5.2.0 +django-stubs-ext==5.2.0 djangorestframework==3.16.0 djangorestframework_simplejwt==5.5.0 idna==3.10 @@ -19,4 +21,6 @@ requests-pkcs12==1.25 six==1.17.0 sqlparse==0.5.3 transliterate==1.10.2 +types-PyYAML==6.0.12.20250516 +typing_extensions==4.13.2 urllib3==2.4.0 diff --git a/backend/routes/migrations/0007_route_created_at_route_status.py b/backend/routes/migrations/0007_route_created_at_route_status.py new file mode 100644 index 0000000..bf8cf26 --- /dev/null +++ b/backend/routes/migrations/0007_route_created_at_route_status.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.1 on 2025-05-26 07:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('routes', '0006_alter_city_id_alter_country_id_alter_leads_id_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='route', + name='created_at', + field=models.DateTimeField(auto_now_add=True, null=True), + ), + migrations.AddField( + model_name='route', + name='status', + field=models.CharField(choices=[('actual', 'Актуально'), ('canceled', 'Отменено'), ('completed', 'Завершено')], default='actual', max_length=20), + ), + ] diff --git a/backend/routes/models.py b/backend/routes/models.py index 54d0d66..c47de4b 100644 --- a/backend/routes/models.py +++ b/backend/routes/models.py @@ -105,6 +105,17 @@ class Route(models.Model): blank=True, null=True ) + status = models.CharField( + max_length=20, + choices=[ + ("actual", "Актуально"), + ("canceled", "Отменено"), + ("completed", "Завершено"), + ], + default="actual", + ) + created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True) + def __str__(self) -> str: from_city_name = self.from_city.name if self.from_city else 'Не указан' to_city_name = self.to_city.name if self.to_city else 'Не указан' diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 227ed89..9a06fe7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -5558,9 +5558,9 @@ } }, "node_modules/preact": { - "version": "10.26.6", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.6.tgz", - "integrity": "sha512-5SRRBinwpwkaD+OqlBDeITlRgvd8I8QlxHJw9AxSdMNV6O+LodN9nUyYGpSF7sadHjs6RzeFShMexC6DbtWr9g==", + "version": "10.26.7", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.7.tgz", + "integrity": "sha512-43xS+QYc1X1IPbw03faSgY6I6OYWcLrJRv3hU0+qMOfh/XCHcP0MX2CVjNARYR2cC/guu975sta4OcjlczxD7g==", "license": "MIT", "funding": { "type": "opencollective", @@ -6496,9 +6496,9 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", "dev": true, "license": "MIT", "dependencies": {