django-bom 1.255__tar.gz → 1.261__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.
Potentially problematic release.
This version of django-bom might be problematic. Click here for more details.
- {django_bom-1.255/django_bom.egg-info → django_bom-1.261}/PKG-INFO +2 -2
- {django_bom-1.255 → django_bom-1.261}/bom/admin.py +34 -0
- {django_bom-1.255 → django_bom-1.261}/bom/constants.py +7 -0
- {django_bom-1.255 → django_bom-1.261}/bom/csv_headers.py +22 -44
- django_bom-1.261/bom/forms.py +1328 -0
- {django_bom-1.255 → django_bom-1.261}/bom/helpers.py +79 -4
- django_bom-1.261/bom/migrations/0052_remove_partrevision_attribute_and_more.py +584 -0
- {django_bom-1.255 → django_bom-1.261}/bom/models.py +191 -80
- django_bom-1.261/bom/static/bom/css/materialize.min.css +6 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/css/style.css +19 -0
- django_bom-1.261/bom/static/bom/js/formset-handler.js +65 -0
- django_bom-1.261/bom/static/bom/js/materialize.min.js +6 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/base.html +8 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/bom-base.html +0 -7
- django_bom-1.261/bom/templates/bom/edit-part-class.html +120 -0
- django_bom-1.261/bom/templates/bom/edit-quantity-of-measure.html +119 -0
- django_bom-1.261/bom/templates/bom/edit-user-meta.html +70 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/part-info.html +11 -2
- django_bom-1.261/bom/templates/bom/part-revision-display.html +50 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/settings.html +138 -11
- {django_bom-1.255 → django_bom-1.261}/bom/tests.py +117 -31
- {django_bom-1.255 → django_bom-1.261}/bom/urls.py +6 -0
- {django_bom-1.255 → django_bom-1.261}/bom/views/views.py +176 -42
- {django_bom-1.255 → django_bom-1.261/django_bom.egg-info}/PKG-INFO +2 -2
- {django_bom-1.255 → django_bom-1.261}/django_bom.egg-info/SOURCES.txt +3 -0
- {django_bom-1.255 → django_bom-1.261}/django_bom.egg-info/requires.txt +1 -1
- {django_bom-1.255 → django_bom-1.261}/pyproject.toml +7 -7
- django_bom-1.255/bom/forms.py +0 -1382
- django_bom-1.255/bom/static/bom/css/materialize.min.css +0 -13
- django_bom-1.255/bom/static/bom/js/materialize.min.js +0 -6
- django_bom-1.255/bom/templates/bom/edit-part-class.html +0 -33
- django_bom-1.255/bom/templates/bom/edit-user-meta.html +0 -38
- django_bom-1.255/bom/templates/bom/part-revision-display.html +0 -184
- {django_bom-1.255 → django_bom-1.261}/LICENSE +0 -0
- {django_bom-1.255 → django_bom-1.261}/MANIFEST.in +0 -0
- {django_bom-1.255 → django_bom-1.261}/README.md +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/__init__.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/apps.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/auth_backends.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/base_classes.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/context_processors.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/decorators.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/form_fields.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/local_settings.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0001_initial.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0002_auto_20180908_2151.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0003_sellerpart_data_source.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0004_auto_20180911_0011.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0005_auto_20181007_1934.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0006_auto_20181007_1949.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0007_auto_20181009_0256.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0008_auto_20181030_0427.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0009_subpart_reference.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0010_auto_20181202_0733.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0011_auto_20181202_2113.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0012_partchangehistory.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0013_auto_20190222_1631.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0014_auto_20190223_2353.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0015_auto_20190303_1915.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0016_auto_20190405_2308.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0017_auto_20190616_1912.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0018_auto_20190616_2143.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0019_auto_20190624_1246.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0020_auto_20190627_0207.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0021_auto_20190627_0428.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0022_auto_20190811_2140.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0023_auto_20191205_2351.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0024_auto_20191214_1342.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0025_auto_20191221_1907.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0026_auto_20191222_2258.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0027_auto_20191222_2347.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0028_partrevision_displayable_synopsis.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0029_auto_20191231_1630.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0030_auto_20200101_2253.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0031_auto_20200104_1352.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0032_auto_20200126_1806.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0033_auto_20200203_0618.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0034_auto_20200222_0359.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0035_auto_20200303_0111.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0036_auto_20200303_0538.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0037_auto_20200405_1642.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0038_auto_20200422_0504.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0039_auto_20200929_2315.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0040_alter_organization_currency.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0041_organization_subscription_quantity.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0042_auto_20210720_2137.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0043_auto_20211123_0157.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0044_auto_20220831_1241.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0045_sellerpart_link.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0046_alter_sellerpart_unique_together.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0047_sellerpart_seller_part_number.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0048_rename_part_organization_number_class_bom_part_organiz_b333d6_idx_and_more.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0049_alter_assembly_id_alter_assemblysubparts_id_and_more.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0050_alter_organization_options.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/0051_alter_manufacturer_organization_and_more.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/migrations/__init__.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/part_bom.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/settings.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/css/dashboard.css +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/css/jquery.treetable.css +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/css/part-info.css +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/css/tablesorter-theme.materialize.css +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/css/treetable-theme.css +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/doc/sample_part_classes.csv +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/doc/test_bom.csv +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/doc/test_bom_5_intelligent.csv +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/doc/test_full_bom.csv +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/doc/test_new_parts.csv +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/doc/test_new_parts_5_intelligent.csv +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/_ionicons_svg_md-arrow-dropdown.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/_ionicons_svg_md-arrow-dropright.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/favicon.ico +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_disabled_web.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_focus_web.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_normal_web.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_pressed_web.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/1x/btn_google_signin_light_disabled_web.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/1x/btn_google_signin_light_focus_web.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/1x/btn_google_signin_light_normal_web.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/1x/btn_google_signin_light_pressed_web.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_disabled_web@2x.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_focus_web@2x.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_normal_web@2x.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_pressed_web@2x.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/2x/btn_google_signin_light_disabled_web@2x.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/2x/btn_google_signin_light_focus_web@2x.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/2x/btn_google_signin_light_normal_web@2x.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/2x/btn_google_signin_light_pressed_web@2x.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.eps +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.eps +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.eps +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.eps +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.eps +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.eps +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.eps +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.eps +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/google_drive_logo.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/indabom.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/mouser.png +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/img/octopart_blue.svg +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/js/jquery-3.4.1.min.js +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/js/jquery.ba-floatingscrollbar.min.js +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/static/bom/js/jquery.treetable.js +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/account-delete.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/add-manufacturer-part.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/add-sellerpart.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/base-menu.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/bom-action-btn.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/bom-action-table.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/bom-base-menu.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/bom-form-modal.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/bom-form.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/bom-modal-add-users.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/bom-signup.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/components/bom-flat.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/components/bom-indented.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/components/manufacturer-part-list.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/components/seller-part-list.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/create-part.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/dashboard-menu.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/dashboard.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/edit-manufacturer-part.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/edit-part.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/help.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/manufacturer-info.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/manufacturers.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/nothing-to-see.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/organization-create.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/part-revision-edit.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/part-revision-manage-bom.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/part-revision-new.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/part-revision-release.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/search-help.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/seller-info.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/sellers.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/signup.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/subscription_panel.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/table_of_contents.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/upload-bom.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/upload-parts-help.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/bom/upload-parts.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/templates/registration/login.html +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/third_party_apis/__init__.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/third_party_apis/base_api.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/third_party_apis/google_drive.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/third_party_apis/mouser.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/third_party_apis/test_apis.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/utils.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/validators.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/views/__init__.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/views/json_views.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/bom/wsgi.py +0 -0
- {django_bom-1.255 → django_bom-1.261}/django_bom.egg-info/dependency_links.txt +0 -0
- {django_bom-1.255 → django_bom-1.261}/django_bom.egg-info/top_level.txt +0 -0
- {django_bom-1.255 → django_bom-1.261}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-bom
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.261
|
|
4
4
|
Summary: A simple Django app to manage a bill of materials.
|
|
5
5
|
Author-email: Mike Kasparian <mpkasp@gmail.com>
|
|
6
6
|
License: GPL-3.0-only
|
|
@@ -22,7 +22,7 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
|
22
22
|
Requires-Python: >=3.10
|
|
23
23
|
Description-Content-Type: text/markdown
|
|
24
24
|
License-File: LICENSE
|
|
25
|
-
Requires-Dist: Django
|
|
25
|
+
Requires-Dist: Django>=5.2
|
|
26
26
|
Requires-Dist: social-auth-app-django<6,>=5
|
|
27
27
|
Requires-Dist: social-auth-core<6,>=4
|
|
28
28
|
Requires-Dist: google-api-python-client>=2
|
|
@@ -10,9 +10,13 @@ from .models import (
|
|
|
10
10
|
Part,
|
|
11
11
|
PartClass,
|
|
12
12
|
PartRevision,
|
|
13
|
+
PartRevisionProperty,
|
|
14
|
+
PartRevisionPropertyDefinition,
|
|
13
15
|
Seller,
|
|
14
16
|
SellerPart,
|
|
15
17
|
Subpart,
|
|
18
|
+
UnitDefinition,
|
|
19
|
+
QuantityOfMeasure,
|
|
16
20
|
get_organization_model,
|
|
17
21
|
get_user_meta_model
|
|
18
22
|
)
|
|
@@ -87,7 +91,10 @@ class PartClassAdmin(admin.ModelAdmin):
|
|
|
87
91
|
|
|
88
92
|
class PartRevisionAdminInline(admin.TabularInline):
|
|
89
93
|
model = PartRevision
|
|
94
|
+
extra = 0
|
|
90
95
|
raw_id_fields = ('assembly',)
|
|
96
|
+
readonly_fields = ('timestamp',)
|
|
97
|
+
show_change_link = True
|
|
91
98
|
|
|
92
99
|
|
|
93
100
|
class PartAdmin(admin.ModelAdmin):
|
|
@@ -97,8 +104,10 @@ class PartAdmin(admin.ModelAdmin):
|
|
|
97
104
|
'organization',
|
|
98
105
|
'get_full_part_number',
|
|
99
106
|
)
|
|
107
|
+
list_filter = ('organization', 'number_class',)
|
|
100
108
|
raw_id_fields = ('number_class', 'primary_manufacturer_part',)
|
|
101
109
|
inlines = [
|
|
110
|
+
PartRevisionAdminInline,
|
|
102
111
|
ManufacturerPartAdminInline,
|
|
103
112
|
]
|
|
104
113
|
|
|
@@ -109,10 +118,22 @@ class PartAdmin(admin.ModelAdmin):
|
|
|
109
118
|
get_full_part_number.admin_order_field = 'number_class__part_number'
|
|
110
119
|
|
|
111
120
|
|
|
121
|
+
class QuantityOfMeasureAdmin(admin.ModelAdmin):
|
|
122
|
+
list_display = ('name', 'organization')
|
|
123
|
+
list_filter = ('organization',)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class PartRevisionPropertyInline(admin.TabularInline):
|
|
127
|
+
model = PartRevisionProperty
|
|
128
|
+
extra = 1
|
|
129
|
+
raw_id_fields = ('property_definition', 'part_revision', 'unit_definition')
|
|
130
|
+
|
|
131
|
+
|
|
112
132
|
class PartRevisionAdmin(admin.ModelAdmin):
|
|
113
133
|
list_display = ('part', 'revision', 'description', 'get_assembly_size', 'timestamp',)
|
|
114
134
|
raw_id_fields = ('assembly',)
|
|
115
135
|
readonly_fields = ('timestamp',)
|
|
136
|
+
inlines = [PartRevisionPropertyInline]
|
|
116
137
|
|
|
117
138
|
def get_assembly_size(self, obj):
|
|
118
139
|
return None if obj.assembly is None else obj.assembly.subparts.count()
|
|
@@ -141,6 +162,16 @@ class AssemblyAdmin(admin.ModelAdmin):
|
|
|
141
162
|
]
|
|
142
163
|
|
|
143
164
|
|
|
165
|
+
class UnitDefinitionAdmin(admin.ModelAdmin):
|
|
166
|
+
list_display = ('name', 'symbol', 'quantity_of_measure', 'base_multiplier', 'organization')
|
|
167
|
+
list_filter = ('organization',)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
class PartRevisionPropertyDefinitionAdmin(admin.ModelAdmin):
|
|
171
|
+
list_display = ('code', 'name', 'type', 'organization', 'quantity_of_measure')
|
|
172
|
+
list_filter = ('organization',)
|
|
173
|
+
|
|
174
|
+
|
|
144
175
|
if settings.BOM_USER_META_MODEL == 'bom.UserMeta':
|
|
145
176
|
current_user_admin = admin.site._registry.get(User)
|
|
146
177
|
|
|
@@ -171,3 +202,6 @@ admin.site.register(PartRevision, PartRevisionAdmin)
|
|
|
171
202
|
admin.site.register(Manufacturer, ManufacturerAdmin)
|
|
172
203
|
admin.site.register(Assembly, AssemblyAdmin)
|
|
173
204
|
admin.site.register(Subpart, SubpartAdmin)
|
|
205
|
+
admin.site.register(UnitDefinition, UnitDefinitionAdmin)
|
|
206
|
+
admin.site.register(PartRevisionPropertyDefinition, PartRevisionPropertyDefinitionAdmin)
|
|
207
|
+
admin.site.register(QuantityOfMeasure, QuantityOfMeasureAdmin)
|
|
@@ -34,6 +34,13 @@ DATA_SOURCES = (
|
|
|
34
34
|
(DATA_SOURCE_MOUSER, 'mouser'),
|
|
35
35
|
)
|
|
36
36
|
|
|
37
|
+
PART_REVISION_PROPERTY_TYPE_STRING = 'S'
|
|
38
|
+
PART_REVISION_PROPERTY_TYPE_DECIMAL = 'D'
|
|
39
|
+
PART_REVISION_PROPERTY_TYPE_BOOLEAN = 'B'
|
|
40
|
+
PART_REVISION_PROPERTY_TYPES = ((PART_REVISION_PROPERTY_TYPE_STRING, 'String'),
|
|
41
|
+
(PART_REVISION_PROPERTY_TYPE_DECIMAL, 'Number'),
|
|
42
|
+
(PART_REVISION_PROPERTY_TYPE_BOOLEAN, 'Boolean'),)
|
|
43
|
+
|
|
37
44
|
VALUE_UNITS = (
|
|
38
45
|
NO_CHOICE,
|
|
39
46
|
('Ohms', '\u03A9'),
|
|
@@ -35,8 +35,11 @@ class CSVHeader:
|
|
|
35
35
|
class CSVHeaders(ABC):
|
|
36
36
|
all_headers_defns = []
|
|
37
37
|
|
|
38
|
+
def __init__(self, *args, **kwargs):
|
|
39
|
+
self.headers_defns = list(self.all_headers_defns)
|
|
40
|
+
|
|
38
41
|
def get_synoynms(self, hdr_name):
|
|
39
|
-
for defn in self.
|
|
42
|
+
for defn in self.headers_defns:
|
|
40
43
|
if hdr_name in defn:
|
|
41
44
|
return defn.synonyms()
|
|
42
45
|
else:
|
|
@@ -53,7 +56,7 @@ class CSVHeaders(ABC):
|
|
|
53
56
|
|
|
54
57
|
# Preserves order of definitions as listed in all_header_defns:
|
|
55
58
|
def get_default_all(self):
|
|
56
|
-
return [d.name for d in self.
|
|
59
|
+
return [d.name for d in self.headers_defns]
|
|
57
60
|
|
|
58
61
|
# Given a list of header names returns the default name for each. The return list
|
|
59
62
|
# matches the order of the input list. If a name is not recognized, then returns
|
|
@@ -151,6 +154,9 @@ class CSVHeaders(ABC):
|
|
|
151
154
|
return True
|
|
152
155
|
raise CSVHeaderError(f'Missing column named {header}')
|
|
153
156
|
|
|
157
|
+
def add_header(self, header):
|
|
158
|
+
self.headers_defns.append(header)
|
|
159
|
+
|
|
154
160
|
|
|
155
161
|
#
|
|
156
162
|
# For each CSV header class, a static data member dictionary uses the key as the default name for the header while the
|
|
@@ -190,52 +196,25 @@ class PartClassesCSVHeaders(CSVHeaders):
|
|
|
190
196
|
]
|
|
191
197
|
|
|
192
198
|
|
|
193
|
-
class
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
CSVHeader('wavelength', name_options=[]),
|
|
204
|
-
CSVHeader('wavelength_units', name_options=[]),
|
|
205
|
-
CSVHeader('memory', name_options=[]),
|
|
206
|
-
CSVHeader('memory_units', name_options=[]),
|
|
207
|
-
CSVHeader('interface', name_options=[]),
|
|
208
|
-
CSVHeader('supply_voltage', name_options=[]),
|
|
209
|
-
CSVHeader('supply_voltage_units', name_options=[]),
|
|
210
|
-
CSVHeader('temperature_rating', name_options=[]),
|
|
211
|
-
CSVHeader('temperature_rating_units', name_options=[]),
|
|
212
|
-
CSVHeader('power_rating', name_options=[]),
|
|
213
|
-
CSVHeader('power_rating_units', name_options=[]),
|
|
214
|
-
CSVHeader('voltage_rating', name_options=[]),
|
|
215
|
-
CSVHeader('voltage_rating_units', name_options=[]),
|
|
216
|
-
CSVHeader('current_rating', name_options=[]),
|
|
217
|
-
CSVHeader('current_rating_units', name_options=[]),
|
|
218
|
-
CSVHeader('material', name_options=[]),
|
|
219
|
-
CSVHeader('color', name_options=[]),
|
|
220
|
-
CSVHeader('finish', name_options=[]),
|
|
221
|
-
CSVHeader('length', name_options=[]),
|
|
222
|
-
CSVHeader('length_units', name_options=[]),
|
|
223
|
-
CSVHeader('width', name_options=[]),
|
|
224
|
-
CSVHeader('width_units', name_options=[]),
|
|
225
|
-
CSVHeader('height', name_options=[]),
|
|
226
|
-
CSVHeader('height_units', name_options=[]),
|
|
227
|
-
CSVHeader('weight', name_options=[]),
|
|
228
|
-
CSVHeader('weight_units', name_options=[]),
|
|
229
|
-
]
|
|
199
|
+
class PartRevisionPropertyCSVHeaders(CSVHeaders):
|
|
200
|
+
def add_dynamic_headers(self, definitions):
|
|
201
|
+
for defn in definitions:
|
|
202
|
+
self.add_header(
|
|
203
|
+
CSVHeader(defn.form_field_name,
|
|
204
|
+
name_options=[defn.name, f'property_{defn.code}', f'property_{defn.name}', 'p']))
|
|
205
|
+
if defn.quantity_of_measure:
|
|
206
|
+
self.add_header(
|
|
207
|
+
CSVHeader(defn.form_unit_field_name, name_options=[f'{defn.name} Units', f'{defn.code}_units']))
|
|
208
|
+
|
|
230
209
|
|
|
210
|
+
class PartsListCSVHeaders(PartRevisionPropertyCSVHeaders):
|
|
231
211
|
all_headers_defns = [
|
|
232
212
|
CSVHeader('description', name_options=['desc', 'desc.', ]),
|
|
233
213
|
CSVHeader('manufacturer_name', name_options=['mfg_name', 'manufacturer_name', 'part_manufacturer', 'mfg', 'manufacturer', 'manufacturer name', ]),
|
|
234
214
|
CSVHeader('manufacturer_part_number', name_options=['mpn', 'mfg_part_number', 'part_manufacturer_part_number', 'mfg part number', 'manufacturer part number']),
|
|
235
215
|
CSVHeader('part_number', name_options=['part number', 'part no', ]),
|
|
236
216
|
CSVHeader('revision', name_options=['rev', 'part_revision', ]),
|
|
237
|
-
|
|
238
|
-
+ SellerPartCSVHeaders.all_headers_defns
|
|
217
|
+
] + SellerPartCSVHeaders.all_headers_defns
|
|
239
218
|
|
|
240
219
|
|
|
241
220
|
class PartsListCSVHeadersSemiIntelligent(PartsListCSVHeaders):
|
|
@@ -246,11 +225,10 @@ class PartsListCSVHeadersSemiIntelligent(PartsListCSVHeaders):
|
|
|
246
225
|
CSVHeader('part_class', name_options=['class', 'part_category']),
|
|
247
226
|
CSVHeader('part_number', name_options=['part number', 'part no', ]),
|
|
248
227
|
CSVHeader('revision', name_options=['rev', 'part_revision', ]),
|
|
249
|
-
|
|
250
|
-
+ SellerPartCSVHeaders.all_headers_defns
|
|
228
|
+
] + SellerPartCSVHeaders.all_headers_defns
|
|
251
229
|
|
|
252
230
|
|
|
253
|
-
class BOMFlatCSVHeaders(
|
|
231
|
+
class BOMFlatCSVHeaders(PartRevisionPropertyCSVHeaders):
|
|
254
232
|
all_headers_defns = [
|
|
255
233
|
CSVHeader('part_number', name_options=['part number', 'part no', ]),
|
|
256
234
|
CSVHeader('quantity', name_options=['count', 'qty', 'quantity', ]),
|