Skip to content

Commit

Permalink
split stock transfer confirmation into model plus items model, update…
Browse files Browse the repository at this point in the history
… view
  • Loading branch information
erikvw committed Nov 21, 2024
1 parent 22869bd commit c1aa827
Show file tree
Hide file tree
Showing 18 changed files with 395 additions and 109 deletions.
1 change: 1 addition & 0 deletions edc_pharmacy/admin/stock/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,6 @@
from .stock_request_item_admin import StockRequestItemAdmin
from .stock_transfer_admin import StockTransferAdmin
from .stock_transfer_confirmation_admin import StockTransferConfirmationAdmin
from .stock_transfer_confirmation_item_admin import StockTransferConfirmationItemAdmin
from .stock_transfer_item_admin import StockTransferItemAdmin
from .supplier_admin import SupplierAdmin
75 changes: 52 additions & 23 deletions edc_pharmacy/admin/stock/stock_transfer_confirmation_admin.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from django.contrib import admin
from django.template.loader import render_to_string
from django.urls import reverse
from django.utils.translation import gettext as _
from django_audit_fields import audit_fieldset_tuple
from edc_utils.date import to_local

from ...admin_site import edc_pharmacy_admin
from ...models import StockTransferConfirmation
Expand All @@ -10,23 +12,24 @@

@admin.register(StockTransferConfirmation, site=edc_pharmacy_admin)
class StockTransferConfirmationAdmin(ModelAdminMixin, admin.ModelAdmin):
change_list_title = "Pharmacy: Stock transfer confirmations"
change_form_title = "Pharmacy: Stock transfer confirmation"
change_list_title = "Pharmacy: Site stock transfer confirmations"
change_form_title = "Pharmacy: Site stock transfer confirmation"
show_object_tools = True
show_cancel = True
list_per_page = 20

ordering = ("confirmed_datetime",)
ordering = ("-transfer_confirmation_identifier",)

fieldsets = (
(
None,
{
"fields": (
"transfer_confirmation_identifier",
"stock",
"confirmed_datetime",
"confirmed_by",
"transfer_confirmation_datetime",
"stock_transfer",
"location",
"comments",
)
},
),
Expand All @@ -35,33 +38,59 @@ class StockTransferConfirmationAdmin(ModelAdminMixin, admin.ModelAdmin):

list_display = (
"identifier",
"subject",
"stock_changelist",
"confirmed_datetime",
"confirmed_by",
"transfer_confirmation_date",
"location",
"stock_transfer_confirmation_item_changelist",
"stock_transfer_changelist",
)

list_filter = (
"transfer_confirmation_datetime",
"location",
)

readonly_fields = (
"transfer_confirmation_identifier",
"stock",
"confirmed_datetime",
"confirmed_by",
"transfer_confirmation_datetime",
"stock_transfer",
"location",
)

search_fields = ("pk", "stock_transfer__pk")

@admin.display(description="CONFIRMATION #", ordering="-transfer_confirmation_identifier")
def identifier(self, obj):
return obj.transfer_confirmation_identifier.split("-")[0]

@admin.display(description="Date", ordering="transfer_confirmation_datetime")
def transfer_confirmation_date(self, obj):
return to_local(obj.transfer_confirmation_datetime).date()

@admin.display(description="Confirmed items")
def stock_transfer_confirmation_item_changelist(self, obj):
item_count = obj.stocktransferconfirmationitem_set.all().count()
url = reverse(
"edc_pharmacy_admin:edc_pharmacy_stocktransferconfirmationitem_changelist"
)
url = f"{url}?q={obj.id}"
context = dict(
url=url,
label=_("Confirmed items (%(item_count)s)") % {"item_count": item_count},
title="Go to stock transfer confirmation items",
)
return render_to_string("edc_pharmacy/stock/items_as_link.html", context=context)

@admin.display(
description="SUBJECT #",
ordering="stock__allocation__registered_subject__subject_identifier",
description="Stock Transfer", ordering="stock_transfer__transfer_identifier"
)
def subject(self, obj):
return obj.stock.allocation.registered_subject.subject_identifier

@admin.display(description="Stock", ordering="stock__code")
def stock_changelist(self, obj):
url = reverse("edc_pharmacy_admin:edc_pharmacy_stock_changelist")
url = f"{url}?q={obj.stock.code}"
context = dict(url=url, label=obj.stock.code, title="Go to stock")
def stock_transfer_changelist(self, obj):
url = reverse("edc_pharmacy_admin:edc_pharmacy_stocktransfer_changelist")
url = f"{url}?q={obj.stock_transfer.id}"
context = dict(
url=url,
label=(
f"{obj.stock_transfer.transfer_identifier} ({obj.stock_transfer.item_count})"
),
title="Go to stock transfer",
)
return render_to_string("edc_pharmacy/stock/items_as_link.html", context=context)
64 changes: 54 additions & 10 deletions edc_pharmacy/admin/stock/stock_transfer_confirmation_item_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,31 @@
from django.template.loader import render_to_string
from django.urls import reverse
from django_audit_fields import audit_fieldset_tuple
from edc_utils.date import to_local

from ...admin_site import edc_pharmacy_admin
from ...models import StockTransferConfirmation
from ...models import StockTransferConfirmationItem
from ..model_admin_mixin import ModelAdminMixin


@admin.register(StockTransferConfirmation, site=edc_pharmacy_admin)
class StockTransferConfirmationAdmin(ModelAdminMixin, admin.ModelAdmin):
change_list_title = "Pharmacy: Stock transfer confirmations"
change_form_title = "Pharmacy: Stock transfer confirmation"
@admin.register(StockTransferConfirmationItem, site=edc_pharmacy_admin)
class StockTransferConfirmationItemAdmin(ModelAdminMixin, admin.ModelAdmin):
change_list_title = "Pharmacy: Site stock transfer confirmation items"
change_form_title = "Pharmacy: Site stock transfer confirmation item"
show_object_tools = True
show_cancel = True
list_per_page = 20

ordering = ("confirmed_datetime",)
ordering = ("-transfer_confirmation_item_identifier",)

fieldsets = (
(
None,
{
"fields": (
"transfer_confirmation_identifier",
"transfer_confirmation_item_identifier",
"transfer_confirmation_item_datetime",
"stock_transfer_confirmation",
"stock",
"confirmed_datetime",
"confirmed_by",
Expand All @@ -35,22 +38,49 @@ class StockTransferConfirmationAdmin(ModelAdminMixin, admin.ModelAdmin):

list_display = (
"identifier",
"transfer_confirmation_item_date",
"subject",
"site",
"stock_changelist",
"stock_transfer_confirmation_changelist",
"confirmed_datetime",
"confirmed_by",
)

list_filter = ("transfer_confirmation_item_datetime",)

readonly_fields = (
"transfer_confirmation_identifier",
"transfer_confirmation_item_identifier",
"transfer_confirmation_item_datetime",
"stock_transfer_confirmation",
"stock",
"confirmed_datetime",
"confirmed_by",
)

@admin.display(description="CONFIRMATION #", ordering="-transfer_confirmation_identifier")
search_fields = (
"pk",
"stock_transfer_confirmation__pk",
"stock__code",
"stock__pk",
"stock__allocation__registered_subject__subject_identifier",
)

@admin.display(
description="CONFIRMATION #", ordering="-transfer_confirmation_item_identifier"
)
def identifier(self, obj):
return obj.transfer_confirmation_identifier.split("-")[0]
return obj.transfer_confirmation_item_identifier

@admin.display(description="Date", ordering="transfer_confirmation_item_datetime")
def transfer_confirmation_item_date(self, obj):
return to_local(obj.transfer_confirmation_item_datetime).date()

@admin.display(
description="Site", ordering="stock_transfer_confirmation__location__site__id"
)
def site(self, obj):
return obj.stock_transfer_confirmation.location.site.id

@admin.display(
description="SUBJECT #",
Expand All @@ -59,6 +89,20 @@ def identifier(self, obj):
def subject(self, obj):
return obj.stock.allocation.registered_subject.subject_identifier

@admin.display(
description="Transfer confirmation",
ordering="stock_transfer_confirmation__transfer_confirmation_identifier",
)
def stock_transfer_confirmation_changelist(self, obj):
url = reverse("edc_pharmacy_admin:edc_pharmacy_stocktransferconfirmation_changelist")
url = f"{url}?q={obj.stock_transfer_confirmation.id}"
context = dict(
url=url,
label=obj.stock_transfer_confirmation.transfer_confirmation_identifier,
title="Go to stock transfer confirmation",
)
return render_to_string("edc_pharmacy/stock/items_as_link.html", context=context)

@admin.display(description="Stock", ordering="stock__code")
def stock_changelist(self, obj):
url = reverse("edc_pharmacy_admin:edc_pharmacy_stock_changelist")
Expand Down
20 changes: 11 additions & 9 deletions edc_pharmacy/admin/stock/stock_transfer_item_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class StockTransferItemAdmin(ModelAdminMixin, admin.ModelAdmin):
"stock_transfer_changelist",
"stock_changelist",
"stock__location",
"stock_transfer_confirmation_changelist",
"stock_transfer_confirmation_item_changelist",
)

list_filter = ("transfer_item_datetime",)
Expand Down Expand Up @@ -83,21 +83,23 @@ def stock_transfer_changelist(self, obj):
return render_to_string("edc_pharmacy/stock/items_as_link.html", context=context)

@admin.display(
description="Confirmation #",
ordering="stocktransferconfirmation__transfer_confirmation_identifier",
description="Site Confirmation #",
ordering="stock__stocktransferconfirmationitem__transfer_confirmation_item_identifier",
)
def stock_transfer_confirmation_changelist(self, obj):
url = reverse("edc_pharmacy_admin:edc_pharmacy_stocktransferconfirmation_changelist")
url = f"{url}?q={obj.id}"
def stock_transfer_confirmation_item_changelist(self, obj):
try:
transfer_confirmation = obj.stock.stocktransferconfirmation
transfer_confirmation_item = obj.stock.stocktransferconfirmationitem
except ObjectDoesNotExist:
pass
else:
url = reverse(
"edc_pharmacy_admin:edc_pharmacy_stocktransferconfirmationitem_changelist"
)
url = f"{url}?q={transfer_confirmation_item.pk}"
context = dict(
url=url,
label=transfer_confirmation.transfer_confirmation_identifier,
title="Go to stock transfer confirmation",
label=transfer_confirmation_item.transfer_confirmation_item_identifier,
title="Go to stock transfer confirmation item",
)
return render_to_string("edc_pharmacy/stock/items_as_link.html", context=context)
return None
2 changes: 2 additions & 0 deletions edc_pharmacy/constants.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
ALLOCATED = "allocated"
ALREADY_CONFIRMED = "already_confirmed"
AVAILABLE = "available"
CANCELLED = "cancelled"
CONTROL_ARM = "control_arm"
DAYS = "days"
DISPENSED = "dispensed"
FILLED = "filled"
INVALID = "invalid"
IN_PROGRESS_APPT = "in_progress"
PARTIAL = "partial"
PER_DAY = "day"
Expand Down
4 changes: 4 additions & 0 deletions edc_pharmacy/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,3 +128,7 @@ class StockTransferError(Exception):

class AssignmentError(Exception):
pass


class StockTransferConfirmationError(Exception):
pass
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
# Generated by Django 5.1.2 on 2024-11-21 03:22

import _socket
import datetime
import uuid

import _socket
import django.db.models.deletion
import django_audit_fields.fields.hostname_modification_field
import django_audit_fields.fields.userfield
import django_audit_fields.fields.uuid_auto_field
import django_audit_fields.models.audit_model_mixin
import django_revision.revision_field
import edc_pharmacy.models.stock.stock_transfer_confirmation
import edc_pharmacy.models.stock.stock_transfer_confirmation_item
import edc_utils.date
import simple_history.models
import uuid
from django.conf import settings
from django.db import migrations, models

import edc_pharmacy.models.stock.stock_transfer_confirmation
import edc_pharmacy.models.stock.stock_transfer_confirmation_item


class Migration(migrations.Migration):

Expand Down
5 changes: 3 additions & 2 deletions edc_pharmacy/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
stock_on_post_delete,
stock_on_post_save,
stock_request_item_on_post_save,
stock_transfer_confirmation_on_post_save,
stock_transfer_confirmation_post_delete,
stock_transfer_confirmation_item_on_post_save,
stock_transfer_confirmation_item_post_delete,
)
from .stock import (
Allocation,
Expand All @@ -47,6 +47,7 @@
StockRequestItem,
StockTransfer,
StockTransferConfirmation,
StockTransferConfirmationItem,
StockTransferItem,
Supplier,
)
Expand Down
14 changes: 7 additions & 7 deletions edc_pharmacy/models/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
Stock,
StockRequest,
StockRequestItem,
StockTransferConfirmation,
StockTransferConfirmationItem,
)


Expand Down Expand Up @@ -149,10 +149,10 @@ def repack_request_on_post_save(

@receiver(
post_save,
sender=StockTransferConfirmation,
dispatch_uid="stock_transfer_confirmation_on_post_save",
sender=StockTransferConfirmationItem,
dispatch_uid="stock_transfer_confirmation_item_on_post_save",
)
def stock_transfer_confirmation_on_post_save(
def stock_transfer_confirmation_item_on_post_save(
sender, instance, raw, created, update_fields, **kwargs
) -> None:
if not raw and not update_fields:
Expand Down Expand Up @@ -190,10 +190,10 @@ def stock_on_post_delete(sender, instance, using, **kwargs) -> None:

@receiver(
post_delete,
sender=StockTransferConfirmation,
dispatch_uid="stock_transfer_confirmation_post_delete",
sender=StockTransferConfirmationItem,
dispatch_uid="stock_transfer_confirmation_item_post_delete",
)
def stock_transfer_confirmation_post_delete(sender, instance, using, **kwargs) -> None:
def stock_transfer_confirmation_item_post_delete(sender, instance, using, **kwargs) -> None:
instance.stock.confirmed_at_site = False
instance.stock.save(update_fields=["confirmed_at_site"])

Expand Down
1 change: 1 addition & 0 deletions edc_pharmacy/models/stock/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@
from .stock_request_item import StockRequestItem
from .stock_transfer import StockTransfer
from .stock_transfer_confirmation import StockTransferConfirmation
from .stock_transfer_confirmation_item import StockTransferConfirmationItem
from .stock_transfer_item import StockTransferItem
from .supplier import Supplier
Loading

0 comments on commit c1aa827

Please sign in to comment.