Skip to content

Commit

Permalink
update Assembly detail-view
Browse files Browse the repository at this point in the history
  • Loading branch information
ed-p-may committed Dec 12, 2024
1 parent ec74674 commit af4123a
Show file tree
Hide file tree
Showing 13 changed files with 372 additions and 179 deletions.
17 changes: 17 additions & 0 deletions webportal/management/commands/delete_assembly_cells.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from django.core.management.base import BaseCommand

from webportal.models import Cell


class Command(BaseCommand):
help = """
Delete all the Assembly cells from the database.
To run: 'python manage.py delete_assembly_cells'
"""

def handle(self, *args, **kwargs):
num_assemblies = Cell.objects.count()
Cell.objects.all().delete()
self.stdout.write(
self.style.SUCCESS(f"{num_assemblies} assembly-cells deleted successfully.")
)
19 changes: 19 additions & 0 deletions webportal/management/commands/delete_assembly_layers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from django.core.management.base import BaseCommand

from webportal.models import Layer


class Command(BaseCommand):
help = """
Delete all the Assembly cells from the database.
To run: 'python manage.py delete_assembly_layers'
"""

def handle(self, *args, **kwargs):
num_assemblies = Layer.objects.count()
Layer.objects.all().delete()
self.stdout.write(
self.style.SUCCESS(
f"{num_assemblies} assembly-layers deleted successfully."
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Generated by Django 5.1.3 on 2024-12-12 17:25

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


class Migration(migrations.Migration):

dependencies = [
("webportal", "0009_alter_material_unique_id"),
]

operations = [
migrations.RemoveField(
model_name="cell",
name="column_number",
),
migrations.RemoveField(
model_name="cell",
name="container",
),
migrations.RemoveField(
model_name="cell",
name="row_number",
),
migrations.AddField(
model_name="assembly",
name="layer_id_order",
field=models.JSONField(default=list),
),
migrations.AlterField(
model_name="material",
name="unique_id",
field=models.CharField(default="90dd06", max_length=6, unique=True),
),
migrations.CreateModel(
name="Layer",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("thickness", models.FloatField()),
(
"assembly",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="layers",
to="webportal.assembly",
),
),
],
),
migrations.AddField(
model_name="cell",
name="layer",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="cells",
to="webportal.layer",
),
),
]
18 changes: 18 additions & 0 deletions webportal/migrations/0011_alter_material_unique_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2024-12-12 17:43

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("webportal", "0010_remove_cell_column_number_remove_cell_container_and_more"),
]

operations = [
migrations.AlterField(
model_name="material",
name="unique_id",
field=models.CharField(default="2d95fc", max_length=6, unique=True),
),
]
18 changes: 18 additions & 0 deletions webportal/migrations/0012_alter_material_unique_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2024-12-12 18:02

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("webportal", "0011_alter_material_unique_id"),
]

operations = [
migrations.AlterField(
model_name="material",
name="unique_id",
field=models.CharField(default="7f013d", max_length=6, unique=True),
),
]
59 changes: 51 additions & 8 deletions webportal/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from django.contrib.auth.models import AbstractUser
from django.db import models

from typing import Any


# ---------------------------------------------------------------------------------------
# -- Users
Expand Down Expand Up @@ -114,21 +116,62 @@ class Assembly(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False)
name = models.CharField(max_length=100, default="assembly")
created_at = models.DateTimeField(auto_now_add=True)
layer_id_order = models.JSONField(default=list)

def get_ordered_layers(self) -> list["Layer"]:
"""Return layers ordered according to the layer_id_order field."""
# Sort layers by the order in layer_order
layers = {layer.id: layer for layer in self.layers.all()}
return [
layers[layer_id] for layer_id in self.layer_id_order if layer_id in layers
]

def delete_layer(self, layer_pk: int) -> None:
"""Delete a layer from the assembly."""
if layer_pk in self.layer_id_order:
self.layer_id_order.remove(layer_pk)
self.save()

def save(self, *args, **kwargs) -> None:
super().save(*args, **kwargs)
layers = Layer.objects.filter(assembly=self)
if not layers.exists():
new_layer = Layer.objects.create(assembly=self, thickness=1.0)
self.layer_id_order.append(new_layer.id)

def save(self, *args, **kwargs):
@property
def layers(self) -> models.QuerySet["Layer"]:
return self.layer_set.all() # type: ignore

def __str__(self) -> str:
return self.name


class Layer(models.Model):
assembly = models.ForeignKey(
Assembly, on_delete=models.CASCADE, related_name="layers"
)
thickness = models.FloatField()

def save(self, *args, **kwargs) -> None:
super().save(*args, **kwargs)
cells = Cell.objects.filter(container=self)
cells = Cell.objects.filter(layer=self)
if not cells.exists():
Cell.objects.create(container=self, column_number=1, row_number=1)
Cell.objects.create(layer=self)

@property
def id(self) -> int:
return self.id

def __str__(self) -> str:
return f"{self.thickness} mm"


class Cell(models.Model):
container = models.ForeignKey(
Assembly, on_delete=models.CASCADE, related_name="cells"
layer = models.ForeignKey(
Layer, on_delete=models.CASCADE, null=True, related_name="cells"
)
column_number = models.IntegerField()
row_number = models.IntegerField()
value = models.TextField(blank=True, null=True)

def __str__(self):
return f"{self.container.name} Cell: [{self.row_number}:{self.column_number}]"
return f"[layer-{self.layer}]: {self.value}"

This file was deleted.

61 changes: 60 additions & 1 deletion webportal/templates/webportal/partials/assemblies/assembly.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,66 @@
</form>
</div>
{% endblock %}

{% block assembly-detail-view %}
<div id="assembly-detail-view">

<div id="assembly-cells">
{% for layer in layers %}

{% block layer %}
<div class="layer" id="layer-{{ layer.pk }}">
<div class="flex flex-row items-center cell" id="cell-{{ cell.pk }}">
<a
id="delete-layer-{{ assembly.pk }}"
hx-delete="{% url 'delete-layer' assembly_pk=assembly.pk layer_pk=layer.pk %}"
hx-target="#assembly"
hx-swap="outerHTML"
hx-confirm="Delete?"
class="cursor-pointer">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none" viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-4 me-2">
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</a>
<form
hx-post="{% url 'update-layer-thickness' assembly.id layer.pk %}"
hx-target="#layer-thickness-{{ layer.pk }}"
hx-swap="innerHTML"
>
<input
id="layer-thickness-{{ layer.pk }}"
type="text"
name="thickness"
class="text-black"
value={{ layer.thickness }}
hx-trigger="changed delay:500ms"
style="border: 1px solid #939799; padding: 8px; border-radius: 4px; background: transparent; color: white;"
onfocus="this.style.borderColor='#007bff'; this.style.boxShadow='0 0 5px rgba(0, 123, 255, 0.5)'; this.style.outline='none'; this.style.background='white'; this.style.color='black';"
onblur="this.style.borderColor='#ccc'; this.style.boxShadow='none'; this.style.background='transparent'; this.style.color='white';"
/>
</form>
<input id="layer-name-{{ layer.pk }}" class="text-black" value="Test" />
</div>
</div>
{% endblock %}

{% include "webportal/partials/assemblies/assembly-detail.html" %}
{% endfor %}
</div>

<div id="grid-control-buttons">
<button class="btn" hx-post="{% url 'add-layer' assembly.pk %}" hx-target="#assembly-cells" hx-swap="beforeend">Add Layer</button>
</div>

</div>
{% endblock %}

{% endif %}
</div>
8 changes: 0 additions & 8 deletions webportal/templates/webportal/partials/assemblies/row.html

This file was deleted.

46 changes: 45 additions & 1 deletion webportal/templates/webportal/partials/assemblies/sidebar.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,51 @@

<div id="assembly-sidebar" class="col-span-1">

{% include 'webportal/partials/assemblies/sidebar_list.html' with assemblies=assemblies active_assembly_id=active_assembly_id %}
{% block assembly-sidebar-list %}

<ul id="assembly-sidebar-list" hx-swap-oob="true">
{% for assembly in assemblies %}
<li class="cursor-pointer hover:underline">
<div
class="flex flex-row items-center"
id=assembly-{{ assembly.pk }}
{% if active_assembly_id == assembly.pk %}
style="color:red"
{% endif %}
>
<a
id="delete-assembly-{{ assembly.pk }}"
hx-delete="{% url 'delete-assembly' assembly.pk %}"
hx-target="#assembly"
hx-swap="outerHTML"
hx-confirm="Delete?"
class="cursor-pointer">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none" viewBox="0 0 24 24"
stroke-width="1"
stroke="currentColor"
class="size-4 me-2">
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</a>
<a
id="assembly-name-{{ assembly.pk }}"
hx-get="{% url 'assembly' assembly.pk %}"
hx-target="#assembly"
hx-swap="outerHTML"
>
{{ assembly.name }}
</a>
</div>
</li>
{% endfor %}
</ul>

{% endblock %}

<form
id="assembly-sidebar-add-new-button"
Expand Down
Loading

0 comments on commit af4123a

Please sign in to comment.