django-bom 1.235__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.
- bom/__init__.py +1 -0
- bom/admin.py +161 -0
- bom/apps.py +8 -0
- bom/base_classes.py +31 -0
- bom/constants.py +210 -0
- bom/context_processors.py +9 -0
- bom/csv_headers.py +274 -0
- bom/decorators.py +32 -0
- bom/form_fields.py +59 -0
- bom/forms.py +1400 -0
- bom/helpers.py +292 -0
- bom/local_settings.py +36 -0
- bom/migrations/0001_initial.py +135 -0
- bom/migrations/0002_auto_20180908_2151.py +24 -0
- bom/migrations/0003_sellerpart_data_source.py +18 -0
- bom/migrations/0004_auto_20180911_0011.py +18 -0
- bom/migrations/0005_auto_20181007_1934.py +56 -0
- bom/migrations/0006_auto_20181007_1949.py +41 -0
- bom/migrations/0007_auto_20181009_0256.py +19 -0
- bom/migrations/0008_auto_20181030_0427.py +19 -0
- bom/migrations/0009_subpart_reference.py +18 -0
- bom/migrations/0010_auto_20181202_0733.py +23 -0
- bom/migrations/0011_auto_20181202_2113.py +22 -0
- bom/migrations/0012_partchangehistory.py +30 -0
- bom/migrations/0013_auto_20190222_1631.py +19 -0
- bom/migrations/0014_auto_20190223_2353.py +18 -0
- bom/migrations/0015_auto_20190303_1915.py +136 -0
- bom/migrations/0016_auto_20190405_2308.py +58 -0
- bom/migrations/0017_auto_20190616_1912.py +19 -0
- bom/migrations/0018_auto_20190616_2143.py +24 -0
- bom/migrations/0019_auto_20190624_1246.py +45 -0
- bom/migrations/0020_auto_20190627_0207.py +38 -0
- bom/migrations/0021_auto_20190627_0428.py +23 -0
- bom/migrations/0022_auto_20190811_2140.py +35 -0
- bom/migrations/0023_auto_20191205_2351.py +255 -0
- bom/migrations/0024_auto_20191214_1342.py +89 -0
- bom/migrations/0025_auto_20191221_1907.py +38 -0
- bom/migrations/0026_auto_20191222_2258.py +22 -0
- bom/migrations/0027_auto_20191222_2347.py +17 -0
- bom/migrations/0028_partrevision_displayable_synopsis.py +74 -0
- bom/migrations/0029_auto_20191231_1630.py +23 -0
- bom/migrations/0030_auto_20200101_2253.py +22 -0
- bom/migrations/0031_auto_20200104_1352.py +38 -0
- bom/migrations/0032_auto_20200126_1806.py +27 -0
- bom/migrations/0033_auto_20200203_0618.py +29 -0
- bom/migrations/0034_auto_20200222_0359.py +30 -0
- bom/migrations/0035_auto_20200303_0111.py +34 -0
- bom/migrations/0036_auto_20200303_0538.py +17 -0
- bom/migrations/0037_auto_20200405_1642.py +44 -0
- bom/migrations/0038_auto_20200422_0504.py +19 -0
- bom/migrations/0039_auto_20200929_2315.py +41 -0
- bom/migrations/0040_alter_organization_currency.py +19 -0
- bom/migrations/0041_organization_subscription_quantity.py +18 -0
- bom/migrations/0042_auto_20210720_2137.py +23 -0
- bom/migrations/0043_auto_20211123_0157.py +24 -0
- bom/migrations/0044_auto_20220831_1241.py +23 -0
- bom/migrations/0045_sellerpart_link.py +18 -0
- bom/migrations/0046_alter_sellerpart_unique_together.py +17 -0
- bom/migrations/0047_sellerpart_seller_part_number.py +18 -0
- bom/migrations/0048_rename_part_organization_number_class_bom_part_organiz_b333d6_idx_and_more.py +1017 -0
- bom/migrations/__init__.py +0 -0
- bom/models.py +756 -0
- bom/part_bom.py +192 -0
- bom/settings.py +225 -0
- bom/static/bom/css/dashboard.css +17 -0
- bom/static/bom/css/jquery.treetable.css +28 -0
- bom/static/bom/css/materialize.min.css +13 -0
- bom/static/bom/css/part-info.css +15 -0
- bom/static/bom/css/style.css +308 -0
- bom/static/bom/css/tablesorter-theme.materialize.css +176 -0
- bom/static/bom/css/treetable-theme.css +42 -0
- bom/static/bom/doc/sample_part_classes.csv +38 -0
- bom/static/bom/doc/test_bom.csv +6 -0
- bom/static/bom/doc/test_bom_5_intelligent.csv +4 -0
- bom/static/bom/doc/test_full_bom.csv +37 -0
- bom/static/bom/doc/test_new_parts.csv +5 -0
- bom/static/bom/doc/test_new_parts_5_intelligent.csv +5 -0
- bom/static/bom/img/_ionicons_svg_md-arrow-dropdown.svg +1 -0
- bom/static/bom/img/_ionicons_svg_md-arrow-dropright.svg +1 -0
- bom/static/bom/img/favicon.ico +0 -0
- bom/static/bom/img/google/web/1x/btn_google_signin_dark_disabled_web.png +0 -0
- bom/static/bom/img/google/web/1x/btn_google_signin_dark_focus_web.png +0 -0
- bom/static/bom/img/google/web/1x/btn_google_signin_dark_normal_web.png +0 -0
- bom/static/bom/img/google/web/1x/btn_google_signin_dark_pressed_web.png +0 -0
- bom/static/bom/img/google/web/1x/btn_google_signin_light_disabled_web.png +0 -0
- bom/static/bom/img/google/web/1x/btn_google_signin_light_focus_web.png +0 -0
- bom/static/bom/img/google/web/1x/btn_google_signin_light_normal_web.png +0 -0
- bom/static/bom/img/google/web/1x/btn_google_signin_light_pressed_web.png +0 -0
- bom/static/bom/img/google/web/2x/btn_google_signin_dark_disabled_web@2x.png +0 -0
- bom/static/bom/img/google/web/2x/btn_google_signin_dark_focus_web@2x.png +0 -0
- bom/static/bom/img/google/web/2x/btn_google_signin_dark_normal_web@2x.png +0 -0
- bom/static/bom/img/google/web/2x/btn_google_signin_dark_pressed_web@2x.png +0 -0
- bom/static/bom/img/google/web/2x/btn_google_signin_light_disabled_web@2x.png +0 -0
- bom/static/bom/img/google/web/2x/btn_google_signin_light_focus_web@2x.png +0 -0
- bom/static/bom/img/google/web/2x/btn_google_signin_light_normal_web@2x.png +0 -0
- bom/static/bom/img/google/web/2x/btn_google_signin_light_pressed_web@2x.png +0 -0
- bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.eps +814 -0
- bom/static/bom/img/google/web/vector/btn_google_dark_disabled_ios.svg +24 -0
- bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.eps +1866 -0
- bom/static/bom/img/google/web/vector/btn_google_dark_focus_ios.svg +51 -0
- bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.eps +1031 -0
- bom/static/bom/img/google/web/vector/btn_google_dark_normal_ios.svg +50 -0
- bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.eps +1031 -0
- bom/static/bom/img/google/web/vector/btn_google_dark_pressed_ios.svg +50 -0
- bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.eps +814 -0
- bom/static/bom/img/google/web/vector/btn_google_light_disabled_ios.svg +24 -0
- bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.eps +1837 -0
- bom/static/bom/img/google/web/vector/btn_google_light_focus_ios.svg +44 -0
- bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.eps +1002 -0
- bom/static/bom/img/google/web/vector/btn_google_light_normal_ios.svg +43 -0
- bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.eps +1002 -0
- bom/static/bom/img/google/web/vector/btn_google_light_pressed_ios.svg +43 -0
- bom/static/bom/img/google_drive_logo.svg +1 -0
- bom/static/bom/img/indabom.png +0 -0
- bom/static/bom/img/mouser.png +0 -0
- bom/static/bom/img/octopart_blue.svg +19 -0
- bom/static/bom/js/jquery-3.4.1.min.js +2 -0
- bom/static/bom/js/jquery.ba-floatingscrollbar.min.js +10 -0
- bom/static/bom/js/jquery.treetable.js +629 -0
- bom/static/bom/js/materialize.min.js +6 -0
- bom/templates/bom/account-delete.html +23 -0
- bom/templates/bom/add-manufacturer-part.html +69 -0
- bom/templates/bom/add-sellerpart.html +96 -0
- bom/templates/bom/base-menu.html +7 -0
- bom/templates/bom/base.html +129 -0
- bom/templates/bom/bom-action-btn.html +23 -0
- bom/templates/bom/bom-action-table.html +57 -0
- bom/templates/bom/bom-base-menu.html +6 -0
- bom/templates/bom/bom-base.html +24 -0
- bom/templates/bom/bom-form-modal.html +35 -0
- bom/templates/bom/bom-form.html +34 -0
- bom/templates/bom/bom-signup.html +16 -0
- bom/templates/bom/components/bom-flat.html +131 -0
- bom/templates/bom/components/bom-indented.html +237 -0
- bom/templates/bom/components/manufacturer-part-list.html +271 -0
- bom/templates/bom/components/seller-part-list.html +63 -0
- bom/templates/bom/create-part.html +68 -0
- bom/templates/bom/dashboard-menu.html +15 -0
- bom/templates/bom/dashboard.html +300 -0
- bom/templates/bom/edit-manufacturer-part.html +75 -0
- bom/templates/bom/edit-part-class.html +36 -0
- bom/templates/bom/edit-part.html +71 -0
- bom/templates/bom/edit-user-meta.html +41 -0
- bom/templates/bom/help.html +1363 -0
- bom/templates/bom/manufacturer-info.html +83 -0
- bom/templates/bom/manufacturers.html +96 -0
- bom/templates/bom/nothing-to-see.html +15 -0
- bom/templates/bom/organization-create.html +135 -0
- bom/templates/bom/part-info.html +440 -0
- bom/templates/bom/part-revision-display.html +184 -0
- bom/templates/bom/part-revision-edit.html +42 -0
- bom/templates/bom/part-revision-manage-bom.html +116 -0
- bom/templates/bom/part-revision-new.html +60 -0
- bom/templates/bom/part-revision-release.html +48 -0
- bom/templates/bom/search-help.html +105 -0
- bom/templates/bom/seller-info.html +83 -0
- bom/templates/bom/sellers.html +96 -0
- bom/templates/bom/settings.html +405 -0
- bom/templates/bom/signup.html +28 -0
- bom/templates/bom/table_of_contents.html +47 -0
- bom/templates/bom/upload-bom.html +112 -0
- bom/templates/bom/upload-parts-help.html +107 -0
- bom/templates/bom/upload-parts.html +54 -0
- bom/templates/registration/login.html +39 -0
- bom/tests.py +1506 -0
- bom/third_party_apis/__init__.py +0 -0
- bom/third_party_apis/base_api.py +51 -0
- bom/third_party_apis/google_drive.py +166 -0
- bom/third_party_apis/mouser.py +132 -0
- bom/third_party_apis/test_apis.py +24 -0
- bom/urls.py +89 -0
- bom/utils.py +228 -0
- bom/validators.py +23 -0
- bom/views/__init__.py +0 -0
- bom/views/json_views.py +55 -0
- bom/views/views.py +1620 -0
- bom/wsgi.py +16 -0
- django_bom-1.235.dist-info/METADATA +207 -0
- django_bom-1.235.dist-info/RECORD +182 -0
- django_bom-1.235.dist-info/WHEEL +5 -0
- django_bom-1.235.dist-info/licenses/LICENSE +674 -0
- django_bom-1.235.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
{% extends 'bom/bom-base.html' %}
|
|
2
|
+
|
|
3
|
+
{% load static %}
|
|
4
|
+
{% load djmoney %}
|
|
5
|
+
|
|
6
|
+
{% block head-title %}{{ part.full_part_number }}{% if part_revision %} {{ part_revision.synopsis }}{% endif %}{% endblock %}
|
|
7
|
+
|
|
8
|
+
{% block head %}
|
|
9
|
+
<link rel="stylesheet" type="text/css" href="{% static 'bom/css/style.css' %}"/>
|
|
10
|
+
<link rel="stylesheet" type="text/css" href="{% static 'bom/css/part-info.css' %}"/>
|
|
11
|
+
{% endblock %}
|
|
12
|
+
|
|
13
|
+
{% block content %}
|
|
14
|
+
{% include 'bom/bom-action-btn.html' with profile=profile %}
|
|
15
|
+
<div class="container-app">
|
|
16
|
+
<div class="part-info">
|
|
17
|
+
<div class="row" style="margin-bottom: 5px;">
|
|
18
|
+
<div class="col m8 hide-on-small-and-down">
|
|
19
|
+
<h3 class="light">{{ part.full_part_number }}</h3>
|
|
20
|
+
{% if part_revision %}
|
|
21
|
+
{% if profile.role == 'A' %}
|
|
22
|
+
<p class="printer-hide">Select latest revision to edit, add a new revision, etc., or select an earlier revision for viewing only</p>
|
|
23
|
+
{% else %}
|
|
24
|
+
<p class="printer-hide">Select a revision for viewing</p>
|
|
25
|
+
{% endif %}
|
|
26
|
+
{% endif %}
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div class="row printer-hide">
|
|
31
|
+
{% if part_revision %}
|
|
32
|
+
<div class="col l2 m3 s5">
|
|
33
|
+
<div class="input-field">
|
|
34
|
+
<select id="select-revision">
|
|
35
|
+
{% for r in revisions.all %}
|
|
36
|
+
<option {% if part_revision.id == r.id %}selected{% endif %}
|
|
37
|
+
value="{% if r == part.latest %}{% url 'bom:part-info' part_id=part.id %}
|
|
38
|
+
{% else %}{% url 'bom:part-info-history' part_id=part.id part_revision_id=r.id %}
|
|
39
|
+
{% endif %}">Rev {{ r.revision }}{% if r.configuration == 'W' %} (working){% endif %}</option>
|
|
40
|
+
{% endfor %}
|
|
41
|
+
</select>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
{% endif %}
|
|
45
|
+
<div class="col {% if part_revision %}m3 s1{% else %}m3 s12{% endif %}">
|
|
46
|
+
{% if profile.role == 'A' and part_revision %}
|
|
47
|
+
<div style="margin-top: 1.5rem;">
|
|
48
|
+
<!-- Dropdown Trigger -->
|
|
49
|
+
<button class='dropdown-trigger hide-on-small-and-down waves-effect waves-light grey lighten-4 btn-flat'
|
|
50
|
+
href='#' data-target='dropdown-revision'><i class="material-icons right">arrow_drop_down</i>Manage
|
|
51
|
+
</button>
|
|
52
|
+
<a class='dropdown-trigger hide-on-med-and-up' href='#' data-target='dropdown-revision'><i
|
|
53
|
+
class="material-icons green-text text-lighten-1">more_vert</i></a>
|
|
54
|
+
<!-- Dropdown Structure -->
|
|
55
|
+
<ul id='dropdown-revision' class='dropdown-content'>
|
|
56
|
+
{% if part_revision.configuration == 'W' %}
|
|
57
|
+
<li>
|
|
58
|
+
<a class="green-text text-lighten-1"
|
|
59
|
+
href="{% url 'bom:part-revision-edit' part_id=part.id part_revision_id=part_revision.id %}">
|
|
60
|
+
<i class="material-icons green-text text-lighten-1">edit</i>Edit</a>
|
|
61
|
+
</li>
|
|
62
|
+
<li>
|
|
63
|
+
<a class="green-text text-lighten-1" href="{% url 'bom:part-revision-release' part_id=part.id part_revision_id=part_revision.id %}">
|
|
64
|
+
<i class="material-icons green-text text-lighten-1">check</i>Release</a>
|
|
65
|
+
</li>
|
|
66
|
+
{% endif %}
|
|
67
|
+
<li>
|
|
68
|
+
<a class="green-text text-lighten-1" href="{% url 'bom:part-revision-new' part_id=part.id %}">
|
|
69
|
+
<i class="material-icons green-text text-lighten-1">add</i>New revision</a>
|
|
70
|
+
</li>
|
|
71
|
+
{% if part_revision.configuration == 'R' %}
|
|
72
|
+
<li>
|
|
73
|
+
<a class="green-text text-lighten-1 disabled" onclick="revertPartRevision()">
|
|
74
|
+
<i class="material-icons green-text text-lighten-1">undo</i>Revert to working</a>
|
|
75
|
+
</li>
|
|
76
|
+
{% endif %}
|
|
77
|
+
<li class="divider" tabindex="-1"></li>
|
|
78
|
+
<li>
|
|
79
|
+
<a class="red-text text-lighten-1" onclick="deletePartRevision()">
|
|
80
|
+
<i class="material-icons red-text text-lighten-1">delete</i>Delete</a>
|
|
81
|
+
</li>
|
|
82
|
+
</ul>
|
|
83
|
+
</div>
|
|
84
|
+
{% elif profile.role == 'A' and not part_revision %}
|
|
85
|
+
<a class='waves-effect waves-light grey lighten-4 btn-flat'
|
|
86
|
+
href='{% url 'bom:part-revision-new' part_id=part.id %}'><i class="material-icons left">add</i>Create Revision</a>
|
|
87
|
+
{% endif %}
|
|
88
|
+
</div>
|
|
89
|
+
{% if part_revision %}
|
|
90
|
+
<div class="col m2 push-l5 push-m4 s6 right-align part-info-form">
|
|
91
|
+
<form action="{% url 'bom:part-info' part_id=part.id %}" method="post">
|
|
92
|
+
{% csrf_token %}
|
|
93
|
+
<div class="row">
|
|
94
|
+
<div class="col s9" style="padding-right: 0;">
|
|
95
|
+
{{ part_info_form }}
|
|
96
|
+
</div>
|
|
97
|
+
<div class="col s3">
|
|
98
|
+
<button type="submit" class="waves-effect waves-green btn-flat input-field btn-icon-round"><i class="material-icons green-text">send</i></button>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
</form>
|
|
102
|
+
</div>
|
|
103
|
+
{% endif %}
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<div class="row">
|
|
107
|
+
<div class="col s12 printer-hide">
|
|
108
|
+
<ul id="tabs" class="tabs tabs-fixed-width">
|
|
109
|
+
<li class="tab"><a id="specs-tab" href="#specs">Specifications</a></li>
|
|
110
|
+
<li class="tab"><a id="bom-tab" href="#bom">Bill of Materials</a></li>
|
|
111
|
+
<li class="tab"><a id="used-tab" href="#used">Where Used</a></li>
|
|
112
|
+
<li class="tab"><a id="sourcing-tab" href="#sourcing">Sourcing</a></li>
|
|
113
|
+
</ul>
|
|
114
|
+
</div>
|
|
115
|
+
|
|
116
|
+
<div id="specs" class="col s12">
|
|
117
|
+
<h4 class="printer-show">Specifications</h4>
|
|
118
|
+
<br>
|
|
119
|
+
<ul class="collection with-header">
|
|
120
|
+
<li class="collection-header"><h5>Item Details</h5></li>
|
|
121
|
+
<li class="collection-item">
|
|
122
|
+
{% if organization.number_scheme == 'S' %}
|
|
123
|
+
<div class="row">
|
|
124
|
+
<div class="col s4 l2 text-right" style="padding-left: 0px;">Item Class:</div>
|
|
125
|
+
<div class="col s8 l10">{{ part.number_class }}</div>
|
|
126
|
+
</div>
|
|
127
|
+
{% endif %}
|
|
128
|
+
<div class="row">
|
|
129
|
+
<div class="col s4 l2 text-right" style="padding-left: 0px;">Number:</div>
|
|
130
|
+
<div class="col s8 l10">{{ part.full_part_number }}
|
|
131
|
+
{% if profile.role == 'A' %}
|
|
132
|
+
<a href="{% url 'bom:part-edit' part_id=part.id %}"> [edit]</a>
|
|
133
|
+
{% endif %}
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
<div class="row">
|
|
137
|
+
<div class="col s4 l2 text-right" style="padding-left: 0px;">Synopsis:</div>
|
|
138
|
+
<div class="col s8 l10">{{ part_revision.synopsis }}</div>
|
|
139
|
+
</div>
|
|
140
|
+
<div class="row">
|
|
141
|
+
<div class="col s4 l2 text-right" style="padding-left: 0px;">Configuration:</div>
|
|
142
|
+
<div class="col s8 l10">{{ part_revision.get_configuration_display|default:'n/a' }} <i>{% if part_revision %}(as of <span id="specs-revision-timestamp"></span>
|
|
143
|
+
){% endif %}
|
|
144
|
+
</i></div>
|
|
145
|
+
</div>
|
|
146
|
+
<div class="row">
|
|
147
|
+
<div class="col s4 l2 text-right" style="padding-left: 0;">
|
|
148
|
+
<img title="Via Google Drive" style="width: 16px;" src="{% static 'bom/img/google_drive_logo.svg' %}"> Files:
|
|
149
|
+
</div>
|
|
150
|
+
<div class="col s8 l10"><a href="{% url 'google-drive:add-folder' part_id=part.id %}" target="_blank">Open Folder</a></div>
|
|
151
|
+
</div>
|
|
152
|
+
<div class="row">
|
|
153
|
+
<div id="mouser-data-sheet-wrapper" style="display: none; min-height: 22px;">
|
|
154
|
+
<div class="col s4 l2 text-right" style="padding-left: 0;">
|
|
155
|
+
<img title="Via Mouser.com" style="width: 16px;" src="{% static 'bom/img/mouser.png' %}"> Datasheets
|
|
156
|
+
</div>
|
|
157
|
+
<div class="col s8 l10"><a id="mouser-data-sheet" target="_blank">View datasheet</a></div>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
</li>
|
|
161
|
+
<li class="collection-header">
|
|
162
|
+
<h5><h5 class="title">Manufacturer & Sourcing</h5></h5>
|
|
163
|
+
</li>
|
|
164
|
+
<li class="collection-item">
|
|
165
|
+
<div class="row">
|
|
166
|
+
<div class="col s4 l2 text-right" style="padding-left: 0px;">Primary Manufacturer Part:</div>
|
|
167
|
+
<div class="col s8 l10">{% if part.primary_manufacturer_part.link %}<a href="{{ part.primary_manufacturer_part.link }}" target="_blank">{% endif %}{{ part.primary_manufacturer_part.manufacturer.name }} - {{ part.primary_manufacturer_part.manufacturer_part_number }}{% if part.primary_manufacturer_part.link %} <i class="material-icons" style="font-size: 14px;">open_in_new</i></a>{% endif %}
|
|
168
|
+
{% if profile.role == 'A' %}
|
|
169
|
+
<a href="{% url 'bom:part-edit' part_id=part.id %}"> [change]</a>
|
|
170
|
+
{% endif %}
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
<div class="row">
|
|
174
|
+
<div class="col s4 l2 text-right" style="padding-left: 0px;">Est. Cost:</div>
|
|
175
|
+
<div id="specs-unit-cost" class="col s8 l10"><span id="mouser-est-cost"></span><span>{{ indented_bom.unit_cost|default_if_none:'-' }}</span></div>
|
|
176
|
+
</div>
|
|
177
|
+
<div class="row">
|
|
178
|
+
<div class="col s4 l2 text-right" style="padding-left: 0px;">Subparts without costs:</div>
|
|
179
|
+
<div class="col s8 l10"><span id="mouser-missing-item-costs"></span><span>{{ indented_bom.missing_item_costs }}</span></div>
|
|
180
|
+
</div>
|
|
181
|
+
<div class="row">
|
|
182
|
+
<div class="col s4 l2 text-right" style="padding-left: 0px;">Est. Total NRE:</div>
|
|
183
|
+
<div class="col s8 l10"><span id="mouser-est-nre"></span><span>{{ indented_bom.nre|default_if_none:'-' }}</span></div>
|
|
184
|
+
</div>
|
|
185
|
+
<div class="row">
|
|
186
|
+
<div class="col s4 l2 text-right" style="padding-left: 0px;">Est. Cost per {{ qty }} Unit Order (Including MOQs):</div>
|
|
187
|
+
<div class="col s8 l10"><span id="mouser-est-cost-per-order"></span><span>{{ indented_bom.out_of_pocket_cost|default_if_none:'-' }}</span></div>
|
|
188
|
+
</div>
|
|
189
|
+
<div class="row" id="mouser-stock-wrapper" style="display: none;">
|
|
190
|
+
<div class="col s4 l2 text-right" style="padding-left: 0px;">Mouser stock:</div>
|
|
191
|
+
<div class="col s8 l10"><span id="mouser-stock"></span></div>
|
|
192
|
+
</div>
|
|
193
|
+
</li>
|
|
194
|
+
</ul>
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
<div id="bom" class="col s12">
|
|
198
|
+
<h4 class="printer-show">Bill of Materials</h4>
|
|
199
|
+
<div id="bom-indented">
|
|
200
|
+
<div class="text-center" style="padding-top: 8px;">
|
|
201
|
+
<span>Indented</span> | <a onclick="showFlatBOM()" href="#">Flat</a>
|
|
202
|
+
</div>
|
|
203
|
+
{% include 'bom/components/bom-indented.html' with order_by=order_by bom_items=indented_bom.parts part=part part_revision=part_revision profile=profile %}
|
|
204
|
+
</div>
|
|
205
|
+
<div id="bom-flat" style="display: none;">
|
|
206
|
+
<div class="text-center" style="padding-top: 8px;">
|
|
207
|
+
<a onclick="showIndentedBOM()" href="#">Indented</a> | <span>Flat</span>
|
|
208
|
+
</div>
|
|
209
|
+
{% include 'bom/components/bom-flat.html' with order_by=order_by bom_items=flat_bom.parts part=part part_revision=part_revision profile=profile %}
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
|
|
213
|
+
<div id="used" class="col s12">
|
|
214
|
+
<h4 class="printer-show">Where Used</h4>
|
|
215
|
+
<br>
|
|
216
|
+
<div class="responsive-table-wrapper">
|
|
217
|
+
<ul class="collapsible" data-collapsible="expandable" style="overflow: scroll;">
|
|
218
|
+
<li class="active">
|
|
219
|
+
<div class="collapsible-header"><i class="material-icons">my_location</i>Where this revision is used</div>
|
|
220
|
+
<div class="collapsible-body">
|
|
221
|
+
<table class="highlight tight">
|
|
222
|
+
<thead>
|
|
223
|
+
<tr>
|
|
224
|
+
<th>Part Number</th>
|
|
225
|
+
<th>Synopsis</th>
|
|
226
|
+
<th>Rev</th>
|
|
227
|
+
<th>Manufacturer</th>
|
|
228
|
+
<th>MPN</th>
|
|
229
|
+
</tr>
|
|
230
|
+
</thead>
|
|
231
|
+
|
|
232
|
+
<tbody>
|
|
233
|
+
{% for used_part in where_used %}
|
|
234
|
+
<tr>
|
|
235
|
+
<td>
|
|
236
|
+
<a href="{% url 'bom:part-info-history' part_id=used_part.part.id part_revision_id=used_part.id %}">{{ used_part.part.full_part_number }}</a>
|
|
237
|
+
</td>
|
|
238
|
+
<td>{{ used_part.synopsis }}</td>
|
|
239
|
+
<td>{{ used_part.revision }}</td>
|
|
240
|
+
<td>{{ used_part.part.primary_manufacturer_part.manufacturer.name }}</td>
|
|
241
|
+
<td>{{ used_part.part.primary_manufacturer_part.manufacturer_part_number }}</td>
|
|
242
|
+
</tr>
|
|
243
|
+
{% empty %}
|
|
244
|
+
<tr>
|
|
245
|
+
<td colspan="99" style="text-align: left; height: 20vh;"><i>This part is not currently
|
|
246
|
+
used in any of your other parts. To add a part to a subassembly or assembly, go to the
|
|
247
|
+
parent part's Bill of Materials, and click "Manage", then "Edit".</i></td>
|
|
248
|
+
</tr>
|
|
249
|
+
{% endfor %}
|
|
250
|
+
</tbody>
|
|
251
|
+
</table>
|
|
252
|
+
</div>
|
|
253
|
+
</li>
|
|
254
|
+
<li>
|
|
255
|
+
<div class="collapsible-header"><i class="material-icons">location_searching</i>All part usages</div>
|
|
256
|
+
<div class="collapsible-body">
|
|
257
|
+
<table class="highlight tight">
|
|
258
|
+
<thead>
|
|
259
|
+
<tr>
|
|
260
|
+
<th>Part Number</th>
|
|
261
|
+
<th>Synopsis</th>
|
|
262
|
+
<th>Rev</th>
|
|
263
|
+
<th>Manufacturer</th>
|
|
264
|
+
<th>MPN</th>
|
|
265
|
+
</tr>
|
|
266
|
+
</thead>
|
|
267
|
+
|
|
268
|
+
<tbody>
|
|
269
|
+
{% for used_part in where_used_part %}
|
|
270
|
+
<tr>
|
|
271
|
+
<td>
|
|
272
|
+
<a href="{% url 'bom:part-info-history' part_id=used_part.part.id part_revision_id=used_part.id %}">{{ used_part.part.full_part_number }}</a>
|
|
273
|
+
</td>
|
|
274
|
+
<td>{{ used_part.synopsis }}</td>
|
|
275
|
+
<td>{{ used_part.revision }}</td>
|
|
276
|
+
<td>{{ used_part.part.primary_manufacturer_part.manufacturer.name }}</td>
|
|
277
|
+
<td>{{ used_part.part.primary_manufacturer_part.manufacturer_part_number }}</td>
|
|
278
|
+
</tr>
|
|
279
|
+
{% empty %}
|
|
280
|
+
<tr>
|
|
281
|
+
<td colspan="99" style="text-align: center; height: 20vh;"><i>This part is not currently
|
|
282
|
+
used in any of your other parts.
|
|
283
|
+
{% if profile.role == 'A' %}
|
|
284
|
+
To add a part to a subassembly or assembly, go to the
|
|
285
|
+
parent part's Bill of Materials, and click "Manage", then "Edit".
|
|
286
|
+
{% endif %}
|
|
287
|
+
</i></td>
|
|
288
|
+
</tr>
|
|
289
|
+
{% endfor %}
|
|
290
|
+
</tbody>
|
|
291
|
+
</table>
|
|
292
|
+
</div>
|
|
293
|
+
</li>
|
|
294
|
+
</ul>
|
|
295
|
+
</div>
|
|
296
|
+
</div>
|
|
297
|
+
|
|
298
|
+
<div id="sourcing" class="col s12">
|
|
299
|
+
<h4 class="printer-show">Sourcing</h4>
|
|
300
|
+
{% include 'bom/components/manufacturer-part-list.html' with manufacturer_parts=part.manufacturer_parts part_revision=part_revision profile=profile %}
|
|
301
|
+
{% if profile.role == 'A' %}
|
|
302
|
+
<div class="row" style="padding-top: 16px;">
|
|
303
|
+
<div class="col s12 center-align">
|
|
304
|
+
<a class="waves-effect waves-green grey lighten-4 btn-flat"
|
|
305
|
+
href="{% url 'bom:part-add-manufacturer-part' part_id=part.id %}" style="margin: 10px;">Add Manufacturer Part</a>
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
{% endif %}
|
|
309
|
+
</div>
|
|
310
|
+
</div>
|
|
311
|
+
</div>
|
|
312
|
+
</div>
|
|
313
|
+
{% endblock %}
|
|
314
|
+
{% block bom-script %}
|
|
315
|
+
<!-- Materialize initializer -->
|
|
316
|
+
<script>
|
|
317
|
+
$(document).ready(function () {
|
|
318
|
+
$('.collapsible').collapsible({
|
|
319
|
+
accordion: false
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
var elem = document.querySelector('.collapsible.expandable');
|
|
323
|
+
var instance = M.Collapsible.init(elem, {
|
|
324
|
+
accordion: false
|
|
325
|
+
});
|
|
326
|
+
</script>
|
|
327
|
+
|
|
328
|
+
<!-- Handle if there's an anchor, select tab -->
|
|
329
|
+
<script type='text/javascript'>
|
|
330
|
+
var tabsElem = document.querySelector('.tabs');
|
|
331
|
+
|
|
332
|
+
{% if tab_anchor %}
|
|
333
|
+
$('#{{ tab_anchor }}-tab').addClass('active');
|
|
334
|
+
{% endif %}
|
|
335
|
+
|
|
336
|
+
var tabs = M.Tabs.init(tabsElem);
|
|
337
|
+
|
|
338
|
+
// For dropdown menu
|
|
339
|
+
$(document).ready(function () {
|
|
340
|
+
$('.dropdown-trigger').dropdown({
|
|
341
|
+
inDuration: 300,
|
|
342
|
+
outDuration: 225,
|
|
343
|
+
constrainWidth: false, // Does not change width of dropdown to that of the activator
|
|
344
|
+
hover: false, // Activate on hover
|
|
345
|
+
gutter: 0, // Spacing from edge
|
|
346
|
+
alignment: 'left', // Displays dropdown with edge aligned to the left of button
|
|
347
|
+
stopPropagation: false, // Stops event propagation
|
|
348
|
+
coverTrigger: false
|
|
349
|
+
}
|
|
350
|
+
);
|
|
351
|
+
|
|
352
|
+
{% if not tab_anchor %}
|
|
353
|
+
if (window.localStorage['part-info-last-anchor']) {
|
|
354
|
+
{#tabs.select(window.localStorage['part-info-last-anchor']);#}
|
|
355
|
+
}
|
|
356
|
+
{% endif %}
|
|
357
|
+
});
|
|
358
|
+
</script>
|
|
359
|
+
|
|
360
|
+
<script src="{% static 'bom/js/jquery.treetable.js' %}"></script>
|
|
361
|
+
<script>
|
|
362
|
+
$("#manufacturer-parts").treetable({
|
|
363
|
+
expandable: true,
|
|
364
|
+
indent: 2,
|
|
365
|
+
initialState: 'collapsed',
|
|
366
|
+
});
|
|
367
|
+
</script>
|
|
368
|
+
|
|
369
|
+
<!-- Floating Horizontal Scrollbar -->
|
|
370
|
+
<script type="text/javascript" src="{% static 'bom/js/jquery.ba-floatingscrollbar.min.js' %}"></script>
|
|
371
|
+
<script>
|
|
372
|
+
$(function () {
|
|
373
|
+
$('.responsive-table-wrapper').floatingScrollbar();
|
|
374
|
+
});
|
|
375
|
+
</script>
|
|
376
|
+
|
|
377
|
+
<!-- For revision selector logic -->
|
|
378
|
+
<script>
|
|
379
|
+
var selectRevisionSelectedIndex = 1;
|
|
380
|
+
$(document).ready(function () {
|
|
381
|
+
selectRevisionSelectedIndex = $("#select-revision")[0].selectedIndex;
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
$("#select-revision").on('change', function () {
|
|
385
|
+
var url = $(this)[0].value;
|
|
386
|
+
var selectedIndex = $(this)[0].selectedIndex;
|
|
387
|
+
if (selectedIndex === 0) {
|
|
388
|
+
var value = "{% if revision == part.latest %}{% url 'bom:part-info' part_id=part.id %}{% else %}{% url 'bom:part-info-history' part_id=part.id part_revision_id=part_revision.id %}{% endif %}";
|
|
389
|
+
$("#select-revision")[0].selectedIndex = selectRevisionSelectedIndex;
|
|
390
|
+
$("#select-revision").formSelect();
|
|
391
|
+
}
|
|
392
|
+
window.location.href = url;
|
|
393
|
+
});
|
|
394
|
+
</script>
|
|
395
|
+
|
|
396
|
+
<!-- Revision timestamp to local time -->
|
|
397
|
+
<script>
|
|
398
|
+
$(document).ready(function () {
|
|
399
|
+
let revision_configuration_date = new Date("{{ part_revision.timestamp.isoformat }}")
|
|
400
|
+
$("#specs-revision-timestamp").text(revision_configuration_date.toLocaleString());
|
|
401
|
+
})
|
|
402
|
+
</script>
|
|
403
|
+
|
|
404
|
+
<!-- Confirmation popups? -->
|
|
405
|
+
<script>
|
|
406
|
+
function deletePartRevision() {
|
|
407
|
+
{% if part_revision is not None %}
|
|
408
|
+
let url = "{% url 'bom:part-revision-delete' part_id=part.id part_revision_id=part_revision.id %}";
|
|
409
|
+
if (confirm("Are you sure you want to delete this revision?\n\nIt will be deleted permanently.")) {
|
|
410
|
+
window.location.href = url;
|
|
411
|
+
}
|
|
412
|
+
{% else %}
|
|
413
|
+
confirm("No part revisions to delete!");
|
|
414
|
+
{% endif %}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
function revertPartRevision() {
|
|
418
|
+
{% if part_revision is not None %}
|
|
419
|
+
let url = "{% url 'bom:part-revision-revert' part_id=part.id part_revision_id=part_revision.id %}";
|
|
420
|
+
if (confirm("Are you sure you want to revert this revision?\n\n")) {
|
|
421
|
+
window.location.href = url;
|
|
422
|
+
}
|
|
423
|
+
{% else %}
|
|
424
|
+
confirm("No part revisions to revert!");
|
|
425
|
+
{% endif %}
|
|
426
|
+
}
|
|
427
|
+
</script>
|
|
428
|
+
|
|
429
|
+
<script>
|
|
430
|
+
function showFlatBOM() {
|
|
431
|
+
$('#bom-indented').hide();
|
|
432
|
+
$('#bom-flat').show();
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
function showIndentedBOM() {
|
|
436
|
+
$('#bom-flat').hide();
|
|
437
|
+
$('#bom-indented').show();
|
|
438
|
+
}
|
|
439
|
+
</script>
|
|
440
|
+
{% endblock bom-script %}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
{% load static %}
|
|
2
|
+
{% load materializecss %}
|
|
3
|
+
|
|
4
|
+
{% comment %}
|
|
5
|
+
|
|
6
|
+
This file is intended to be used as a Django include file for the purpose of displaying
|
|
7
|
+
all of the properties of a part revision, as follows:
|
|
8
|
+
|
|
9
|
+
{% include 'bom/part-revision-display.html' with part_revision_form=XXX %}
|
|
10
|
+
|
|
11
|
+
where XXX should be the name of the includee's object that represent its PartRevisionForm.
|
|
12
|
+
|
|
13
|
+
{% endcomment %}
|
|
14
|
+
<p>Must include a either a description or electronics value, and value units. The remaining fields are optional.</p>
|
|
15
|
+
<div class="row">
|
|
16
|
+
<div class="fieldWrapper">
|
|
17
|
+
{{ part_revision_form.revision|materializecss:'m2 s12' }}
|
|
18
|
+
</div>
|
|
19
|
+
<div class="fieldWrapper">
|
|
20
|
+
{{ part_revision_form.description|materializecss:'m8 s12' }}
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<div class="row">
|
|
25
|
+
<div class="col s12">
|
|
26
|
+
<h4>Electronics</h4>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div class="row">
|
|
31
|
+
<div class="fieldWrapper">
|
|
32
|
+
{{ part_revision_form.value|materializecss:'m2 s12' }}
|
|
33
|
+
</div>
|
|
34
|
+
<div class="fieldWrapper">
|
|
35
|
+
{{ part_revision_form.value_units|materializecss:'m1 s12' }}
|
|
36
|
+
</div>
|
|
37
|
+
<div class="fieldWrapper">
|
|
38
|
+
{{ part_revision_form.tolerance|materializecss:'m1 s12' }}
|
|
39
|
+
</div>
|
|
40
|
+
<div class="fieldWrapper">
|
|
41
|
+
{{ part_revision_form.package|materializecss:'m2 s12' }}
|
|
42
|
+
</div>
|
|
43
|
+
<div class="fieldWrapper">
|
|
44
|
+
{{ part_revision_form.pin_count|materializecss:'m1 s12' }}
|
|
45
|
+
</div>
|
|
46
|
+
<div class="fieldWrapper">
|
|
47
|
+
{{ part_revision_form.supply_voltage|materializecss:'m1 s12' }}
|
|
48
|
+
</div>
|
|
49
|
+
<div class="fieldWrapper">
|
|
50
|
+
{{ part_revision_form.supply_voltage_units|materializecss:'m1 s12' }}
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div class="row">
|
|
55
|
+
<div class="col s12">
|
|
56
|
+
<h4>Ratings</h4>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<div class="row">
|
|
61
|
+
<div class="fieldWrapper">
|
|
62
|
+
{{ part_revision_form.power_rating|materializecss:'m1 s12' }}
|
|
63
|
+
</div>
|
|
64
|
+
<div class="fieldWrapper">
|
|
65
|
+
{{ part_revision_form.power_rating_units|materializecss:'m1 s12' }}
|
|
66
|
+
</div>
|
|
67
|
+
<div class="fieldWrapper">
|
|
68
|
+
{{ part_revision_form.voltage_rating|materializecss:'m1 s12' }}
|
|
69
|
+
</div>
|
|
70
|
+
<div class="fieldWrapper">
|
|
71
|
+
{{ part_revision_form.voltage_rating_units|materializecss:'m1 s12' }}
|
|
72
|
+
</div>
|
|
73
|
+
<div class="fieldWrapper">
|
|
74
|
+
{{ part_revision_form.current_rating|materializecss:'m1 s12' }}
|
|
75
|
+
</div>
|
|
76
|
+
<div class="fieldWrapper">
|
|
77
|
+
{{ part_revision_form.current_rating_units|materializecss:'m1 s12' }}
|
|
78
|
+
</div>
|
|
79
|
+
<div class="fieldWrapper">
|
|
80
|
+
{{ part_revision_form.temperature_rating|materializecss:'m1 s12' }}
|
|
81
|
+
</div>
|
|
82
|
+
<div class="fieldWrapper">
|
|
83
|
+
{{ part_revision_form.temperature_rating_range_max|materializecss:'m1 s12' }}
|
|
84
|
+
</div>
|
|
85
|
+
<div class="fieldWrapper">
|
|
86
|
+
{{ part_revision_form.temperature_rating_range_min|materializecss:'m1 s12' }}
|
|
87
|
+
</div>
|
|
88
|
+
<div class="fieldWrapper">
|
|
89
|
+
{{ part_revision_form.temperature_rating_units|materializecss:'m1 s12' }}
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<div class="row">
|
|
94
|
+
<div class="col s12">
|
|
95
|
+
<h4>Miscellaneous</h4>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<div class="row">
|
|
100
|
+
<div class="fieldWrapper">
|
|
101
|
+
{{ part_revision_form.memory|materializecss:'m1 s12' }}
|
|
102
|
+
</div>
|
|
103
|
+
<div class="fieldWrapper">
|
|
104
|
+
{{ part_revision_form.memory_units|materializecss:'m1 s12' }}
|
|
105
|
+
</div>
|
|
106
|
+
<div class="fieldWrapper">
|
|
107
|
+
{{ part_revision_form.interface|materializecss:'m2 s12' }}
|
|
108
|
+
</div>
|
|
109
|
+
<div class="fieldWrapper">
|
|
110
|
+
{{ part_revision_form.frequency|materializecss:'m1 s12' }}
|
|
111
|
+
</div>
|
|
112
|
+
<div class="fieldWrapper">
|
|
113
|
+
{{ part_revision_form.frequency_units|materializecss:'m1 s12' }}
|
|
114
|
+
</div>
|
|
115
|
+
<div class="fieldWrapper">
|
|
116
|
+
{{ part_revision_form.wavelength|materializecss:'m1 s12' }}
|
|
117
|
+
</div>
|
|
118
|
+
<div class="fieldWrapper">
|
|
119
|
+
{{ part_revision_form.wavelength_units|materializecss:'m1 s12' }}
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
|
|
123
|
+
<div class="row">
|
|
124
|
+
<div class="col s12">
|
|
125
|
+
<h4>Appearance</h4>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<div class="row">
|
|
130
|
+
<div class="fieldWrapper">
|
|
131
|
+
{{ part_revision_form.color|materializecss:'m2 s12' }}
|
|
132
|
+
</div>
|
|
133
|
+
<div class="fieldWrapper">
|
|
134
|
+
{{ part_revision_form.material|materializecss:'m2 s12' }}
|
|
135
|
+
</div>
|
|
136
|
+
<div class="fieldWrapper">
|
|
137
|
+
{{ part_revision_form.finish|materializecss:'m2 s12' }}
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
|
|
141
|
+
<div class="row">
|
|
142
|
+
<div class="col s12">
|
|
143
|
+
<h4>Dimensions</h4>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
<div class="row">
|
|
148
|
+
<div class="fieldWrapper">
|
|
149
|
+
{{ part_revision_form.length|materializecss:'m1 s12' }}
|
|
150
|
+
</div>
|
|
151
|
+
<div class="fieldWrapper">
|
|
152
|
+
{{ part_revision_form.length_units|materializecss:'m1 s12' }}
|
|
153
|
+
</div>
|
|
154
|
+
<div class="fieldWrapper">
|
|
155
|
+
{{ part_revision_form.width|materializecss:'m1 s12' }}
|
|
156
|
+
</div>
|
|
157
|
+
<div class="fieldWrapper">
|
|
158
|
+
{{ part_revision_form.width_units|materializecss:'m1 s12' }}
|
|
159
|
+
</div>
|
|
160
|
+
<div class="fieldWrapper">
|
|
161
|
+
{{ part_revision_form.height|materializecss:'m1 s12' }}
|
|
162
|
+
</div>
|
|
163
|
+
<div class="fieldWrapper">
|
|
164
|
+
{{ part_revision_form.height_units|materializecss:'m1 s12' }}
|
|
165
|
+
</div>
|
|
166
|
+
<div class="fieldWrapper">
|
|
167
|
+
{{ part_revision_form.weight|materializecss:'m1 s12' }}
|
|
168
|
+
</div>
|
|
169
|
+
<div class="fieldWrapper">
|
|
170
|
+
{{ part_revision_form.weight_units|materializecss:'m1 s12' }}
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
<div class="row">
|
|
175
|
+
<div class="col s12">
|
|
176
|
+
<h4>Other Attributes</h4>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<div class="row">
|
|
181
|
+
<div class="fieldWrapper">
|
|
182
|
+
{{ part_revision_form.attribute|materializecss:'m12 s12' }}
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|