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.
Files changed (193) hide show
  1. {django_bom-1.241/django_bom.egg-info → django_bom-1.245}/PKG-INFO +1 -1
  2. {django_bom-1.241 → django_bom-1.245}/bom/admin.py +15 -11
  3. {django_bom-1.241 → 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.241 → django_bom-1.245}/bom/settings.py +2 -6
  6. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/settings.html +18 -13
  7. {django_bom-1.241 → django_bom-1.245}/bom/views/views.py +1 -1
  8. {django_bom-1.241 → django_bom-1.245/django_bom.egg-info}/PKG-INFO +1 -1
  9. {django_bom-1.241 → django_bom-1.245}/django_bom.egg-info/SOURCES.txt +1 -0
  10. {django_bom-1.241 → django_bom-1.245}/pyproject.toml +1 -1
  11. {django_bom-1.241 → django_bom-1.245}/LICENSE +0 -0
  12. {django_bom-1.241 → django_bom-1.245}/MANIFEST.in +0 -0
  13. {django_bom-1.241 → django_bom-1.245}/README.md +0 -0
  14. {django_bom-1.241 → django_bom-1.245}/bom/__init__.py +0 -0
  15. {django_bom-1.241 → django_bom-1.245}/bom/apps.py +0 -0
  16. {django_bom-1.241 → django_bom-1.245}/bom/auth_backends.py +0 -0
  17. {django_bom-1.241 → django_bom-1.245}/bom/base_classes.py +0 -0
  18. {django_bom-1.241 → django_bom-1.245}/bom/constants.py +0 -0
  19. {django_bom-1.241 → django_bom-1.245}/bom/context_processors.py +0 -0
  20. {django_bom-1.241 → django_bom-1.245}/bom/csv_headers.py +0 -0
  21. {django_bom-1.241 → django_bom-1.245}/bom/decorators.py +0 -0
  22. {django_bom-1.241 → django_bom-1.245}/bom/form_fields.py +0 -0
  23. {django_bom-1.241 → django_bom-1.245}/bom/helpers.py +0 -0
  24. {django_bom-1.241 → django_bom-1.245}/bom/local_settings.py +0 -0
  25. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0001_initial.py +0 -0
  26. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0002_auto_20180908_2151.py +0 -0
  27. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0003_sellerpart_data_source.py +0 -0
  28. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0004_auto_20180911_0011.py +0 -0
  29. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0005_auto_20181007_1934.py +0 -0
  30. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0006_auto_20181007_1949.py +0 -0
  31. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0007_auto_20181009_0256.py +0 -0
  32. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0008_auto_20181030_0427.py +0 -0
  33. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0009_subpart_reference.py +0 -0
  34. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0010_auto_20181202_0733.py +0 -0
  35. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0011_auto_20181202_2113.py +0 -0
  36. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0012_partchangehistory.py +0 -0
  37. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0013_auto_20190222_1631.py +0 -0
  38. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0014_auto_20190223_2353.py +0 -0
  39. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0015_auto_20190303_1915.py +0 -0
  40. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0016_auto_20190405_2308.py +0 -0
  41. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0017_auto_20190616_1912.py +0 -0
  42. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0018_auto_20190616_2143.py +0 -0
  43. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0019_auto_20190624_1246.py +0 -0
  44. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0020_auto_20190627_0207.py +0 -0
  45. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0021_auto_20190627_0428.py +0 -0
  46. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0022_auto_20190811_2140.py +0 -0
  47. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0023_auto_20191205_2351.py +0 -0
  48. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0024_auto_20191214_1342.py +0 -0
  49. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0025_auto_20191221_1907.py +0 -0
  50. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0026_auto_20191222_2258.py +0 -0
  51. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0027_auto_20191222_2347.py +0 -0
  52. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0028_partrevision_displayable_synopsis.py +0 -0
  53. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0029_auto_20191231_1630.py +0 -0
  54. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0030_auto_20200101_2253.py +0 -0
  55. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0031_auto_20200104_1352.py +0 -0
  56. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0032_auto_20200126_1806.py +0 -0
  57. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0033_auto_20200203_0618.py +0 -0
  58. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0034_auto_20200222_0359.py +0 -0
  59. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0035_auto_20200303_0111.py +0 -0
  60. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0036_auto_20200303_0538.py +0 -0
  61. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0037_auto_20200405_1642.py +0 -0
  62. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0038_auto_20200422_0504.py +0 -0
  63. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0039_auto_20200929_2315.py +0 -0
  64. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0040_alter_organization_currency.py +0 -0
  65. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0041_organization_subscription_quantity.py +0 -0
  66. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0042_auto_20210720_2137.py +0 -0
  67. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0043_auto_20211123_0157.py +0 -0
  68. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0044_auto_20220831_1241.py +0 -0
  69. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0045_sellerpart_link.py +0 -0
  70. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0046_alter_sellerpart_unique_together.py +0 -0
  71. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0047_sellerpart_seller_part_number.py +0 -0
  72. {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
  73. {django_bom-1.241 → django_bom-1.245}/bom/migrations/0049_alter_assembly_id_alter_assemblysubparts_id_and_more.py +0 -0
  74. {django_bom-1.241 → django_bom-1.245}/bom/migrations/__init__.py +0 -0
  75. {django_bom-1.241 → django_bom-1.245}/bom/models.py +0 -0
  76. {django_bom-1.241 → django_bom-1.245}/bom/part_bom.py +0 -0
  77. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/dashboard.css +0 -0
  78. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/jquery.treetable.css +0 -0
  79. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/materialize.min.css +0 -0
  80. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/part-info.css +0 -0
  81. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/style.css +0 -0
  82. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/tablesorter-theme.materialize.css +0 -0
  83. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/css/treetable-theme.css +0 -0
  84. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/sample_part_classes.csv +0 -0
  85. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/test_bom.csv +0 -0
  86. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/test_bom_5_intelligent.csv +0 -0
  87. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/test_full_bom.csv +0 -0
  88. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/test_new_parts.csv +0 -0
  89. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/doc/test_new_parts_5_intelligent.csv +0 -0
  90. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/_ionicons_svg_md-arrow-dropdown.svg +0 -0
  91. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/_ionicons_svg_md-arrow-dropright.svg +0 -0
  92. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/favicon.ico +0 -0
  93. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_disabled_web.png +0 -0
  94. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_focus_web.png +0 -0
  95. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_normal_web.png +0 -0
  96. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_pressed_web.png +0 -0
  97. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_disabled_web.png +0 -0
  98. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_focus_web.png +0 -0
  99. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_normal_web.png +0 -0
  100. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/1x/btn_google_signin_light_pressed_web.png +0 -0
  101. {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
  102. {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
  103. {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
  104. {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
  105. {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
  106. {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
  107. {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
  108. {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
  109. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.eps +0 -0
  110. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.svg +0 -0
  111. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.eps +0 -0
  112. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.svg +0 -0
  113. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.eps +0 -0
  114. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.svg +0 -0
  115. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.eps +0 -0
  116. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.svg +0 -0
  117. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.eps +0 -0
  118. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.svg +0 -0
  119. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.eps +0 -0
  120. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.svg +0 -0
  121. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.eps +0 -0
  122. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.svg +0 -0
  123. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.eps +0 -0
  124. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.svg +0 -0
  125. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/google_drive_logo.svg +0 -0
  126. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/indabom.png +0 -0
  127. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/mouser.png +0 -0
  128. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/img/octopart_blue.svg +0 -0
  129. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/js/jquery-3.4.1.min.js +0 -0
  130. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/js/jquery.ba-floatingscrollbar.min.js +0 -0
  131. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/js/jquery.treetable.js +0 -0
  132. {django_bom-1.241 → django_bom-1.245}/bom/static/bom/js/materialize.min.js +0 -0
  133. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/account-delete.html +0 -0
  134. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/add-manufacturer-part.html +0 -0
  135. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/add-sellerpart.html +0 -0
  136. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/base-menu.html +0 -0
  137. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/base.html +0 -0
  138. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-action-btn.html +0 -0
  139. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-action-table.html +0 -0
  140. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-base-menu.html +0 -0
  141. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-base.html +0 -0
  142. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-form-modal.html +0 -0
  143. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-form.html +0 -0
  144. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-modal-add-users.html +0 -0
  145. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/bom-signup.html +0 -0
  146. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/components/bom-flat.html +0 -0
  147. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/components/bom-indented.html +0 -0
  148. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/components/manufacturer-part-list.html +0 -0
  149. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/components/seller-part-list.html +0 -0
  150. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/create-part.html +0 -0
  151. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/dashboard-menu.html +0 -0
  152. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/dashboard.html +0 -0
  153. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/edit-manufacturer-part.html +0 -0
  154. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/edit-part-class.html +0 -0
  155. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/edit-part.html +0 -0
  156. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/edit-user-meta.html +0 -0
  157. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/help.html +0 -0
  158. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/manufacturer-info.html +0 -0
  159. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/manufacturers.html +0 -0
  160. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/nothing-to-see.html +0 -0
  161. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/organization-create.html +0 -0
  162. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-info.html +0 -0
  163. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-revision-display.html +0 -0
  164. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-revision-edit.html +0 -0
  165. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-revision-manage-bom.html +0 -0
  166. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-revision-new.html +0 -0
  167. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/part-revision-release.html +0 -0
  168. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/search-help.html +0 -0
  169. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/seller-info.html +0 -0
  170. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/sellers.html +0 -0
  171. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/signup.html +0 -0
  172. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/subscription_panel.html +0 -0
  173. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/table_of_contents.html +0 -0
  174. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/upload-bom.html +0 -0
  175. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/upload-parts-help.html +0 -0
  176. {django_bom-1.241 → django_bom-1.245}/bom/templates/bom/upload-parts.html +0 -0
  177. {django_bom-1.241 → django_bom-1.245}/bom/templates/registration/login.html +0 -0
  178. {django_bom-1.241 → django_bom-1.245}/bom/tests.py +0 -0
  179. {django_bom-1.241 → django_bom-1.245}/bom/third_party_apis/__init__.py +0 -0
  180. {django_bom-1.241 → django_bom-1.245}/bom/third_party_apis/base_api.py +0 -0
  181. {django_bom-1.241 → django_bom-1.245}/bom/third_party_apis/google_drive.py +0 -0
  182. {django_bom-1.241 → django_bom-1.245}/bom/third_party_apis/mouser.py +0 -0
  183. {django_bom-1.241 → django_bom-1.245}/bom/third_party_apis/test_apis.py +0 -0
  184. {django_bom-1.241 → django_bom-1.245}/bom/urls.py +0 -0
  185. {django_bom-1.241 → django_bom-1.245}/bom/utils.py +0 -0
  186. {django_bom-1.241 → django_bom-1.245}/bom/validators.py +0 -0
  187. {django_bom-1.241 → django_bom-1.245}/bom/views/__init__.py +0 -0
  188. {django_bom-1.241 → django_bom-1.245}/bom/views/json_views.py +0 -0
  189. {django_bom-1.241 → django_bom-1.245}/bom/wsgi.py +0 -0
  190. {django_bom-1.241 → django_bom-1.245}/django_bom.egg-info/dependency_links.txt +0 -0
  191. {django_bom-1.241 → django_bom-1.245}/django_bom.egg-info/requires.txt +0 -0
  192. {django_bom-1.241 → django_bom-1.245}/django_bom.egg-info/top_level.txt +0 -0
  193. {django_bom-1.241 → 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.241
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:
@@ -228,7 +228,7 @@
228
228
  enctype="multipart/form-data">
229
229
  {% csrf_token %}
230
230
  <div class="row">
231
- {{ organization_form|materializecss:'s12 l4' }}
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
- <form action="{% url 'social:disconnect' 'google-oauth2' %}" method="post">
340
- {% csrf_token %}
341
- <button class="waves-effect waves-light btn btn-primary" type="submit">Disconnect
342
- </button>
343
- </form>
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
- <a href="{% url "social:begin" "google-oauth2" %}">
347
- <img title="Google sign-in."
348
- src="{% static 'bom/img/google/web/1x/btn_google_signin_dark_normal_web.png' %}">
349
- </a>
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)).exclude(id__in=[organization.owner.id]).order_by(
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-bom
3
- Version: 1.241
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
@@ -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.241"
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