django-bom 1.239__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.
Files changed (195) hide show
  1. {django_bom-1.239/django_bom.egg-info → django_bom-1.245}/PKG-INFO +1 -1
  2. {django_bom-1.239 → django_bom-1.245}/bom/admin.py +15 -11
  3. {django_bom-1.239 → django_bom-1.245}/bom/forms.py +2 -22
  4. django_bom-1.245/bom/migrations/0050_alter_organization_options.py +17 -0
  5. {django_bom-1.239 → django_bom-1.245}/bom/settings.py +2 -6
  6. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/css/style.css +85 -5
  7. django_bom-1.245/bom/templates/bom/settings.html +465 -0
  8. django_bom-1.245/bom/templates/bom/subscription_panel.html +16 -0
  9. {django_bom-1.239 → django_bom-1.245}/bom/views/views.py +2 -3
  10. {django_bom-1.239 → django_bom-1.245/django_bom.egg-info}/PKG-INFO +1 -1
  11. {django_bom-1.239 → django_bom-1.245}/django_bom.egg-info/SOURCES.txt +2 -1
  12. {django_bom-1.239 → django_bom-1.245}/pyproject.toml +1 -1
  13. django_bom-1.239/bom/templates/bom/_subscription_panel.html +0 -6
  14. django_bom-1.239/bom/templates/bom/settings.html +0 -399
  15. {django_bom-1.239 → django_bom-1.245}/LICENSE +0 -0
  16. {django_bom-1.239 → django_bom-1.245}/MANIFEST.in +0 -0
  17. {django_bom-1.239 → django_bom-1.245}/README.md +0 -0
  18. {django_bom-1.239 → django_bom-1.245}/bom/__init__.py +0 -0
  19. {django_bom-1.239 → django_bom-1.245}/bom/apps.py +0 -0
  20. {django_bom-1.239 → django_bom-1.245}/bom/auth_backends.py +0 -0
  21. {django_bom-1.239 → django_bom-1.245}/bom/base_classes.py +0 -0
  22. {django_bom-1.239 → django_bom-1.245}/bom/constants.py +0 -0
  23. {django_bom-1.239 → django_bom-1.245}/bom/context_processors.py +0 -0
  24. {django_bom-1.239 → django_bom-1.245}/bom/csv_headers.py +0 -0
  25. {django_bom-1.239 → django_bom-1.245}/bom/decorators.py +0 -0
  26. {django_bom-1.239 → django_bom-1.245}/bom/form_fields.py +0 -0
  27. {django_bom-1.239 → django_bom-1.245}/bom/helpers.py +0 -0
  28. {django_bom-1.239 → django_bom-1.245}/bom/local_settings.py +0 -0
  29. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0001_initial.py +0 -0
  30. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0002_auto_20180908_2151.py +0 -0
  31. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0003_sellerpart_data_source.py +0 -0
  32. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0004_auto_20180911_0011.py +0 -0
  33. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0005_auto_20181007_1934.py +0 -0
  34. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0006_auto_20181007_1949.py +0 -0
  35. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0007_auto_20181009_0256.py +0 -0
  36. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0008_auto_20181030_0427.py +0 -0
  37. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0009_subpart_reference.py +0 -0
  38. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0010_auto_20181202_0733.py +0 -0
  39. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0011_auto_20181202_2113.py +0 -0
  40. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0012_partchangehistory.py +0 -0
  41. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0013_auto_20190222_1631.py +0 -0
  42. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0014_auto_20190223_2353.py +0 -0
  43. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0015_auto_20190303_1915.py +0 -0
  44. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0016_auto_20190405_2308.py +0 -0
  45. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0017_auto_20190616_1912.py +0 -0
  46. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0018_auto_20190616_2143.py +0 -0
  47. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0019_auto_20190624_1246.py +0 -0
  48. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0020_auto_20190627_0207.py +0 -0
  49. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0021_auto_20190627_0428.py +0 -0
  50. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0022_auto_20190811_2140.py +0 -0
  51. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0023_auto_20191205_2351.py +0 -0
  52. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0024_auto_20191214_1342.py +0 -0
  53. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0025_auto_20191221_1907.py +0 -0
  54. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0026_auto_20191222_2258.py +0 -0
  55. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0027_auto_20191222_2347.py +0 -0
  56. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0028_partrevision_displayable_synopsis.py +0 -0
  57. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0029_auto_20191231_1630.py +0 -0
  58. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0030_auto_20200101_2253.py +0 -0
  59. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0031_auto_20200104_1352.py +0 -0
  60. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0032_auto_20200126_1806.py +0 -0
  61. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0033_auto_20200203_0618.py +0 -0
  62. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0034_auto_20200222_0359.py +0 -0
  63. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0035_auto_20200303_0111.py +0 -0
  64. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0036_auto_20200303_0538.py +0 -0
  65. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0037_auto_20200405_1642.py +0 -0
  66. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0038_auto_20200422_0504.py +0 -0
  67. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0039_auto_20200929_2315.py +0 -0
  68. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0040_alter_organization_currency.py +0 -0
  69. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0041_organization_subscription_quantity.py +0 -0
  70. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0042_auto_20210720_2137.py +0 -0
  71. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0043_auto_20211123_0157.py +0 -0
  72. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0044_auto_20220831_1241.py +0 -0
  73. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0045_sellerpart_link.py +0 -0
  74. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0046_alter_sellerpart_unique_together.py +0 -0
  75. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0047_sellerpart_seller_part_number.py +0 -0
  76. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0048_rename_part_organization_number_class_bom_part_organiz_b333d6_idx_and_more.py +0 -0
  77. {django_bom-1.239 → django_bom-1.245}/bom/migrations/0049_alter_assembly_id_alter_assemblysubparts_id_and_more.py +0 -0
  78. {django_bom-1.239 → django_bom-1.245}/bom/migrations/__init__.py +0 -0
  79. {django_bom-1.239 → django_bom-1.245}/bom/models.py +0 -0
  80. {django_bom-1.239 → django_bom-1.245}/bom/part_bom.py +0 -0
  81. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/css/dashboard.css +0 -0
  82. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/css/jquery.treetable.css +0 -0
  83. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/css/materialize.min.css +0 -0
  84. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/css/part-info.css +0 -0
  85. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/css/tablesorter-theme.materialize.css +0 -0
  86. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/css/treetable-theme.css +0 -0
  87. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/doc/sample_part_classes.csv +0 -0
  88. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/doc/test_bom.csv +0 -0
  89. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/doc/test_bom_5_intelligent.csv +0 -0
  90. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/doc/test_full_bom.csv +0 -0
  91. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/doc/test_new_parts.csv +0 -0
  92. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/doc/test_new_parts_5_intelligent.csv +0 -0
  93. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/_ionicons_svg_md-arrow-dropdown.svg +0 -0
  94. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/_ionicons_svg_md-arrow-dropright.svg +0 -0
  95. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/favicon.ico +0 -0
  96. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_disabled_web.png +0 -0
  97. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_focus_web.png +0 -0
  98. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_normal_web.png +0 -0
  99. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_pressed_web.png +0 -0
  100. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_disabled_web.png +0 -0
  101. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_focus_web.png +0 -0
  102. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_normal_web.png +0 -0
  103. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_pressed_web.png +0 -0
  104. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_disabled_web@2x.png +0 -0
  105. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_focus_web@2x.png +0 -0
  106. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_normal_web@2x.png +0 -0
  107. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_pressed_web@2x.png +0 -0
  108. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_light_disabled_web@2x.png +0 -0
  109. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_light_focus_web@2x.png +0 -0
  110. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_light_normal_web@2x.png +0 -0
  111. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/2x/btn_google_signin_light_pressed_web@2x.png +0 -0
  112. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.eps +0 -0
  113. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.svg +0 -0
  114. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.eps +0 -0
  115. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.svg +0 -0
  116. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.eps +0 -0
  117. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.svg +0 -0
  118. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.eps +0 -0
  119. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.svg +0 -0
  120. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.eps +0 -0
  121. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.svg +0 -0
  122. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.eps +0 -0
  123. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.svg +0 -0
  124. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.eps +0 -0
  125. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.svg +0 -0
  126. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.eps +0 -0
  127. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.svg +0 -0
  128. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/google_drive_logo.svg +0 -0
  129. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/indabom.png +0 -0
  130. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/mouser.png +0 -0
  131. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/img/octopart_blue.svg +0 -0
  132. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/js/jquery-3.4.1.min.js +0 -0
  133. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/js/jquery.ba-floatingscrollbar.min.js +0 -0
  134. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/js/jquery.treetable.js +0 -0
  135. {django_bom-1.239 → django_bom-1.245}/bom/static/bom/js/materialize.min.js +0 -0
  136. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/account-delete.html +0 -0
  137. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/add-manufacturer-part.html +0 -0
  138. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/add-sellerpart.html +0 -0
  139. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/base-menu.html +0 -0
  140. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/base.html +0 -0
  141. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/bom-action-btn.html +0 -0
  142. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/bom-action-table.html +0 -0
  143. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/bom-base-menu.html +0 -0
  144. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/bom-base.html +0 -0
  145. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/bom-form-modal.html +0 -0
  146. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/bom-form.html +0 -0
  147. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/bom-modal-add-users.html +0 -0
  148. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/bom-signup.html +0 -0
  149. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/components/bom-flat.html +0 -0
  150. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/components/bom-indented.html +0 -0
  151. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/components/manufacturer-part-list.html +0 -0
  152. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/components/seller-part-list.html +0 -0
  153. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/create-part.html +0 -0
  154. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/dashboard-menu.html +0 -0
  155. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/dashboard.html +0 -0
  156. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/edit-manufacturer-part.html +0 -0
  157. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/edit-part-class.html +0 -0
  158. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/edit-part.html +0 -0
  159. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/edit-user-meta.html +0 -0
  160. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/help.html +0 -0
  161. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/manufacturer-info.html +0 -0
  162. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/manufacturers.html +0 -0
  163. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/nothing-to-see.html +0 -0
  164. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/organization-create.html +0 -0
  165. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/part-info.html +0 -0
  166. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/part-revision-display.html +0 -0
  167. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/part-revision-edit.html +0 -0
  168. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/part-revision-manage-bom.html +0 -0
  169. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/part-revision-new.html +0 -0
  170. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/part-revision-release.html +0 -0
  171. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/search-help.html +0 -0
  172. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/seller-info.html +0 -0
  173. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/sellers.html +0 -0
  174. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/signup.html +0 -0
  175. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/table_of_contents.html +0 -0
  176. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/upload-bom.html +0 -0
  177. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/upload-parts-help.html +0 -0
  178. {django_bom-1.239 → django_bom-1.245}/bom/templates/bom/upload-parts.html +0 -0
  179. {django_bom-1.239 → django_bom-1.245}/bom/templates/registration/login.html +0 -0
  180. {django_bom-1.239 → django_bom-1.245}/bom/tests.py +0 -0
  181. {django_bom-1.239 → django_bom-1.245}/bom/third_party_apis/__init__.py +0 -0
  182. {django_bom-1.239 → django_bom-1.245}/bom/third_party_apis/base_api.py +0 -0
  183. {django_bom-1.239 → django_bom-1.245}/bom/third_party_apis/google_drive.py +0 -0
  184. {django_bom-1.239 → django_bom-1.245}/bom/third_party_apis/mouser.py +0 -0
  185. {django_bom-1.239 → django_bom-1.245}/bom/third_party_apis/test_apis.py +0 -0
  186. {django_bom-1.239 → django_bom-1.245}/bom/urls.py +0 -0
  187. {django_bom-1.239 → django_bom-1.245}/bom/utils.py +0 -0
  188. {django_bom-1.239 → django_bom-1.245}/bom/validators.py +0 -0
  189. {django_bom-1.239 → django_bom-1.245}/bom/views/__init__.py +0 -0
  190. {django_bom-1.239 → django_bom-1.245}/bom/views/json_views.py +0 -0
  191. {django_bom-1.239 → django_bom-1.245}/bom/wsgi.py +0 -0
  192. {django_bom-1.239 → django_bom-1.245}/django_bom.egg-info/dependency_links.txt +0 -0
  193. {django_bom-1.239 → django_bom-1.245}/django_bom.egg-info/requires.txt +0 -0
  194. {django_bom-1.239 → django_bom-1.245}/django_bom.egg-info/top_level.txt +0 -0
  195. {django_bom-1.239 → django_bom-1.245}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-bom
3
- Version: 1.239
3
+ Version: 1.245
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
@@ -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
- # Try to unregister User model
146
- try:
147
- admin.site.unregister(User)
148
- except admin.sites.NotRegistered:
149
- pass
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, MaxValueValidator, MinLengthValidator, MinValueValidator
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, decimal, numeric
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:
@@ -8,24 +8,38 @@ main {
8
8
  min-height: 100vh;
9
9
  }
10
10
 
11
+ p {
12
+ font-size: 1.2em;
13
+ font-weight: 300;
14
+ }
15
+
16
+ li {
17
+ font-size: 1.2em;
18
+ font-weight: 300;
19
+ }
20
+
11
21
  h1 {
12
- font-size: 3.3rem;
22
+ font-size: 3.5rem;
23
+ font-weight: 300;
13
24
  }
14
25
 
15
26
  h2 {
16
- font-size: 2.8rem;
27
+ font-size: 3.0rem;
28
+ font-weight: 300;
17
29
  }
18
30
 
19
31
  h3 {
20
- font-size: 2.2rem;
32
+ font-size: 1.6rem;
33
+ font-weight: 300;
21
34
  }
22
35
 
23
36
  h4 {
24
- font-size: 1.8rem;
37
+ font-size: 1.3rem;
38
+ font-weight: 300;
25
39
  }
26
40
 
27
41
  h5 {
28
- font-size: 1.3rem;
42
+ font-size: 1.1rem;
29
43
  }
30
44
 
31
45
  .tabs {
@@ -316,4 +330,70 @@ a.anchor {
316
330
  .pagination {
317
331
  display: none;
318
332
  }
333
+ }
334
+
335
+ /* --- Settings & Admin Layout Refinements (flat, Material-inspired) --- */
336
+ /* Scoped to .container-app so marketing pages and legacy views remain unchanged. */
337
+
338
+ /* Section spacing for denser admin/settings layouts */
339
+ .container-app .section {
340
+ padding-top: 16px;
341
+ padding-bottom: 16px;
342
+ }
343
+
344
+ /* Consistent section headers with optional leading/trailing icons */
345
+ .container-app .section-title {
346
+ display: flex;
347
+ align-items: center;
348
+ gap: 8px;
349
+ margin: 0 0 8px 0;
350
+ letter-spacing: 0.2px;
351
+ font-weight: 500;
352
+ }
353
+
354
+ .container-app .section-title .material-icons {
355
+ line-height: 1;
356
+ }
357
+
358
+ .container-app .section-title img {
359
+ height: 1.8rem;
360
+ margin-left: 6px;
361
+ vertical-align: middle;
362
+ }
363
+
364
+ /* When a service logo/image is used as a leading icon, adjust spacing */
365
+ .container-app .section-title img:first-child {
366
+ margin-left: 0;
367
+ margin-right: 6px;
368
+ }
369
+
370
+ /* Comfortable dividers between blocks */
371
+ .container-app .divider {
372
+ margin: 16px 0;
373
+ }
374
+
375
+ /* Slightly smaller paragraph text and tighter rhythm in settings */
376
+ .container-app .section p {
377
+ margin: 0 0 12px 0;
378
+ }
379
+
380
+ /* Tabs separation from content */
381
+ .container-app .tabs {
382
+ margin-bottom: 12px;
383
+ }
384
+
385
+ /* Flat collections (used as key-value lists in settings) */
386
+ .container-app .collection.z-depth-0 {
387
+ border: none;
388
+ }
389
+
390
+ .container-app .collection.z-depth-0 .collection-item {
391
+ border: none;
392
+ padding-left: 0;
393
+ }
394
+
395
+ /* Button group spacing in aligned action rows */
396
+ .container-app .right-align .btn,
397
+ .container-app .right-align .btn-flat {
398
+ margin-left: 4px;
319
399
  }