diff --git a/.github/actions/setup/action.yaml b/.github/actions/setup/action.yaml index 1a954349ef..62f1331b0f 100644 --- a/.github/actions/setup/action.yaml +++ b/.github/actions/setup/action.yaml @@ -15,6 +15,10 @@ inputs: required: false description: 'Install the InvenTree requirements?' default: 'false' + dev-install: + required: false + description: 'Install the InvenTree development requirements?' + default: 'false' update: required: false description: 'Should a full update cycle be run?' @@ -72,6 +76,10 @@ runs: sudo apt-get install ${{ inputs.apt-dependency }} # Invoke commands + - name: Install dev requirements + if: ${{ inputs.dev-install == 'true' ||inputs.install == 'true' }} + shell: bash + run: pip install -r requirements-dev.txt - name: Run invoke install if: ${{ inputs.install == 'true' }} shell: bash diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index 604e7d0369..860bb8f7b6 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -34,7 +34,7 @@ jobs: - name: Enviroment Setup uses: ./.github/actions/setup with: - install: true + dev-install: true - name: Run flake8 run: flake8 InvenTree --extend-ignore=D @@ -119,6 +119,7 @@ jobs: uses: ./.github/actions/setup with: apt-dependency: gettext poppler-utils + dev-install: true update: true - name: Download Python Code For `${{ env.wrapper_name }}` run: git clone --depth 1 https://github.com/inventree/${{ env.wrapper_name }} ./${{ env.wrapper_name }} @@ -168,6 +169,7 @@ jobs: uses: ./.github/actions/setup with: apt-dependency: gettext poppler-utils + dev-install: true update: true - name: Coverage Tests run: invoke coverage diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 36687da4e8..bd66e6986c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -28,3 +28,14 @@ repos: rev: '5.10.1' hooks: - id: isort +- repo: https://github.com/jazzband/pip-tools + rev: 6.6.2 + hooks: + - id: pip-compile + name: pip-compile requirements-dev.in + args: [--generate-hashes, requirements-dev.in, -o, requirements-dev.txt] + files: ^requirements-dev\.(in|txt)$ + - id: pip-compile + name: pip-compile requirements.txt + args: [requirements.in, -o, requirements.txt] + files: ^requirements\.(in|txt)$ diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 5e43d8d5de..5b72062c13 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -33,6 +33,7 @@ class InvenTreeMoneySerializer(MoneyField): """Overrite default values.""" kwargs["max_digits"] = kwargs.get("max_digits", 19) kwargs["decimal_places"] = kwargs.get("decimal_places", 4) + kwargs["required"] = kwargs.get("required", False) super().__init__(*args, **kwargs) diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index d11f0920a0..ea0b235635 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -253,7 +253,6 @@ INSTALLED_APPS = [ 'django_cleanup.apps.CleanupConfig', # Automatically delete orphaned MEDIA files 'mptt', # Modified Preorder Tree Traversal 'markdownify', # Markdown template rendering - 'django_admin_shell', # Python shell for the admin interface 'djmoney', # django-money integration 'djmoney.contrib.exchange', # django-money exchange rates 'error_report', # Error reporting in the admin interface diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 3f32152a5f..55e18e73c7 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -152,7 +152,6 @@ frontendpatterns = [ # admin sites re_path(f'^{settings.INVENTREE_ADMIN_URL}/error_log/', include('error_report.urls')), - re_path(f'^{settings.INVENTREE_ADMIN_URL}/shell/', include('django_admin_shell.urls')), re_path(f'^{settings.INVENTREE_ADMIN_URL}/', admin.site.urls, name='inventree-admin'), # DB user sessions diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py index 746a1c58e9..3102850d4e 100644 --- a/InvenTree/build/api.py +++ b/InvenTree/build/api.py @@ -420,7 +420,7 @@ class BuildItemList(ListCreateAPI): DjangoFilterBackend, ] - filter_fields = [ + filterset_fields = [ 'build', 'stock_item', 'bom_item', @@ -438,7 +438,7 @@ class BuildAttachmentList(AttachmentMixin, ListCreateDestroyAPIView): DjangoFilterBackend, ] - filter_fields = [ + filterset_fields = [ 'build', ] diff --git a/InvenTree/common/api.py b/InvenTree/common/api.py index 9938b89072..3f5a1ad3a4 100644 --- a/InvenTree/common/api.py +++ b/InvenTree/common/api.py @@ -289,7 +289,7 @@ class NotificationList(BulkDeleteMixin, ListAPI): 'message', ] - filter_fields = [ + filterset_fields = [ 'category', 'read', ] diff --git a/InvenTree/company/api.py b/InvenTree/company/api.py index 6abc432c61..d7f1f1ccdb 100644 --- a/InvenTree/company/api.py +++ b/InvenTree/company/api.py @@ -46,7 +46,7 @@ class CompanyList(ListCreateAPI): filters.OrderingFilter, ] - filter_fields = [ + filterset_fields = [ 'is_customer', 'is_manufacturer', 'is_supplier', @@ -169,7 +169,7 @@ class ManufacturerPartAttachmentList(AttachmentMixin, ListCreateDestroyAPIView): DjangoFilterBackend, ] - filter_fields = [ + filterset_fields = [ 'manufacturer_part', ] @@ -233,7 +233,7 @@ class ManufacturerPartParameterList(ListCreateDestroyAPIView): filters.OrderingFilter, ] - filter_fields = [ + filterset_fields = [ 'name', 'value', 'units', @@ -333,7 +333,7 @@ class SupplierPartList(ListCreateDestroyAPIView): filters.OrderingFilter, ] - filter_fields = [ + filterset_fields = [ ] search_fields = [ @@ -377,7 +377,7 @@ class SupplierPriceBreakList(ListCreateAPI): DjangoFilterBackend, ] - filter_fields = [ + filterset_fields = [ 'part', ] diff --git a/InvenTree/company/migrations/0046_alter_company_image.py b/InvenTree/company/migrations/0046_alter_company_image.py new file mode 100644 index 0000000000..518f6453d5 --- /dev/null +++ b/InvenTree/company/migrations/0046_alter_company_image.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.13 on 2022-06-27 23:08 + +import company.models +from django.db import migrations +import stdimage.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('company', '0045_alter_company_notes'), + ] + + operations = [ + migrations.AlterField( + model_name='company', + name='image', + field=stdimage.models.StdImageField(blank=True, force_min_size=False, null=True, upload_to=company.models.rename_company_image, variations={'preview': (256, 256), 'thumbnail': (128, 128)}, verbose_name='Image'), + ), + ] diff --git a/InvenTree/label/api.py b/InvenTree/label/api.py index a2ce1adff7..7b533c8825 100644 --- a/InvenTree/label/api.py +++ b/InvenTree/label/api.py @@ -31,7 +31,7 @@ class LabelListView(ListAPI): filters.SearchFilter ] - filter_fields = [ + filterset_fields = [ 'enabled', ] diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index f90446da0d..634a07c580 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -70,7 +70,7 @@ class GeneralExtraLineList: 'reference' ] - filter_fields = [ + filterset_fields = [ 'order', ] @@ -540,7 +540,7 @@ class SalesOrderAttachmentList(AttachmentMixin, ListCreateDestroyAPIView): rest_filters.DjangoFilterBackend, ] - filter_fields = [ + filterset_fields = [ 'order', ] @@ -672,7 +672,7 @@ class SalesOrderList(APIDownloadMixin, ListCreateAPI): 'reference': ['reference_int', 'reference'], } - filter_fields = [ + filterset_fields = [ 'customer', ] @@ -814,7 +814,7 @@ class SalesOrderLineItemList(ListCreateAPI): 'reference', ] - filter_fields = [ + filterset_fields = [ 'order', 'part', ] @@ -990,7 +990,7 @@ class SalesOrderAllocationList(ListAPI): ] # Default filterable fields - filter_fields = [ + filterset_fields = [ ] @@ -1069,7 +1069,7 @@ class PurchaseOrderAttachmentList(AttachmentMixin, ListCreateDestroyAPIView): rest_filters.DjangoFilterBackend, ] - filter_fields = [ + filterset_fields = [ 'order', ] diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index da1403da4d..ceb9b60c8c 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -135,7 +135,7 @@ class CategoryList(ListCreateAPI): filters.OrderingFilter, ] - filter_fields = [ + filterset_fields = [ ] ordering_fields = [ @@ -281,7 +281,7 @@ class PartSalePriceList(ListCreateAPI): DjangoFilterBackend ] - filter_fields = [ + filterset_fields = [ 'part', ] @@ -304,7 +304,7 @@ class PartInternalPriceList(ListCreateAPI): DjangoFilterBackend ] - filter_fields = [ + filterset_fields = [ 'part', ] @@ -319,7 +319,7 @@ class PartAttachmentList(AttachmentMixin, ListCreateDestroyAPIView): DjangoFilterBackend, ] - filter_fields = [ + filterset_fields = [ 'part', ] @@ -1412,7 +1412,7 @@ class PartParameterTemplateList(ListCreateAPI): filters.SearchFilter, ] - filter_fields = [ + filterset_fields = [ 'name', ] @@ -1477,7 +1477,7 @@ class PartParameterList(ListCreateAPI): DjangoFilterBackend ] - filter_fields = [ + filterset_fields = [ 'part', 'template', ] @@ -1758,7 +1758,7 @@ class BomList(ListCreateDestroyAPIView): filters.OrderingFilter, ] - filter_fields = [ + filterset_fields = [ ] @@ -1857,7 +1857,7 @@ class BomItemSubstituteList(ListCreateAPI): filters.OrderingFilter, ] - filter_fields = [ + filterset_fields = [ 'part', 'bom_item', ] diff --git a/InvenTree/part/migrations/0080_alter_part_image.py b/InvenTree/part/migrations/0080_alter_part_image.py new file mode 100644 index 0000000000..9632795cc8 --- /dev/null +++ b/InvenTree/part/migrations/0080_alter_part_image.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.13 on 2022-06-27 23:08 + +from django.db import migrations +import part.models +import stdimage.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('part', '0079_alter_part_notes'), + ] + + operations = [ + migrations.AlterField( + model_name='part', + name='image', + field=stdimage.models.StdImageField(blank=True, force_min_size=False, null=True, upload_to=part.models.rename_part_image, variations={'preview': (256, 256), 'thumbnail': (128, 128)}, verbose_name='Image'), + ), + ] diff --git a/InvenTree/plugin/api.py b/InvenTree/plugin/api.py index e043da189a..ea171e2770 100644 --- a/InvenTree/plugin/api.py +++ b/InvenTree/plugin/api.py @@ -62,7 +62,7 @@ class PluginList(ListAPI): filters.OrderingFilter, ] - filter_fields = [ + filterset_fields = [ 'active', ] @@ -140,7 +140,7 @@ class PluginSettingList(ListAPI): DjangoFilterBackend, ] - filter_fields = [ + filterset_fields = [ 'plugin__active', 'plugin__key', ] diff --git a/InvenTree/report/api.py b/InvenTree/report/api.py index f27f3d9f18..c97026361d 100644 --- a/InvenTree/report/api.py +++ b/InvenTree/report/api.py @@ -34,7 +34,7 @@ class ReportListView(ListAPI): filters.SearchFilter, ] - filter_fields = [ + filterset_fields = [ 'enabled', ] diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 3df39c3b1c..88007dea34 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -283,7 +283,7 @@ class StockLocationList(ListCreateAPI): filters.OrderingFilter, ] - filter_fields = [ + filterset_fields = [ ] search_fields = [ @@ -1064,7 +1064,7 @@ class StockAttachmentList(AttachmentMixin, ListCreateDestroyAPIView): filters.SearchFilter, ] - filter_fields = [ + filterset_fields = [ 'stock_item', ] @@ -1095,7 +1095,7 @@ class StockItemTestResultList(ListCreateDestroyAPIView): filters.OrderingFilter, ] - filter_fields = [ + filterset_fields = [ 'test', 'user', 'result', @@ -1302,7 +1302,7 @@ class StockTrackingList(ListAPI): filters.OrderingFilter, ] - filter_fields = [ + filterset_fields = [ 'item', 'user', ] diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index ecd58f24aa..a08a5e95ea 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -183,7 +183,11 @@ class StockItemSerializer(InvenTree.serializers.InvenTreeModelSerializer): def get_purchase_price_string(self, obj): """Return purchase price as string.""" - return str(obj.purchase_price) if obj.purchase_price else '-' + if obj.purchase_price: + obj.purchase_price.decimal_places_display = 4 + return str(obj.purchase_price) + + return '-' purchase_order_reference = serializers.CharField(source='purchase_order.reference', read_only=True) sales_order_reference = serializers.CharField(source='sales_order.reference', read_only=True) diff --git a/requirements-dev.in b/requirements-dev.in new file mode 100644 index 0000000000..3853a5ac6f --- /dev/null +++ b/requirements-dev.in @@ -0,0 +1,12 @@ +# Dev requirements for InvenTree +coverage # Unit test coverage +coveralls==2.1.2 # Coveralls linking (for tracking coverage) # PINNED 2022-06-28 - Old version needed for correct upload +django-debug-toolbar # Debug / profiling toolbar +django-test-migrations # Unit testing for database migrations +flake8 # PEP checking +flake8-docstrings # docstring format testing +isort # python import sorting +pep8-naming # PEP naming convention extension +pip-tools # Compile pip requirements +pre-commit # Git pre-commit +setuptools # Standard depenedency diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000000..b233220b4d --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,254 @@ +# +# This file is autogenerated by pip-compile with python 3.9 +# To update, run: +# +# pip-compile --generate-hashes --output-file=requirements-dev.txt requirements-dev.in +# +asgiref==3.5.2 \ + --hash=sha256:1d2880b792ae8757289136f1db2b7b99100ce959b2aa57fd69dab783d05afac4 \ + --hash=sha256:4a29362a6acebe09bf1d6640db38c1dc3d9217c68e6f9f6204d72667fc19a424 + # via django +certifi==2022.6.15 \ + --hash=sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d \ + --hash=sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412 + # via requests +cfgv==3.3.1 \ + --hash=sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426 \ + --hash=sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736 + # via pre-commit +charset-normalizer==2.0.12 \ + --hash=sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597 \ + --hash=sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df + # via requests +click==8.1.3 \ + --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ + --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 + # via pip-tools +coverage==5.5 \ + --hash=sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c \ + --hash=sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6 \ + --hash=sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45 \ + --hash=sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a \ + --hash=sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03 \ + --hash=sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529 \ + --hash=sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a \ + --hash=sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a \ + --hash=sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2 \ + --hash=sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6 \ + --hash=sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759 \ + --hash=sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53 \ + --hash=sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a \ + --hash=sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4 \ + --hash=sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff \ + --hash=sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502 \ + --hash=sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793 \ + --hash=sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb \ + --hash=sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905 \ + --hash=sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821 \ + --hash=sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b \ + --hash=sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81 \ + --hash=sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0 \ + --hash=sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b \ + --hash=sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3 \ + --hash=sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184 \ + --hash=sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701 \ + --hash=sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a \ + --hash=sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82 \ + --hash=sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638 \ + --hash=sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5 \ + --hash=sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083 \ + --hash=sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6 \ + --hash=sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90 \ + --hash=sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465 \ + --hash=sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a \ + --hash=sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3 \ + --hash=sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e \ + --hash=sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066 \ + --hash=sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf \ + --hash=sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b \ + --hash=sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae \ + --hash=sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669 \ + --hash=sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873 \ + --hash=sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b \ + --hash=sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6 \ + --hash=sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb \ + --hash=sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160 \ + --hash=sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c \ + --hash=sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079 \ + --hash=sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d \ + --hash=sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6 + # via + # -r requirements-dev.in + # coveralls +coveralls==2.1.2 \ + --hash=sha256:4430b862baabb3cf090d36d84d331966615e4288d8a8c5957e0fd456d0dd8bd6 \ + --hash=sha256:b3b60c17b03a0dee61952a91aed6f131e0b2ac8bd5da909389c53137811409e1 + # via -r requirements-dev.in +distlib==0.3.4 \ + --hash=sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b \ + --hash=sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579 + # via virtualenv +django==4.0.5 \ + --hash=sha256:502ae42b6ab1b612c933fb50d5ff850facf858a4c212f76946ecd8ea5b3bf2d9 \ + --hash=sha256:f7431a5de7277966f3785557c3928433347d998c1e6459324501378a291e5aab + # via django-debug-toolbar +django-debug-toolbar==3.5.0 \ + --hash=sha256:89a52128309eb4da12738801ff0c202d2ff8730d1c3225fac6acf630c303e661 \ + --hash=sha256:97965f2630692de316ea0c1ca5bfa81660d7ba13146dbc6be2059cf55b35d0e5 + # via -r requirements-dev.in +django-test-migrations==1.2.0 \ + --hash=sha256:874884ff4e980583cd9f1c986bb9fbfe72b436e759be23004e4f52c26a15f363 \ + --hash=sha256:9e8b9b4364fef70dde10a5f85c5a75d447ca2189ec648325610fab1268daec97 + # via -r requirements-dev.in +docopt==0.6.2 \ + --hash=sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491 + # via coveralls +filelock==3.7.1 \ + --hash=sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404 \ + --hash=sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04 + # via virtualenv +flake8==4.0.1 \ + --hash=sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d \ + --hash=sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d + # via + # -r requirements-dev.in + # flake8-docstrings + # pep8-naming +flake8-docstrings==1.6.0 \ + --hash=sha256:99cac583d6c7e32dd28bbfbef120a7c0d1b6dde4adb5a9fd441c4227a6534bde \ + --hash=sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b + # via -r requirements-dev.in +identify==2.5.1 \ + --hash=sha256:0dca2ea3e4381c435ef9c33ba100a78a9b40c0bab11189c7cf121f75815efeaa \ + --hash=sha256:3d11b16f3fe19f52039fb7e39c9c884b21cb1b586988114fbe42671f03de3e82 + # via pre-commit +idna==3.3 \ + --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \ + --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d + # via requests +isort==5.10.1 \ + --hash=sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7 \ + --hash=sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951 + # via -r requirements-dev.in +mccabe==0.6.1 \ + --hash=sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42 \ + --hash=sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f + # via flake8 +nodeenv==1.7.0 \ + --hash=sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e \ + --hash=sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b + # via pre-commit +pep517==0.12.0 \ + --hash=sha256:931378d93d11b298cf511dd634cf5ea4cb249a28ef84160b3247ee9afb4e8ab0 \ + --hash=sha256:dd884c326898e2c6e11f9e0b64940606a93eb10ea022a2e067959f3a110cf161 + # via pip-tools +pep8-naming==0.13.0 \ + --hash=sha256:069ea20e97f073b3e6d4f789af2a57816f281ca64b86210c7d471117a4b6bfd0 \ + --hash=sha256:9f38e6dcf867a1fb7ad47f5ff72c0ddae544a6cf64eb9f7600b7b3c0bb5980b5 + # via -r requirements-dev.in +pip-tools==6.6.2 \ + --hash=sha256:6b486548e5a139e30e4c4a225b3b7c2d46942a9f6d1a91143c21b1de4d02fd9b \ + --hash=sha256:f638503a9f77d98d9a7d72584b1508d3f82ed019b8fab24f4e5ad078c1b8c95e + # via -r requirements-dev.in +platformdirs==2.5.2 \ + --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ + --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 + # via virtualenv +pre-commit==2.19.0 \ + --hash=sha256:10c62741aa5704faea2ad69cb550ca78082efe5697d6f04e5710c3c229afdd10 \ + --hash=sha256:4233a1e38621c87d9dda9808c6606d7e7ba0e087cd56d3fe03202a01d2919615 + # via -r requirements-dev.in +pycodestyle==2.8.0 \ + --hash=sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20 \ + --hash=sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f + # via flake8 +pydocstyle==6.1.1 \ + --hash=sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc \ + --hash=sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4 + # via flake8-docstrings +pyflakes==2.4.0 \ + --hash=sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c \ + --hash=sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e + # via flake8 +pyyaml==6.0 \ + --hash=sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293 \ + --hash=sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b \ + --hash=sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57 \ + --hash=sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b \ + --hash=sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4 \ + --hash=sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07 \ + --hash=sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba \ + --hash=sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9 \ + --hash=sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287 \ + --hash=sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513 \ + --hash=sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0 \ + --hash=sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 \ + --hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 \ + --hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f \ + --hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2 \ + --hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc \ + --hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c \ + --hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 \ + --hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 \ + --hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c \ + --hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 \ + --hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b \ + --hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c \ + --hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb \ + --hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 \ + --hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 \ + --hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d \ + --hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 \ + --hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 \ + --hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 \ + --hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \ + --hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \ + --hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5 + # via pre-commit +requests==2.28.0 \ + --hash=sha256:bc7861137fbce630f17b03d3ad02ad0bf978c844f3536d0edda6499dafce2b6f \ + --hash=sha256:d568723a7ebd25875d8d1eaf5dfa068cd2fc8194b2e483d7b1f7c81918dbec6b + # via coveralls +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via virtualenv +snowballstemmer==2.2.0 \ + --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ + --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a + # via pydocstyle +sqlparse==0.4.2 \ + --hash=sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae \ + --hash=sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d + # via + # django + # django-debug-toolbar +toml==0.10.2 \ + --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ + --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f + # via pre-commit +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f + # via pep517 +typing-extensions==4.2.0 \ + --hash=sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708 \ + --hash=sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376 + # via django-test-migrations +urllib3==1.26.9 \ + --hash=sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14 \ + --hash=sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e + # via requests +virtualenv==20.15.0 \ + --hash=sha256:4c44b1d77ca81f8368e2d7414f9b20c428ad16b343ac6d226206c5b84e2b4fcc \ + --hash=sha256:804cce4de5b8a322f099897e308eecc8f6e2951f1a8e7e2b3598dff865f01336 + # via pre-commit +wheel==0.37.1 \ + --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a \ + --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 + # via pip-tools + +# WARNING: The following packages were not pinned, but pip requires them to be +# pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag. +# pip +# setuptools diff --git a/requirements.in b/requirements.in new file mode 100644 index 0000000000..26353cdaf3 --- /dev/null +++ b/requirements.in @@ -0,0 +1,37 @@ +# Please keep this list sorted - if you pin a version provide a reason +Django<4 # Django package +coreapi # API documentation for djangorestframework +django-allauth # SSO for external providers via OpenID +django-allauth-2fa # MFA / 2FA +django-cleanup # Automated deletion of old / unused uploaded files +django-cors-headers # CORS headers extension for DRF +django-crispy-forms # Form helpers +django-error-report # Error report viewer for the admin interface +django-filter # Extended filtering options +django-formtools # Form wizard tools +django-import-export==2.5.0 # Data import / export for admin interface +django-maintenance-mode # Shut down application while reloading etc. +django-markdownify # Markdown rendering +django-money<3.0.0 # Django app for currency management # FIXED 2022-06-26 to make sure py-moneyed is not conflicting +django-mptt==0.11.0 # Modified Preorder Tree Traversal +django-redis>=5.0.0 # Redis integration +django-q # Background task scheduling +django-sql-utils # Advanced query annotation / aggregation +django-sslserver # Secure HTTP development server +django-stdimage # Advanced ImageField management +django-user-sessions # user sessions in DB +django-weasyprint # django weasyprint integration +djangorestframework # DRF framework +django-xforwardedfor-middleware # IP forwarding metadata +gunicorn # Gunicorn web server +pdf2image # PDF to image conversion +pillow # Image manipulation +python-barcode[images] # Barcode generator +qrcode[pil] # QR code generator +rapidfuzz==0.7.6 # Fuzzy string matching +sentry-sdk # Error reporting (optional) +setuptools # Standard depenedency +tablib[xls,xlsx,yaml] # Support for XLS and XLSX formats + +# Fixed sub-dependencies +py-moneyed<2.0 # For django-money # FIXED 2022-06-18 as we need `moneyed.localization` diff --git a/requirements.txt b/requirements.txt index 9a9a93cfd5..967f860faf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,51 +1,249 @@ -# Please keep this list sorted -Django==3.2.13 # Django package -bleach==4.1.0 # HTML santization -certifi # Certifi is (most likely) installed through one of the requirements above -coreapi==2.3.0 # API documentation -coverage==5.3 # Unit test coverage -coveralls==2.1.2 # Coveralls linking (for Travis) -cryptography==3.4.8 # Cryptography support -django-admin-shell==0.1.2 # Python shell for the admin interface -django-allauth==0.48.0 # SSO for external providers via OpenID -django-allauth-2fa==0.9 # MFA / 2FA # IMPORTANT: Do only change after reviewing GHSA-8j76-mm54-52xq -django-cleanup==5.1.0 # Manage deletion of old / unused uploaded files -django-cors-headers==3.2.0 # CORS headers extension for DRF -django-crispy-forms==1.11.2 # Form helpers -django-debug-toolbar==3.2.4 # Debug / profiling toolbar -django-error-report==0.2.0 # Error report viewer for the admin interface -django-filter==2.4.0 # Extended filtering options -django-formtools==2.3 # Form wizard tools -django-import-export==2.5.0 # Data import / export for admin interface -django-maintenance-mode==0.16.1 # Shut down application while reloading etc. -django-markdownify==0.8.0 # Markdown rendering -django-money==1.1 # Django app for currency management -django-mptt==0.11.0 # Modified Preorder Tree Traversal -django-redis>=5.0.0 # Redis integration -django-q==1.3.4 # Background task scheduling -django-sql-utils==0.5.0 # Advanced query annotation / aggregation -django-sslserver==0.22 # Secure HTTP development server -django-stdimage==5.1.1 # Advanced ImageField management -django-test-migrations==1.1.0 # Unit testing for database migrations -django-user-sessions==1.7.1 # user sessions in DB -django-weasyprint==2.1.0 # django weasyprint integration -djangorestframework==3.12.4 # DRF framework -django-xforwardedfor-middleware==2.0 # IP forwarding metadata -flake8==3.8.3 # PEP checking -flake8-docstrings==1.6.0 # docstring format testing -gunicorn>=20.1.0 # Gunicorn web server -importlib_metadata # Backport for importlib.metadata -isort==5.10.1 # DEV: python import sorting -markdown==3.3.4 # Force particular version of markdown -pdf2image==1.16.0 # PDF to image conversion -pep8-naming==0.11.1 # PEP naming convention extension -pre-commit==2.19.0 # Git pre-commit -pillow==9.1.1 # Image manipulation -py-moneyed==0.8.0 # Specific version requirement for py-moneyed -pygments==2.7.4 # Syntax highlighting -python-barcode[images]==0.13.1 # Barcode generator -qrcode[pil]==6.1 # QR code generator -rapidfuzz==0.7.6 # Fuzzy string matching -sentry-sdk==1.5.12 # Error reporting (optional) -tablib[xls,xlsx,yaml] # Support for XLS and XLSX formats -weasyprint==55.0 # PDF generation library +# +# This file is autogenerated by pip-compile with python 3.9 +# To update, run: +# +# pip-compile --output-file=requirements.txt requirements.in +# +arrow==1.2.2 + # via django-q +asgiref==3.5.2 + # via django +babel==2.10.3 + # via py-moneyed +bleach[css]==5.0.0 + # via django-markdownify +blessed==1.19.1 + # via django-q +brotli==1.0.9 + # via fonttools +certifi==2022.6.15 + # via + # requests + # sentry-sdk +cffi==1.15.0 + # via + # cryptography + # weasyprint +charset-normalizer==2.0.12 + # via requests +coreapi==2.3.3 + # via -r requirements.in +coreschema==0.0.4 + # via coreapi +cryptography==37.0.2 + # via pyjwt +cssselect2==0.6.0 + # via weasyprint +defusedxml==0.7.1 + # via + # odfpy + # python3-openid +diff-match-patch==20200713 + # via django-import-export +django==3.2.13 + # via + # -r requirements.in + # django-allauth + # django-allauth-2fa + # django-cors-headers + # django-error-report + # django-filter + # django-formtools + # django-import-export + # django-js-asset + # django-markdownify + # django-money + # django-mptt + # django-otp + # django-picklefield + # django-q + # django-redis + # django-sql-utils + # django-sslserver + # django-stdimage + # django-user-sessions + # django-weasyprint + # django-xforwardedfor-middleware + # djangorestframework +django-allauth==0.51.0 + # via + # -r requirements.in + # django-allauth-2fa +django-allauth-2fa==0.9 + # via -r requirements.in +django-cleanup==6.0.0 + # via -r requirements.in +django-cors-headers==3.13.0 + # via -r requirements.in +django-crispy-forms==1.14.0 + # via -r requirements.in +django-error-report==0.2.0 + # via -r requirements.in +django-filter==22.1 + # via -r requirements.in +django-formtools==2.3 + # via -r requirements.in +django-import-export==2.5.0 + # via -r requirements.in +django-js-asset==2.0.0 + # via django-mptt +django-maintenance-mode==0.16.3 + # via -r requirements.in +django-markdownify==0.9.2 + # via -r requirements.in +django-money==2.1.1 + # via -r requirements.in +django-mptt==0.11.0 + # via -r requirements.in +django-otp==1.1.3 + # via django-allauth-2fa +django-picklefield==3.1 + # via django-q +django-q==1.3.9 + # via -r requirements.in +django-redis==5.2.0 + # via -r requirements.in +django-sql-utils==0.6.1 + # via -r requirements.in +django-sslserver==0.22 + # via -r requirements.in +django-stdimage==6.0.1 + # via -r requirements.in +django-user-sessions==1.7.1 + # via -r requirements.in +django-weasyprint==2.1.0 + # via -r requirements.in +django-xforwardedfor-middleware==2.0 + # via -r requirements.in +djangorestframework==3.13.1 + # via -r requirements.in +et-xmlfile==1.1.0 + # via openpyxl +fonttools[woff]==4.33.3 + # via weasyprint +gunicorn==20.1.0 + # via -r requirements.in +html5lib==1.1 + # via weasyprint +idna==3.3 + # via requests +importlib-metadata==4.12.0 + # via markdown +itypes==1.2.0 + # via coreapi +jinja2==3.1.2 + # via coreschema +markdown==3.3.7 + # via django-markdownify +markuppy==1.14 + # via tablib +markupsafe==2.1.1 + # via jinja2 +oauthlib==3.2.0 + # via requests-oauthlib +odfpy==1.4.1 + # via tablib +openpyxl==3.0.10 + # via tablib +pdf2image==1.16.0 + # via -r requirements.in +pillow==9.1.1 + # via + # -r requirements.in + # django-stdimage + # pdf2image + # python-barcode + # qrcode + # weasyprint +py-moneyed==1.2 + # via + # -r requirements.in + # django-money +pycparser==2.21 + # via cffi +pydyf==0.2.0 + # via weasyprint +pyjwt[crypto]==2.4.0 + # via django-allauth +pyphen==0.12.0 + # via weasyprint +python-barcode[images]==0.14.0 + # via -r requirements.in +python-dateutil==2.8.2 + # via arrow +python-fsutil==0.6.1 + # via django-maintenance-mode +python3-openid==3.2.0 + # via django-allauth +pytz==2022.1 + # via + # babel + # django + # djangorestframework +pyyaml==6.0 + # via tablib +qrcode[pil]==7.3.1 + # via + # -r requirements.in + # django-allauth-2fa +rapidfuzz==0.7.6 + # via -r requirements.in +redis==3.5.3 + # via + # django-q + # django-redis +requests==2.28.0 + # via + # coreapi + # django-allauth + # requests-oauthlib +requests-oauthlib==1.3.1 + # via django-allauth +sentry-sdk==1.6.0 + # via -r requirements.in +six==1.16.0 + # via + # bleach + # blessed + # html5lib + # python-dateutil +sqlparse==0.4.2 + # via + # django + # django-sql-utils +tablib[html,ods,xls,xlsx,yaml]==3.2.1 + # via + # -r requirements.in + # django-import-export +tinycss2==1.1.1 + # via + # bleach + # cssselect2 + # weasyprint +uritemplate==4.1.1 + # via coreapi +urllib3==1.26.9 + # via + # requests + # sentry-sdk +wcwidth==0.2.5 + # via blessed +weasyprint==55.0 + # via django-weasyprint +webencodings==0.5.1 + # via + # bleach + # cssselect2 + # html5lib + # tinycss2 +xlrd==2.0.1 + # via tablib +xlwt==1.3.0 + # via tablib +zipp==3.8.0 + # via importlib-metadata +zopfli==0.2.1 + # via fonttools + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/tasks.py b/tasks.py index 36e8a20678..5161676321 100644 --- a/tasks.py +++ b/tasks.py @@ -111,10 +111,10 @@ def install(c): @task def setup_dev(c): """Sets up everything needed for the dev enviroment.""" - print("Installing required python packages from 'requirements.txt'") + print("Installing required python packages from 'requirements-dev.txt'") # Install required Python packages with PIP - c.run('pip3 install -U -r requirements.txt') + c.run('pip3 install -U -r requirements-dev.txt') # Install pre-commit hook c.run('pre-commit install')