django-bom 1.239__py3-none-any.whl → 1.243__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.
- bom/migrations/0050_alter_organization_options.py +17 -0
- bom/settings.py +2 -6
- bom/static/bom/css/style.css +85 -5
- bom/templates/bom/settings.html +280 -214
- bom/templates/bom/subscription_panel.html +16 -0
- bom/views/views.py +2 -3
- {django_bom-1.239.dist-info → django_bom-1.243.dist-info}/METADATA +1 -1
- {django_bom-1.239.dist-info → django_bom-1.243.dist-info}/RECORD +11 -10
- bom/templates/bom/_subscription_panel.html +0 -6
- {django_bom-1.239.dist-info → django_bom-1.243.dist-info}/WHEEL +0 -0
- {django_bom-1.239.dist-info → django_bom-1.243.dist-info}/licenses/LICENSE +0 -0
- {django_bom-1.239.dist-info → django_bom-1.243.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Generated by Django 5.2.8 on 2025-12-16 18:43
|
|
2
|
+
|
|
3
|
+
from django.db import migrations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
('bom', '0049_alter_assembly_id_alter_assemblysubparts_id_and_more'),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.AlterModelOptions(
|
|
14
|
+
name='organization',
|
|
15
|
+
options={'permissions': (('manage_members', 'Can manage organization members'),)},
|
|
16
|
+
),
|
|
17
|
+
]
|
bom/settings.py
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import logging
|
|
2
|
+
import os
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from django.utils.log import DEFAULT_LOGGING
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
# BASE CONFIGURATION & LOCAL SETTINGS
|
|
8
|
-
# --------------------------------------------------------------------------
|
|
5
|
+
from django.utils.log import DEFAULT_LOGGING
|
|
9
6
|
|
|
10
7
|
logger = logging.getLogger(__name__)
|
|
11
8
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
12
9
|
|
|
13
|
-
# Attempt to load local settings (similar pattern to your original, but clean)
|
|
14
10
|
try:
|
|
15
11
|
from .local_settings import *
|
|
16
12
|
except ImportError:
|
bom/static/bom/css/style.css
CHANGED
|
@@ -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.
|
|
22
|
+
font-size: 3.5rem;
|
|
23
|
+
font-weight: 300;
|
|
13
24
|
}
|
|
14
25
|
|
|
15
26
|
h2 {
|
|
16
|
-
font-size:
|
|
27
|
+
font-size: 3.0rem;
|
|
28
|
+
font-weight: 300;
|
|
17
29
|
}
|
|
18
30
|
|
|
19
31
|
h3 {
|
|
20
|
-
font-size:
|
|
32
|
+
font-size: 1.6rem;
|
|
33
|
+
font-weight: 300;
|
|
21
34
|
}
|
|
22
35
|
|
|
23
36
|
h4 {
|
|
24
|
-
font-size: 1.
|
|
37
|
+
font-size: 1.3rem;
|
|
38
|
+
font-weight: 300;
|
|
25
39
|
}
|
|
26
40
|
|
|
27
41
|
h5 {
|
|
28
|
-
font-size: 1.
|
|
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
|
}
|
bom/templates/bom/settings.html
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
{% block content %}
|
|
9
9
|
<div class="row container-app">
|
|
10
|
-
<div class="col
|
|
10
|
+
<div class="col s8 offset-s2">
|
|
11
11
|
<ul id="tabs" class="tabs tabs-fixed-width">
|
|
12
12
|
<li class="tab"><a id="user-tab" href="#user">User</a></li>
|
|
13
13
|
<li class="tab"><a id="indabom-tab" href="#indabom">IndaBOM</a></li>
|
|
@@ -15,53 +15,59 @@
|
|
|
15
15
|
</ul>
|
|
16
16
|
</div>
|
|
17
17
|
|
|
18
|
-
<div id="user" class="col s12">
|
|
19
|
-
<
|
|
20
|
-
|
|
21
|
-
{%
|
|
22
|
-
|
|
23
|
-
<div class="
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
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>
|
|
27
31
|
</div>
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
{{ user_form.email|materializecss:'s12 m4' }}
|
|
33
|
-
</div>
|
|
34
|
-
<div class="row">
|
|
35
|
-
<div class="col s12 right-align">
|
|
36
|
-
<button class="waves-effect waves-light btn btn-primary" type="submit" name="submit-edit-user">
|
|
37
|
-
Save
|
|
38
|
-
</button>
|
|
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' }}
|
|
39
36
|
</div>
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
<p>Deleting your account is permanent. If you are the organization owner, your organization will also be deleted unless you transfer ownership before proceeding.</p>
|
|
48
|
-
<a href="{% url 'account-delete' %}" class="btn btn-warning">Delete My Account</a>
|
|
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>
|
|
49
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>
|
|
50
56
|
</div>
|
|
51
57
|
</div>
|
|
52
58
|
</div>
|
|
53
59
|
|
|
54
|
-
<div id="indabom" class="col s12">
|
|
60
|
+
<div id="indabom" class="col s12 l8 offset-l2">
|
|
55
61
|
{% if profile.role == 'A' %}
|
|
56
62
|
{% if organization.number_scheme == 'S' %}
|
|
57
|
-
|
|
58
|
-
<
|
|
59
|
-
|
|
63
|
+
<div class="section">
|
|
64
|
+
<h4 class="section-title"><i class="material-icons teal-text text-darken-1">category</i>Part
|
|
65
|
+
Classes</h4>
|
|
60
66
|
<form name="seller" action="{% url 'bom:settings' tab_anchor=INDABOM_TAB %}" method="post" enctype="multipart/form-data">
|
|
61
67
|
{% csrf_token %}
|
|
62
68
|
{% if part_classes.count > 0 %}
|
|
63
69
|
<div class="row" style="margin-bottom: 0;">
|
|
64
|
-
<div class="input-field col s8
|
|
70
|
+
<div class="input-field col s8 l4">
|
|
65
71
|
<select name="part-class-action">
|
|
66
72
|
<option value="" disabled selected>Choose your action</option>
|
|
67
73
|
<option value="submit-part-class-enable-mouser">Enable Mouser</option>
|
|
@@ -70,16 +76,18 @@
|
|
|
70
76
|
</select>
|
|
71
77
|
<label>Action</label>
|
|
72
78
|
</div>
|
|
73
|
-
<div class="col s2
|
|
79
|
+
<div class="col s2 l2">
|
|
74
80
|
<div class="input-field">
|
|
75
81
|
<button class="waves-effect waves-light btn btn-primary" type="submit">Go
|
|
76
82
|
</button>
|
|
77
83
|
</div>
|
|
78
84
|
</div>
|
|
79
|
-
<div class="col s2
|
|
85
|
+
<div class="col s2 l6 right-align">
|
|
80
86
|
<div class="input-field">
|
|
81
|
-
<button class="waves-effect btn-flat btn-icon-round tooltipped"
|
|
82
|
-
|
|
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>
|
|
83
91
|
</div>
|
|
84
92
|
</div>
|
|
85
93
|
</div>
|
|
@@ -90,7 +98,9 @@
|
|
|
90
98
|
<th class="text-normal">Code</th>
|
|
91
99
|
<th class="text-normal">Name</th>
|
|
92
100
|
<th class="text-normal">Description</th>
|
|
93
|
-
<th class="text-normal"><img height="18" style="padding: 4px 4px 0 4px;"
|
|
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
|
|
94
104
|
Sourcing
|
|
95
105
|
</th>
|
|
96
106
|
<th class="text-normal">Options</th>
|
|
@@ -106,7 +116,9 @@
|
|
|
106
116
|
<td class="text-normal">{{ part_class.name }}</td>
|
|
107
117
|
<td class="text-normal">{{ part_class.comment }}</td>
|
|
108
118
|
<td class="text-normal">{% if part_class.mouser_enabled %}
|
|
109
|
-
<img height="24" style="padding: 4px 4px 0 4px;" alt="Mouser"
|
|
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>
|
|
110
122
|
<td>
|
|
111
123
|
<a class="waves-effect btn-flat"
|
|
112
124
|
href="{% url 'bom:part-class-edit' part_class_id=part_class.id %}"><i
|
|
@@ -117,212 +129,266 @@
|
|
|
117
129
|
</tbody>
|
|
118
130
|
</table>
|
|
119
131
|
{% else %}
|
|
120
|
-
<p>No part classes have been defined yet
|
|
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>
|
|
121
138
|
{% endif %}
|
|
122
139
|
</form>
|
|
123
|
-
|
|
124
|
-
<div class="row" style="padding-top: 16px;">
|
|
125
|
-
<div class="col s12 right-align">
|
|
126
|
-
{% if part_classes.count == 0 %}
|
|
127
|
-
<a href="{% url 'bom:help' %}#part-numbering" target="_blank">What is a part class?</a>
|
|
128
|
-
<p>You may also use <a href="{% static 'bom/doc/sample_part_classes.csv' %}">this sample CSV file</a>.</p>
|
|
129
|
-
{% endif %}
|
|
140
|
+
<div class="right-align" style="margin-top: 16px;">
|
|
130
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>.' %}
|
|
131
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' %}
|
|
132
143
|
</div>
|
|
133
144
|
</div>
|
|
134
|
-
|
|
135
|
-
<
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
<
|
|
139
|
-
|
|
140
|
-
<
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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>
|
|
147
168
|
</div>
|
|
148
|
-
</
|
|
149
|
-
</
|
|
169
|
+
</form>
|
|
170
|
+
</div>
|
|
150
171
|
{% endif %}
|
|
151
|
-
|
|
152
|
-
<
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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>
|
|
167
215
|
{% endif %}
|
|
168
|
-
</
|
|
169
|
-
<p style="font-size: 15px;">You can read more about the options <a href="{% url 'bom:help' %}#part-numbering" target="_blank">here</a>.</p>
|
|
170
|
-
{% if organization_parts_count > 0 %}
|
|
171
|
-
<p><b>You've already created {{ organization_parts_count }} part{{ organization_parts_count|pluralize }}.</b> Since changing your organization number scheme requires changing your
|
|
172
|
-
parts numbers, please manually delete your parts then come back here to change your organization number scheme. Alternatively we can
|
|
173
|
-
help delete your parts if you reach out to info@indabom.com.</p>
|
|
174
|
-
{% else %}
|
|
175
|
-
<form name="number-scheme" action="{% url 'bom:settings' tab_anchor=INDABOM_TAB %}" method="post" class="col s12">
|
|
176
|
-
{% csrf_token %}
|
|
177
|
-
<button type="submit" name="change-number-scheme" class="waves-effect waves-light btn red lighten-1">Change Scheme to {% if organization.number_scheme == 'S' %}
|
|
178
|
-
Intelligent{% else %}Semi-Intelligent{% endif %}</button>
|
|
179
|
-
</form>
|
|
180
|
-
{% endif %}
|
|
216
|
+
</div>
|
|
181
217
|
{% else %}
|
|
182
218
|
{% include 'bom/nothing-to-see.html' with required_privilege='Admin' %}
|
|
183
219
|
{% endif %}
|
|
184
220
|
</div>
|
|
185
221
|
|
|
186
|
-
<div id="organization" class="col s12">
|
|
222
|
+
<div id="organization" class="col s12 l8 offset-l2">
|
|
187
223
|
{% if user.bom_profile.role == 'A' %}
|
|
188
|
-
<
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
<
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
</
|
|
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' }}
|
|
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>
|
|
204
240
|
</div>
|
|
205
|
-
</
|
|
206
|
-
</
|
|
241
|
+
</div>
|
|
242
|
+
</form>
|
|
207
243
|
</div>
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
</
|
|
249
|
-
</
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
</
|
|
260
|
-
</
|
|
261
|
-
|
|
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>
|
|
262
302
|
</div>
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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>
|
|
267
315
|
{% if not google_authentication %}
|
|
268
316
|
<p>Connect your Google account to access Google Drive features.
|
|
269
|
-
{% if not organization.google_drive_parent %}Organization owners can enable file storage
|
|
270
|
-
owner
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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>
|
|
279
333
|
{% else %}
|
|
280
334
|
<p>You're connected with Google and can access Google Drive features.</p>
|
|
281
335
|
{% endif %}
|
|
282
|
-
<
|
|
336
|
+
<div>
|
|
283
337
|
{% if google_authentication %}
|
|
284
|
-
<p>Logged in to Google as: {{ google_authentication.uid }}
|
|
285
|
-
<
|
|
286
|
-
{%
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
338
|
+
<p>Logged in to Google as: {{ google_authentication.uid }}</p>
|
|
339
|
+
<div class="right-align">
|
|
340
|
+
<form action="{% url 'social:disconnect' 'google-oauth2' %}" method="post">
|
|
341
|
+
{% csrf_token %}
|
|
342
|
+
<button class="waves-effect waves-light btn btn-primary" type="submit">
|
|
343
|
+
Disconnect
|
|
344
|
+
</button>
|
|
345
|
+
</form>
|
|
346
|
+
</div>
|
|
290
347
|
{% else %}
|
|
291
|
-
<
|
|
292
|
-
|
|
293
|
-
|
|
348
|
+
<p>To get started, sign in with Google:</p>
|
|
349
|
+
<div class="right-align">
|
|
350
|
+
<a href="{% url "social:begin" "google-oauth2" %}">
|
|
351
|
+
<img title="Google sign-in."
|
|
352
|
+
src="{% static 'bom/img/google/web/1x/btn_google_signin_dark_normal_web.png' %}">
|
|
353
|
+
</a>
|
|
354
|
+
</div>
|
|
294
355
|
{% endif %}
|
|
295
|
-
</
|
|
356
|
+
</div>
|
|
296
357
|
</div>
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
358
|
+
<div class="section">
|
|
359
|
+
<h5 class="section-title"><img title="Sourcing via Mouser.com"
|
|
360
|
+
src="{% static 'bom/img/mouser.png' %}">Automagic Sourcing via
|
|
361
|
+
Mouser
|
|
362
|
+
</h5>
|
|
363
|
+
<!--<p>No connection required. To enable sourcing via Mouser, select which part classes you'd like
|
|
364
|
+
enabled on the Settings IndaBOM tab. Once enabled, sourcing information will appear on part
|
|
365
|
+
detail pages in which there are parts sourced via Mouser.</p>-->
|
|
366
|
+
<p>Currently under construction.</p>
|
|
306
367
|
</div>
|
|
307
368
|
</div>
|
|
308
369
|
{% endif %}
|
|
370
|
+
|
|
309
371
|
{% if profile.organization %}
|
|
310
|
-
<div class="
|
|
311
|
-
<
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
372
|
+
<div class="section">
|
|
373
|
+
<h4 class="section-title"><i class="material-icons red-text text-darken-1">exit_to_app</i>Leave Your
|
|
374
|
+
Organization</h4>
|
|
375
|
+
<p>Warning, the only way back in to {{ organization.name }} is if you are invited by an organization
|
|
376
|
+
administrator.</p>
|
|
377
|
+
<form name="leave-organization" action="{% url 'bom:settings' tab_anchor=ORGANIZATION_TAB %}"
|
|
378
|
+
method="post" enctype="multipart/form-data">
|
|
379
|
+
{% csrf_token %}
|
|
380
|
+
<div class="right-align">
|
|
381
|
+
<button class="waves-effect waves-light btn red lighten-1" type="submit"
|
|
382
|
+
name="submit-leave-organization">
|
|
383
|
+
<i class="material-icons left">exit_to_app</i>Leave Organization
|
|
384
|
+
</button>
|
|
385
|
+
</div>
|
|
386
|
+
</form>
|
|
319
387
|
</div>
|
|
320
388
|
{% else %}
|
|
321
|
-
<div class="
|
|
322
|
-
<
|
|
323
|
-
|
|
324
|
-
<p>To create your organization, start <a href="{% url 'bom:home' %}">here</a>.</p>
|
|
325
|
-
</div>
|
|
389
|
+
<div class="section">
|
|
390
|
+
<h4 class="section-title">You're not part of any organization</h4>
|
|
391
|
+
<p>To create your organization, start <a href="{% url 'bom:home' %}">here</a>.</p>
|
|
326
392
|
</div>
|
|
327
393
|
{% endif %}
|
|
328
394
|
</div>
|
|
@@ -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>
|
bom/views/views.py
CHANGED
|
@@ -357,7 +357,7 @@ def bom_settings(request, tab_anchor=None):
|
|
|
357
357
|
part_classes = PartClass.objects.all().filter(organization=organization)
|
|
358
358
|
|
|
359
359
|
users_in_organization = User.objects.filter(
|
|
360
|
-
id__in=UserMeta.objects.filter(organization=organization).values_list('user', flat=True)).
|
|
360
|
+
id__in=UserMeta.objects.filter(organization=organization).values_list('user', flat=True)).order_by(
|
|
361
361
|
'first_name', 'last_name', 'email')
|
|
362
362
|
users_in_organization_count = users_in_organization.count()
|
|
363
363
|
has_member_capacity = users_in_organization_count < organization.subscription_quantity
|
|
@@ -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
|
-
|
|
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:
|
|
@@ -13,7 +13,7 @@ bom/helpers.py,sha256=ONsDM0agG9sKJWMjN4IRNlWx2HNF7T0CXM-ts0GRiAY,15031
|
|
|
13
13
|
bom/local_settings.py,sha256=yE4aupIquCWsFms44qoCrRrlIyM3sqpOkiwyj1WLxI8,820
|
|
14
14
|
bom/models.py,sha256=poZoct60kAULCs8RlqC3MFtOl84l2ZfZzjb_d3t9z2g,36537
|
|
15
15
|
bom/part_bom.py,sha256=30HYAKAEhtadiM9tk6vgCQnn7gNJeuXbzF5gXvMvKG4,8720
|
|
16
|
-
bom/settings.py,sha256=
|
|
16
|
+
bom/settings.py,sha256=t3jamLeW4yJWIfB0aa5lbyz9xBCi-wcxTPEZxv5hswQ,8116
|
|
17
17
|
bom/tests.py,sha256=ZqcTUYVXeWjAqzKAV6hp6SKTU0_IOTwIEboTujl7N_M,69905
|
|
18
18
|
bom/urls.py,sha256=sGNKO8BsTO_TDPsqB-c_fqRozaNHOf9WYRaOy-7OLAE,6841
|
|
19
19
|
bom/utils.py,sha256=z_2jACSkRc0hsc0mdR8tOK10KiSDeM0a6rXIpztPDuA,7302
|
|
@@ -68,12 +68,13 @@ bom/migrations/0046_alter_sellerpart_unique_together.py,sha256=KcOwhf5Vh02wDq_Z3
|
|
|
68
68
|
bom/migrations/0047_sellerpart_seller_part_number.py,sha256=QdjdWMNlSyLHB7uSTq_8xhPxnYAXR8yht-d_AsMvJBw,446
|
|
69
69
|
bom/migrations/0048_rename_part_organization_number_class_bom_part_organiz_b333d6_idx_and_more.py,sha256=rZ_mfd_xFu4BglhYxkNuQVqwThZ721kjrlCAn9LkNRo,50969
|
|
70
70
|
bom/migrations/0049_alter_assembly_id_alter_assemblysubparts_id_and_more.py,sha256=l1q5BCNVYWD6Ngf9pGzYq1hQMvvshmdFlm33On63YNc,3247
|
|
71
|
+
bom/migrations/0050_alter_organization_options.py,sha256=n-YGAoUdUxYdh5NY0Zpz2T4CWEOR7tDjSFFk-KZD_tw,432
|
|
71
72
|
bom/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
72
73
|
bom/static/bom/css/dashboard.css,sha256=saLXUpnVRjsV9HNdsmQD4Eq-zBlm8R2YePhvoc1uifk,245
|
|
73
74
|
bom/static/bom/css/jquery.treetable.css,sha256=H37aGBAAFP3R6v08nui9gKSdLE2VGsGsmlttrIImzfE,652
|
|
74
75
|
bom/static/bom/css/materialize.min.css,sha256=OweaP_Ic6rsV-lysfyS4h-LM6sRwuO3euTYfr6M124g,141841
|
|
75
76
|
bom/static/bom/css/part-info.css,sha256=xQ6zJXHLStwU76UVoYxjG-MjdQzFRwg-jANqrj_KFS0,252
|
|
76
|
-
bom/static/bom/css/style.css,sha256=
|
|
77
|
+
bom/static/bom/css/style.css,sha256=_UDH_6aa77N7tWxZNNQv6LblE0hHSLkdTxWzpKJpEwk,6326
|
|
77
78
|
bom/static/bom/css/tablesorter-theme.materialize.css,sha256=S7DYXb4vdqdDSUouZ8aIbAxIpemhIzFfeRySdnvvSlc,7435
|
|
78
79
|
bom/static/bom/css/treetable-theme.css,sha256=RxMklK-XfcF90gxekH3IULmyr7_HRA0TdNz_9Xjxuro,24013
|
|
79
80
|
bom/static/bom/doc/sample_part_classes.csv,sha256=nAWhBV9KtHSejLUKD7OKKtbkfUYCeLgCwze9BPstiFo,1694
|
|
@@ -125,7 +126,6 @@ bom/static/bom/js/jquery-3.4.1.min.js,sha256=CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFl
|
|
|
125
126
|
bom/static/bom/js/jquery.ba-floatingscrollbar.min.js,sha256=NptA5rS2zjhkcu26WQJtMr34psHYzUYRsLrSziTusgg,1271
|
|
126
127
|
bom/static/bom/js/jquery.treetable.js,sha256=JEXnh_LuKYxk8CUIT1anQ4es4nfOqC0bds_NjsbMBUI,16611
|
|
127
128
|
bom/static/bom/js/materialize.min.js,sha256=9aWZlbcIvNSnb4BWaUYlFNGylNeTWUL_yffW_3Dbk_o,181114
|
|
128
|
-
bom/templates/bom/_subscription_panel.html,sha256=KE3f4DJ72c93GkW9O6bJw94ht05wNZxORP7o31qafcg,461
|
|
129
129
|
bom/templates/bom/account-delete.html,sha256=YjtG5o-sJHuK4Np3vyEliySF-eAwmFn0ROynDdvPMsU,728
|
|
130
130
|
bom/templates/bom/add-manufacturer-part.html,sha256=gM5_-RfgiuQwfns7s1J006d6ypKMbdG8F_kdLGQrJjA,3242
|
|
131
131
|
bom/templates/bom/add-sellerpart.html,sha256=W9rUYrfpqw3yx45S86GIpepdmN_8Xrf23urYexgObBw,4279
|
|
@@ -160,8 +160,9 @@ bom/templates/bom/part-revision-release.html,sha256=voG7wmYc1Cm3e_H1IasvQcPuyqnn
|
|
|
160
160
|
bom/templates/bom/search-help.html,sha256=Wh_tXBJtz0bznk0F1C7OSdRhMe2qpOs9NMCBb2i0CFI,4398
|
|
161
161
|
bom/templates/bom/seller-info.html,sha256=MACsHMYQXMWfRslXuvh9hD2z28VXzVi0DSy4yg7WQMk,3595
|
|
162
162
|
bom/templates/bom/sellers.html,sha256=6ut7LwRMGUKYB4BRjiSpDBP9BGgqT7nxpNQpUVWDvkw,5412
|
|
163
|
-
bom/templates/bom/settings.html,sha256=
|
|
163
|
+
bom/templates/bom/settings.html,sha256=et6ct7SxA8hJK8GyLcfEgmYb6esS2zvDoUJb432dfd0,28237
|
|
164
164
|
bom/templates/bom/signup.html,sha256=tB_x7q3IufSNXsd9Dfh8fdWpkiWSGH2_Zgw749B1PaU,884
|
|
165
|
+
bom/templates/bom/subscription_panel.html,sha256=Ute49APwiXONQW2z0AApJRaSwnwtsYt3_opn0bW5BX8,843
|
|
165
166
|
bom/templates/bom/table_of_contents.html,sha256=7wXWOfmVkk5Itjax5x1PE-g5QjxqmYBr7RW8NgtGRng,1763
|
|
166
167
|
bom/templates/bom/upload-bom.html,sha256=qGlI9HoUNe9H2m5T5TqKWGphaNupz3Y0020h_7GebsU,5230
|
|
167
168
|
bom/templates/bom/upload-parts-help.html,sha256=h2QbPn2QCRD6FVwDwerQSqM72fRFLI5835MsNtrvT7k,5456
|
|
@@ -178,9 +179,9 @@ bom/third_party_apis/mouser.py,sha256=q2-p0k2n-LNel_QRlfak0kAXT-9hh59k_Pt51PTG09
|
|
|
178
179
|
bom/third_party_apis/test_apis.py,sha256=2W0jtTisGTmktC7l556pn9-pZYseTQmmQfo6_4uP4Dc,679
|
|
179
180
|
bom/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
180
181
|
bom/views/json_views.py,sha256=CaDMxHGnp2182ZV9QZfNkgM7tc_rNmokkelav9rF2dE,2462
|
|
181
|
-
bom/views/views.py,sha256=
|
|
182
|
-
django_bom-1.
|
|
183
|
-
django_bom-1.
|
|
184
|
-
django_bom-1.
|
|
185
|
-
django_bom-1.
|
|
186
|
-
django_bom-1.
|
|
182
|
+
bom/views/views.py,sha256=uTxpDDB-Bt4y125JnqnxCe--kluIu1fk0Pfg4Abg8yc,72229
|
|
183
|
+
django_bom-1.243.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
184
|
+
django_bom-1.243.dist-info/METADATA,sha256=aeEnhLXxjc9KEpcghiDDpelDtmYHpwRXnZ9_ww19-ow,7558
|
|
185
|
+
django_bom-1.243.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
186
|
+
django_bom-1.243.dist-info/top_level.txt,sha256=6zytg4lnnobI96dO-ZEadPOCslrrFmf4t2Pnv-y8x0Y,4
|
|
187
|
+
django_bom-1.243.dist-info/RECORD,,
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{# Placeholder for subscription/billing UI. Host applications (e.g., indabom) can override this template by providing their own `bom/_subscription_panel.html` earlier in the template search path. #}
|
|
2
|
-
<div class="row">
|
|
3
|
-
<div class="col">
|
|
4
|
-
<i>As a self-hosted django-bom app, you can upgrade any organization using the admin dashboard by finding your <b>Organization</b> and changing the <b>Subscription</b> property to <b>Pro</b>.</i>
|
|
5
|
-
</div>
|
|
6
|
-
</div>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|