Parcourir la source

Present only object from same document in admin FKs

Jocelyn Delande il y a 9 ans
Parent
commit
521d1fb601
1 fichiers modifiés avec 21 ajouts et 3 suppressions
  1. 21 3
      costs/admin.py

+ 21 - 3
costs/admin.py

@@ -21,17 +21,29 @@ class DocumentAdmin(admin.ModelAdmin):
                         new, edit_url)))
     copy.short_description = 'Copier'
 
-class GoodUseInline(admin.TabularInline):
+
+class AbstractUseInline(admin.TabularInline):
+    """ An inline with some knowledge of the currently edited Document
+    """
+    def formfield_for_foreignkey(self, db_field, request, **kwargs):
+        if db_field.name == "resource" and getattr(request, 'document', None):
+            kwargs["queryset"] = db_field.related_model.objects.filter(
+                document=request.document)
+            return super().formfield_for_foreignkey(
+                db_field, request, **kwargs)
+
+
+class GoodUseInline(AbstractUseInline):
     model = GoodUse
     extra = 1
 
 
-class CostUseInline(admin.TabularInline):
+class CostUseInline(AbstractUseInline):
     model = CostUse
     extra = 1
 
 
-class ServiceUseInline(admin.TabularInline):
+class ServiceUseInline(AbstractUseInline):
     model = ServiceUse
     extra = 1
     fk_name = 'service'
@@ -77,6 +89,12 @@ class ServiceAdmin(admin.ModelAdmin):
     inlines = (CostUseInline, GoodUseInline, ServiceUseInline)
     list_filter = [DirectDocumentFilter]
 
+    def get_form(self, request, obj=None, **kwargs):
+        if obj:
+            # anotate the request with some context
+            request.document = obj.document
+        return super().get_form(request, obj, **kwargs)
+
     def monthly_unit_cost(self, obj):
         return '{:.2f}€'.format(obj.get_prices()['unit_recurring_price'])