Skip to content

Commit

Permalink
add reportlab manifest
Browse files Browse the repository at this point in the history
  • Loading branch information
erikvw committed Nov 19, 2024
1 parent b32081b commit 56813a0
Show file tree
Hide file tree
Showing 50 changed files with 945 additions and 103 deletions.
1 change: 1 addition & 0 deletions edc_pharmacy/admin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
ReceiveItemAdmin,
RequestRepackAdmin,
StockAdmin,
StockProxyAdmin,
StockRequestAdmin,
StockRequestItemAdmin,
StockTransferAdmin,
Expand Down
1 change: 1 addition & 0 deletions edc_pharmacy/admin/actions/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@
from .prepare_stock_request_items import prepare_stock_request_items_action
from .print_labels import print_labels, 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
from .transfer_stock import transfer_stock_action
2 changes: 1 addition & 1 deletion edc_pharmacy/admin/actions/confirm_stock.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def confirm_stock_from_queryset(
if queryset.count() > 0:
session_uuid = str(uuid4())
stock_pks = queryset.values_list("pk", flat=True)
request.session[session_uuid] = [str(o) for o in stock_pks]
request.session[session_uuid] = {"queryset": [str(o) for o in stock_pks]}
url = reverse(
"edc_pharmacy:confirm_stock_from_queryset_url",
kwargs={"session_uuid": session_uuid},
Expand Down
22 changes: 22 additions & 0 deletions edc_pharmacy/admin/actions/print_transfer_stock_manifest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from __future__ import annotations

from django.contrib import admin, messages
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.utils.translation import gettext


@admin.action(description="Print transfer manifest")
def print_transfer_stock_manifest_action(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:
url = reverse(
"edc_pharmacy:generate_manifest", kwargs={"stock_transfer": queryset.first().pk}
)
return HttpResponseRedirect(url)
return None
4 changes: 3 additions & 1 deletion edc_pharmacy/admin/actions/process_repack_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ def process_repack_request_action(modeladmin, request, queryset):

# run task / func and update or clear the task_id
task = run_task_sync_or_async(
process_repack_request_queryset, repack_request_pks=repack_request_pks
process_repack_request_queryset,
repack_request_pks=repack_request_pks,
username=request.user.username,
)
task_id = getattr(task, "id", None)
queryset.update(task_id=task_id)
Expand Down
2 changes: 1 addition & 1 deletion edc_pharmacy/admin/actions/transfer_stock.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.utils.translation import gettext


@admin.action(description="Transfer stock to site")
@admin.action(description="Scan items to transfer to site")
def transfer_stock_action(modeladmin, request, queryset):
if queryset.count() > 1 or queryset.count() == 0:
messages.add_message(
Expand Down
1 change: 1 addition & 0 deletions edc_pharmacy/admin/stock/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from .receive_item_admin import ReceiveItemAdmin
from .repack_request_admin import RequestRepackAdmin
from .stock_admin import StockAdmin
from .stock_proxy_admin import StockProxyAdmin
from .stock_request_admin import StockRequestAdmin
from .stock_request_item_admin import StockRequestItemAdmin
from .stock_transfer_admin import StockTransferAdmin
Expand Down
1 change: 1 addition & 0 deletions edc_pharmacy/admin/stock/dispense_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class DispenseAdmin(ModelAdminMixin, admin.ModelAdmin):
search_fields = (
"id",
"rx__subject_identifier",
"dispenseitem__stock__code",
)

list_filter = (
Expand Down
12 changes: 11 additions & 1 deletion edc_pharmacy/admin/stock/location_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,19 @@ class LocationAdmin(ModelAdminMixin, admin.ModelAdmin):
)
},
),
(
"Contact",
{
"fields": (
"contact_name",
"contact_tel",
"contact_email",
)
},
),
)

search_fields = ["id", "name"]
search_fields = ["id", "name", "contact_name"]

def get_readonly_fields(self, request, obj=None):
if obj:
Expand Down
16 changes: 15 additions & 1 deletion edc_pharmacy/admin/stock/receive_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class ReceiveAdmin(ModelAdminMixin, admin.ModelAdmin):
form = ReceiveForm
ordering = ("-receive_identifier",)
actions = [confirm_received_stock_action]
autocomplete_fields = ["supplier"]

fieldsets = (
(
Expand All @@ -57,8 +58,18 @@ class ReceiveAdmin(ModelAdminMixin, admin.ModelAdmin):
{
"fields": (
"receive_datetime",
"location",
"order",
"location",
)
},
),
(
"Section B",
{
"fields": (
"supplier",
"invoice_number",
"invoice_date",
)
},
),
Expand All @@ -73,6 +84,7 @@ class ReceiveAdmin(ModelAdminMixin, admin.ModelAdmin):
"order_changelist",
"items",
"stock_changelist",
"invoice_date",
"created",
"modified",
)
Expand All @@ -87,6 +99,8 @@ class ReceiveAdmin(ModelAdminMixin, admin.ModelAdmin):
"receive_identifier",
"order__id",
"location__name",
"invoice_number",
"supplier__name",
)

@admin.display(description="RECEIVE #", ordering="receive_identifier")
Expand Down
22 changes: 21 additions & 1 deletion edc_pharmacy/admin/stock/stock_admin.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.contrib import admin
from django.core.exceptions import ObjectDoesNotExist
from django.template.loader import render_to_string
from django.urls import reverse
from django.utils.html import format_html
Expand Down Expand Up @@ -115,10 +116,12 @@ class StockAdmin(ModelAdminMixin, admin.ModelAdmin):
"stock_request_changelist",
"allocation_changelist",
"stock_transfer_item_changelist",
"dispense_changelist",
"created",
"modified",
)
list_filter = (
"container",
"confirmed",
AllocationListFilter,
TransferredListFilter,
Expand All @@ -128,7 +131,6 @@ class StockAdmin(ModelAdminMixin, admin.ModelAdmin):
"product__assignment__name",
"lot",
"location__display_name",
"container",
"confirmed_by",
"confirmed_datetime",
HasOrderNumFilter,
Expand All @@ -151,6 +153,7 @@ class StockAdmin(ModelAdminMixin, admin.ModelAdmin):
"allocation__stock_request_item__stock_request__id",
"allocation__id",
"stocktransferitem__stock_transfer__id",
"dispenseitem__dispense__id",
)
readonly_fields = (
"code",
Expand Down Expand Up @@ -364,3 +367,20 @@ def stock_request_changelist(self, obj):
)
return render_to_string("edc_pharmacy/stock/items_as_link.html", context=context)
return None

@admin.display(description="DISPENSE #")
def dispense_changelist(self, obj):
try:
obj.dispenseitem
except ObjectDoesNotExist:
pass
else:
url = reverse("edc_pharmacy_admin:edc_pharmacy_dispense_changelist")
url = f"{url}?q={obj.code}"
context = dict(
url=url,
label=obj.dispenseitem.dispense.dispense_identifier,
title="Go to dispense",
)
return render_to_string("edc_pharmacy/stock/items_as_link.html", context=context)
return None
72 changes: 72 additions & 0 deletions edc_pharmacy/admin/stock/stock_proxy_admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
from django.contrib import admin

from ...admin_site import edc_pharmacy_admin
from ...models import StockProxy
from ..list_filters import TransferredListFilter
from .stock_admin import StockAdmin


@admin.register(StockProxy, site=edc_pharmacy_admin)
class StockProxyAdmin(StockAdmin):

list_display = (
"formatted_code",
"transferred",
"formatted_confirmed_at_site",
"formatted_dispensed",
"stock_request_changelist",
"stock_transfer_item_changelist",
"allocation_changelist",
"dispense_changelist",
"formulation",
"qty",
"container_str",
"unit_qty",
"created",
"modified",
)
list_filter = (
TransferredListFilter,
"confirmed_at_site",
"product__formulation__description",
"location__display_name",
"created",
"modified",
)
search_fields = (
"stock_identifier",
"from_stock__stock_identifier",
"code",
"from_stock__code",
"repack_request__id",
"allocation__registered_subject__subject_identifier",
"allocation__stock_request_item__id",
"allocation__stock_request_item__stock_request__id",
"allocation__id",
"stocktransferitem__stock_transfer__id",
)
readonly_fields = (
"code",
"confirmed",
"confirmed_by",
"confirmed_datetime",
"container",
"from_stock",
"location",
"repack_request",
"lot",
"product",
"qty_in",
"qty_out",
"unit_qty_in",
"unit_qty_out",
"receive_item",
"stock_identifier",
)

def get_queryset(self, request):
return (
super()
.get_queryset(request)
.filter(confirmed=True, allocation__isnull=False, container__may_request_as=True)
)
20 changes: 19 additions & 1 deletion edc_pharmacy/admin/stock/stock_request_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

from ...admin_site import edc_pharmacy_admin
from ...forms import StockRequestForm
from ...models import StockRequest
from ...models import Allocation, StockRequest
from ..actions import allocate_stock_to_subject, prepare_stock_request_items_action
from ..model_admin_mixin import ModelAdminMixin
from ..utils import stock_request_status_counts
Expand Down Expand Up @@ -85,6 +85,24 @@ class StockRequestAdmin(ModelAdminMixin, admin.ModelAdmin):

readonly_fields = ("item_count",)

def get_readonly_fields(self, request, obj=None):
fields = super().get_readonly_fields(request, obj)
if obj:
if Allocation.objects.filter(stock_request_item__stock_request=obj).exists():
fields = (
"request_identifier",
"request_datetime",
"cutoff_datetime",
"location",
"formulation",
"container",
"containers_per_subject",
"item_count",
"subject_identifiers",
"excluded_subject_identifiers",
)
return fields

@admin.display(description="Request #", ordering="request_identifier")
def stock_request_id(self, obj):
return obj.request_identifier
Expand Down
4 changes: 2 additions & 2 deletions edc_pharmacy/admin/stock/stock_transfer_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from ...admin_site import edc_pharmacy_admin
from ...forms import StockTransferForm
from ...models import StockTransfer, StockTransferItem
from ..actions import transfer_stock_action
from ..actions import print_transfer_stock_manifest_action, transfer_stock_action
from ..model_admin_mixin import ModelAdminMixin


Expand All @@ -20,7 +20,7 @@ class StockTransferAdmin(ModelAdminMixin, admin.ModelAdmin):
list_per_page = 20

autocomplete_fields = ["from_location", "to_location"]
actions = [transfer_stock_action]
actions = [transfer_stock_action, print_transfer_stock_manifest_action]

form = StockTransferForm

Expand Down
22 changes: 22 additions & 0 deletions edc_pharmacy/admin/stock/stock_transfer_item_admin.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.contrib import admin
from django.core.exceptions import ObjectDoesNotExist
from django.template.loader import render_to_string
from django.urls import reverse
from django_audit_fields import audit_fieldset_tuple
Expand Down Expand Up @@ -39,6 +40,7 @@ class StockTransferItemAdmin(ModelAdminMixin, admin.ModelAdmin):
"stock_transfer_changelist",
"stock_changelist",
"stock__location",
"stock_transfer_confirmation_changelist",
)

list_filter = ("transfer_item_datetime",)
Expand Down Expand Up @@ -79,3 +81,23 @@ def stock_transfer_changelist(self, obj):
url=url, label=obj.stock_transfer.transfer_identifier, title="Go to stock transfer"
)
return render_to_string("edc_pharmacy/stock/items_as_link.html", context=context)

@admin.display(
description="Confirmation #",
ordering="stocktransferconfirmation__transfer_confirmation_identifier",
)
def stock_transfer_confirmation_changelist(self, obj):
url = reverse("edc_pharmacy_admin:edc_pharmacy_stocktransferconfirmation_changelist")
url = f"{url}?q={obj.id}"
try:
transfer_confirmation = obj.stock.stocktransferconfirmation
except ObjectDoesNotExist:
pass
else:
context = dict(
url=url,
label=transfer_confirmation.transfer_confirmation_identifier,
title="Go to stock transfer confirmation",
)
return render_to_string("edc_pharmacy/stock/items_as_link.html", context=context)
return None
5 changes: 2 additions & 3 deletions edc_pharmacy/forms/stock/receive_item_form.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,8 @@ def clean(self):
# in unit_qty's
if cleaned_data.get("qty"):
# TODO: clean this up
qty_ordered = (
cleaned_data.get("order_item").unit_qty
+ cleaned_data.get("order_item").unit_qty_received
qty_ordered = cleaned_data.get("order_item").unit_qty + (
cleaned_data.get("order_item").unit_qty_received or 0
)
qty_already_received = self._meta.model.objects.filter(
order_item=cleaned_data.get("order_item")
Expand Down
Loading

0 comments on commit 56813a0

Please sign in to comment.