Skip to content

Commit

Permalink
functioning inventory/orders
Browse files Browse the repository at this point in the history
  • Loading branch information
WoosterInitiative committed Dec 20, 2023
1 parent 2616320 commit de676f3
Show file tree
Hide file tree
Showing 35 changed files with 476 additions and 35 deletions.
3 changes: 3 additions & 0 deletions config/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,16 @@
"allauth",
"allauth.account",
"allauth.socialaccount",
"wooster_django.basemodels",
]

LOCAL_APPS = [
"wooster_django.users",
# Your stuff: custom apps go here
# "wooster_django.containers",
"wooster_django.customers",
"wooster_django.inventory",
"wooster_django.orders",
"wooster_django.projects",
]
# https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
Expand Down
Empty file.
1 change: 1 addition & 0 deletions wooster_django/basemodels/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Register your models here.
6 changes: 6 additions & 0 deletions wooster_django/basemodels/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class BasemodelsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "basemodels"
23 changes: 23 additions & 0 deletions wooster_django/basemodels/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.2.7 on 2023-12-20 06:02

from django.db import migrations, models


class Migration(migrations.Migration):
initial = True

dependencies = []

operations = [
migrations.CreateModel(
name="DocumentNumber",
fields=[
("document", models.CharField(max_length=50, primary_key=True, serialize=False, unique=True)),
("prefix", models.CharField(blank=True, max_length=10, null=True)),
("padding_digits", models.IntegerField(blank=True, null=True)),
("next_counter", models.IntegerField(default=1)),
("last_number", models.CharField(editable=False, max_length=50, null=True)),
("last_generated_date", models.DateTimeField(auto_now=True)),
],
),
]
Empty file.
48 changes: 48 additions & 0 deletions wooster_django/basemodels/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
from slugify import slugify


# Create your models here.
class BaseModel(models.Model):
"""Base model for standardization. Includes generating slug."""

name = models.CharField(max_length=50)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("created by"), on_delete=models.PROTECT)
slug = models.SlugField(unique=True, editable=False)
created_date = models.DateTimeField(_("created date"), auto_now_add=True)
modified_date = models.DateTimeField(_("modified date"), auto_now=True)

class Meta:
abstract = True

def __str__(self):
return self.name

def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
super().save(*args, **kwargs)


class DocumentNumber(models.Model):
document = models.CharField(max_length=50, primary_key=True, unique=True)
prefix = models.CharField(max_length=10, blank=True, null=True)
padding_digits = models.IntegerField(blank=True, null=True)
next_counter = models.IntegerField(default=1)
last_number = models.CharField(max_length=50, editable=False, null=True)
last_generated_date = models.DateTimeField(auto_now=True)

def get_next_number(self):
prefix = self.prefix
next_counter = self.next_counter
padded_counter = str(next_counter).zfill(self.padding_digits)
number = f"{prefix}{padded_counter}"

self.next_counter += 1
self.last_number = number

self.save()

return number
1 change: 1 addition & 0 deletions wooster_django/basemodels/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Create your tests here.
1 change: 1 addition & 0 deletions wooster_django/basemodels/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Create your views here.
Empty file.
1 change: 1 addition & 0 deletions wooster_django/containers/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Register your models here.
6 changes: 6 additions & 0 deletions wooster_django/containers/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class ContainersConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "containers"
Empty file.
1 change: 1 addition & 0 deletions wooster_django/containers/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Create your models here.
1 change: 1 addition & 0 deletions wooster_django/containers/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Create your tests here.
1 change: 1 addition & 0 deletions wooster_django/containers/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Create your views here.
36 changes: 19 additions & 17 deletions wooster_django/customers/models.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,32 @@
from django.conf import settings
# from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
from phonenumber_field.modelfields import PhoneNumberField
from slugify import slugify

# from slugify import slugify
# from wooster_django.basemodels.models import BaseModel


# Create your models here.
class BaseModel(models.Model):
"""Base model for standardization. Includes generating slug."""
# class BaseModel(models.Model):
# """Base model for standardization. Includes generating slug."""

name = models.CharField(max_length=50)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("created by"), on_delete=models.PROTECT)
slug = models.SlugField(unique=True, editable=False)
created_date = models.DateTimeField(_("created date"), auto_now_add=True)
modified_date = models.DateTimeField(_("modified date"), auto_now=True)
# name = models.CharField(max_length=50)
# created_by = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("created by"), on_delete=models.PROTECT)
# slug = models.SlugField(unique=True, editable=False)
# created_date = models.DateTimeField(_("created date"), auto_now_add=True)
# modified_date = models.DateTimeField(_("modified date"), auto_now=True)

class Meta:
abstract = True
# class Meta:
# abstract = True

def __str__(self):
return self.name
# def __str__(self):
# return self.name

def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
super().save(*args, **kwargs)
# def save(self, *args, **kwargs):
# if not self.slug:
# self.slug = slugify(self.name)
# super().save(*args, **kwargs)


class Customer(models.Model):
Expand Down
2 changes: 1 addition & 1 deletion wooster_django/inventory/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class ItemAdmin(admin.ModelAdmin):
list_editable = ["in_stock_amount", "in_stock_amount_unit"]
search_fields = ["name", "internal_identifier", "vendor_identifier", "common_color"]
filter_horizontal = ["alternate_manufacturers", "alternate_vendors", "item_categories"]
list_filter = ["manufacturer", "vendor", "in_stock_amount_unit", "common_color"]
list_filter = ["manufacturer", "vendor", "in_stock_amount_unit", "common_color", "is_parent_item"]


@admin.register(History)
Expand Down
17 changes: 17 additions & 0 deletions wooster_django/inventory/migrations/0010_alter_history_amount.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.2.7 on 2023-12-20 05:33

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("inventory", "0009_history"),
]

operations = [
migrations.AlterField(
model_name="history",
name="amount",
field=models.DecimalField(decimal_places=2, help_text="always >= 0", max_digits=5, verbose_name="amount"),
),
]
36 changes: 19 additions & 17 deletions wooster_django/inventory/models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import shortuuid
from basemodels.models import BaseModel
from colorfield.fields import ColorField
from django.conf import settings

# from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
from slugify import slugify
Expand All @@ -22,25 +24,25 @@


# Create your models here.
class BaseModel(models.Model):
"""Base model for standardization. Includes generating slug."""
# class BaseModel(models.Model):
# """Base model for standardization. Includes generating slug."""

name = models.CharField(max_length=50)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("created by"), on_delete=models.PROTECT)
slug = models.SlugField(unique=True, editable=False)
created_date = models.DateTimeField(_("created date"), auto_now_add=True)
modified_date = models.DateTimeField(_("modified date"), auto_now=True)
# name = models.CharField(max_length=50)
# created_by = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("created by"), on_delete=models.PROTECT)
# slug = models.SlugField(unique=True, editable=False)
# created_date = models.DateTimeField(_("created date"), auto_now_add=True)
# modified_date = models.DateTimeField(_("modified date"), auto_now=True)

class Meta:
abstract = True
# class Meta:
# abstract = True

def __str__(self):
return self.name
# def __str__(self):
# return self.name

def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
super().save(*args, **kwargs)
# def save(self, *args, **kwargs):
# if not self.slug:
# self.slug = slugify(self.name)
# super().save(*args, **kwargs)


class ItemCategory(BaseModel):
Expand Down Expand Up @@ -134,7 +136,7 @@ class Meta:
class History(BaseModel):
name = None
item = models.ForeignKey("inventory.Item", verbose_name=_("item"), on_delete=models.CASCADE)
amount = models.DecimalField(_("amount"), help_text=_("always <= 0"), max_digits=5, decimal_places=2)
amount = models.DecimalField(_("amount"), help_text=_("always >= 0"), max_digits=5, decimal_places=2)

class Meta:
ordering = ["-created_date"]
Expand Down
Empty file.
30 changes: 30 additions & 0 deletions wooster_django/orders/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from django.contrib import admin

# from inventory.models import Item
from projects.models import Project

from .models import Order, OrderItem


# Register your models here.
class OrderItemInline(admin.TabularInline):
model = OrderItem


class ProjectInline(admin.TabularInline):
model = Project
extra = 0


@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
list_display = ["number", "customer", "expected_date", "subtotal"]
list_filter = ["customer"]
date_hierarchy = "created_date"
search_fields = ["number", "customer"]
inlines = [OrderItemInline, ProjectInline]


@admin.register(OrderItem)
class OrderItemAdmin(admin.ModelAdmin):
list_display = ["order", "item", "extended_price"]
6 changes: 6 additions & 0 deletions wooster_django/orders/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class OrdersConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "orders"
71 changes: 71 additions & 0 deletions wooster_django/orders/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Generated by Django 4.2.7 on 2023-12-20 05:33

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):
initial = True

dependencies = [
("inventory", "0010_alter_history_amount"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("customers", "0001_initial"),
]

operations = [
migrations.CreateModel(
name="Order",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("name", models.CharField(max_length=50)),
("slug", models.SlugField(editable=False, unique=True)),
("created_date", models.DateTimeField(auto_now_add=True, verbose_name="created date")),
("modified_date", models.DateTimeField(auto_now=True, verbose_name="modified date")),
("expected_date", models.DateField(verbose_name="Expected Completion Date")),
(
"created_by",
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
to=settings.AUTH_USER_MODEL,
verbose_name="created by",
),
),
(
"customer",
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT, to="customers.customer", verbose_name="Customer"
),
),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="OrderItems",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("rank", models.SmallIntegerField(verbose_name="rank")),
("quantity", models.FloatField(verbose_name="quantity")),
(
"item",
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT, to="inventory.item", verbose_name="Item"
),
),
(
"order",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="orders.order", verbose_name="Order"
),
),
],
),
migrations.AddField(
model_name="order",
name="items",
field=models.ManyToManyField(through="orders.OrderItems", to="inventory.item", verbose_name="items"),
),
]
18 changes: 18 additions & 0 deletions wooster_django/orders/migrations/0002_orderitems_item_price.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2023-12-20 05:36

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("orders", "0001_initial"),
]

operations = [
migrations.AddField(
model_name="orderitems",
name="item_price",
field=models.DecimalField(decimal_places=2, default=0, max_digits=5, verbose_name="Item Price"),
preserve_default=False,
),
]
Loading

0 comments on commit de676f3

Please sign in to comment.