django-bom 1.239__tar.gz → 1.241__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 (194) hide show
  1. {django_bom-1.239/django_bom.egg-info → django_bom-1.241}/PKG-INFO +1 -1
  2. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/css/style.css +85 -5
  3. django_bom-1.241/bom/templates/bom/settings.html +460 -0
  4. django_bom-1.241/bom/templates/bom/subscription_panel.html +16 -0
  5. {django_bom-1.239 → django_bom-1.241}/bom/views/views.py +1 -2
  6. {django_bom-1.239 → django_bom-1.241/django_bom.egg-info}/PKG-INFO +1 -1
  7. {django_bom-1.239 → django_bom-1.241}/django_bom.egg-info/SOURCES.txt +1 -1
  8. {django_bom-1.239 → django_bom-1.241}/pyproject.toml +1 -1
  9. django_bom-1.239/bom/templates/bom/_subscription_panel.html +0 -6
  10. django_bom-1.239/bom/templates/bom/settings.html +0 -399
  11. {django_bom-1.239 → django_bom-1.241}/LICENSE +0 -0
  12. {django_bom-1.239 → django_bom-1.241}/MANIFEST.in +0 -0
  13. {django_bom-1.239 → django_bom-1.241}/README.md +0 -0
  14. {django_bom-1.239 → django_bom-1.241}/bom/__init__.py +0 -0
  15. {django_bom-1.239 → django_bom-1.241}/bom/admin.py +0 -0
  16. {django_bom-1.239 → django_bom-1.241}/bom/apps.py +0 -0
  17. {django_bom-1.239 → django_bom-1.241}/bom/auth_backends.py +0 -0
  18. {django_bom-1.239 → django_bom-1.241}/bom/base_classes.py +0 -0
  19. {django_bom-1.239 → django_bom-1.241}/bom/constants.py +0 -0
  20. {django_bom-1.239 → django_bom-1.241}/bom/context_processors.py +0 -0
  21. {django_bom-1.239 → django_bom-1.241}/bom/csv_headers.py +0 -0
  22. {django_bom-1.239 → django_bom-1.241}/bom/decorators.py +0 -0
  23. {django_bom-1.239 → django_bom-1.241}/bom/form_fields.py +0 -0
  24. {django_bom-1.239 → django_bom-1.241}/bom/forms.py +0 -0
  25. {django_bom-1.239 → django_bom-1.241}/bom/helpers.py +0 -0
  26. {django_bom-1.239 → django_bom-1.241}/bom/local_settings.py +0 -0
  27. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0001_initial.py +0 -0
  28. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0002_auto_20180908_2151.py +0 -0
  29. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0003_sellerpart_data_source.py +0 -0
  30. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0004_auto_20180911_0011.py +0 -0
  31. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0005_auto_20181007_1934.py +0 -0
  32. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0006_auto_20181007_1949.py +0 -0
  33. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0007_auto_20181009_0256.py +0 -0
  34. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0008_auto_20181030_0427.py +0 -0
  35. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0009_subpart_reference.py +0 -0
  36. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0010_auto_20181202_0733.py +0 -0
  37. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0011_auto_20181202_2113.py +0 -0
  38. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0012_partchangehistory.py +0 -0
  39. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0013_auto_20190222_1631.py +0 -0
  40. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0014_auto_20190223_2353.py +0 -0
  41. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0015_auto_20190303_1915.py +0 -0
  42. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0016_auto_20190405_2308.py +0 -0
  43. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0017_auto_20190616_1912.py +0 -0
  44. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0018_auto_20190616_2143.py +0 -0
  45. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0019_auto_20190624_1246.py +0 -0
  46. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0020_auto_20190627_0207.py +0 -0
  47. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0021_auto_20190627_0428.py +0 -0
  48. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0022_auto_20190811_2140.py +0 -0
  49. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0023_auto_20191205_2351.py +0 -0
  50. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0024_auto_20191214_1342.py +0 -0
  51. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0025_auto_20191221_1907.py +0 -0
  52. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0026_auto_20191222_2258.py +0 -0
  53. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0027_auto_20191222_2347.py +0 -0
  54. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0028_partrevision_displayable_synopsis.py +0 -0
  55. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0029_auto_20191231_1630.py +0 -0
  56. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0030_auto_20200101_2253.py +0 -0
  57. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0031_auto_20200104_1352.py +0 -0
  58. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0032_auto_20200126_1806.py +0 -0
  59. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0033_auto_20200203_0618.py +0 -0
  60. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0034_auto_20200222_0359.py +0 -0
  61. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0035_auto_20200303_0111.py +0 -0
  62. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0036_auto_20200303_0538.py +0 -0
  63. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0037_auto_20200405_1642.py +0 -0
  64. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0038_auto_20200422_0504.py +0 -0
  65. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0039_auto_20200929_2315.py +0 -0
  66. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0040_alter_organization_currency.py +0 -0
  67. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0041_organization_subscription_quantity.py +0 -0
  68. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0042_auto_20210720_2137.py +0 -0
  69. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0043_auto_20211123_0157.py +0 -0
  70. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0044_auto_20220831_1241.py +0 -0
  71. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0045_sellerpart_link.py +0 -0
  72. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0046_alter_sellerpart_unique_together.py +0 -0
  73. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0047_sellerpart_seller_part_number.py +0 -0
  74. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0048_rename_part_organization_number_class_bom_part_organiz_b333d6_idx_and_more.py +0 -0
  75. {django_bom-1.239 → django_bom-1.241}/bom/migrations/0049_alter_assembly_id_alter_assemblysubparts_id_and_more.py +0 -0
  76. {django_bom-1.239 → django_bom-1.241}/bom/migrations/__init__.py +0 -0
  77. {django_bom-1.239 → django_bom-1.241}/bom/models.py +0 -0
  78. {django_bom-1.239 → django_bom-1.241}/bom/part_bom.py +0 -0
  79. {django_bom-1.239 → django_bom-1.241}/bom/settings.py +0 -0
  80. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/css/dashboard.css +0 -0
  81. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/css/jquery.treetable.css +0 -0
  82. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/css/materialize.min.css +0 -0
  83. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/css/part-info.css +0 -0
  84. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/css/tablesorter-theme.materialize.css +0 -0
  85. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/css/treetable-theme.css +0 -0
  86. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/doc/sample_part_classes.csv +0 -0
  87. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/doc/test_bom.csv +0 -0
  88. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/doc/test_bom_5_intelligent.csv +0 -0
  89. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/doc/test_full_bom.csv +0 -0
  90. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/doc/test_new_parts.csv +0 -0
  91. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/doc/test_new_parts_5_intelligent.csv +0 -0
  92. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/_ionicons_svg_md-arrow-dropdown.svg +0 -0
  93. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/_ionicons_svg_md-arrow-dropright.svg +0 -0
  94. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/favicon.ico +0 -0
  95. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_disabled_web.png +0 -0
  96. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_focus_web.png +0 -0
  97. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_normal_web.png +0 -0
  98. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/1x/btn_google_signin_dark_pressed_web.png +0 -0
  99. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/1x/btn_google_signin_light_disabled_web.png +0 -0
  100. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/1x/btn_google_signin_light_focus_web.png +0 -0
  101. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/1x/btn_google_signin_light_normal_web.png +0 -0
  102. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/1x/btn_google_signin_light_pressed_web.png +0 -0
  103. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_disabled_web@2x.png +0 -0
  104. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_focus_web@2x.png +0 -0
  105. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_normal_web@2x.png +0 -0
  106. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/2x/btn_google_signin_dark_pressed_web@2x.png +0 -0
  107. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/2x/btn_google_signin_light_disabled_web@2x.png +0 -0
  108. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/2x/btn_google_signin_light_focus_web@2x.png +0 -0
  109. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/2x/btn_google_signin_light_normal_web@2x.png +0 -0
  110. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/2x/btn_google_signin_light_pressed_web@2x.png +0 -0
  111. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.eps +0 -0
  112. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.svg +0 -0
  113. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.eps +0 -0
  114. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.svg +0 -0
  115. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.eps +0 -0
  116. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.svg +0 -0
  117. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.eps +0 -0
  118. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.svg +0 -0
  119. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.eps +0 -0
  120. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.svg +0 -0
  121. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.eps +0 -0
  122. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.svg +0 -0
  123. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.eps +0 -0
  124. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.svg +0 -0
  125. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.eps +0 -0
  126. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.svg +0 -0
  127. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/google_drive_logo.svg +0 -0
  128. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/indabom.png +0 -0
  129. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/mouser.png +0 -0
  130. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/img/octopart_blue.svg +0 -0
  131. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/js/jquery-3.4.1.min.js +0 -0
  132. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/js/jquery.ba-floatingscrollbar.min.js +0 -0
  133. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/js/jquery.treetable.js +0 -0
  134. {django_bom-1.239 → django_bom-1.241}/bom/static/bom/js/materialize.min.js +0 -0
  135. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/account-delete.html +0 -0
  136. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/add-manufacturer-part.html +0 -0
  137. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/add-sellerpart.html +0 -0
  138. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/base-menu.html +0 -0
  139. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/base.html +0 -0
  140. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/bom-action-btn.html +0 -0
  141. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/bom-action-table.html +0 -0
  142. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/bom-base-menu.html +0 -0
  143. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/bom-base.html +0 -0
  144. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/bom-form-modal.html +0 -0
  145. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/bom-form.html +0 -0
  146. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/bom-modal-add-users.html +0 -0
  147. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/bom-signup.html +0 -0
  148. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/components/bom-flat.html +0 -0
  149. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/components/bom-indented.html +0 -0
  150. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/components/manufacturer-part-list.html +0 -0
  151. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/components/seller-part-list.html +0 -0
  152. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/create-part.html +0 -0
  153. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/dashboard-menu.html +0 -0
  154. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/dashboard.html +0 -0
  155. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/edit-manufacturer-part.html +0 -0
  156. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/edit-part-class.html +0 -0
  157. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/edit-part.html +0 -0
  158. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/edit-user-meta.html +0 -0
  159. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/help.html +0 -0
  160. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/manufacturer-info.html +0 -0
  161. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/manufacturers.html +0 -0
  162. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/nothing-to-see.html +0 -0
  163. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/organization-create.html +0 -0
  164. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/part-info.html +0 -0
  165. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/part-revision-display.html +0 -0
  166. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/part-revision-edit.html +0 -0
  167. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/part-revision-manage-bom.html +0 -0
  168. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/part-revision-new.html +0 -0
  169. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/part-revision-release.html +0 -0
  170. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/search-help.html +0 -0
  171. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/seller-info.html +0 -0
  172. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/sellers.html +0 -0
  173. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/signup.html +0 -0
  174. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/table_of_contents.html +0 -0
  175. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/upload-bom.html +0 -0
  176. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/upload-parts-help.html +0 -0
  177. {django_bom-1.239 → django_bom-1.241}/bom/templates/bom/upload-parts.html +0 -0
  178. {django_bom-1.239 → django_bom-1.241}/bom/templates/registration/login.html +0 -0
  179. {django_bom-1.239 → django_bom-1.241}/bom/tests.py +0 -0
  180. {django_bom-1.239 → django_bom-1.241}/bom/third_party_apis/__init__.py +0 -0
  181. {django_bom-1.239 → django_bom-1.241}/bom/third_party_apis/base_api.py +0 -0
  182. {django_bom-1.239 → django_bom-1.241}/bom/third_party_apis/google_drive.py +0 -0
  183. {django_bom-1.239 → django_bom-1.241}/bom/third_party_apis/mouser.py +0 -0
  184. {django_bom-1.239 → django_bom-1.241}/bom/third_party_apis/test_apis.py +0 -0
  185. {django_bom-1.239 → django_bom-1.241}/bom/urls.py +0 -0
  186. {django_bom-1.239 → django_bom-1.241}/bom/utils.py +0 -0
  187. {django_bom-1.239 → django_bom-1.241}/bom/validators.py +0 -0
  188. {django_bom-1.239 → django_bom-1.241}/bom/views/__init__.py +0 -0
  189. {django_bom-1.239 → django_bom-1.241}/bom/views/json_views.py +0 -0
  190. {django_bom-1.239 → django_bom-1.241}/bom/wsgi.py +0 -0
  191. {django_bom-1.239 → django_bom-1.241}/django_bom.egg-info/dependency_links.txt +0 -0
  192. {django_bom-1.239 → django_bom-1.241}/django_bom.egg-info/requires.txt +0 -0
  193. {django_bom-1.239 → django_bom-1.241}/django_bom.egg-info/top_level.txt +0 -0
  194. {django_bom-1.239 → django_bom-1.241}/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.241
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
@@ -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
  }
@@ -0,0 +1,460 @@
1
+ {% extends 'bom/bom-base.html' %}
2
+
3
+ {% load materializecss %}
4
+ {% load static %}
5
+
6
+ {% block head-title %}{{ title }}{% endblock %}
7
+
8
+ {% block content %}
9
+ <div class="row container-app">
10
+ <div class="col s8 offset-s2">
11
+ <ul id="tabs" class="tabs tabs-fixed-width">
12
+ <li class="tab"><a id="user-tab" href="#user">User</a></li>
13
+ <li class="tab"><a id="indabom-tab" href="#indabom">IndaBOM</a></li>
14
+ <li class="tab"><a id="organization-tab" href="#organization">Organization</a></li>
15
+ </ul>
16
+ </div>
17
+
18
+ <div id="user" class="col l8 offset-l2 s12">
19
+ <div class="section">
20
+ <h4 class="section-title"><i class="material-icons teal-text text-darken-1">person</i>User</h4>
21
+ <form name="seller" action="{% url 'bom:settings' tab_anchor=USER_TAB %}" method="post">
22
+ {% csrf_token %}
23
+ <div class="row">
24
+ <div class="col s12">
25
+ <p>Your role is: <b>{{ user.bom_profile.get_role_display }}</b></p>
26
+ <p>Your username is: <b>{{ user.username }}</b></p>
27
+ <p>To request a change in role please contact <a
28
+ href="mailto:{{ organization.owner.email }}">{{ organization.owner.email }}</a> for
29
+ assistance.</p>
30
+ </div>
31
+ </div>
32
+ <div class="row">
33
+ {{ user_form.first_name|materializecss:'s12 l6' }}
34
+ {{ user_form.last_name|materializecss:'s12 l6' }}
35
+ {{ user_form.email|materializecss:'s12' }}
36
+ </div>
37
+ <div class="row">
38
+ <div class="col s12 right-align">
39
+ <button class="waves-effect waves-light btn btn-primary" type="submit"
40
+ name="submit-edit-user">
41
+ Save
42
+ </button>
43
+ </div>
44
+ </div>
45
+ </form>
46
+ </div>
47
+
48
+ <div class="section"
49
+ style="background: #ffebee; border: 1px solid #ffcdd2; padding: 16px; border-radius: 6px;">
50
+ <h5 class="section-title red-text text-darken-2" style="margin-top:0;"><i
51
+ class="material-icons red-text text-darken-2">warning</i>Danger Zone</h5>
52
+ <p>Deleting your account is permanent. If you are the organization owner, your organization will also be
53
+ deleted unless you transfer ownership before proceeding.</p>
54
+ <div class="right-align" style="margin-top: 8px;">
55
+ <a href="{% url 'account-delete' %}" class="btn red lighten-1">Delete My Account</a>
56
+ </div>
57
+ </div>
58
+ </div>
59
+
60
+ <div id="indabom" class="col s12 l8 offset-l2">
61
+ {% if profile.role == 'A' %}
62
+ {% if organization.number_scheme == 'S' %}
63
+ <div class="section">
64
+ <h4 class="section-title"><i class="material-icons teal-text text-darken-1">category</i>Part
65
+ Classes</h4>
66
+ <form name="seller" action="{% url 'bom:settings' tab_anchor=INDABOM_TAB %}" method="post" enctype="multipart/form-data">
67
+ {% csrf_token %}
68
+ {% if part_classes.count > 0 %}
69
+ <div class="row" style="margin-bottom: 0;">
70
+ <div class="input-field col s8 l4">
71
+ <select name="part-class-action">
72
+ <option value="" disabled selected>Choose your action</option>
73
+ <option value="submit-part-class-enable-mouser">Enable Mouser</option>
74
+ <option value="submit-part-class-disable-mouser">Disable Mouser</option>
75
+ <option value="submit-part-class-delete">Delete</option>
76
+ </select>
77
+ <label>Action</label>
78
+ </div>
79
+ <div class="col s2 l2">
80
+ <div class="input-field">
81
+ <button class="waves-effect waves-light btn btn-primary" type="submit">Go
82
+ </button>
83
+ </div>
84
+ </div>
85
+ <div class="col s2 l6 right-align">
86
+ <div class="input-field">
87
+ <button class="waves-effect btn-flat btn-icon-round tooltipped"
88
+ type="submit" name="submit-part-class-export"
89
+ data-tooltip="Export part classes."><i class="material-icons">file_download</i>
90
+ </button>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ <table class="striped tight">
95
+ <thead>
96
+ <tr>
97
+ <th class="text-normal"><label><input type="checkbox" id="part-class-select-all"><span></span></label></th>
98
+ <th class="text-normal">Code</th>
99
+ <th class="text-normal">Name</th>
100
+ <th class="text-normal">Description</th>
101
+ <th class="text-normal"><img height="18" style="padding: 4px 4px 0 4px;"
102
+ alt="Mouser" title="Via Mouser.com"
103
+ src="{% static 'bom/img/mouser.png' %}">Mouser
104
+ Sourcing
105
+ </th>
106
+ <th class="text-normal">Options</th>
107
+ </tr>
108
+ </thead>
109
+ <tbody>
110
+ {% for part_class in part_classes %}
111
+ <tr>
112
+ <td>
113
+ <label><input type="checkbox" class="filled-in checkbox-array" name="actions" value="{{ part_class.id }}"><span></span></label>
114
+ </td>
115
+ <td class="text-normal">{{ part_class.code }}</td>
116
+ <td class="text-normal">{{ part_class.name }}</td>
117
+ <td class="text-normal">{{ part_class.comment }}</td>
118
+ <td class="text-normal">{% if part_class.mouser_enabled %}
119
+ <img height="24" style="padding: 4px 4px 0 4px;" alt="Mouser"
120
+ title="Via Mouser.com"
121
+ src="{% static 'bom/img/mouser.png' %}">{% endif %}</td>
122
+ <td>
123
+ <a class="waves-effect btn-flat"
124
+ href="{% url 'bom:part-class-edit' part_class_id=part_class.id %}"><i
125
+ class="material-icons left">edit</i>Edit</a>
126
+ </td>
127
+ </tr>
128
+ {% endfor %}
129
+ </tbody>
130
+ </table>
131
+ {% else %}
132
+ <p>No part classes have been defined yet. <a href="{% url 'bom:help' %}#part-numbering"
133
+ target="_blank">What is a part class?</a>
134
+ </p>
135
+ <p>To get started, add your first part class, or upload some here. To help, here is <a
136
+ href="{% static 'bom/doc/sample_part_classes.csv' %}">a sample
137
+ CSV file</a>.</p>
138
+ {% endif %}
139
+ </form>
140
+ <div class="right-align" style="margin-top: 16px;">
141
+ {% include 'bom/bom-form-modal.html' with modal_title='Upload Part Classes' form=part_class_csv_form action=part_class_form_action name='submit-part-class-upload' modal_description='To batch add part classes, upload a csv that contains columns with the headers<b>`name`</b> and <b>`code`</b>. You may optionally specify a description or comment by including a column with the header <b>`description`</b> or <b>`comment`</b>.' %}
142
+ {% include 'bom/bom-form-modal.html' with modal_title='Add Part Class' form=part_class_form action=part_class_form_action name='submit-part-class-create' %}
143
+ </div>
144
+ </div>
145
+
146
+ <div class="divider"></div>
147
+
148
+ <div class="section">
149
+ <h4 class="section-title" id="indabom-part-number"><i
150
+ class="material-icons teal-text text-darken-1">format_list_numbered</i>Part Number</h4>
151
+ <form name="seller" action="{% url 'bom:settings' tab_anchor=INDABOM_TAB %}" method="post"
152
+ enctype="multipart/form-data">
153
+ {% csrf_token %}
154
+ <p>You may only increase the number of digits for each component of the part number: the
155
+ part class code (C), part item number (N), and the part variation (V).</p>
156
+ <p>Your organization's current configuration is
157
+ <b>{{ organization.number_cs }}-{{ organization.number_ns }}
158
+ {% if organization.number_vs %}-{{ organization.number_vs }}{% endif %}</b></p>
159
+ <div class="row">
160
+ {{ organization_number_len_form|materializecss:'s4 l2' }}
161
+ <div class="col s12 l6 input-field right-align">
162
+ <button class="waves-effect waves-light btn btn-primary" type="submit"
163
+ name="submit-number-item-len"
164
+ onclick="return confirm('Are you sure you want to change the number of digits?')">
165
+ Save
166
+ </button>
167
+ </div>
168
+ </div>
169
+ </form>
170
+ </div>
171
+ {% endif %}
172
+
173
+ <div class="divider"></div>
174
+
175
+ <div class="section">
176
+ <h4 class="section-title"><i class="material-icons teal-text text-darken-1">swap_horiz</i>Change
177
+ Organization Number Scheme</h4>
178
+ <p>Your organization's number scheme is currently:
179
+ <b>{{ organization.get_number_scheme_display }}</b></p>
180
+ <ul class="browser-default">
181
+ {% if organization.number_scheme == 'S' or organization_parts_count == 0 %}
182
+ <li style="padding-bottom: 16px;"><b>Semi-intelligent</b> e.g. CCC-NNNN-YY<br>Consists of 3
183
+ components: a 3-digit part class, a N-digit part number, and a 2-digit variation.
184
+ IndaBOM part numbers are designed to be simple to assign and simple to subsequently
185
+ write, type, or speak. You define the part classes in your organization, and how long
186
+ your N-digit part number is below.
187
+ </li>
188
+ {% endif %}
189
+ {% if organization.number_scheme == 'I' or organization_parts_count == 0 %}
190
+ <li><b>Intelligent</b> You control your numbers.<br>Intelligent part numbering on IndaBOM
191
+ allows the user to assign any part number to a part. The part number contains
192
+ descriptive details embedded within that provides noteworthy information about the part.
193
+ For example, a capacitor may be named C0402X5R33PF to indicate that it is a capacitor of
194
+ size "0402", using a X5R dialectric, and is 33pF.
195
+ </li>
196
+ {% endif %}
197
+ </ul>
198
+ <p style="font-size: 15px;">You can read more about the options <a
199
+ href="{% url 'bom:help' %}#part-numbering" target="_blank">here</a>.</p>
200
+ {% if organization_parts_count > 0 %}
201
+ <p><b>You've already created {{ organization_parts_count }}
202
+ part{{ organization_parts_count|pluralize }}.</b> Since changing your organization number
203
+ scheme requires changing your parts numbers, please manually delete your parts then come
204
+ back here to change your organization number scheme. Alternatively we can help delete your
205
+ parts if you reach out to info@indabom.com.</p>
206
+ {% else %}
207
+ <form name="number-scheme" action="{% url 'bom:settings' tab_anchor=INDABOM_TAB %}"
208
+ method="post">
209
+ {% csrf_token %}
210
+ <button type="submit" name="change-number-scheme"
211
+ class="waves-effect waves-light btn red lighten-1">Change Scheme to
212
+ {% if organization.number_scheme == 'S' %}Intelligent{% else %}
213
+ Semi-Intelligent{% endif %}</button>
214
+ </form>
215
+ {% endif %}
216
+ </div>
217
+ {% else %}
218
+ {% include 'bom/nothing-to-see.html' with required_privilege='Admin' %}
219
+ {% endif %}
220
+ </div>
221
+
222
+ <div id="organization" class="col s12 l8 offset-l2">
223
+ {% if user.bom_profile.role == 'A' %}
224
+ <div class="section">
225
+ <h4 class="section-title"><i class="material-icons teal-text text-darken-1">business</i>Organization
226
+ </h4>
227
+ <form name="seller" action="{% url 'bom:settings' tab_anchor=ORGANIZATION_TAB %}" method="post"
228
+ enctype="multipart/form-data">
229
+ {% csrf_token %}
230
+ <div class="row">
231
+ {{ organization_form|materializecss:'s12 l4' }}
232
+ </div>
233
+ <div class="row">
234
+ <div class="col s12 right-align">
235
+ <button class="waves-effect waves-light btn btn-primary" type="submit"
236
+ name="submit-edit-organization"
237
+ onclick="return confirm('Are you sure you want to change the organization information?')">
238
+ Save
239
+ </button>
240
+ </div>
241
+ </div>
242
+ </form>
243
+ </div>
244
+
245
+ <div class="section">
246
+ <h4 class="section-title"><i class="material-icons teal-text text-darken-1">group</i>Users</h4>
247
+ <form name="seller" action="{% url 'bom:settings' tab_anchor=ORGANIZATION_TAB %}" method="post"
248
+ enctype="multipart/form-data">
249
+ {% csrf_token %}
250
+ <table>
251
+ <thead>
252
+ <tr>
253
+ <th class="text-normal"><label><input type="checkbox" id="user-select-all"><span></span></label>
254
+ </th>
255
+ <th class="text-normal">Role</th>
256
+ <th class="text-normal">User Name</th>
257
+ <th class="text-normal">Full Name</th>
258
+ <th class="text-normal">Email</th>
259
+ <th class="text-normal"></th>
260
+ </tr>
261
+ </thead>
262
+ <tbody>
263
+ {% for org_user in users_in_organization %}
264
+ <tr>
265
+ <td>
266
+ <label><input type="checkbox" class="filled-in"
267
+ name="remove_user_meta_id_{{ org_user.bom_profile.id }}"><span/></label>
268
+ </td>
269
+ <td class="text-normal">{{ org_user.bom_profile.get_role_display }}</td>
270
+ <td class="text-normal">{{ org_user.username }}</td>
271
+ <td class="text-normal">{{ org_user.first_name }} {{ org_user.last_name }}</td>
272
+ <td class="text-normal"><a href="mailto:{{ user.email }}">{{ org_user.email }}</a>
273
+ </td>
274
+ <td>
275
+ <a class="waves-effect btn-flat"
276
+ href="{% url 'bom:user-meta-edit' user_meta_id=org_user.bom_profile.id %}"><i
277
+ class="material-icons left">edit</i>Edit</a>
278
+ </td>
279
+ </tr>
280
+ {% empty %}
281
+ <tr>
282
+ <td colspan="5" style="font-style: italic;">There are no additional users in this
283
+ organization.
284
+ </td>
285
+ </tr>
286
+ {% endfor %}
287
+ </tbody>
288
+ </table>
289
+ <div class="row" style="padding-top: 16px;">
290
+ <div class="col s6">
291
+ <button class="waves-effect waves-light btn red lighten-1" type="submit"
292
+ name="submit-remove-user"
293
+ onclick="return confirm('Are you sure you want to remove the selected users from {{ organization }}?')">
294
+ Remove Selected
295
+ </button>
296
+ </div>
297
+ <div class="col s6 right-align">
298
+ {% include 'bom/bom-modal-add-users.html' with modal_title='Add User' form=user_add_form action=user_add_form_action name='submit-add-user' %}
299
+ </div>
300
+ </div>
301
+ </form>
302
+ </div>
303
+
304
+ {# Subscription & Billing placed after Users for a more natural flow #}
305
+ {% include 'bom/subscription_panel.html' %}
306
+
307
+ <div class="section">
308
+ <h4 class="section-title"><i
309
+ class="material-icons teal-text text-darken-1">integration_instructions</i>Integrations</h4>
310
+ <div class="section">
311
+ <h5 class="section-title"><img title="Via Google Drive"
312
+ src="{% static 'bom/img/google_drive_logo.svg' %}">Part File
313
+ Storage
314
+ with Google Drive</h5>
315
+ {% if not google_authentication %}
316
+ <p>Connect your Google account to access Google Drive features.
317
+ {% if not organization.google_drive_parent %}Organization owners can enable file storage
318
+ using Google Drive. {% if organization.owner == user %}Since you are the owner, you
319
+ are
320
+ able to enable file storage!{% else %}Contact your organization owner to enable.
321
+ {% endif %}{% endif %}</p>
322
+ <p>When you connect, we will create a folder called <b>IndaBOM Part Files</b> in your root
323
+ of
324
+ Google Drive (and it can be moved anywhere in your drive). To add files to a part,
325
+ navigate
326
+ to the part in IndaBOM, and on the part's <b>Specifications</b> tab, click the <img
327
+ title="Via Google Drive" style="width: 16px; vertical-align: middle;"
328
+ src="{% static 'bom/img/google_drive_logo.svg' %}"> Google Drive link. This will
329
+ create a folder for your part in your root IndaBOM directory, or take you there if it
330
+ already exists.</p>
331
+ <p>You'll be able to access the files directly through Google Drive, and through
332
+ IndaBOM.</p>
333
+ {% else %}
334
+ <p>You're connected with Google and can access Google Drive features.</p>
335
+ {% endif %}
336
+ <div>
337
+ {% if google_authentication %}
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>
344
+ {% else %}
345
+ <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>
350
+ {% endif %}
351
+ </div>
352
+ </div>
353
+ <div class="section">
354
+ <h5 class="section-title"><img title="Sourcing via Mouser.com"
355
+ src="{% static 'bom/img/mouser.png' %}">Automagic Sourcing via
356
+ Mouser
357
+ </h5>
358
+ <!--<p>No connection required. To enable sourcing via Mouser, select which part classes you'd like
359
+ enabled on the Settings IndaBOM tab. Once enabled, sourcing information will appear on part
360
+ detail pages in which there are parts sourced via Mouser.</p>-->
361
+ <p>Currently under construction.</p>
362
+ </div>
363
+ </div>
364
+ {% endif %}
365
+
366
+ {% if profile.organization %}
367
+ <div class="section">
368
+ <h4 class="section-title"><i class="material-icons red-text text-darken-1">exit_to_app</i>Leave Your
369
+ Organization</h4>
370
+ <p>Warning, the only way back in to {{ organization.name }} is if you are invited by an organization
371
+ administrator.</p>
372
+ <form name="leave-organization" action="{% url 'bom:settings' tab_anchor=ORGANIZATION_TAB %}"
373
+ method="post" enctype="multipart/form-data">
374
+ {% csrf_token %}
375
+ <div class="right-align">
376
+ <button class="waves-effect waves-light btn red lighten-1" type="submit"
377
+ name="submit-leave-organization">
378
+ <i class="material-icons left">exit_to_app</i>Leave Organization
379
+ </button>
380
+ </div>
381
+ </form>
382
+ </div>
383
+ {% else %}
384
+ <div class="section">
385
+ <h4 class="section-title">You're not part of any organization</h4>
386
+ <p>To create your organization, start <a href="{% url 'bom:home' %}">here</a>.</p>
387
+ </div>
388
+ {% endif %}
389
+ </div>
390
+ </div>
391
+
392
+ {% endblock %}
393
+
394
+ {% block bom-script %}
395
+
396
+ <!-- Handle if there's an anchor, select tab -->
397
+ <script type='text/javascript'>
398
+ var tabsElem = document.querySelector('.tabs');
399
+
400
+ {% if tab_anchor %}
401
+ $('#{{ tab_anchor }}-tab').addClass('active');
402
+ {% endif %}
403
+
404
+ var tabs = M.Tabs.init(tabsElem);
405
+ </script>
406
+
407
+ <script type='text/javascript'>
408
+ function user_checkbox_clear_all() {
409
+ $("input[type='checkbox']:checked").prop("checked", false)
410
+ }
411
+ </script>
412
+
413
+ <script type='text/javascript'>
414
+ $(document).ready(function () {
415
+ const selectAllId = '#part-class-select-all';
416
+ $(selectAllId).change(function () {
417
+ var table = $(selectAllId).closest('table');
418
+ if ($(selectAllId).is(":checked")) {
419
+ $("input[type='checkbox']:not(:checked)", table).prop("checked", true)
420
+ } else {
421
+ $("input[type='checkbox']:checked", table).prop("checked", false)
422
+ }
423
+ });
424
+ });
425
+
426
+ $(document).ready(function () {
427
+ const selectAllId = '#user-select-all';
428
+ $(selectAllId).change(function () {
429
+ var table = $(selectAllId).closest('table');
430
+ if ($(selectAllId).is(":checked")) {
431
+ $("input[type='checkbox']:not(:checked)", table).prop("checked", true)
432
+ } else {
433
+ $("input[type='checkbox']:checked", table).prop("checked", false)
434
+ }
435
+ });
436
+ });
437
+ </script>
438
+
439
+ <script>
440
+ $(document).ready(function () {
441
+ let $checkbox = $('.checkbox-array');
442
+ let lastChecked = null;
443
+
444
+ $checkbox.click(function (e) {
445
+ if (!lastChecked) {
446
+ lastChecked = this;
447
+ return;
448
+ }
449
+
450
+ if (e.shiftKey) {
451
+ const start = $checkbox.index(this);
452
+ const end = $checkbox.index(lastChecked);
453
+ $checkbox.slice(Math.min(start, end), Math.max(start, end) + 1).prop('checked', lastChecked.checked);
454
+ }
455
+ lastChecked = this;
456
+ });
457
+ });
458
+ </script>
459
+
460
+ {% endblock bom-script %}
@@ -0,0 +1,16 @@
1
+ {# Placeholder for subscription/billing UI. Host apps can override this template. Flat layout (no cards). #}
2
+ <div class="section">
3
+ <h4 class="section-title" style="display:flex;align-items:center;gap:8px;margin-top:0;">
4
+ <i class="material-icons teal-text text-darken-1">credit_card</i>
5
+ Subscription & Billing
6
+ </h4>
7
+ <p class="grey-text" style="margin-top:8px;">
8
+ This self-hosted instance of django-bom does not include a billing portal. To change an organization's plan or
9
+ seat count,
10
+ use the Django admin: edit the Organization object and adjust the <b>Subscription</b> related fields.
11
+ </p>
12
+ <div class="right-align" style="margin-top: 8px;">
13
+ <a class="btn waves-effect" href="/admin/">Open Admin</a>
14
+ </div>
15
+ <div class="divider" style="margin-top:16px;"></div>
16
+ </div>
@@ -462,8 +462,7 @@ def bom_settings(request, tab_anchor=None):
462
462
  tab_anchor = INDABOM_TAB
463
463
  part_class_csv_form = PartClassCSVForm(request.POST, request.FILES, organization=organization)
464
464
  if part_class_csv_form.is_valid():
465
- for success in part_class_csv_form.successes:
466
- messages.info(request, success)
465
+ messages.info(request, f'Successfully uploaded {len(part_class_csv_form.successes)} part classes.')
467
466
  for warning in part_class_csv_form.warnings:
468
467
  messages.warning(request, warning)
469
468
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-bom
3
- Version: 1.239
3
+ Version: 1.241
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
@@ -129,7 +129,6 @@ bom/static/bom/js/jquery-3.4.1.min.js
129
129
  bom/static/bom/js/jquery.ba-floatingscrollbar.min.js
130
130
  bom/static/bom/js/jquery.treetable.js
131
131
  bom/static/bom/js/materialize.min.js
132
- bom/templates/bom/_subscription_panel.html
133
132
  bom/templates/bom/account-delete.html
134
133
  bom/templates/bom/add-manufacturer-part.html
135
134
  bom/templates/bom/add-sellerpart.html
@@ -166,6 +165,7 @@ bom/templates/bom/seller-info.html
166
165
  bom/templates/bom/sellers.html
167
166
  bom/templates/bom/settings.html
168
167
  bom/templates/bom/signup.html
168
+ bom/templates/bom/subscription_panel.html
169
169
  bom/templates/bom/table_of_contents.html
170
170
  bom/templates/bom/upload-bom.html
171
171
  bom/templates/bom/upload-parts-help.html
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "django-bom"
10
- version = "1.239"
10
+ version = "1.241"
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"