Нема описа

admin.py 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. from django.contrib import admin
  2. from . import models
  3. from orgs.models import Organization
  4. class OrgScopedAdmin(admin.ModelAdmin):
  5. """Limit queryset and FK choices to the current request.org when available."""
  6. def get_queryset(self, request):
  7. qs = super().get_queryset(request)
  8. org = getattr(request, "org", None)
  9. if org is not None and any(f.name == "organization" for f in self.model._meta.fields):
  10. return qs.filter(organization=org)
  11. return qs
  12. def formfield_for_foreignkey(self, db_field, request, **kwargs):
  13. org = getattr(request, "org", None)
  14. if org is not None:
  15. # Direct organization field
  16. if db_field.name == "organization":
  17. kwargs["queryset"] = Organization.objects.filter(pk=org.pk)
  18. else:
  19. # If related model has an organization field, scope it
  20. rel = getattr(db_field, "remote_field", None)
  21. rel_model = getattr(rel, "model", None)
  22. if rel_model is not None and any(f.name == "organization" for f in rel_model._meta.fields):
  23. kwargs["queryset"] = rel_model.objects.filter(organization=org)
  24. return super().formfield_for_foreignkey(db_field, request, **kwargs)
  25. # Organization admin is managed in orgs app; UserProfile lives in orgs
  26. @admin.register(models.MaterialCategory)
  27. class MaterialCategoryAdmin(OrgScopedAdmin):
  28. list_display = ("name", "organization", "created_at")
  29. search_fields = ("name",)
  30. @admin.register(models.Material)
  31. class MaterialAdmin(OrgScopedAdmin):
  32. list_display = ("name", "code", "get_category_display", "organization", "default_unit")
  33. list_filter = ("default_unit", "category")
  34. search_fields = ("name", "code")
  35. class MaterialImageInline(admin.TabularInline):
  36. model = models.MaterialImage
  37. extra = 1
  38. inlines = [MaterialImageInline]
  39. @admin.register(models.PriceList)
  40. class PriceListAdmin(OrgScopedAdmin):
  41. list_display = ("name", "organization", "currency_code", "effective_from", "effective_to")
  42. search_fields = ("name",)
  43. @admin.register(models.PriceListItem)
  44. class PriceListItemAdmin(admin.ModelAdmin):
  45. list_display = ("price_list", "material", "unit", "unit_price", "direction")
  46. list_filter = ("direction", "unit")
  47. search_fields = ("price_list__name", "material__name")
  48. @admin.register(models.Customer)
  49. class CustomerAdmin(OrgScopedAdmin):
  50. list_display = ("name", "organization", "email", "phone", "price_list")
  51. search_fields = ("name", "email", "phone")
  52. @admin.register(models.CustomerSite)
  53. class CustomerSiteAdmin(OrgScopedAdmin):
  54. list_display = ("name", "customer")
  55. search_fields = ("name", "customer__name")
  56. @admin.register(models.ServiceAgreement)
  57. class ServiceAgreementAdmin(OrgScopedAdmin):
  58. list_display = ("customer", "site", "price_list", "valid_from", "valid_to")
  59. search_fields = ("customer__name",)
  60. @admin.register(models.PickupOrder)
  61. class PickupOrderAdmin(OrgScopedAdmin):
  62. list_display = ("id", "organization", "customer", "site", "status", "scheduled_at")
  63. list_filter = ("status",)
  64. search_fields = ("customer__name", "site__name")
  65. @admin.register(models.PickupItem)
  66. class PickupItemAdmin(OrgScopedAdmin):
  67. list_display = ("pickup", "material", "estimated_qty", "unit")
  68. search_fields = ("pickup__id", "material__name")
  69. @admin.register(models.WeighTicket)
  70. class WeighTicketAdmin(OrgScopedAdmin):
  71. list_display = ("id", "pickup", "ticket_number", "net_weight", "unit", "recorded_at")
  72. search_fields = ("ticket_number", "pickup__id")
  73. @admin.register(models.WeighLine)
  74. class WeighLineAdmin(OrgScopedAdmin):
  75. list_display = ("ticket", "material", "quantity", "unit")
  76. search_fields = ("ticket__id", "material__name")
  77. """Billing models are registered in billing.admin."""
  78. @admin.register(models.Document)
  79. class DocumentAdmin(OrgScopedAdmin):
  80. list_display = ("organization", "kind", "content_type", "object_id", "uploaded_by", "created_at")
  81. search_fields = ("kind",)
  82. @admin.register(models.AuditLog)
  83. class AuditLogAdmin(OrgScopedAdmin):
  84. list_display = ("created_at", "organization", "user", "action", "content_type", "object_id")
  85. search_fields = ("action", "user__username")
  86. list_filter = ("action",)
  87. @admin.register(models.ScrapListing)
  88. class ScrapListingAdmin(OrgScopedAdmin):
  89. list_display = ("id", "organization", "title", "status", "starts_at", "ends_at", "is_public")
  90. list_filter = ("status", "is_public")
  91. search_fields = ("title",)
  92. @admin.register(models.ScrapListingItem)
  93. class ScrapListingItemAdmin(OrgScopedAdmin):
  94. list_display = ("listing", "material", "quantity_estimate", "unit")
  95. search_fields = ("listing__id", "material__name")
  96. @admin.register(models.ScrapBid)
  97. class ScrapBidAdmin(OrgScopedAdmin):
  98. list_display = ("listing", "bidder_org", "price_total", "status", "created_at")
  99. list_filter = ("status",)
  100. search_fields = ("listing__id", "bidder_org__code")
  101. @admin.register(models.ScrapAward)
  102. class ScrapAwardAdmin(OrgScopedAdmin):
  103. list_display = ("listing", "winning_bid", "pickup")
  104. search_fields = ("listing__id",)
  105. @admin.register(models.ScrapListingInvite)
  106. class ScrapListingInviteAdmin(OrgScopedAdmin):
  107. list_display = ("listing", "invited_org", "invited_user", "created_at")
  108. search_fields = ("listing__id", "invited_org__code", "invited_user__username")
  109. @admin.register(models.ProvidedService)
  110. class ProvidedServiceAdmin(OrgScopedAdmin):
  111. list_display = ("title", "organization", "is_enabled", "display_order", "created_at")
  112. list_filter = ("organization", "is_enabled")
  113. search_fields = ("title", "description")
  114. ordering = ("organization", "display_order", "id")