From 0daba7c163df8a700d3fa33cfbc1c9f8a479221b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladimir=20Bezugl=C3=B5i?= Date: Wed, 24 Oct 2018 22:39:51 +0300 Subject: [PATCH 1/7] Fix django 2.0 compatibility --- .gitignore | 1 + genericadmin/admin.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5301ecd..407c264 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ MANIFEST *egg* *.bak *.tmproj +.idea \ No newline at end of file diff --git a/genericadmin/admin.py b/genericadmin/admin.py index 40aff4c..450d1d2 100755 --- a/genericadmin/admin.py +++ b/genericadmin/admin.py @@ -23,6 +23,7 @@ except ImportError: from django.contrib.admin.options import IS_POPUP_VAR from django.core.exceptions import ObjectDoesNotExist +from django.views.generic import RedirectView JS_PATH = getattr(settings, 'GENERICADMIN_JS', 'genericadmin/js/') @@ -63,7 +64,12 @@ def get_generic_field_list(self, request, prefix=''): fields['prefix'] = prefix field_list.append(fields) else: - for field in self.model._meta.virtual_fields: + # virtual_fields were deprecated in django 2.0 + try: + fields = self.model._meta.virtual_fields + except AttributeError: + fields = self.model._meta.private_fields + for field in fields: if isinstance(field, GenericForeignKey) and \ field.ct_field not in exclude and field.fk_field not in exclude: field_list.append({ @@ -90,6 +96,10 @@ def wrapper(*args, **kwargs): custom_urls = [ url(r'^obj-data/$', wrap(self.generic_lookup), name='admin_genericadmin_obj_lookup'), url(r'^genericadmin-init/$', wrap(self.genericadmin_js_init), name='admin_genericadmin_init'), + + # to work with django 2.0 + url(r'../genericadmin-init/change/$', + wrap(RedirectView.as_view(pattern_name='%s:admin_genericadmin_init' % self.admin_site.name))), ] return custom_urls + super(BaseGenericModelAdmin, self).get_urls() From 98846bdda8c22d61cd1558984ec2d9883751ec53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladimir=20Bezugl=C3=B5i?= Date: Wed, 24 Oct 2018 22:49:33 +0300 Subject: [PATCH 2/7] Fix django 2.0 compatibility --- genericadmin/admin.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/genericadmin/admin.py b/genericadmin/admin.py index 450d1d2..c92239d 100755 --- a/genericadmin/admin.py +++ b/genericadmin/admin.py @@ -80,10 +80,16 @@ def get_generic_field_list(self, request, prefix=''): }) if hasattr(self, 'inlines') and len(self.inlines) > 0: - for FormSet, inline in zip(self.get_formsets_with_inlines(request), self.get_inline_instances(request)): - if hasattr(inline, 'get_generic_field_list'): - prefix = FormSet.get_default_prefix() - field_list = field_list + inline.get_generic_field_list(request, prefix) + try: + for FormSet, inline in zip(self.get_formsets_with_inlines(request), self.get_inline_instances(request)): + if hasattr(inline, 'get_generic_field_list'): + prefix = FormSet.get_default_prefix() + field_list = field_list + inline.get_generic_field_list(request, prefix) + except AttributeError: + for FormSet, inline in self.get_formsets_with_inlines(request): + if hasattr(inline, 'get_generic_field_list'): + prefix = FormSet.get_default_prefix() + field_list = field_list + inline.get_generic_field_list(request, prefix) return field_list From 0843b79c2cb436d32d86e8caa923520405c020ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladimir=20Bezugl=C3=B5i?= Date: Wed, 24 Oct 2018 22:50:37 +0300 Subject: [PATCH 3/7] bump version 0.7.0 -> 0.7.1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index faf0c0f..e4395a3 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ def convert_readme(): setup( name='django-genericadmin', - version='0.7.0', + version='0.7.1', description="Adds support for generic relations within Django's admin interface.", author='Weston Nielson, Jan Schrewe, Arthur Hanson', author_email='wnielson@gmail.com, jschrewe@googlemail.com, worldnomad@gmail.com', From e7f11ed85b9814c01e5315d0867229610fd62a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladimir=20Bezugl=C3=B5i?= Date: Wed, 24 Oct 2018 23:06:45 +0300 Subject: [PATCH 4/7] Fix django 2.0 compatibility --- genericadmin/admin.py | 4 ++-- genericadmin/static/genericadmin/js/genericadmin.js | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/genericadmin/admin.py b/genericadmin/admin.py index c92239d..afa9aa9 100755 --- a/genericadmin/admin.py +++ b/genericadmin/admin.py @@ -104,8 +104,8 @@ def wrapper(*args, **kwargs): url(r'^genericadmin-init/$', wrap(self.genericadmin_js_init), name='admin_genericadmin_init'), # to work with django 2.0 - url(r'../genericadmin-init/change/$', - wrap(RedirectView.as_view(pattern_name='%s:admin_genericadmin_init' % self.admin_site.name))), + url(r'^../obj-data/$', wrap(self.generic_lookup), name='admin_genericadmin_obj_lookup_change'), + url(r'^../genericadmin-init/change/$', wrap(self.genericadmin_js_init), name='admin_genericadmin_init'), ] return custom_urls + super(BaseGenericModelAdmin, self).get_urls() diff --git a/genericadmin/static/genericadmin/js/genericadmin.js b/genericadmin/static/genericadmin/js/genericadmin.js index 529dbb9..072251a 100755 --- a/genericadmin/static/genericadmin/js/genericadmin.js +++ b/genericadmin/static/genericadmin/js/genericadmin.js @@ -73,7 +73,13 @@ }, getLookupUrl: function(cID) { - return '../../../' + this.url_array[cID][0] + '/' + this.getLookupUrlParams(cID); + var forword = '../../../'; + var suffix = '/change/'; + var href = window.location.href; + if (href.indexOf(suffix, href.length - suffix.length) !== -1) { + forword += '../'; + } + return forword + this.url_array[cID][0] + '/' + this.getLookupUrlParams(cID); }, getFkId: function() { From 3e7e5c81be21fac6e90789a10e4abd2c26b63326 Mon Sep 17 00:00:00 2001 From: zaquest Date: Thu, 17 Oct 2019 15:53:45 +0700 Subject: [PATCH 5/7] Fix JS for newer django --- .../static/genericadmin/js/genericadmin.js | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/genericadmin/static/genericadmin/js/genericadmin.js b/genericadmin/static/genericadmin/js/genericadmin.js index 529dbb9..5ea7071 100755 --- a/genericadmin/static/genericadmin/js/genericadmin.js +++ b/genericadmin/static/genericadmin/js/genericadmin.js @@ -12,10 +12,10 @@ var GenericAdmin = { url_array: null, fields: null, - obj_url: "../obj-data/", + obj_url: "../../obj-data/", admin_media_url: window.__admin_media_prefix__, popup: '_popup', - + prepareSelect: function(select) { var that = this, opt_keys = [], @@ -30,7 +30,7 @@ if (this.value) { if (that.url_array[this.value]) { key = that.url_array[this.value][0].split('/')[0]; - + opt = $(this).clone(); opt.text(that.capFirst(opt.text())); if ($.inArray(key, opt_keys) < 0) { @@ -47,7 +47,7 @@ } }); select.empty().append(no_value); - + opt_keys = opt_keys.sort(); $.each(opt_keys, function(index, key) { @@ -62,7 +62,7 @@ }, getLookupUrlParams: function(cID) { - var q = this.url_array[cID][1] || {}, + var q = this.url_array[cID][1] || {}, str = []; for(var p in q) { str.push(encodeURIComponent(p) + "=" + encodeURIComponent(q[p])); @@ -71,11 +71,11 @@ url = x ? ("?" + x) : ""; return url; }, - + getLookupUrl: function(cID) { - return '../../../' + this.url_array[cID][0] + '/' + this.getLookupUrlParams(cID); + return '../../../../' + this.url_array[cID][0] + '/' + this.getLookupUrlParams(cID); }, - + getFkId: function() { if (this.fields.inline === false) { return 'id_' + this.fields.fk_field; @@ -83,7 +83,7 @@ return ['id_', this.fields.prefix, '-', this.fields.number, '-', this.fields.fk_field].join(''); } }, - + getCtId: function() { if (this.fields.inline === false) { return 'id_' + this.fields.ct_field; @@ -91,24 +91,24 @@ return ['id_', this.fields.prefix, '-', this.fields.number, '-', this.fields.ct_field].join(''); } }, - + capFirst: function(string) { return string.charAt(0).toUpperCase() + string.slice(1); }, - + hideLookupLink: function() { var this_id = this.getFkId(); $('#lookup_' + this_id).unbind().remove(); $('#lookup_text_' + this_id + ' a').remove(); $('#lookup_text_' + this_id + ' span').remove(); }, - + showLookupLink: function() { var that = this, url = this.getLookupUrl(this.cID), id = 'lookup_' + this.getFkId(), link = ' '; - + link = link + ''; // insert link html after input element @@ -116,7 +116,7 @@ return id; }, - + pollInputChange: function(window) { var that = this, interval_id = setInterval(function() { @@ -128,11 +128,11 @@ }, 150); }, - + popRelatedObjectLookup: function(link) { var name = id_to_windowname(this.getFkId()), url_parts = [], - href, + href, win; if (link.href.search(/\?/) >= 0) { @@ -156,14 +156,14 @@ win.focus(); return false; }, - + updateObjectData: function() { var that = this; return function() { var value = that.object_input.val(); - - if (!value) { - return + + if (!value) { + return } //var this_id = that.getFkId(); $('#lookup_text_' + that.getFkId() + ' span').text('loading...'); @@ -208,10 +208,10 @@ this.url_array = url_array; this.fields = fields; this.popup = popup_var || this.popup; - + // store the base element this.object_input = $("#" + this.getFkId()); - + // find the select we need to change this.object_select = this.prepareSelect($("#" + this.getCtId())); @@ -245,22 +245,22 @@ this.updateObjectData()(); } }; - + var InlineAdmin = { sub_admins: null, url_array: null, fields: null, popup: '_popup', - + install: function(fields, url_array, popup_var) { var inline_count = $('#id_' + fields.prefix + '-TOTAL_FORMS').val(), admin; - + this.url_array = url_array; this.fields = fields; this.sub_admins = []; this.popup = popup_var || this.popup; - + for (var j = 0; j < inline_count; j++) { f = $.extend({}, this.fields); f.number = j; @@ -279,7 +279,7 @@ added_fields.number = ($('#id_' + that.fields.prefix + '-TOTAL_FORMS').val() - 1); admin.install(added_fields, that.url_array, that.popup); that.sub_admins.push(admin); - + $('#' + that.fields.prefix + '-' + added_fields.number + ' .inline-deletelink').click( that.removeHandler(that) ); @@ -290,7 +290,7 @@ var parent_id, deleted_num, sub_admin; - + e.preventDefault(); parent_id = $(e.currentTarget).parents('.dynamic-' + that.fields.prefix).first().attr('id'); deleted_num = parseInt(parent_id.charAt(parent_id.length - 1), 10); @@ -308,14 +308,14 @@ $(document).ready(function() { $.ajax({ - url: '../genericadmin-init/', + url: '../../genericadmin-init/', dataType: 'json', success: function(data) { var url_array = data.url_array, ct_fields = data.fields, popup_var = data.popup_var, fields; - + for (var i = 0; i < ct_fields.length; i++) { fields = ct_fields[i]; if (fields.inline === false) { @@ -327,4 +327,4 @@ } }); }); -} (django.jQuery)); +} (django.jQuery || jQuery)); From 289164be9f9cac432f5937c5c7b47380f9c86c76 Mon Sep 17 00:00:00 2001 From: codegraft Date: Wed, 29 Apr 2020 22:19:14 +0200 Subject: [PATCH 6/7] Fix for django 2.2 --- genericadmin/admin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/genericadmin/admin.py b/genericadmin/admin.py index afa9aa9..4a86706 100755 --- a/genericadmin/admin.py +++ b/genericadmin/admin.py @@ -41,6 +41,7 @@ def __init__(self, model, admin_site): media = list(self.Media.js) except: media = [] + media.append('jquery.init.js') media.append(JS_PATH + 'genericadmin.js') self.Media.js = tuple(media) From 3d0c7986d1265ec66c4e69476170fa9d138dc927 Mon Sep 17 00:00:00 2001 From: codegraft Date: Wed, 29 Apr 2020 22:30:06 +0200 Subject: [PATCH 7/7] fix path for jquery.init.js --- genericadmin/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/genericadmin/admin.py b/genericadmin/admin.py index 4a86706..9d47d4a 100755 --- a/genericadmin/admin.py +++ b/genericadmin/admin.py @@ -41,7 +41,7 @@ def __init__(self, model, admin_site): media = list(self.Media.js) except: media = [] - media.append('jquery.init.js') + media.append('admin/js/jquery.init.js') media.append(JS_PATH + 'genericadmin.js') self.Media.js = tuple(media)