From 579236986e74fe0dab33132b44a2eb1ebe9e9cfe Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Wed, 20 Nov 2019 14:53:24 +0100 Subject: [PATCH] Fixed update bug in CorpContact admin selects The problem is that Django RelatedObjectLookups.js is triggering select changes for the initial value and we don't want to change the contact list for this initial change (unless we lose the currently selected value). --- stages/admin.py | 4 ++-- stages/static/js/avail_form.js | 4 +++- stages/views/__init__.py | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/stages/admin.py b/stages/admin.py index e7b6ebb..dc06d43 100644 --- a/stages/admin.py +++ b/stages/admin.py @@ -360,7 +360,7 @@ class PeriodAdmin(admin.ModelAdmin): class AvailabilityAdmin(admin.ModelAdmin): - list_display = ('corporation', 'period', 'domain') + list_display = ('corporation', 'period', 'domain', 'contact') list_filter = ('period',) fields = (('corporation', 'period'), 'domain', 'contact', 'priority', 'comment') form = AvailabilityAdminForm @@ -370,7 +370,7 @@ class AvailabilityAdmin(admin.ModelAdmin): kwargs["queryset"] = Corporation.objects.filter(archived=False).order_by('name') if db_field.name == "contact": kwargs["queryset"] = CorpContact.objects.filter(archived=False) - return super(AvailabilityAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) + return super().formfield_for_foreignkey(db_field, request, **kwargs) class TrainingAdmin(admin.ModelAdmin): diff --git a/stages/static/js/avail_form.js b/stages/static/js/avail_form.js index 42e6f81..31c9e00 100644 --- a/stages/static/js/avail_form.js +++ b/stages/static/js/avail_form.js @@ -2,11 +2,13 @@ django.jQuery(document).ready(function() { django.jQuery('#id_corporation, .field-corporation select').change(function(ev) { // Fill contact select // Either in availability admin, or in stages admin with availability inlines + if (this.id == 'id_period') return; if (this.id == 'id_corporation') var sel = django.jQuery('#id_contact'); else var sel = django.jQuery(this).closest('fieldset').find('.field-contact select'); - sel.html(''); var id_corp = django.jQuery("option:selected", this).val(); django.jQuery.getJSON('/corporation/' + id_corp + '/contacts/', function(data) { + if (data.length && data[0].corporation_id == id_corp) return + sel.html(''); django.jQuery.each(data, function(key, contact) { var item = contact.first_name + ' ' + contact.last_name; if (contact.role.length) item += ' (' + contact.role + ')'; diff --git a/stages/views/__init__.py b/stages/views/__init__.py index 88ef08d..64280f5 100644 --- a/stages/views/__init__.py +++ b/stages/views/__init__.py @@ -243,7 +243,7 @@ class TrainingsByPeriodView(ListView): class CorpContactJSONView(ListView): """ Return all contacts from a given corporation """ - return_fields = ['id', 'first_name', 'last_name', 'role', 'is_main'] + return_fields = ['id', 'first_name', 'last_name', 'role', 'is_main', 'corporation_id'] def get_queryset(self): return CorpContact.objects.filter(corporation__pk=self.kwargs['pk'], archived=False)