Lots of changes to scope precedents

master
Pete Ley 6 months ago
parent db55e4df62
commit 3bb3e8ca42

@ -122,11 +122,11 @@ Import summary:
query = 'SELECT name,tid FROM fqi_taxonomy_term_data WHERE vid=2'
for legacy_category in self._q(query):
c, new = ProjectCategory.objects.get_or_create(
description=legacy_category.name,
name=legacy_category.name,
legacy_id=legacy_category.tid,
)
if new:
self.stdout.write(f'Importing project category: {c.description}')
self.stdout.write(f'Importing project category: {c.name}')
c.save()
def set_project_categories(self, project):

@ -1,4 +1,4 @@
# Generated by Django 4.2.6 on 2023-11-15 19:33
# Generated by Django 4.2.6 on 2023-11-16 16:01
from django.conf import settings
from django.db import migrations, models
@ -13,9 +13,9 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('wagtailimages', '0025_alter_image_file_alter_rendition_file'),
('wagtailcore', '0089_log_entry_data_json_null_to_object'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
@ -35,11 +35,12 @@ class Migration(migrations.Migration):
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('legacy_id', models.IntegerField()),
('sort_order', models.IntegerField(default=0, help_text='Lower numbers sort earlier')),
],
options={
'verbose_name_plural': 'finishes',
'ordering': ['name'],
'ordering': ['sort_order', 'name'],
'abstract': False,
},
),
migrations.CreateModel(
@ -56,8 +57,8 @@ class Migration(migrations.Migration):
name='LandingProduct',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sort_order', models.IntegerField(default=0)),
('name', models.CharField(max_length=255)),
('sort_order', models.IntegerField(default=0, help_text='Lower numbers sort earlier')),
('description', models.TextField(blank=True, null=True)),
],
options={
@ -87,8 +88,8 @@ class Migration(migrations.Migration):
name='MiscProduct',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sort_order', models.IntegerField(default=0)),
('name', models.CharField(max_length=255)),
('sort_order', models.IntegerField(default=0, help_text='Lower numbers sort earlier')),
('description', models.TextField(blank=True, null=True)),
],
options={
@ -97,29 +98,42 @@ class Migration(migrations.Migration):
},
),
migrations.CreateModel(
name='NosingProduct',
name='Project',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sort_order', models.IntegerField(default=0)),
('legacy_id', models.IntegerField(blank=True, null=True)),
('number', models.IntegerField(unique=True)),
('name', models.CharField(max_length=255)),
('description', models.TextField(blank=True, null=True)),
('link', models.CharField(max_length=255)),
('status', models.CharField(choices=[('Awarded', 'Awarded'), ('Ongoing', 'Ongoing'), ('Complete', 'Complete'), ('On Hold', 'On Hold'), ('Canceled', 'Canceled')], max_length=255, null=True)),
('award_date', models.DateField(blank=True, null=True)),
('complete_date', models.DateField(blank=True, null=True)),
('bid_number', models.CharField(blank=True, max_length=255, null=True)),
('contract_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=15, null=True)),
('actual_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=15, null=True, verbose_name='closeout amount')),
('client_job_number', models.CharField(blank=True, max_length=255, null=True)),
('client_contract_no', models.CharField(blank=True, max_length=255, null=True, verbose_name='client contract number')),
('building_code', models.CharField(blank=True, max_length=255, null=True)),
('notes', models.TextField(blank=True, null=True)),
('address', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.location')),
('architect', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='architect_projects', to='core.company')),
],
options={
'ordering': ['sort_order', 'name'],
'abstract': False,
'ordering': ['-number'],
},
bases=(wagtail.search.index.Indexed, models.Model),
),
migrations.CreateModel(
name='ProjectCategory',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('legacy_id', models.IntegerField()),
('description', models.CharField(max_length=255)),
('name', models.CharField(max_length=255)),
('sort_order', models.IntegerField(default=0, help_text='Lower numbers sort earlier')),
('legacy_id', models.IntegerField(blank=True, null=True)),
],
options={
'verbose_name_plural': 'project categories',
'ordering': ['description'],
'ordering': ['sort_order', 'name'],
'abstract': False,
},
),
migrations.CreateModel(
@ -136,8 +150,8 @@ class Migration(migrations.Migration):
name='RailProduct',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sort_order', models.IntegerField(default=0)),
('name', models.CharField(max_length=255)),
('sort_order', models.IntegerField(default=0, help_text='Lower numbers sort earlier')),
('description', models.TextField(blank=True, null=True)),
],
options={
@ -149,8 +163,8 @@ class Migration(migrations.Migration):
name='StairProduct',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sort_order', models.IntegerField(default=0)),
('name', models.CharField(max_length=255)),
('sort_order', models.IntegerField(default=0, help_text='Lower numbers sort earlier')),
('description', models.TextField(blank=True, null=True)),
],
options={
@ -158,54 +172,88 @@ class Migration(migrations.Migration):
'abstract': False,
},
),
migrations.CreateModel(
name='StringerMaterial',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
],
),
migrations.CreateModel(
name='StringerSize',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sizes', to='core.stringermaterial')),
('sort_order', models.IntegerField(default=0, help_text='Lower numbers sort earlier')),
],
options={
'ordering': ['sort_order', 'name'],
'abstract': False,
},
),
migrations.CreateModel(
name='Project',
name='Scope',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('legacy_id', models.IntegerField(blank=True, null=True)),
('number', models.IntegerField(unique=True)),
('name', models.CharField(max_length=255)),
('status', models.CharField(choices=[('Awarded', 'Awarded'), ('Ongoing', 'Ongoing'), ('Complete', 'Complete'), ('On Hold', 'On Hold'), ('Canceled', 'Canceled')], max_length=255, null=True)),
('award_date', models.DateField(blank=True, null=True)),
('complete_date', models.DateField(blank=True, null=True)),
('bid_number', models.CharField(blank=True, max_length=255, null=True)),
('contract_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=15, null=True)),
('actual_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=15, null=True, verbose_name='closeout amount')),
('client_job_number', models.CharField(blank=True, max_length=255, null=True)),
('client_contract_no', models.CharField(blank=True, max_length=255, null=True, verbose_name='client contract number')),
('building_code', models.CharField(blank=True, max_length=255, null=True)),
('sort_order', models.IntegerField(blank=True, editable=False, null=True)),
('name', models.CharField(help_text='e.g. "Stair 1" or "Machine Room Stair"', max_length=255)),
('alt_name', models.CharField(blank=True, help_text='Stair name in client documents, if different', max_length=255, null=True)),
('grid', models.CharField(blank=True, max_length=16, null=True)),
('levels', models.CharField(blank=True, max_length=64, null=True)),
('notes', models.TextField(blank=True, null=True)),
('address', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.location')),
('architect', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='architect_projects', to='core.company')),
('categories', models.ManyToManyField(to='core.projectcategory')),
('client', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='client_projects', to='core.company')),
('engineer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='engineer_projects', to='core.company', verbose_name='engineer of record')),
('general_contractor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='contractor_projects', to='core.company')),
('lender', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='lender_projects', to='core.company')),
('mail_address', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mail_address', to='core.location')),
('owner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owner_projects', to='core.company')),
('project_manager', models.ForeignKey(blank=True, limit_choices_to={'groups__name__in': ['staff project manager']}, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
('ship_address', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ship_address', to='core.location')),
('flight_count', models.IntegerField(default=0)),
('mid_landing_count', models.IntegerField(default=0)),
('floor_landing_count', models.IntegerField(default=0)),
('finishes', modelcluster.fields.ParentalManyToManyField(blank=True, to='core.finish')),
('land_prods', modelcluster.fields.ParentalManyToManyField(blank=True, to='core.landingproduct', verbose_name='landing products')),
('misc_prods', modelcluster.fields.ParentalManyToManyField(blank=True, to='core.miscproduct', verbose_name='misc products')),
('project', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='scopes', to='core.project')),
('rail_prods', modelcluster.fields.ParentalManyToManyField(blank=True, to='core.railproduct', verbose_name='rail products')),
('stair_prods', modelcluster.fields.ParentalManyToManyField(blank=True, to='core.stairproduct', verbose_name='stair products')),
('stringer_sizes', modelcluster.fields.ParentalManyToManyField(blank=True, to='core.stringersize')),
],
options={
'ordering': ['-number'],
'ordering': ['sort_order'],
'abstract': False,
},
bases=(wagtail.search.index.Indexed, models.Model),
),
migrations.AddField(
model_name='project',
name='categories',
field=models.ManyToManyField(to='core.projectcategory'),
),
migrations.AddField(
model_name='project',
name='client',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='client_projects', to='core.company'),
),
migrations.AddField(
model_name='project',
name='engineer',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='engineer_projects', to='core.company', verbose_name='engineer of record'),
),
migrations.AddField(
model_name='project',
name='general_contractor',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='contractor_projects', to='core.company'),
),
migrations.AddField(
model_name='project',
name='lender',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='lender_projects', to='core.company'),
),
migrations.AddField(
model_name='project',
name='mail_address',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mail_address', to='core.location'),
),
migrations.AddField(
model_name='project',
name='owner',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owner_projects', to='core.company'),
),
migrations.AddField(
model_name='project',
name='project_manager',
field=models.ForeignKey(blank=True, limit_choices_to={'groups__name__in': ['staff project manager']}, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='project',
name='ship_address',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ship_address', to='core.location'),
),
migrations.CreateModel(
name='LandingPageImage',

@ -1,5 +1,43 @@
from .client import *
from .frontend import *
from .location import *
from .product import *
from .project import *
from django.db import models
class Named(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class Meta:
abstract = True
ordering = ['name']
class Orderable(models.Model):
sort_order = models.IntegerField(
default=0,
help_text='Lower numbers sort earlier',
)
class Meta:
abstract = True
ordering = ['sort_order']
class ChoiceList(Named, Orderable):
class Meta:
abstract = True
ordering = ['sort_order', 'name']
class LegacyModel(models.Model):
legacy_id = models.IntegerField(blank=True, null=True)
class Meta:
abstract = True
from .client import * # noqa: E402
from .frontend import * # noqa: E402
from .location import * # noqa: E402
from .product import * # noqa: E402
from .project import * # noqa: E402

@ -1,55 +1,21 @@
from django.db import models
from . import Named, Orderable, ChoiceList
class StringerMaterial(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class StringerSize(models.Model):
name = models.CharField(max_length=255)
material = models.ForeignKey(
StringerMaterial,
on_delete=models.CASCADE,
related_name='sizes',
)
def __str__(self):
return self.name
class Finish(models.Model):
name = models.CharField(max_length=255)
legacy_id = models.IntegerField()
class StringerSize(ChoiceList):
pass
def __str__(self):
return self.name
class Meta:
class Finish(ChoiceList):
class Meta(ChoiceList.Meta):
verbose_name_plural = 'finishes'
ordering = ['name']
class Orderable(models.Model):
sort_order = models.IntegerField(default=0)
class Meta:
abstract = True
ordering = ['sort_order']
class Product(Orderable):
name = models.CharField(max_length=255)
class Product(ChoiceList):
description = models.TextField(blank=True, null=True)
def __str__(self):
return self.name
class Meta():
class Meta(ChoiceList.Meta):
abstract = True
ordering = ['sort_order', 'name']
class StairProduct(Product):
@ -66,7 +32,3 @@ class RailProduct(Product):
class MiscProduct(Product):
pass
class NosingProduct(Product):
link = models.CharField(max_length=255)

@ -1,25 +1,33 @@
from django.db import models
from wagtail.models import Page
from django.forms.widgets import CheckboxSelectMultiple
from modelcluster.fields import ParentalKey, ParentalManyToManyField
from modelcluster.models import ClusterableModel
from wagtail.admin.panels import FieldPanel, FieldRowPanel, MultiFieldPanel
from wagtail.models import Page, Orderable
from wagtail.contrib.routable_page.models import RoutablePageMixin, path
from wagtail.search import index
from . import LandingPage, Location, Company
from . import (
Company,
LandingPage,
LandingProduct,
Location,
Finish,
MiscProduct,
RailProduct,
StairProduct,
StringerSize,
ChoiceList,
LegacyModel
)
from sf_auth.models import User
class ProjectCategory(models.Model):
legacy_id = models.IntegerField()
description = models.CharField(max_length=255)
def __str__(self):
return self.description
class Meta:
class ProjectCategory(LegacyModel, ChoiceList):
class Meta(ChoiceList.Meta):
verbose_name_plural = 'project categories'
ordering = ['description']
class Project(index.Indexed, models.Model):
legacy_id = models.IntegerField(blank=True, null=True)
class Project(LegacyModel, index.Indexed, ClusterableModel):
number = models.IntegerField(unique=True)
name = models.CharField(max_length=255)
categories = models.ManyToManyField(ProjectCategory)
@ -65,71 +73,71 @@ class Project(index.Indexed, models.Model):
address = models.ForeignKey(
Location,
on_delete=models.SET_NULL,
blank = True,
null = True,
blank=True,
null=True,
)
mail_address = models.ForeignKey(
Location,
on_delete=models.SET_NULL,
blank = True,
null = True,
related_name = 'mail_address'
blank=True,
null=True,
related_name='mail_address'
)
ship_address = models.ForeignKey(
Location,
on_delete=models.SET_NULL,
blank = True,
null = True,
related_name = 'ship_address'
blank=True,
null=True,
related_name='ship_address'
)
owner = models.ForeignKey(
Company,
on_delete=models.SET_NULL,
blank = True,
null = True,
related_name = 'owner_projects'
blank=True,
null=True,
related_name='owner_projects'
)
lender = models.ForeignKey(
Company,
on_delete=models.SET_NULL,
blank = True,
null = True,
related_name = 'lender_projects'
blank=True,
null=True,
related_name='lender_projects'
)
general_contractor = models.ForeignKey(
Company,
on_delete=models.SET_NULL,
blank = True,
null = True,
related_name = 'contractor_projects'
blank=True,
null=True,
related_name='contractor_projects'
)
architect = models.ForeignKey(
Company,
on_delete=models.SET_NULL,
blank = True,
null = True,
related_name = 'architect_projects'
blank=True,
null=True,
related_name='architect_projects'
)
engineer = models.ForeignKey(
Company,
on_delete=models.SET_NULL,
blank = True,
null = True,
related_name = 'engineer_projects',
verbose_name = 'engineer of record',
blank=True,
null=True,
related_name='engineer_projects',
verbose_name='engineer of record',
)
client = models.ForeignKey(
Company,
on_delete=models.SET_NULL,
blank = True,
null = True,
related_name = 'client_projects'
blank=True,
null=True,
related_name='client_projects'
)
project_manager = models.ForeignKey(
@ -175,4 +183,77 @@ class ProjectIndexPage(RoutablePageMixin, Page):
},
template='core/project_page.html',
)
class Scope(Orderable, ClusterableModel):
project = ParentalKey(Project, on_delete=models.CASCADE, related_name='scopes')
name = models.CharField(
max_length=255,
help_text='e.g. "Stair 1" or "Machine Room Stair"'
)
alt_name = models.CharField(
max_length=255,
blank=True,
null=True,
help_text='Stair name in client documents, if different',
)
grid = models.CharField(max_length=16, blank=True, null=True)
levels = models.CharField(max_length=64, blank=True, null=True)
notes = models.TextField(blank=True, null=True)
finishes = ParentalManyToManyField(Finish, blank=True)
stringer_sizes = ParentalManyToManyField(StringerSize, blank=True)
stair_prods = ParentalManyToManyField(
StairProduct,
blank=True,
verbose_name='stair products',
)
land_prods = ParentalManyToManyField(
LandingProduct,
blank=True,
verbose_name='landing products',
)
rail_prods = ParentalManyToManyField(
RailProduct,
blank=True,
verbose_name='rail products',
)
misc_prods = ParentalManyToManyField(
MiscProduct,
blank=True,
verbose_name='misc products',
)
flight_count = models.IntegerField(default=0)
mid_landing_count = models.IntegerField(default=0)
floor_landing_count = models.IntegerField(default=0)
def landing_count(self):
return self.mid_landing_count + self.floor_landing_count
def __str__(self):
return f'{self.project.number} {self.name}'
panels = [
FieldRowPanel([
FieldPanel('name'),
FieldPanel('alt_name'),
]),
FieldRowPanel([
FieldPanel('grid'),
FieldPanel('levels'),
]),
FieldPanel('notes'),
MultiFieldPanel([
FieldRowPanel([
FieldPanel('stair_prods', widget=CheckboxSelectMultiple),
FieldPanel('land_prods', widget=CheckboxSelectMultiple),
FieldPanel('rail_prods', widget=CheckboxSelectMultiple),
FieldPanel('misc_prods', widget=CheckboxSelectMultiple),
]),
FieldRowPanel([
FieldPanel('finishes', widget=CheckboxSelectMultiple),
FieldPanel('stringer_sizes', widget=CheckboxSelectMultiple),
]),
]),
]

@ -5,6 +5,7 @@ from wagtail.admin.panels import (
MultiFieldPanel,
TabbedInterface,
ObjectList,
InlinePanel,
)
from wagtail.admin.viewsets.chooser import ChooserViewSet
from wagtail.snippets.views.snippets import SnippetViewSet, SnippetViewSetGroup
@ -17,8 +18,9 @@ from .models import (
LandingProduct,
RailProduct,
MiscProduct,
StringerMaterial,
Scope,
StringerSize,
Finish,
)
@ -37,12 +39,12 @@ class ProjectViewSet(PerPageMixin, SnippetViewSet):
edit_handler = TabbedInterface([
ObjectList(
[
MultiFieldPanel(children=[
FieldRowPanel(children=[
MultiFieldPanel([
FieldRowPanel([
FieldPanel('number'),
FieldPanel('name'),
]),
FieldRowPanel(children=[
FieldRowPanel([
FieldPanel('project_manager'),
]),
]),
@ -97,6 +99,7 @@ class ProjectViewSet(PerPageMixin, SnippetViewSet):
],
heading='Relationships'
),
ObjectList([InlinePanel('scopes')], heading='Scope'),
])
@ -104,10 +107,11 @@ class ProjectCategoryViewSet(PerPageMixin, SnippetViewSet):
model = ProjectCategory
add_to_admin_menu = True
icon = 'form'
list_display = ['description']
list_display = ['name']
panels = [
FieldPanel('description'),
FieldPanel('name'),
FieldPanel('sort_order'),
]
@ -153,24 +157,14 @@ class CompanyViewSet(PerPageMixin, SnippetViewSet):
]
class StringerMaterialChooserViewSet(ChooserViewSet):
model = StringerMaterial
form_fields = ['name']
class StringerMaterialViewSet(SnippetViewSet):
model = StringerMaterial
chooser_viewset_class = StringerMaterialChooserViewSet
class StringerSizeViewSet(PerPageMixin, SnippetViewSet):
model = StringerSize
class ProjectViewSetGroup(SnippetViewSetGroup):
menu_label = 'Projects'
add_to_admin_menu = True
list_display = ['name', 'material']
panels = [
FieldPanel('name'),
FieldPanel('material'),
items = [
ProjectViewSet,
ProjectCategoryViewSet,
LocationViewSet,
CompanyViewSet,
]
@ -180,7 +174,7 @@ class ProductViewSet(PerPageMixin, SnippetViewSet):
panels = [
FieldPanel('name'),
FieldPanel('description'),
FieldPanel('sort_order', help_text='Lower numbers sort earlier'),
FieldPanel('sort_order'),
]
@ -200,12 +194,36 @@ class MiscProductViewSet(ProductViewSet):
model = MiscProduct
class FinishViewSet(PerPageMixin, SnippetViewSet):
model = Finish
panels = [
FieldPanel('name'),
]
class StringerSizeViewSet(PerPageMixin, SnippetViewSet):
model = StringerSize
list_display = ['name']
panels = [
FieldPanel('name'),
]
class ProductViewSetGroup(SnippetViewSetGroup):
items = [
StairProductViewSet,
LandingProductViewSet,
RailProductViewSet,
MiscProductViewSet,
FinishViewSet,
StringerSizeViewSet,
]
menu_label = 'Products'
add_to_admin_menu = True
class ScopeViewSet(SnippetViewSet):
model = Scope

@ -3,23 +3,13 @@ from wagtail.admin.userbar import AccessibilityItem
from wagtail.snippets.models import register_snippet
from wagtail.snippets.wagtail_hooks import SnippetsMenuItem
from .views import (
ProjectViewSet,
ProjectCategoryViewSet,
LocationViewSet,
CompanyViewSet,
ProjectViewSetGroup,
ProductViewSetGroup,
StringerMaterialViewSet,
StringerSizeViewSet,
)
register_snippet(ProjectViewSet)
register_snippet(ProjectCategoryViewSet)
register_snippet(LocationViewSet)
register_snippet(CompanyViewSet)
register_snippet(ProjectViewSetGroup)
register_snippet(ProductViewSetGroup)
register_snippet(StringerSizeViewSet)
register_snippet(StringerMaterialViewSet)
@hooks.register('construct_wagtail_userbar')

@ -1,2 +1,3 @@
[flake8]
max-line-length = 92
max-line-length = 92
ignore = F401,F403
Loading…
Cancel
Save