django-bom 1.262__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of django-bom might be problematic. Click here for more details.

Files changed (191) hide show
  1. bom/__init__.py +1 -0
  2. bom/admin.py +207 -0
  3. bom/apps.py +8 -0
  4. bom/auth_backends.py +47 -0
  5. bom/base_classes.py +31 -0
  6. bom/constants.py +217 -0
  7. bom/context_processors.py +9 -0
  8. bom/csv_headers.py +252 -0
  9. bom/decorators.py +32 -0
  10. bom/form_fields.py +59 -0
  11. bom/forms.py +1328 -0
  12. bom/helpers.py +367 -0
  13. bom/local_settings.py +35 -0
  14. bom/migrations/0001_initial.py +135 -0
  15. bom/migrations/0002_auto_20180908_2151.py +24 -0
  16. bom/migrations/0003_sellerpart_data_source.py +18 -0
  17. bom/migrations/0004_auto_20180911_0011.py +18 -0
  18. bom/migrations/0005_auto_20181007_1934.py +56 -0
  19. bom/migrations/0006_auto_20181007_1949.py +41 -0
  20. bom/migrations/0007_auto_20181009_0256.py +19 -0
  21. bom/migrations/0008_auto_20181030_0427.py +19 -0
  22. bom/migrations/0009_subpart_reference.py +18 -0
  23. bom/migrations/0010_auto_20181202_0733.py +23 -0
  24. bom/migrations/0011_auto_20181202_2113.py +22 -0
  25. bom/migrations/0012_partchangehistory.py +30 -0
  26. bom/migrations/0013_auto_20190222_1631.py +19 -0
  27. bom/migrations/0014_auto_20190223_2353.py +18 -0
  28. bom/migrations/0015_auto_20190303_1915.py +136 -0
  29. bom/migrations/0016_auto_20190405_2308.py +58 -0
  30. bom/migrations/0017_auto_20190616_1912.py +19 -0
  31. bom/migrations/0018_auto_20190616_2143.py +24 -0
  32. bom/migrations/0019_auto_20190624_1246.py +45 -0
  33. bom/migrations/0020_auto_20190627_0207.py +38 -0
  34. bom/migrations/0021_auto_20190627_0428.py +23 -0
  35. bom/migrations/0022_auto_20190811_2140.py +35 -0
  36. bom/migrations/0023_auto_20191205_2351.py +255 -0
  37. bom/migrations/0024_auto_20191214_1342.py +89 -0
  38. bom/migrations/0025_auto_20191221_1907.py +38 -0
  39. bom/migrations/0026_auto_20191222_2258.py +22 -0
  40. bom/migrations/0027_auto_20191222_2347.py +17 -0
  41. bom/migrations/0028_partrevision_displayable_synopsis.py +74 -0
  42. bom/migrations/0029_auto_20191231_1630.py +23 -0
  43. bom/migrations/0030_auto_20200101_2253.py +22 -0
  44. bom/migrations/0031_auto_20200104_1352.py +38 -0
  45. bom/migrations/0032_auto_20200126_1806.py +27 -0
  46. bom/migrations/0033_auto_20200203_0618.py +29 -0
  47. bom/migrations/0034_auto_20200222_0359.py +30 -0
  48. bom/migrations/0035_auto_20200303_0111.py +34 -0
  49. bom/migrations/0036_auto_20200303_0538.py +17 -0
  50. bom/migrations/0037_auto_20200405_1642.py +44 -0
  51. bom/migrations/0038_auto_20200422_0504.py +19 -0
  52. bom/migrations/0039_auto_20200929_2315.py +41 -0
  53. bom/migrations/0040_alter_organization_currency.py +19 -0
  54. bom/migrations/0041_organization_subscription_quantity.py +18 -0
  55. bom/migrations/0042_auto_20210720_2137.py +23 -0
  56. bom/migrations/0043_auto_20211123_0157.py +24 -0
  57. bom/migrations/0044_auto_20220831_1241.py +23 -0
  58. bom/migrations/0045_sellerpart_link.py +18 -0
  59. bom/migrations/0046_alter_sellerpart_unique_together.py +17 -0
  60. bom/migrations/0047_sellerpart_seller_part_number.py +18 -0
  61. bom/migrations/0048_rename_part_organization_number_class_bom_part_organiz_b333d6_idx_and_more.py +1017 -0
  62. bom/migrations/0049_alter_assembly_id_alter_assemblysubparts_id_and_more.py +99 -0
  63. bom/migrations/0050_alter_organization_options.py +17 -0
  64. bom/migrations/0051_alter_manufacturer_organization_and_more.py +41 -0
  65. bom/migrations/0052_remove_partrevision_attribute_and_more.py +584 -0
  66. bom/migrations/__init__.py +0 -0
  67. bom/models.py +886 -0
  68. bom/part_bom.py +192 -0
  69. bom/settings.py +262 -0
  70. bom/static/bom/css/dashboard.css +17 -0
  71. bom/static/bom/css/jquery.treetable.css +28 -0
  72. bom/static/bom/css/materialize.min.css +13 -0
  73. bom/static/bom/css/part-info.css +15 -0
  74. bom/static/bom/css/style.css +482 -0
  75. bom/static/bom/css/tablesorter-theme.materialize.css +176 -0
  76. bom/static/bom/css/treetable-theme.css +42 -0
  77. bom/static/bom/doc/sample_part_classes.csv +38 -0
  78. bom/static/bom/doc/test_bom.csv +6 -0
  79. bom/static/bom/doc/test_bom_5_intelligent.csv +4 -0
  80. bom/static/bom/doc/test_full_bom.csv +37 -0
  81. bom/static/bom/doc/test_new_parts.csv +5 -0
  82. bom/static/bom/doc/test_new_parts_5_intelligent.csv +5 -0
  83. bom/static/bom/img/_ionicons_svg_md-arrow-dropdown.svg +1 -0
  84. bom/static/bom/img/_ionicons_svg_md-arrow-dropright.svg +1 -0
  85. bom/static/bom/img/favicon.ico +0 -0
  86. bom/static/bom/img/google/web/1x/btn_google_signin_dark_disabled_web.png +0 -0
  87. bom/static/bom/img/google/web/1x/btn_google_signin_dark_focus_web.png +0 -0
  88. bom/static/bom/img/google/web/1x/btn_google_signin_dark_normal_web.png +0 -0
  89. bom/static/bom/img/google/web/1x/btn_google_signin_dark_pressed_web.png +0 -0
  90. bom/static/bom/img/google/web/1x/btn_google_signin_light_disabled_web.png +0 -0
  91. bom/static/bom/img/google/web/1x/btn_google_signin_light_focus_web.png +0 -0
  92. bom/static/bom/img/google/web/1x/btn_google_signin_light_normal_web.png +0 -0
  93. bom/static/bom/img/google/web/1x/btn_google_signin_light_pressed_web.png +0 -0
  94. bom/static/bom/img/google/web/2x/btn_google_signin_dark_disabled_web@2x.png +0 -0
  95. bom/static/bom/img/google/web/2x/btn_google_signin_dark_focus_web@2x.png +0 -0
  96. bom/static/bom/img/google/web/2x/btn_google_signin_dark_normal_web@2x.png +0 -0
  97. bom/static/bom/img/google/web/2x/btn_google_signin_dark_pressed_web@2x.png +0 -0
  98. bom/static/bom/img/google/web/2x/btn_google_signin_light_disabled_web@2x.png +0 -0
  99. bom/static/bom/img/google/web/2x/btn_google_signin_light_focus_web@2x.png +0 -0
  100. bom/static/bom/img/google/web/2x/btn_google_signin_light_normal_web@2x.png +0 -0
  101. bom/static/bom/img/google/web/2x/btn_google_signin_light_pressed_web@2x.png +0 -0
  102. bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.eps +814 -0
  103. bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.svg +24 -0
  104. bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.eps +1866 -0
  105. bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.svg +51 -0
  106. bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.eps +1031 -0
  107. bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.svg +50 -0
  108. bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.eps +1031 -0
  109. bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.svg +50 -0
  110. bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.eps +814 -0
  111. bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.svg +24 -0
  112. bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.eps +1837 -0
  113. bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.svg +44 -0
  114. bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.eps +1002 -0
  115. bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.svg +43 -0
  116. bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.eps +1002 -0
  117. bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.svg +43 -0
  118. bom/static/bom/img/google_drive_logo.svg +1 -0
  119. bom/static/bom/img/indabom.png +0 -0
  120. bom/static/bom/img/mouser.png +0 -0
  121. bom/static/bom/img/octopart_blue.svg +19 -0
  122. bom/static/bom/js/formset-handler.js +65 -0
  123. bom/static/bom/js/jquery-3.4.1.min.js +2 -0
  124. bom/static/bom/js/jquery.ba-floatingscrollbar.min.js +10 -0
  125. bom/static/bom/js/jquery.treetable.js +629 -0
  126. bom/static/bom/js/materialize.min.js +6 -0
  127. bom/templates/bom/account-delete.html +23 -0
  128. bom/templates/bom/add-manufacturer-part.html +66 -0
  129. bom/templates/bom/add-sellerpart.html +93 -0
  130. bom/templates/bom/base-menu.html +16 -0
  131. bom/templates/bom/base.html +129 -0
  132. bom/templates/bom/bom-action-btn.html +23 -0
  133. bom/templates/bom/bom-action-table.html +57 -0
  134. bom/templates/bom/bom-base-menu.html +6 -0
  135. bom/templates/bom/bom-base.html +24 -0
  136. bom/templates/bom/bom-form-modal.html +36 -0
  137. bom/templates/bom/bom-form.html +30 -0
  138. bom/templates/bom/bom-modal-add-users.html +49 -0
  139. bom/templates/bom/bom-signup.html +12 -0
  140. bom/templates/bom/components/bom-flat.html +131 -0
  141. bom/templates/bom/components/bom-indented.html +237 -0
  142. bom/templates/bom/components/manufacturer-part-list.html +270 -0
  143. bom/templates/bom/components/seller-part-list.html +62 -0
  144. bom/templates/bom/create-part.html +65 -0
  145. bom/templates/bom/dashboard-menu.html +15 -0
  146. bom/templates/bom/dashboard.html +303 -0
  147. bom/templates/bom/edit-manufacturer-part.html +72 -0
  148. bom/templates/bom/edit-part-class.html +120 -0
  149. bom/templates/bom/edit-part.html +67 -0
  150. bom/templates/bom/edit-quantity-of-measure.html +119 -0
  151. bom/templates/bom/edit-user-meta.html +70 -0
  152. bom/templates/bom/help.html +1356 -0
  153. bom/templates/bom/manufacturer-info.html +82 -0
  154. bom/templates/bom/manufacturers.html +97 -0
  155. bom/templates/bom/nothing-to-see.html +15 -0
  156. bom/templates/bom/organization-create.html +135 -0
  157. bom/templates/bom/part-info.html +448 -0
  158. bom/templates/bom/part-revision-display.html +50 -0
  159. bom/templates/bom/part-revision-edit.html +39 -0
  160. bom/templates/bom/part-revision-manage-bom.html +115 -0
  161. bom/templates/bom/part-revision-new.html +57 -0
  162. bom/templates/bom/part-revision-release.html +41 -0
  163. bom/templates/bom/search-help.html +101 -0
  164. bom/templates/bom/seller-info.html +82 -0
  165. bom/templates/bom/sellers.html +97 -0
  166. bom/templates/bom/settings.html +734 -0
  167. bom/templates/bom/signup.html +28 -0
  168. bom/templates/bom/subscription_panel.html +16 -0
  169. bom/templates/bom/table_of_contents.html +47 -0
  170. bom/templates/bom/upload-bom.html +111 -0
  171. bom/templates/bom/upload-parts-help.html +103 -0
  172. bom/templates/bom/upload-parts.html +50 -0
  173. bom/templates/registration/login.html +39 -0
  174. bom/tests.py +1592 -0
  175. bom/third_party_apis/__init__.py +0 -0
  176. bom/third_party_apis/base_api.py +51 -0
  177. bom/third_party_apis/google_drive.py +166 -0
  178. bom/third_party_apis/mouser.py +132 -0
  179. bom/third_party_apis/test_apis.py +24 -0
  180. bom/urls.py +100 -0
  181. bom/utils.py +228 -0
  182. bom/validators.py +23 -0
  183. bom/views/__init__.py +0 -0
  184. bom/views/json_views.py +55 -0
  185. bom/views/views.py +1773 -0
  186. bom/wsgi.py +16 -0
  187. django_bom-1.262.dist-info/METADATA +206 -0
  188. django_bom-1.262.dist-info/RECORD +191 -0
  189. django_bom-1.262.dist-info/WHEEL +5 -0
  190. django_bom-1.262.dist-info/licenses/LICENSE +674 -0
  191. django_bom-1.262.dist-info/top_level.txt +1 -0
@@ -0,0 +1,41 @@
1
+ # Generated by Django 2.1.1 on 2018-10-07 19:49
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ def update_primary_manufacturer_part(apps, schema_editor):
8
+ Part = apps.get_model('bom', 'Part')
9
+ ManufacturerPart = apps.get_model('bom', 'ManufacturerPart')
10
+
11
+ for p in Part.objects.all():
12
+ p.primary_manufacturer_part = ManufacturerPart.objects.filter(part=p)[0]
13
+ p.save()
14
+
15
+
16
+ class Migration(migrations.Migration):
17
+
18
+ dependencies = [
19
+ ('bom', '0005_auto_20181007_1934'),
20
+ ]
21
+
22
+ operations = [
23
+ migrations.RemoveField(
24
+ model_name='part',
25
+ name='manufacturer',
26
+ ),
27
+ migrations.RemoveField(
28
+ model_name='part',
29
+ name='manufacturer_part_number',
30
+ ),
31
+ migrations.RemoveField(
32
+ model_name='sellerpart',
33
+ name='part',
34
+ ),
35
+ migrations.AddField(
36
+ model_name='part',
37
+ name='primary_manufacturer_part',
38
+ field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='primary_manufacturer_part', to='bom.ManufacturerPart'),
39
+ ),
40
+ migrations.RunPython(update_primary_manufacturer_part),
41
+ ]
@@ -0,0 +1,19 @@
1
+ # Generated by Django 2.1.1 on 2018-10-09 02:56
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('bom', '0006_auto_20181007_1949'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name='part',
16
+ name='primary_manufacturer_part',
17
+ field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='primary_manufacturer_part', to='bom.ManufacturerPart'),
18
+ ),
19
+ ]
@@ -0,0 +1,19 @@
1
+ # Generated by Django 2.1.1 on 2018-10-30 04:27
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('bom', '0007_auto_20181009_0256'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name='part',
16
+ name='primary_manufacturer_part',
17
+ field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='primary_manufacturer_part', to='bom.ManufacturerPart'),
18
+ ),
19
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 2.1.1 on 2018-11-26 02:01
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('bom', '0008_auto_20181030_0427'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='subpart',
15
+ name='reference',
16
+ field=models.TextField(blank=True, default='', null=True),
17
+ ),
18
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 2.1.3 on 2018-12-02 07:33
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('bom', '0009_subpart_reference'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='part',
15
+ name='google_drive_parent',
16
+ field=models.CharField(blank=True, default=None, max_length=128, null=True),
17
+ ),
18
+ migrations.AddField(
19
+ model_name='usermeta',
20
+ name='google_drive_parent',
21
+ field=models.CharField(blank=True, default=None, max_length=128, null=True),
22
+ ),
23
+ ]
@@ -0,0 +1,22 @@
1
+ # Generated by Django 2.1.3 on 2018-12-02 21:13
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('bom', '0010_auto_20181202_0733'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RemoveField(
14
+ model_name='usermeta',
15
+ name='google_drive_parent',
16
+ ),
17
+ migrations.AddField(
18
+ model_name='organization',
19
+ name='google_drive_parent',
20
+ field=models.CharField(blank=True, default=None, max_length=128, null=True),
21
+ ),
22
+ ]
@@ -0,0 +1,30 @@
1
+ # Generated by Django 2.1.5 on 2019-02-19 16:30
2
+
3
+ import django.core.validators
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('bom', '0011_auto_20181202_2113'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.CreateModel(
15
+ name='PartChangeHistory',
16
+ fields=[
17
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18
+ ('part_id', models.CharField(max_length=2)),
19
+ ('old_number_item', models.CharField(blank=True, default=None, max_length=4, validators=[django.core.validators.RegexValidator('^[0-9]*$', 'Only numeric characters are allowed.')])),
20
+ ('old_number_variation', models.CharField(blank=True, default=None, max_length=2, validators=[django.core.validators.RegexValidator('^[0-9a-zA-Z]*$', 'Only alphanumeric characters are allowed.')])),
21
+ ('old_description', models.CharField(default=None, max_length=255)),
22
+ ('old_revision', models.CharField(max_length=2)),
23
+ ('old_time_stamp', models.DateTimeField(auto_now=True)),
24
+ ('attribute', models.CharField(default=None, max_length=255)),
25
+ ('original_value', models.CharField(default=None, max_length=255)),
26
+ ('new_value', models.CharField(default=None, max_length=255)),
27
+ ('attribute_time_stamp', models.DateTimeField(auto_now=True)),
28
+ ],
29
+ ),
30
+ ]
@@ -0,0 +1,19 @@
1
+ # Generated by Django 2.1.5 on 2019-02-22 16:31
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('bom', '0012_partchangehistory'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name='partchangehistory',
16
+ name='part_id',
17
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bom.Part'),
18
+ ),
19
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 2.1.5 on 2019-02-23 23:53
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('bom', '0013_auto_20190222_1631'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RenameField(
14
+ model_name='partchangehistory',
15
+ old_name='part_id',
16
+ new_name='part',
17
+ ),
18
+ ]
@@ -0,0 +1,136 @@
1
+ # Generated by Django 2.1.5 on 2019-03-03 19:15
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ def update_partchangehistory(apps, schema_editor):
8
+ PartChangeHistory = apps.get_model('bom', 'PartChangeHistory')
9
+
10
+ for pch in PartChangeHistory.objects.all():
11
+ pch.description = pch.old_description
12
+ pch.revision = pch.old_revision
13
+ pch.value = pch.new_value
14
+ pch.save()
15
+
16
+
17
+ class Migration(migrations.Migration):
18
+
19
+ dependencies = [
20
+ ('bom', '0014_auto_20190223_2353'),
21
+ ]
22
+
23
+ operations = [
24
+ migrations.CreateModel(
25
+ name='Assembly',
26
+ fields=[
27
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
28
+ ],
29
+ ),
30
+ migrations.CreateModel(
31
+ name='AssemblySubparts',
32
+ fields=[
33
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
34
+ ],
35
+ options={
36
+ 'db_table': 'bom_assembly_subparts',
37
+ },
38
+ ),
39
+ migrations.AddField(
40
+ model_name='assembly',
41
+ name='subparts',
42
+ field=models.ManyToManyField(related_name='assemblies', through='bom.AssemblySubparts', to='bom.Subpart'),
43
+ ),
44
+ migrations.AddField(
45
+ model_name='assemblysubparts',
46
+ name='assembly',
47
+ field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='bom.Assembly'),
48
+ ),
49
+ migrations.AddField(
50
+ model_name='assemblysubparts',
51
+ name='subpart',
52
+ field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='bom.Subpart'),
53
+ ),
54
+ migrations.AlterUniqueTogether(
55
+ name='assemblysubparts',
56
+ unique_together={('assembly', 'subpart')},
57
+ ),
58
+ # migrations.AddField(
59
+ # model_name='assembly',
60
+ # name='subparts',
61
+ # field=models.ManyToManyField(to='bom.Subpart', related_name='assemblies'),
62
+ # ),
63
+ migrations.RemoveField(
64
+ model_name='partfile',
65
+ name='part',
66
+ ),
67
+ migrations.DeleteModel(
68
+ name='PartFile',
69
+ ),
70
+ migrations.RenameField(
71
+ model_name='partchangehistory',
72
+ old_name='attribute_time_stamp',
73
+ new_name='timestamp',
74
+ ),
75
+ migrations.AddField(
76
+ model_name='partchangehistory',
77
+ name='description',
78
+ field=models.CharField(default='', max_length=255),
79
+ ),
80
+ migrations.AddField(
81
+ model_name='partchangehistory',
82
+ name='revision',
83
+ field=models.CharField(db_index=True, max_length=2),
84
+ ),
85
+ migrations.AddField(
86
+ model_name='partchangehistory',
87
+ name='value',
88
+ field=models.CharField(default=None, max_length=255, null=True),
89
+ ),
90
+ migrations.AlterField(
91
+ model_name='partchangehistory',
92
+ name='attribute',
93
+ field=models.CharField(default=None, max_length=255, null=True),
94
+ ),
95
+ migrations.AddField(
96
+ model_name='partchangehistory',
97
+ name='assembly',
98
+ field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.PROTECT,
99
+ to='bom.Assembly'),
100
+ ),
101
+ migrations.RemoveField(
102
+ model_name='partchangehistory',
103
+ name='original_value',
104
+ ),
105
+ migrations.RemoveField(
106
+ model_name='partchangehistory',
107
+ name='old_number_item',
108
+ ),
109
+ migrations.RemoveField(
110
+ model_name='partchangehistory',
111
+ name='old_number_variation',
112
+ ),
113
+ migrations.RemoveField(
114
+ model_name='partchangehistory',
115
+ name='old_time_stamp',
116
+ ),
117
+ migrations.RunPython(update_partchangehistory),
118
+ migrations.RemoveField(
119
+ model_name='partchangehistory',
120
+ name='new_value',
121
+ ),
122
+ migrations.RemoveField(
123
+ model_name='partchangehistory',
124
+ name='old_description',
125
+ ),
126
+ migrations.RemoveField(
127
+ model_name='partchangehistory',
128
+ name='old_revision',
129
+ ),
130
+ migrations.AddField(
131
+ model_name='subpart',
132
+ name='part_revision',
133
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE,
134
+ related_name='assembly_subpart', to='bom.PartChangeHistory'),
135
+ )
136
+ ]
@@ -0,0 +1,58 @@
1
+ # Generated by Django 2.2 on 2019-04-05 23:08
2
+
3
+ from django.db import migrations
4
+
5
+ def update_parts_to_part_history(apps, schema_editor):
6
+ Part = apps.get_model('bom', 'Part')
7
+ PartChangeHistory = apps.get_model('bom', 'PartChangeHistory')
8
+ Assembly = apps.get_model('bom', 'Assembly')
9
+ Subpart = apps.get_model('bom', 'Subpart')
10
+
11
+ for p in Part.objects.all():
12
+ subparts = Subpart.objects.filter(assembly_part=p)
13
+ assembly = None
14
+ if subparts.count() > 0:
15
+ assembly = Assembly.objects.create()
16
+ assembly.subparts.set(subparts)
17
+
18
+ try:
19
+ PartChangeHistory.objects.get_or_create(part=p, description=p.description,
20
+ revision=p.revision, assembly=assembly)
21
+ except PartChangeHistory.MultipleObjectsReturned:
22
+ continue
23
+
24
+ for sp in Subpart.objects.all():
25
+ part = sp.assembly_subpart
26
+ pch = PartChangeHistory.objects.filter(part=part).order_by('-revision').first()
27
+ sp.part_revision = pch
28
+ sp.save()
29
+
30
+ class Migration(migrations.Migration):
31
+
32
+ dependencies = [
33
+ ('bom', '0015_auto_20190303_1915'),
34
+ ]
35
+
36
+ operations = [
37
+ migrations.RunPython(update_parts_to_part_history),
38
+ migrations.RemoveField(
39
+ model_name='part',
40
+ name='description',
41
+ ),
42
+ migrations.RemoveField(
43
+ model_name='part',
44
+ name='revision',
45
+ ),
46
+ migrations.RemoveField(
47
+ model_name='part',
48
+ name='subparts',
49
+ ),
50
+ migrations.RemoveField(
51
+ model_name='subpart',
52
+ name='assembly_part',
53
+ ),
54
+ migrations.RemoveField(
55
+ model_name='subpart',
56
+ name='assembly_subpart',
57
+ ),
58
+ ]
@@ -0,0 +1,19 @@
1
+ # Generated by Django 2.2 on 2019-06-16 19:12
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ atomic = False
9
+
10
+ dependencies = [
11
+ ('bom', '0016_auto_20190405_2308'),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.RenameModel(
16
+ old_name='PartChangeHistory',
17
+ new_name='PartRevision',
18
+ ),
19
+ ]
@@ -0,0 +1,24 @@
1
+ # Generated by Django 2.2 on 2019-06-16 21:43
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('bom', '0017_auto_20190616_1912'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name='assemblysubparts',
16
+ name='assembly',
17
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bom.Assembly'),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name='assemblysubparts',
21
+ name='subpart',
22
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bom.Subpart'),
23
+ ),
24
+ ]
@@ -0,0 +1,45 @@
1
+ # Generated by Django 2.2 on 2019-06-24 12:46
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ def update_part_revisions(apps, schema_editor):
7
+ Part = apps.get_model('bom', 'Part')
8
+ PartRevision = apps.get_model('bom', 'PartRevision')
9
+
10
+ for p in Part.objects.all():
11
+ revs = PartRevision.objects.filter(part=p)
12
+ rev_numbers = revs.values_list('revision', flat=True)
13
+ for rev_number in rev_numbers:
14
+ if list(rev_numbers).count(rev_number) > 1:
15
+ revs_to_update = list(revs.filter(revision=rev_number).order_by('timestamp'))
16
+ count_revs_to_update = int(PartRevision.objects.filter(part=p, revision=rev_number).count())
17
+ idx = -1
18
+ for r in revs_to_update:
19
+ idx += 1
20
+ if idx < (count_revs_to_update - 1):
21
+ timestamp = r.timestamp
22
+ r.revision = '{}.{}'.format(r.revision, idx)
23
+ # TODO: Don't update timestamps
24
+ r.timestamp = timestamp
25
+ r.save()
26
+
27
+
28
+ class Migration(migrations.Migration):
29
+
30
+ dependencies = [
31
+ ('bom', '0018_auto_20190616_2143'),
32
+ ]
33
+
34
+ operations = [
35
+ migrations.AlterField(
36
+ model_name='partrevision',
37
+ name='revision',
38
+ field=models.CharField(db_index=True, max_length=4),
39
+ ),
40
+ migrations.RunPython(update_part_revisions),
41
+ migrations.AlterUniqueTogether(
42
+ name='partrevision',
43
+ unique_together={('part', 'revision')},
44
+ ),
45
+ ]
@@ -0,0 +1,38 @@
1
+ # Generated by Django 2.2.2 on 2019-06-27 02:07
2
+
3
+ from django.db import migrations, models
4
+ import django.utils.timezone
5
+
6
+
7
+ def update_part_revision_configuration(apps, schema_editor):
8
+ Part = apps.get_model('bom', 'Part')
9
+ PartRevision = apps.get_model('bom', 'PartRevision')
10
+
11
+ for p in Part.objects.all():
12
+ revs = PartRevision.objects.filter(part=p)
13
+ latest = revs.order_by('-id').first()
14
+ for rev in revs:
15
+ if rev != latest:
16
+ rev.configuration = 'R'
17
+ rev.save()
18
+
19
+
20
+ class Migration(migrations.Migration):
21
+
22
+ dependencies = [
23
+ ('bom', '0019_auto_20190624_1246'),
24
+ ]
25
+
26
+ operations = [
27
+ migrations.AddField(
28
+ model_name='partrevision',
29
+ name='configuration',
30
+ field=models.CharField(choices=[('R', 'Released'), ('W', 'Working')], default='W', max_length=1),
31
+ ),
32
+ migrations.RunPython(update_part_revision_configuration),
33
+ migrations.AlterField(
34
+ model_name='partrevision',
35
+ name='timestamp',
36
+ field=models.DateTimeField(default=django.utils.timezone.now),
37
+ ),
38
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 2.2.2 on 2019-06-27 04:28
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('bom', '0020_auto_20190627_0207'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='partrevision',
15
+ name='attribute',
16
+ field=models.CharField(blank=True, default=None, max_length=255, null=True),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='partrevision',
20
+ name='value',
21
+ field=models.CharField(blank=True, default=None, max_length=255, null=True),
22
+ ),
23
+ ]
@@ -0,0 +1,35 @@
1
+ # Generated by Django 2.2.2 on 2019-08-11 21:40
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('bom', '0021_auto_20190627_0428'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='sellerpart',
15
+ name='minimum_order_quantity',
16
+ field=models.IntegerField(default=1),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='sellerpart',
20
+ name='minimum_pack_quantity',
21
+ field=models.IntegerField(default=1),
22
+ ),
23
+ migrations.AlterField(
24
+ model_name='sellerpart',
25
+ name='nre_cost',
26
+ field=models.DecimalField(decimal_places=4, default=0, max_digits=8),
27
+ preserve_default=False,
28
+ ),
29
+ migrations.AlterField(
30
+ model_name='sellerpart',
31
+ name='unit_cost',
32
+ field=models.DecimalField(decimal_places=4, default=0, max_digits=8),
33
+ preserve_default=False,
34
+ ),
35
+ ]