django-bom 1.241__tar.gz → 1.245__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {django_bom-1.241/django_bom.egg-info → django_bom-1.245}/PKG-INFO +1 -1
- {django_bom-1.241 → django_bom-1.245}/bom/admin.py +15 -11
- {django_bom-1.241 → django_bom-1.245}/bom/forms.py +2 -22
- django_bom-1.245/bom/migrations/0050_alter_organization_options.py +17 -0
- {django_bom-1.241 → django_bom-1.245}/bom/settings.py +2 -6
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/settings.html +18 -13
- {django_bom-1.241 → django_bom-1.245}/bom/views/views.py +1 -1
- {django_bom-1.241 → django_bom-1.245/django_bom.egg-info}/PKG-INFO +1 -1
- {django_bom-1.241 → django_bom-1.245}/django_bom.egg-info/SOURCES.txt +1 -0
- {django_bom-1.241 → django_bom-1.245}/pyproject.toml +1 -1
- {django_bom-1.241 → django_bom-1.245}/LICENSE +0 -0
- {django_bom-1.241 → django_bom-1.245}/MANIFEST.in +0 -0
- {django_bom-1.241 → django_bom-1.245}/README.md +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/__init__.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/apps.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/auth_backends.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/base_classes.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/constants.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/context_processors.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/csv_headers.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/decorators.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/form_fields.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/helpers.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/local_settings.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0001_initial.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0002_auto_20180908_2151.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0003_sellerpart_data_source.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0004_auto_20180911_0011.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0005_auto_20181007_1934.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0006_auto_20181007_1949.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0007_auto_20181009_0256.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0008_auto_20181030_0427.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0009_subpart_reference.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0010_auto_20181202_0733.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0011_auto_20181202_2113.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0012_partchangehistory.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0013_auto_20190222_1631.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0014_auto_20190223_2353.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0015_auto_20190303_1915.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0016_auto_20190405_2308.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0017_auto_20190616_1912.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0018_auto_20190616_2143.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0019_auto_20190624_1246.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0020_auto_20190627_0207.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0021_auto_20190627_0428.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0022_auto_20190811_2140.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0023_auto_20191205_2351.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0024_auto_20191214_1342.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0025_auto_20191221_1907.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0026_auto_20191222_2258.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0027_auto_20191222_2347.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0028_partrevision_displayable_synopsis.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0029_auto_20191231_1630.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0030_auto_20200101_2253.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0031_auto_20200104_1352.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0032_auto_20200126_1806.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0033_auto_20200203_0618.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0034_auto_20200222_0359.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0035_auto_20200303_0111.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0036_auto_20200303_0538.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0037_auto_20200405_1642.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0038_auto_20200422_0504.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0039_auto_20200929_2315.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0040_alter_organization_currency.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0041_organization_subscription_quantity.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0042_auto_20210720_2137.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0043_auto_20211123_0157.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0044_auto_20220831_1241.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0045_sellerpart_link.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0046_alter_sellerpart_unique_together.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0047_sellerpart_seller_part_number.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0048_rename_part_organization_number_class_bom_part_organiz_b333d6_idx_and_more.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/0049_alter_assembly_id_alter_assemblysubparts_id_and_more.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/migrations/__init__.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/models.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/part_bom.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/dashboard.css +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/jquery.treetable.css +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/materialize.min.css +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/part-info.css +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/style.css +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/tablesorter-theme.materialize.css +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/treetable-theme.css +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/sample_part_classes.csv +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/test_bom.csv +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/test_bom_5_intelligent.csv +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/test_full_bom.csv +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/test_new_parts.csv +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/test_new_parts_5_intelligent.csv +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/_ionicons_svg_md-arrow-dropdown.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/_ionicons_svg_md-arrow-dropright.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/favicon.ico +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_disabled_web.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_focus_web.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_normal_web.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_pressed_web.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_disabled_web.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_focus_web.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_normal_web.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_pressed_web.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_disabled_web@2x.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_focus_web@2x.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_normal_web@2x.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_pressed_web@2x.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_light_disabled_web@2x.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_light_focus_web@2x.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_light_normal_web@2x.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_light_pressed_web@2x.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.eps +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.eps +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.eps +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.eps +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.eps +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.eps +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.eps +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.eps +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google_drive_logo.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/indabom.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/mouser.png +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/octopart_blue.svg +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/js/jquery-3.4.1.min.js +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/js/jquery.ba-floatingscrollbar.min.js +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/js/jquery.treetable.js +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/static/bom/js/materialize.min.js +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/account-delete.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/add-manufacturer-part.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/add-sellerpart.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/base-menu.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/base.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-action-btn.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-action-table.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-base-menu.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-base.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-form-modal.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-form.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-modal-add-users.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-signup.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/components/bom-flat.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/components/bom-indented.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/components/manufacturer-part-list.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/components/seller-part-list.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/create-part.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/dashboard-menu.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/dashboard.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/edit-manufacturer-part.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/edit-part-class.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/edit-part.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/edit-user-meta.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/help.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/manufacturer-info.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/manufacturers.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/nothing-to-see.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/organization-create.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-info.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-revision-display.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-revision-edit.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-revision-manage-bom.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-revision-new.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-revision-release.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/search-help.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/seller-info.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/sellers.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/signup.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/subscription_panel.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/table_of_contents.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/upload-bom.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/upload-parts-help.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/upload-parts.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/templates/registration/login.html +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/tests.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/third_party_apis/__init__.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/third_party_apis/base_api.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/third_party_apis/google_drive.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/third_party_apis/mouser.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/third_party_apis/test_apis.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/urls.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/utils.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/validators.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/views/__init__.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/views/json_views.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/bom/wsgi.py +0 -0
- {django_bom-1.241 → django_bom-1.245}/django_bom.egg-info/dependency_links.txt +0 -0
- {django_bom-1.241 → django_bom-1.245}/django_bom.egg-info/requires.txt +0 -0
- {django_bom-1.241 → django_bom-1.245}/django_bom.egg-info/top_level.txt +0 -0
- {django_bom-1.241 → django_bom-1.245}/setup.cfg +0 -0
|
@@ -16,19 +16,15 @@ from .models import (
|
|
|
16
16
|
UserMeta,
|
|
17
17
|
)
|
|
18
18
|
|
|
19
|
-
|
|
20
19
|
User = get_user_model()
|
|
21
20
|
|
|
22
21
|
class UserMetaInline(admin.TabularInline):
|
|
23
22
|
model = UserMeta
|
|
23
|
+
verbose_name = 'BOM User Meta'
|
|
24
24
|
raw_id_fields = ('organization',)
|
|
25
25
|
can_delete = False
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
class UserAdmin(UserAdmin):
|
|
29
|
-
inlines = (UserMetaInline,)
|
|
30
|
-
|
|
31
|
-
|
|
32
28
|
class OrganizationAdmin(admin.ModelAdmin):
|
|
33
29
|
list_display = ('name',)
|
|
34
30
|
|
|
@@ -142,13 +138,21 @@ class AssemblyAdmin(admin.ModelAdmin):
|
|
|
142
138
|
]
|
|
143
139
|
|
|
144
140
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
141
|
+
current_admin = admin.site._registry.get(User)
|
|
142
|
+
|
|
143
|
+
if current_admin:
|
|
144
|
+
admin_class = current_admin.__class__
|
|
145
|
+
inlines = list(admin_class.inlines or [])
|
|
146
|
+
if UserMetaInline not in inlines:
|
|
147
|
+
inlines.append(UserMetaInline)
|
|
148
|
+
admin_class.inlines = inlines
|
|
149
|
+
else:
|
|
150
|
+
class BomUserAdmin(UserAdmin):
|
|
151
|
+
inlines = [UserMetaInline]
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
admin.site.register(User, BomUserAdmin)
|
|
150
155
|
|
|
151
|
-
admin.site.register(User, UserAdmin)
|
|
152
156
|
admin.site.register(Organization, OrganizationAdmin)
|
|
153
157
|
admin.site.register(Seller, SellerAdmin)
|
|
154
158
|
admin.site.register(SellerPart, SellerPartAdmin)
|
|
@@ -1,41 +1,27 @@
|
|
|
1
1
|
import codecs
|
|
2
2
|
import csv
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Type, TypeVar
|
|
5
4
|
|
|
6
5
|
from django import forms
|
|
7
6
|
from django.contrib.auth.forms import UserCreationForm
|
|
8
7
|
from django.core.exceptions import ValidationError
|
|
9
|
-
from django.core.validators import MaxLengthValidator,
|
|
8
|
+
from django.core.validators import MaxLengthValidator, MinLengthValidator
|
|
10
9
|
from django.db import IntegrityError
|
|
11
10
|
from django.forms.models import model_to_dict
|
|
12
11
|
from django.utils.translation import gettext_lazy as _
|
|
13
|
-
|
|
14
12
|
from djmoney.money import Money
|
|
15
13
|
|
|
16
14
|
from .constants import (
|
|
17
|
-
CONFIGURATION_TYPES,
|
|
18
15
|
CURRENT_UNITS,
|
|
19
16
|
DISTANCE_UNITS,
|
|
20
17
|
FREQUENCY_UNITS,
|
|
21
18
|
INTERFACE_TYPES,
|
|
22
19
|
MEMORY_UNITS,
|
|
23
|
-
NUMBER_CLASS_CODE_LEN_DEFAULT,
|
|
24
|
-
NUMBER_CLASS_CODE_LEN_MAX,
|
|
25
|
-
NUMBER_CLASS_CODE_LEN_MIN,
|
|
26
|
-
NUMBER_ITEM_LEN_DEFAULT,
|
|
27
|
-
NUMBER_ITEM_LEN_MAX,
|
|
28
|
-
NUMBER_ITEM_LEN_MIN,
|
|
29
20
|
NUMBER_SCHEME_INTELLIGENT,
|
|
30
21
|
NUMBER_SCHEME_SEMI_INTELLIGENT,
|
|
31
|
-
NUMBER_VARIATION_LEN_DEFAULT,
|
|
32
|
-
NUMBER_VARIATION_LEN_MAX,
|
|
33
|
-
NUMBER_VARIATION_LEN_MIN,
|
|
34
22
|
PACKAGE_TYPES,
|
|
35
23
|
POWER_UNITS,
|
|
36
24
|
ROLE_TYPE_VIEWER,
|
|
37
|
-
ROLE_TYPES,
|
|
38
|
-
SUBSCRIPTION_TYPES,
|
|
39
25
|
TEMPERATURE_UNITS,
|
|
40
26
|
VALUE_UNITS,
|
|
41
27
|
VOLTAGE_UNITS,
|
|
@@ -43,11 +29,9 @@ from .constants import (
|
|
|
43
29
|
WEIGHT_UNITS,
|
|
44
30
|
)
|
|
45
31
|
from .csv_headers import (
|
|
46
|
-
BOMFlatCSVHeaders,
|
|
47
32
|
BOMIndentedCSVHeaders,
|
|
48
33
|
CSVHeaderError,
|
|
49
34
|
PartClassesCSVHeaders,
|
|
50
|
-
PartsListCSVHeaders,
|
|
51
35
|
)
|
|
52
36
|
from .form_fields import AutocompleteTextInput
|
|
53
37
|
from .models import (
|
|
@@ -66,14 +50,10 @@ from .models import (
|
|
|
66
50
|
UserMeta,
|
|
67
51
|
)
|
|
68
52
|
from .utils import (
|
|
69
|
-
check_references_for_duplicates,
|
|
70
|
-
get_from_dict,
|
|
71
53
|
listify_string,
|
|
72
|
-
prep_for_sorting_nicely,
|
|
73
54
|
stringify_list,
|
|
74
55
|
)
|
|
75
|
-
from .validators import alphanumeric
|
|
76
|
-
|
|
56
|
+
from .validators import alphanumeric
|
|
77
57
|
|
|
78
58
|
logger = logging.getLogger(__name__)
|
|
79
59
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Generated by Django 5.2.8 on 2025-12-16 18:43
|
|
2
|
+
|
|
3
|
+
from django.db import migrations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
('bom', '0049_alter_assembly_id_alter_assemblysubparts_id_and_more'),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.AlterModelOptions(
|
|
14
|
+
name='organization',
|
|
15
|
+
options={'permissions': (('manage_members', 'Can manage organization members'),)},
|
|
16
|
+
),
|
|
17
|
+
]
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import logging
|
|
2
|
+
import os
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from django.utils.log import DEFAULT_LOGGING
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
# BASE CONFIGURATION & LOCAL SETTINGS
|
|
8
|
-
# --------------------------------------------------------------------------
|
|
5
|
+
from django.utils.log import DEFAULT_LOGGING
|
|
9
6
|
|
|
10
7
|
logger = logging.getLogger(__name__)
|
|
11
8
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
12
9
|
|
|
13
|
-
# Attempt to load local settings (similar pattern to your original, but clean)
|
|
14
10
|
try:
|
|
15
11
|
from .local_settings import *
|
|
16
12
|
except ImportError:
|
|
@@ -228,7 +228,7 @@
|
|
|
228
228
|
enctype="multipart/form-data">
|
|
229
229
|
{% csrf_token %}
|
|
230
230
|
<div class="row">
|
|
231
|
-
{{ organization_form|materializecss:'s12
|
|
231
|
+
{{ organization_form|materializecss:'s12' }}
|
|
232
232
|
</div>
|
|
233
233
|
<div class="row">
|
|
234
234
|
<div class="col s12 right-align">
|
|
@@ -242,6 +242,9 @@
|
|
|
242
242
|
</form>
|
|
243
243
|
</div>
|
|
244
244
|
|
|
245
|
+
{# Subscription & Billing placed after Users for a more natural flow #}
|
|
246
|
+
{% include 'bom/subscription_panel.html' %}
|
|
247
|
+
|
|
245
248
|
<div class="section">
|
|
246
249
|
<h4 class="section-title"><i class="material-icons teal-text text-darken-1">group</i>Users</h4>
|
|
247
250
|
<form name="seller" action="{% url 'bom:settings' tab_anchor=ORGANIZATION_TAB %}" method="post"
|
|
@@ -301,9 +304,6 @@
|
|
|
301
304
|
</form>
|
|
302
305
|
</div>
|
|
303
306
|
|
|
304
|
-
{# Subscription & Billing placed after Users for a more natural flow #}
|
|
305
|
-
{% include 'bom/subscription_panel.html' %}
|
|
306
|
-
|
|
307
307
|
<div class="section">
|
|
308
308
|
<h4 class="section-title"><i
|
|
309
309
|
class="material-icons teal-text text-darken-1">integration_instructions</i>Integrations</h4>
|
|
@@ -336,17 +336,22 @@
|
|
|
336
336
|
<div>
|
|
337
337
|
{% if google_authentication %}
|
|
338
338
|
<p>Logged in to Google as: {{ google_authentication.uid }}</p>
|
|
339
|
-
<
|
|
340
|
-
{%
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
339
|
+
<div class="right-align">
|
|
340
|
+
<form action="{% url 'social:disconnect' 'google-oauth2' %}" method="post">
|
|
341
|
+
{% csrf_token %}
|
|
342
|
+
<button class="waves-effect waves-light btn btn-primary" type="submit">
|
|
343
|
+
Disconnect
|
|
344
|
+
</button>
|
|
345
|
+
</form>
|
|
346
|
+
</div>
|
|
344
347
|
{% else %}
|
|
345
348
|
<p>To get started, sign in with Google:</p>
|
|
346
|
-
<
|
|
347
|
-
<
|
|
348
|
-
|
|
349
|
-
|
|
349
|
+
<div class="right-align">
|
|
350
|
+
<a href="{% url "social:begin" "google-oauth2" %}">
|
|
351
|
+
<img title="Google sign-in."
|
|
352
|
+
src="{% static 'bom/img/google/web/1x/btn_google_signin_dark_normal_web.png' %}">
|
|
353
|
+
</a>
|
|
354
|
+
</div>
|
|
350
355
|
{% endif %}
|
|
351
356
|
</div>
|
|
352
357
|
</div>
|
|
@@ -357,7 +357,7 @@ def bom_settings(request, tab_anchor=None):
|
|
|
357
357
|
part_classes = PartClass.objects.all().filter(organization=organization)
|
|
358
358
|
|
|
359
359
|
users_in_organization = User.objects.filter(
|
|
360
|
-
id__in=UserMeta.objects.filter(organization=organization).values_list('user', flat=True)).
|
|
360
|
+
id__in=UserMeta.objects.filter(organization=organization).values_list('user', flat=True)).order_by(
|
|
361
361
|
'first_name', 'last_name', 'email')
|
|
362
362
|
users_in_organization_count = users_in_organization.count()
|
|
363
363
|
has_member_capacity = users_in_organization_count < organization.subscription_quantity
|
|
@@ -72,6 +72,7 @@ bom/migrations/0046_alter_sellerpart_unique_together.py
|
|
|
72
72
|
bom/migrations/0047_sellerpart_seller_part_number.py
|
|
73
73
|
bom/migrations/0048_rename_part_organization_number_class_bom_part_organiz_b333d6_idx_and_more.py
|
|
74
74
|
bom/migrations/0049_alter_assembly_id_alter_assemblysubparts_id_and_more.py
|
|
75
|
+
bom/migrations/0050_alter_organization_options.py
|
|
75
76
|
bom/migrations/__init__.py
|
|
76
77
|
bom/static/bom/css/dashboard.css
|
|
77
78
|
bom/static/bom/css/jquery.treetable.css
|
|
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "django-bom"
|
|
10
|
-
version = "1.
|
|
10
|
+
version = "1.245"
|
|
11
11
|
description = "A simple Django app to manage a bill of materials."
|
|
12
12
|
readme = {file = "README.md", content-type = "text/markdown"}
|
|
13
13
|
requires-python = ">=3.10"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_bom-1.241 → django_bom-1.245}/bom/migrations/0028_partrevision_displayable_synopsis.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_bom-1.241 → django_bom-1.245}/bom/migrations/0041_organization_subscription_quantity.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_bom-1.241 → django_bom-1.245}/bom/migrations/0046_alter_sellerpart_unique_together.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/_ionicons_svg_md-arrow-dropdown.svg
RENAMED
|
File without changes
|
{django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/_ionicons_svg_md-arrow-dropright.svg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_bom-1.241 → django_bom-1.245}/bom/templates/bom/components/manufacturer-part-list.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|