From cf9122460247eca4dcd1f9b4a2877e6972237483 Mon Sep 17 00:00:00 2001 From: Eberton Kociba Date: Tue, 26 May 2026 22:46:46 -0300 Subject: [PATCH] =?UTF-8?q?Cards=20de=20movimenta=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1 - Modelo do Rotation agora conta com novas propriedades para calcular o tempo de movimentação. 2 - ListView da Movimentações filtra e separa rotações em aberto para serem mostradas em Card 3 - O template rotation_home inclui _active_rotation_card para exibir as informações das Movimentações em aberto --- multigranja/apps/entities/models/rotation.py | 23 ++++++++++++++++- .../templates/_active_rotation_card.html | 25 +++++++++++++++---- .../templates/rotation/rotation_home.html | 13 +++++++++- .../apps/entities/views/list/rotation.py | 14 ++++++++++- 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/multigranja/apps/entities/models/rotation.py b/multigranja/apps/entities/models/rotation.py index 7395261..66d705d 100644 --- a/multigranja/apps/entities/models/rotation.py +++ b/multigranja/apps/entities/models/rotation.py @@ -1,4 +1,5 @@ from django.db import models +from django.utils import timezone class Rotation(models.Model): is_active = models.BooleanField(default=True) @@ -12,4 +13,24 @@ class Rotation(models.Model): paddock = models.ForeignKey('entities.Paddock', on_delete=models.CASCADE, related_name='rotations') def __str__(self): - return f"Movimentação {self.id} - Lote {self.batch.identifier}" \ No newline at end of file + return f"Movimentação {self.id} - Lote {self.batch.identifier}" + + @property + def duration(self): + end = self.exit_date or timezone.now() + return end - self.entry_date + + @property + def duration_display_day(self): + end = self.exit_date or timezone.now() + delta = end - self.entry_date + + days = delta.days + + if days == 0: + return "Hoje" + + if days == 1: + return "1" + + return f"{days}" \ No newline at end of file diff --git a/multigranja/apps/entities/templates/_active_rotation_card.html b/multigranja/apps/entities/templates/_active_rotation_card.html index 7b3f8ac..c0e4262 100644 --- a/multigranja/apps/entities/templates/_active_rotation_card.html +++ b/multigranja/apps/entities/templates/_active_rotation_card.html @@ -1,6 +1,21 @@ -
-

Movimentação {rotation.id}

-

Lote {lote.name} atualmente no piquete {paddock.number} a {rotation.duration} atrás

-

var = {{var}}

- Ver mais +
+
+

{{ obj.batch.identifier }} em piquete {{ obj.paddock.paddock_number }}

+
+ +
+

Há {{ obj.duration_display_day }} dias, desde {{ obj.entry_date|date:"d/m/Y" }}

+
+ +
+

Animais: {{ obj.animal_count }}

+
+ +
+

UGM: {{ obj.livestock_unit }}

+
+ +
+ Ver mais +
\ No newline at end of file diff --git a/multigranja/apps/entities/templates/rotation/rotation_home.html b/multigranja/apps/entities/templates/rotation/rotation_home.html index cf5e5fc..0f628be 100644 --- a/multigranja/apps/entities/templates/rotation/rotation_home.html +++ b/multigranja/apps/entities/templates/rotation/rotation_home.html @@ -2,7 +2,18 @@ {% load custom_tags %} {% block before_table %} -

Essas informações aparecem antes da tabela apenas para a tela de movimentações

+

Movimentações em aberto

+
+ {% if not open_rotations %} +

Nenhuma movimentação em aberto

+ {% else %} + + {% for obj in open_rotations %} + {% include "_active_rotation_card.html" %} + {% endfor %} + +{% endif %} +
{% endblock %} {% block table %} diff --git a/multigranja/apps/entities/views/list/rotation.py b/multigranja/apps/entities/views/list/rotation.py index 95e17b3..36b57a1 100644 --- a/multigranja/apps/entities/views/list/rotation.py +++ b/multigranja/apps/entities/views/list/rotation.py @@ -25,4 +25,16 @@ class RotationListView(BaseListView): filter_fields = ["id", "batch", "paddock"] def get_queryset(self): - return super().get_queryset().filter(is_active=True, paddock__farm=self.selected_farm) \ No newline at end of file + queryset = super().get_queryset() + self.open_rotations = queryset.filter(exit_date__isnull=True, paddock__farm=self.selected_farm) + + return super().get_queryset().filter(is_active=True, paddock__farm=self.selected_farm) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context.update({ + "open_rotations": self.open_rotations, + }) + + return context \ No newline at end of file