From 913fb663fd1cb26ec9fd30bae15a9f5f855993e0 Mon Sep 17 00:00:00 2001 From: Thomas Rusiecki Date: Fri, 28 Feb 2025 16:55:10 -0300 Subject: [PATCH] lot_tag list can be reordered --- admin/templates/lot_tag_panel.html | 58 +++++++++++++++++++++++++++++- admin/urls.py | 1 + admin/views.py | 24 +++++++++++++ dashboard/mixins.py | 2 +- lot/models.py | 19 ++++++++++ 5 files changed, 102 insertions(+), 2 deletions(-) diff --git a/admin/templates/lot_tag_panel.html b/admin/templates/lot_tag_panel.html index 689aad0..48d9a95 100644 --- a/admin/templates/lot_tag_panel.html +++ b/admin/templates/lot_tag_panel.html @@ -16,8 +16,13 @@
{% if lot_tags_edit %} + + {% for tag in lot_tags_edit %} - + + + @@ -56,6 +69,11 @@
+ {% trans 'Inbox order CANNOT be changed' %} +
# + {% trans "Lot Group Name" %} {% trans "Actions" %} @@ -26,7 +31,15 @@
+ + {{ tag.name }}
+
+ {% csrf_token %} + + +
{% else %} {% endfor %} + + + + + {% endblock %} diff --git a/admin/urls.py b/admin/urls.py index 0a719ca..23c6086 100644 --- a/admin/urls.py +++ b/admin/urls.py @@ -19,4 +19,5 @@ urlpatterns = [ path("lot/add", views.AddLotTagView.as_view(), name="add_lot_tag"), path("lot/delete/", views.DeleteLotTagView.as_view(), name='delete_lot_tag'), path("lot/edit//", views.UpdateLotTagView.as_view(), name='edit_lot_tag'), + path("lot/update_order/", views.UpdateLotTagOrderView.as_view(), name='update_lot_tag_order'), ] diff --git a/admin/views.py b/admin/views.py index 3465287..b2ad5cb 100644 --- a/admin/views.py +++ b/admin/views.py @@ -206,6 +206,30 @@ class UpdateLotTagView(AdminView, UpdateView): return response +class UpdateLotTagOrderView(AdminView, TemplateView): + success_url = reverse_lazy('admin:tag_panel') + + def post(self, request, *args, **kwargs): + form = OrderingStateForm(request.POST) + + if form.is_valid(): + ordered_ids = form.cleaned_data["ordering"].split(',') + + with transaction.atomic(): + #TODO: log on institution wide logging - if implemented - + current_order = 2 + for lookup_id in ordered_ids: + lot_tag = LotTag.objects.get(id=lookup_id) + lot_tag.order = current_order + lot_tag.save() + current_order += 1 + + messages.success(self.request, _("Order changed succesfuly.")) + return redirect(self.success_url) + else: + return Http404 + + class InstitutionView(AdminView, UpdateView): template_name = "institution.html" title = _("Edit institution") diff --git a/dashboard/mixins.py b/dashboard/mixins.py index c95e808..417747c 100644 --- a/dashboard/mixins.py +++ b/dashboard/mixins.py @@ -35,7 +35,7 @@ class DashboardView(LoginRequiredMixin): context = super().get_context_data(**kwargs) lot_tags = LotTag.objects.filter( owner=self.request.user.institution, - ) + ).order_by('order') context.update({ "commit_id": settings.COMMIT, 'title': self.title, diff --git a/lot/models.py b/lot/models.py index d651689..f25f22b 100644 --- a/lot/models.py +++ b/lot/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.db.models import Max from django.utils.translation import gettext_lazy as _ from utils.constants import ( STR_SM_SIZE, @@ -16,11 +17,28 @@ class LotTag(models.Model): owner = models.ForeignKey(Institution, on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) inbox = models.BooleanField(default=False) + order = models.PositiveIntegerField(default=0) def __str__(self): return self.name + def save(self, *args, **kwargs): + if not self.pk: + # set the order to be last + max_order = LotTag.objects.filter(owner=self.owner).aggregate(Max('order'))['order__max'] + self.order = (max_order or 0) + 1 + super().save(*args, **kwargs) + + + def delete(self, *args, **kwargs): + institution = self.owner + order = self.order + super().delete(*args, **kwargs) + # Adjust the order of other instances + LotTag.objects.filter(owner=institution, order__gt=order).update(order=models.F('order') - 1) + + class DeviceLot(models.Model): lot = models.ForeignKey("Lot", on_delete=models.CASCADE) device_id = models.CharField(max_length=STR_EXTEND_SIZE, blank=False, null=False) @@ -51,6 +69,7 @@ class Lot(models.Model): def remove(self, v): for d in DeviceLot.objects.filter(lot=self, device_id=v): d.delete() + @property def devices(self): return DeviceLot.objects.filter(lot=self)