Skip to content

Commit

Permalink
tweeks to flow changelist to view, etc, lang po
Browse files Browse the repository at this point in the history
  • Loading branch information
erikvw committed Nov 20, 2024
1 parent 56813a0 commit b176125
Show file tree
Hide file tree
Showing 61 changed files with 1,641 additions and 588 deletions.
10 changes: 8 additions & 2 deletions edc_pharmacy/admin/actions/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,21 @@
from .confirm_stock import (
confirm_received_stock_action,
confirm_repacked_stock_action,
confirm_stock_from_instance,
confirm_stock_from_queryset,
)
from .delete_items_for_stock_request import delete_items_for_stock_request_action
from .delete_order_items import delete_order_items_action
from .delete_receive_items import delete_receive_items_action
from .go_to_add_repack_request import go_to_add_repack_request_action
from .go_to_allocations import go_to_allocations
from .go_to_stock import go_to_stock
from .prepare_stock_request_items import prepare_stock_request_items_action
from .print_labels import print_labels, print_labels_from_repack_request
from .print_labels import (
print_labels,
print_labels_from_receive,
print_labels_from_receive_item,
print_labels_from_repack_request,
)
from .print_stock_labels import print_stock_labels
from .print_transfer_stock_manifest import print_transfer_stock_manifest_action
from .process_repack_request import process_repack_request_action
Expand Down
70 changes: 38 additions & 32 deletions edc_pharmacy/admin/actions/confirm_stock.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from __future__ import annotations

from typing import TYPE_CHECKING
from uuid import uuid4

from django.contrib import admin, messages
Expand All @@ -9,8 +8,7 @@
from django.urls import reverse
from django.utils.translation import gettext

if TYPE_CHECKING:
from ...models import Receive, RepackRequest
from ...models import Receive, RepackRequest, Stock


@admin.display(description="Confirm repacked and labeled stock")
Expand All @@ -22,7 +20,7 @@ def confirm_repacked_stock_action(modeladmin, request, queryset: QuerySet[Repack
gettext("Select one and only one item"),
)
else:
return confirm_stock_from_instance(modeladmin, request, queryset)
return confirm_stock_from_queryset(modeladmin, request, queryset)
return None


Expand All @@ -35,41 +33,49 @@ def confirm_received_stock_action(modeladmin, request, queryset: QuerySet[Repack
gettext("Select one and only one item"),
)
else:
return confirm_stock_from_instance(modeladmin, request, queryset)
return None


@admin.display(description="Confirm labeled stock")
def confirm_stock_from_instance(
modeladmin, request, queryset: QuerySet[RepackRequest | Receive]
):
"""See also : utils.confirm_stock"""
if queryset.count() > 1 or queryset.count() == 0:
messages.add_message(
request,
messages.ERROR,
gettext("Select one and only one item"),
)
else:
url = reverse(
"edc_pharmacy:confirm_stock_from_instance_url",
kwargs={
"source_pk": str(queryset.first().id),
"model": queryset.model._meta.label_lower.split(".")[1],
},
)
return HttpResponseRedirect(url)
return confirm_stock_from_queryset(modeladmin, request, queryset)
return None


@admin.display(description="Confirm labeled stock")
def confirm_stock_from_queryset(
modeladmin, request, queryset: QuerySet[RepackRequest | Receive]
modeladmin, request, queryset: QuerySet[RepackRequest | Receive | Stock]
):
if queryset.count() > 0:
stock_codes = []
pk = None
identifier = None
model_name = None
word = "confirmed"
if queryset.count() == 1:
if queryset.model == RepackRequest:
stock_qs = Stock.objects.filter(
repack_request__pk__in=[obj.pk for obj in queryset]
)
stock_codes = stock_qs.values_list("code", flat=True)
pk = queryset.first().pk
identifier = queryset.first().repack_identifier
model_name = queryset.model._meta.verbose_name
elif queryset.model == Receive:
stock_qs = Stock.objects.filter(
receive_item__receive__pk__in=[obj.pk for obj in queryset]
)
stock_codes = stock_qs.values_list("code", flat=True)
pk = queryset.first().pk
identifier = queryset.first().receive_identifier
model_name = queryset.model._meta.verbose_name
elif queryset.count() > 1:
stock_codes = queryset.values_list("code", flat=True)

if queryset.count() >= 1:
session_uuid = str(uuid4())
stock_pks = queryset.values_list("pk", flat=True)
request.session[session_uuid] = {"queryset": [str(o) for o in stock_pks]}
request.session[session_uuid] = {
"stock_codes": [str(o) for o in stock_codes],
"source_pk": pk,
"source_identifier": identifier,
"source_label_lower": queryset.model._meta.label_lower,
"source_model_name": model_name,
"transaction_word": word,
}
url = reverse(
"edc_pharmacy:confirm_stock_from_queryset_url",
kwargs={"session_uuid": session_uuid},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.contrib import messages
from django.utils.translation import gettext

from edc_pharmacy.models import StockRequestItem
from ...models import StockRequestItem


def delete_items_for_stock_request_action(modeladmin, request, queryset):
Expand Down
34 changes: 34 additions & 0 deletions edc_pharmacy/admin/actions/delete_order_items.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from django.contrib import admin, messages
from django.db.models import QuerySet
from django.utils.translation import gettext

from ...models import OrderItem, Stock


@admin.display(description=f"Delete selected {OrderItem._meta.verbose_name_plural}")
def delete_order_items_action(modeladmin, request, queryset: QuerySet[OrderItem]):
failed_count = 0
success_count = 0
for obj in queryset:
if obj.receiveitem_set.filter(stock__confirmed=True).exists():
failed_count += 1
else:
Stock.objects.filter(receive_item__order_item=obj, confirmed=False).delete()
obj.receiveitem_set.all().delete()
obj.delete()
success_count += 1
if success_count > 0:
messages.add_message(
request,
messages.SUCCESS,
gettext(f"Successfully deleted {success_count} {OrderItem._meta.verbose_name}."),
)
if failed_count > 0:
messages.add_message(
request,
messages.ERROR,
gettext(
f"Unable to deleted {failed_count} {OrderItem._meta.verbose_name}. "
"Confirmed stock items exist."
),
)
33 changes: 33 additions & 0 deletions edc_pharmacy/admin/actions/delete_receive_items.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from django.contrib import admin, messages
from django.db.models import QuerySet
from django.utils.translation import gettext

from ...models import ReceiveItem, Stock


@admin.display(description=f"Delete selected {ReceiveItem._meta.verbose_name_plural}")
def delete_receive_items_action(modeladmin, request, queryset: QuerySet[ReceiveItem]):
failed_count = 0
success_count = 0
for obj in queryset:
if obj.stock_set.filter(confirmed=True).exists():
failed_count += 1
else:
Stock.objects.filter(receive_item=obj, confirmed=False).delete()
obj.delete()
success_count += 1
if success_count > 0:
messages.add_message(
request,
messages.SUCCESS,
gettext(f"Successfully deleted {success_count} {ReceiveItem._meta.verbose_name}."),
)
if failed_count > 0:
messages.add_message(
request,
messages.ERROR,
gettext(
f"Unable to deleted {failed_count} {ReceiveItem._meta.verbose_name}. "
"Confirmed stock items exist."
),
)
46 changes: 46 additions & 0 deletions edc_pharmacy/admin/actions/print_labels.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,49 @@ def print_labels_from_repack_request(modeladmin, request, queryset):
)
return HttpResponseRedirect(url)
return None


@admin.action(description="Print labels")
def print_labels_from_receive(modeladmin, request, queryset):
if queryset.count() > 1 or queryset.count() == 0:
messages.add_message(
request,
messages.ERROR,
gettext("Select one and only one item"),
)
else:
session_uuid = str(uuid4())
stock_qs = Stock.objects.values_list("pk", flat=True).filter(
receive_item__receive=queryset.first()
)
if stock_qs.exists():
request.session[session_uuid] = [o for o in stock_qs]
url = reverse(
"edc_pharmacy:print_labels_url",
kwargs={"session_uuid": session_uuid, "model": "stock"},
)
return HttpResponseRedirect(url)
return None


@admin.action(description="Print labels")
def print_labels_from_receive_item(modeladmin, request, queryset):
if queryset.count() > 1 or queryset.count() == 0:
messages.add_message(
request,
messages.ERROR,
gettext("Select one and only one item"),
)
else:
session_uuid = str(uuid4())
stock_qs = Stock.objects.values_list("pk", flat=True).filter(
receive_item=queryset.first()
)
if stock_qs.exists():
request.session[session_uuid] = [o for o in stock_qs]
url = reverse(
"edc_pharmacy:print_labels_url",
kwargs={"session_uuid": session_uuid, "model": "stock"},
)
return HttpResponseRedirect(url)
return None
45 changes: 43 additions & 2 deletions edc_pharmacy/admin/list_filters.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from django.contrib.admin import SimpleListFilter
from django.contrib.sites.shortcuts import get_current_site
from django.db.models import Count, F, Q
from django.utils.translation import gettext as _
from edc_constants.choices import YES_NO, YES_NO_NA
from edc_constants.constants import NO, NOT_APPLICABLE, YES
from edc_constants.constants import NEW, NO, NOT_APPLICABLE, PARTIAL, RECEIVED, YES

from ..models import Medication, Rx
from ..utils import blinded_user
Expand Down Expand Up @@ -62,7 +63,7 @@ def queryset(self, request, queryset):
**opts,
)
elif self.value() == NOT_APPLICABLE:
opts = dict(from_stock__isnull=True) if from_stock else {}
opts = dict(from_stock__isnull=False) if from_stock else {}
qs = queryset.filter(
allocation__isnull=True,
container__may_request_as=False,
Expand All @@ -71,6 +72,23 @@ def queryset(self, request, queryset):
return qs


class StockItemAllocationListFilter(SimpleListFilter):
title = "Allocated"
parameter_name = "allocated"

def lookups(self, request, model_admin):
return YES_NO

def queryset(self, request, queryset):
qs = None
if self.value():
if self.value() == YES:
qs = queryset.filter(allocation__isnull=False)
elif self.value() == NO:
qs = queryset.filter(allocation__isnull=True)
return qs


class TransferredListFilter(SimpleListFilter):
title = "Transferred"
parameter_name = "transferred"
Expand Down Expand Up @@ -218,3 +236,26 @@ def queryset(self, request, queryset):
& Q(allocation__stock__location=F("stock_request__location"))
)
return qs


class OrderItemStatusListFilter(SimpleListFilter):
title = "Status"
parameter_name = "order_item_status"

def lookups(self, request, model_admin):
return (
(NEW, _("New")),
(PARTIAL, _("Partial")),
(RECEIVED, _("Received")),
)

def queryset(self, request, queryset):
qs = None
if self.value():
if self.value() == RECEIVED:
qs = queryset.filter(unit_qty=0)
elif self.value() == PARTIAL:
qs = queryset.filter(Q(unit_qty_ordered__gt=F("unit_qty")) & ~Q(unit_qty=0))
elif self.value() == NEW:
qs = queryset.filter(unit_qty=F("unit_qty_ordered"))
return qs
Loading

0 comments on commit b176125

Please sign in to comment.