From ec7467484c191efc553ab5b2b63821919a15c5e4 Mon Sep 17 00:00:00 2001 From: PH Tools Date: Thu, 12 Dec 2024 10:46:54 -0500 Subject: [PATCH] add render-block --- PH_Materials/settings.py | 1 + requirements.txt | 1 + .../management/commands/delete_assemblies.py | 17 +++++ .../0008_alter_material_unique_id.py | 18 +++++ .../0009_alter_material_unique_id.py | 18 +++++ webportal/models.py | 9 +++ .../partials/assemblies/assembly-detail.html | 23 +++++- .../partials/assemblies/assembly-name.html | 18 ----- .../partials/assemblies/assembly.html | 23 +++++- .../webportal/partials/assemblies/column.html | 3 - .../webportal/partials/assemblies/row.html | 11 ++- .../partials/assemblies/sidebar_list.html | 2 + webportal/views.py | 76 +++++++++++++------ 13 files changed, 171 insertions(+), 49 deletions(-) create mode 100644 webportal/management/commands/delete_assemblies.py create mode 100644 webportal/migrations/0008_alter_material_unique_id.py create mode 100644 webportal/migrations/0009_alter_material_unique_id.py delete mode 100644 webportal/templates/webportal/partials/assemblies/assembly-name.html delete mode 100644 webportal/templates/webportal/partials/assemblies/column.html diff --git a/PH_Materials/settings.py b/PH_Materials/settings.py index 4102526..771a11f 100644 --- a/PH_Materials/settings.py +++ b/PH_Materials/settings.py @@ -55,6 +55,7 @@ "django_htmx", "template_partials", "import_export", + "render_block", # --------------------- # -- Apps "webportal", diff --git a/requirements.txt b/requirements.txt index a8ed90d..d797b16 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,6 +11,7 @@ django-htmx==1.21.0 django-import-export==4.3.1 django-template-partials==24.4 django-widget-tweaks==1.5.0 +django-render-block==0.10 factory-boy==3.3.1 faker==33.1.0 gunicorn==23.0.0 diff --git a/webportal/management/commands/delete_assemblies.py b/webportal/management/commands/delete_assemblies.py new file mode 100644 index 0000000..ecdf3aa --- /dev/null +++ b/webportal/management/commands/delete_assemblies.py @@ -0,0 +1,17 @@ +from django.core.management.base import BaseCommand + +from webportal.models import Assembly + + +class Command(BaseCommand): + help = """ + Delete all the assemblies from the database. + To run: 'python manage.py delete_assemblies' + """ + + def handle(self, *args, **kwargs): + num_assemblies = Assembly.objects.count() + Assembly.objects.all().delete() + self.stdout.write( + self.style.SUCCESS(f"{num_assemblies} assemblies deleted successfully.") + ) diff --git a/webportal/migrations/0008_alter_material_unique_id.py b/webportal/migrations/0008_alter_material_unique_id.py new file mode 100644 index 0000000..c3d8565 --- /dev/null +++ b/webportal/migrations/0008_alter_material_unique_id.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.3 on 2024-12-11 22:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("webportal", "0007_assembly_user_alter_material_unique_id"), + ] + + operations = [ + migrations.AlterField( + model_name="material", + name="unique_id", + field=models.CharField(default="41573d", max_length=6, unique=True), + ), + ] diff --git a/webportal/migrations/0009_alter_material_unique_id.py b/webportal/migrations/0009_alter_material_unique_id.py new file mode 100644 index 0000000..bfd8e26 --- /dev/null +++ b/webportal/migrations/0009_alter_material_unique_id.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.3 on 2024-12-11 22:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("webportal", "0008_alter_material_unique_id"), + ] + + operations = [ + migrations.AlterField( + model_name="material", + name="unique_id", + field=models.CharField(default="4e3bd0", max_length=6, unique=True), + ), + ] diff --git a/webportal/models.py b/webportal/models.py index 02060d7..83bc735 100644 --- a/webportal/models.py +++ b/webportal/models.py @@ -115,6 +115,12 @@ class Assembly(models.Model): name = models.CharField(max_length=100, default="assembly") created_at = models.DateTimeField(auto_now_add=True) + def save(self, *args, **kwargs): + super().save(*args, **kwargs) + cells = Cell.objects.filter(container=self) + if not cells.exists(): + Cell.objects.create(container=self, column_number=1, row_number=1) + class Cell(models.Model): container = models.ForeignKey( @@ -123,3 +129,6 @@ class Cell(models.Model): 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}]" diff --git a/webportal/templates/webportal/partials/assemblies/assembly-detail.html b/webportal/templates/webportal/partials/assemblies/assembly-detail.html index d0899a2..3aebab9 100644 --- a/webportal/templates/webportal/partials/assemblies/assembly-detail.html +++ b/webportal/templates/webportal/partials/assemblies/assembly-detail.html @@ -1,5 +1,26 @@
-

assembly-detail-view {{ assembly.name }}

+
+ {% for row in row_range %} +
+ {% for col in col_range %} +
+ + {% comment %} + {% for cell in cells %} + {% if cell.x == col and cell.y == row %} + {% endif %} + {% endfor %} + {% endcomment %} +
+ {% endfor %} +
+ {% endfor %} +
+ +
+ + +
\ No newline at end of file diff --git a/webportal/templates/webportal/partials/assemblies/assembly-name.html b/webportal/templates/webportal/partials/assemblies/assembly-name.html deleted file mode 100644 index 0471b0f..0000000 --- a/webportal/templates/webportal/partials/assemblies/assembly-name.html +++ /dev/null @@ -1,18 +0,0 @@ -
-
- -
-
diff --git a/webportal/templates/webportal/partials/assemblies/assembly.html b/webportal/templates/webportal/partials/assemblies/assembly.html index fa358d8..3e6d3b3 100644 --- a/webportal/templates/webportal/partials/assemblies/assembly.html +++ b/webportal/templates/webportal/partials/assemblies/assembly.html @@ -1,6 +1,27 @@
{% if assembly %} - {% include "webportal/partials/assemblies/assembly-name.html" %} + + {% block assembly-name %} +
+
+ +
+
+ {% endblock %} + {% include "webportal/partials/assemblies/assembly-detail.html" %} {% endif %}
diff --git a/webportal/templates/webportal/partials/assemblies/column.html b/webportal/templates/webportal/partials/assemblies/column.html deleted file mode 100644 index 2160750..0000000 --- a/webportal/templates/webportal/partials/assemblies/column.html +++ /dev/null @@ -1,3 +0,0 @@ -{% for cell in cells %} -
{{ cell.value }}
-{% endfor %} \ No newline at end of file diff --git a/webportal/templates/webportal/partials/assemblies/row.html b/webportal/templates/webportal/partials/assemblies/row.html index 2160750..64e305a 100644 --- a/webportal/templates/webportal/partials/assemblies/row.html +++ b/webportal/templates/webportal/partials/assemblies/row.html @@ -1,3 +1,8 @@ -{% for cell in cells %} -
{{ cell.value }}
-{% endfor %} \ No newline at end of file +
+ {% for cell in cells %} + {% comment %}
{{ cell.value }}
{% endcomment %} +
+ +
+ {% endfor %} +
\ No newline at end of file diff --git a/webportal/templates/webportal/partials/assemblies/sidebar_list.html b/webportal/templates/webportal/partials/assemblies/sidebar_list.html index 096c71a..27dda34 100644 --- a/webportal/templates/webportal/partials/assemblies/sidebar_list.html +++ b/webportal/templates/webportal/partials/assemblies/sidebar_list.html @@ -9,6 +9,7 @@ {% endif %} > HttpResponse: """ this_assembly = get_object_or_404(Assembly, pk=pk) - # Render the new assembly item + num_rows = this_assembly.cells.aggregate(mx=Max("row_number"))["mx"] + num_cols = this_assembly.cells.aggregate(mx=Max("column_number"))["mx"] + assembly_html = render_to_string( - "webportal/partials/assemblies/assembly.html", {"assembly": this_assembly} + "webportal/partials/assemblies/assembly.html", + { + "assembly": this_assembly, + "cells": this_assembly.cells.all(), + "row_range": range(num_rows), + "col_range": range(num_cols), + }, ) + + # sidebar_html = render_block_to_string( + # "webportal/partials/assemblies/sidebar_list.html", + # block_name="", + # context=Context( + # { + # "assemblies": Assembly.objects.filter(user=request.user), + # "active_assembly_id": pk, + # } + # ), + # request=request, + # ) sidebar_html = render_to_string( "webportal/partials/assemblies/sidebar_list.html", { @@ -262,20 +284,19 @@ def assembly(request: WSGIRequest, pk: int) -> HttpResponse: @login_required @require_POST def update_assembly_name(request: WSGIRequest, pk: int) -> HttpResponse: - """Update the name of the Assembly. - - Returns: - The updated 'Assembly' view. - """ - - this_assembly = get_object_or_404(Assembly, pk=pk) - if request.method == "POST": if name := request.POST.get("name"): + this_assembly = get_object_or_404(Assembly, pk=pk) this_assembly.name = name this_assembly.save() - return assembly(request, pk) + template_name = "webportal/partials/assemblies/assembly.html" + context = {"assembly": this_assembly} + detail_view_name = render_block_to_string( + template_name, block_name="assembly-name", context=context, request=request + ) + sidebar_name = f"
{this_assembly.name}
" + return HttpResponse(content=detail_view_name + sidebar_name) @login_required @@ -320,31 +341,40 @@ def assembly_detail(request, pk): def add_row(request, pk): container = get_object_or_404(Assembly, id=pk) - max_y = container.cells.aggregate(max_y=models.Max("y"))["max_y"] or 0 - new_y = max_y + 1 - max_x = container.cells.aggregate(max_x=models.Max("x"))["max_x"] or 0 + max_row_num = container.cells.aggregate(mx=Max("row_number")).get("mx", 0) + new_row_num = max_row_num + 1 + max_col_num = container.cells.aggregate(mx=Max("column_number")).get("mx", 0) # Add new row new_cells = [] - for x in range(max_x + 1): - cell = Cell(container=container, x=x, y=new_y, value="") + for col_num in range(max_col_num): + cell = Cell( + container=container, + column_number=col_num + 1, + row_number=new_row_num, + value="", + ) new_cells.append(cell) Cell.objects.bulk_create(new_cells) # Render just the new row - return JsonResponse({"html": render_to_string("row.html", {"cells": new_cells})}) + return HttpResponse( + render_to_string("webportal/partials/assemblies/row.html", {"cells": new_cells}) + ) def add_column(request, pk): container = get_object_or_404(Assembly, id=container_id) - max_x = container.cells.aggregate(max_x=models.Max("x"))["max_x"] or 0 - new_x = max_x + 1 - max_y = container.cells.aggregate(max_y=models.Max("y"))["max_y"] or 0 + max_row_num = container.cells.aggregate(mx=Max("row_number")).get("mx", 0) + max_col_num = container.cells.aggregate(mx=Max("column_number")).get("mx", 0) + new_col_num = max_col_num + 1 # Add new column new_cells = [] - for y in range(max_y + 1): - cell = Cell(container=container, x=new_x, y=y, value="") + for row_num in range(max_row_num + 1): + cell = Cell( + container=container, column_number=new_col_num, row_number=row_num, value="" + ) new_cells.append(cell) Cell.objects.bulk_create(new_cells)