refactor: optimize admin queries and add dependent dropdown logic for contract posts in operation templates
This commit is contained in:
parent
0d35e71cfc
commit
28f8204f5a
1 changed files with 75 additions and 15 deletions
|
|
@ -713,25 +713,21 @@ class OperationTemplateAdminForm(forms.ModelForm):
|
||||||
ct = ContentType.objects.get_for_model(model)
|
ct = ContentType.objects.get_for_model(model)
|
||||||
|
|
||||||
# Filter instances by categories first (most specific), then by thematic
|
# Filter instances by categories first (most specific), then by thematic
|
||||||
|
qs = model.objects.select_related('category')
|
||||||
if category_ids:
|
if category_ids:
|
||||||
instances = model.objects.filter(
|
instances = qs.filter(category_id__in=category_ids).order_by('code')
|
||||||
category_id__in=category_ids
|
|
||||||
).order_by('code')
|
|
||||||
elif thematic_id:
|
elif thematic_id:
|
||||||
instances = model.objects.filter(
|
instances = qs.filter(category__thematic_id=thematic_id).order_by('code')
|
||||||
category__thematic_id=thematic_id
|
|
||||||
).order_by('code')
|
|
||||||
else:
|
else:
|
||||||
instances = model.objects.all().order_by('code')
|
instances = qs.all().order_by('code')
|
||||||
|
|
||||||
if instances.exists():
|
for instance in instances:
|
||||||
for instance in instances:
|
# Value format: "content_type_id:object_id"
|
||||||
# Value format: "content_type_id:object_id"
|
value = f"{ct.id}:{instance.pk}"
|
||||||
value = f"{ct.id}:{instance.pk}"
|
# Display with category info
|
||||||
# Display with category info
|
category_name = instance.category.get_name() if instance.category else ''
|
||||||
category_name = instance.category.get_name() if instance.category else ''
|
display = f"{instance} ({category_name})" if category_name else str(instance)
|
||||||
display = f"{instance} ({category_name})" if category_name else str(instance)
|
choices.append((value, display))
|
||||||
choices.append((value, display))
|
|
||||||
except (TypeError, Exception):
|
except (TypeError, Exception):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
@ -778,8 +774,33 @@ class OperationTemplateAdminForm(forms.ModelForm):
|
||||||
js = ('interventions/admin_operation_template_dynamic.js',)
|
js = ('interventions/admin_operation_template_dynamic.js',)
|
||||||
|
|
||||||
|
|
||||||
|
class ContractOperationTemplatePostInlineForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = ContractOperationTemplatePost
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
from contracts.models import ContractPost
|
||||||
|
contract_id = None
|
||||||
|
if self.instance and self.instance.pk and self.instance.contract_id:
|
||||||
|
contract_id = self.instance.contract_id
|
||||||
|
elif self.data:
|
||||||
|
prefix = self.prefix
|
||||||
|
contract_key = f"{prefix}-contract" if prefix else "contract"
|
||||||
|
contract_id = self.data.get(contract_key)
|
||||||
|
|
||||||
|
if contract_id:
|
||||||
|
self.fields['contract_post'].queryset = ContractPost.objects.filter(
|
||||||
|
contract_id=contract_id
|
||||||
|
).order_by('order_number')
|
||||||
|
else:
|
||||||
|
self.fields['contract_post'].queryset = ContractPost.objects.none()
|
||||||
|
|
||||||
|
|
||||||
class OperationTemplateContractPostInline(admin.TabularInline):
|
class OperationTemplateContractPostInline(admin.TabularInline):
|
||||||
model = ContractOperationTemplatePost
|
model = ContractOperationTemplatePost
|
||||||
|
form = ContractOperationTemplatePostInlineForm
|
||||||
extra = 0
|
extra = 0
|
||||||
fields = ('contract', 'contract_post', 'default_quantity', 'comment')
|
fields = ('contract', 'contract_post', 'default_quantity', 'comment')
|
||||||
verbose_name = "Poste de contrat par défaut"
|
verbose_name = "Poste de contrat par défaut"
|
||||||
|
|
@ -794,6 +815,10 @@ class OperationTemplateContractPostInline(admin.TabularInline):
|
||||||
kwargs["queryset"] = Contract.objects.filter(
|
kwargs["queryset"] = Contract.objects.filter(
|
||||||
thematics=template.thematic
|
thematics=template.thematic
|
||||||
).distinct().select_related('company').order_by('contract_number')
|
).distinct().select_related('company').order_by('contract_number')
|
||||||
|
else:
|
||||||
|
kwargs["queryset"] = Contract.objects.all().select_related('company').order_by('contract_number')
|
||||||
|
else:
|
||||||
|
kwargs["queryset"] = Contract.objects.all().select_related('company').order_by('contract_number')
|
||||||
return super().formfield_for_foreignkey(db_field, request, **kwargs)
|
return super().formfield_for_foreignkey(db_field, request, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -818,6 +843,13 @@ class OperationTemplateAdmin(admin.ModelAdmin):
|
||||||
'description': 'Sélectionnez les modèles d\'équipements spécifiques. Si vide, tous les modèles des catégories sélectionnées seront concernés.',
|
'description': 'Sélectionnez les modèles d\'équipements spécifiques. Si vide, tous les modèles des catégories sélectionnées seront concernés.',
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_queryset(self, request):
|
||||||
|
return super().get_queryset(request).select_related(
|
||||||
|
'thematic', 'team', 'team__company'
|
||||||
|
).prefetch_related(
|
||||||
|
'categories', 'asset_model_filters'
|
||||||
|
)
|
||||||
|
|
||||||
@admin.display(description='Catégories')
|
@admin.display(description='Catégories')
|
||||||
def categories_list(self, obj):
|
def categories_list(self, obj):
|
||||||
|
|
@ -834,8 +866,31 @@ class OperationTemplateAdmin(admin.ModelAdmin):
|
||||||
return ', '.join(str(f) for f in filters) + ('...' if obj.asset_model_filters.count() > 3 else '')
|
return ', '.join(str(f) for f in filters) + ('...' if obj.asset_model_filters.count() > 3 else '')
|
||||||
|
|
||||||
|
|
||||||
|
class ContractOperationTemplatePostAdminForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = ContractOperationTemplatePost
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
from contracts.models import ContractPost
|
||||||
|
contract_id = None
|
||||||
|
if self.instance and self.instance.pk and self.instance.contract_id:
|
||||||
|
contract_id = self.instance.contract_id
|
||||||
|
elif self.data and 'contract' in self.data:
|
||||||
|
contract_id = self.data.get('contract')
|
||||||
|
|
||||||
|
if contract_id:
|
||||||
|
self.fields['contract_post'].queryset = ContractPost.objects.filter(
|
||||||
|
contract_id=contract_id
|
||||||
|
).order_by('order_number')
|
||||||
|
else:
|
||||||
|
self.fields['contract_post'].queryset = ContractPost.objects.none()
|
||||||
|
|
||||||
|
|
||||||
@admin.register(ContractOperationTemplatePost)
|
@admin.register(ContractOperationTemplatePost)
|
||||||
class ContractOperationTemplatePostAdmin(admin.ModelAdmin):
|
class ContractOperationTemplatePostAdmin(admin.ModelAdmin):
|
||||||
|
form = ContractOperationTemplatePostAdminForm
|
||||||
list_display = ('contract', 'operation_template', 'contract_post', 'default_quantity', 'comment')
|
list_display = ('contract', 'operation_template', 'contract_post', 'default_quantity', 'comment')
|
||||||
list_filter = ('contract', 'operation_template', 'contract__thematics')
|
list_filter = ('contract', 'operation_template', 'contract__thematics')
|
||||||
search_fields = (
|
search_fields = (
|
||||||
|
|
@ -850,6 +905,11 @@ class ContractOperationTemplatePostAdmin(admin.ModelAdmin):
|
||||||
class Media:
|
class Media:
|
||||||
js = ('interventions/admin_operation_template_dynamic.js',)
|
js = ('interventions/admin_operation_template_dynamic.js',)
|
||||||
|
|
||||||
|
def get_queryset(self, request):
|
||||||
|
return super().get_queryset(request).select_related(
|
||||||
|
'contract', 'contract__company', 'operation_template', 'contract_post'
|
||||||
|
)
|
||||||
|
|
||||||
def formfield_for_foreignkey(self, db_field, request, **kwargs):
|
def formfield_for_foreignkey(self, db_field, request, **kwargs):
|
||||||
if db_field.name == "contract_post":
|
if db_field.name == "contract_post":
|
||||||
obj_id = request.resolver_match.kwargs.get('object_id') if request.resolver_match else None
|
obj_id = request.resolver_match.kwargs.get('object_id') if request.resolver_match else None
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue