From 9f8c21e7154886507340b9a2c9d29397c106cfb4 Mon Sep 17 00:00:00 2001 From: Mahmood Choopani Date: Tue, 14 Feb 2023 22:57:29 +0330 Subject: [PATCH 1/4] add heading filtering by relation --- django_dyn_dt/views.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/django_dyn_dt/views.py b/django_dyn_dt/views.py index 8f1e63e..6ae83f0 100644 --- a/django_dyn_dt/views.py +++ b/django_dyn_dt/views.py @@ -3,6 +3,7 @@ from django.core.exceptions import ValidationError from django.db.models import Q +from django.db.models.fields.related import RelatedField from django.http import HttpResponse from django.shortcuts import render @@ -22,9 +23,9 @@ DYNAMIC_DATATB = {} try: - DYNAMIC_DATATB = getattr(settings, 'DYNAMIC_DATATB') -except: - pass + DYNAMIC_DATATB = getattr(settings, 'DYNAMIC_DATATB') +except: + pass # TODO: 404 for wrong page number def data_table_view(request, **kwargs): @@ -32,8 +33,7 @@ def data_table_view(request, **kwargs): model_class = Utils.get_class(DYNAMIC_DATATB, kwargs.get('model_name')) except KeyError: return render(request, '404.html', status=404) - headings = [field.name for field in model_class._meta.get_fields()] - + headings = _get_headings(model_class) page_number = int(request.GET.get('page', 1)) search_key = request.GET.get('search', '') entries = int(request.GET.get('entries', 10)) @@ -149,8 +149,7 @@ def export(request, **kwargs): export_type = request_body.get('type', 'csv') filter_options = Q() - headings = filter(lambda field: field.name not in hidden, - [field for field in model_class._meta.get_fields()]) + headings = filter(lambda field: field.name not in hidden, _get_headings(model_class)) headings = list(headings) for field in headings: field_name = field.name @@ -230,3 +229,17 @@ def get_random_string(length): # choose from all lowercase letter letters = string.ascii_lowercase return ''.join(random.choice(letters) for i in range(length)) + + +def _get_headings(model_class, filter_relations=True): + headings = [] + for field in model_class._meta.get_fields(): + is_many_to_many_field = field.__dict__.get('many_to_many', False) + is_many_to_one_field = field.__dict__.get('many_to_one', False) + is_one_to_many_field = field.__dict__.get('one_to_many', False) + is_one_to_one_field = field.__dict__.get('one_to_one', False) + if filter_relations and ( + is_many_to_many_field or is_many_to_one_field or is_one_to_many_field or is_one_to_one_field): + continue + headings.append(field.name) + return headings From 11bf80c1e32fb5e2c8edd15b6ef911489c9aa7cf Mon Sep 17 00:00:00 2001 From: Mahmood Choopani Date: Tue, 14 Feb 2023 23:01:59 +0330 Subject: [PATCH 2/4] remove () of columns because of changing columns to property in library --- django_dyn_dt/templates/static/src/controller/index.js | 6 +++--- django_dyn_dt/templates/static/src/index.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/django_dyn_dt/templates/static/src/controller/index.js b/django_dyn_dt/templates/static/src/controller/index.js index f49817f..5539e0a 100644 --- a/django_dyn_dt/templates/static/src/controller/index.js +++ b/django_dyn_dt/templates/static/src/controller/index.js @@ -155,11 +155,11 @@ export const columnsManage = (dataTable) => { const id = myData.headings.indexOf(e.target.closest('input').id) if (e.target.closest('input').checked) { - dataTable.columns().hide([parseInt(id)]) + dataTable.columns.hide([parseInt(id)]) const hideColumns = JSON.parse(localStorage.getItem('hideColumns')) || [] localStorage.setItem('hideColumns' , JSON.stringify([...hideColumns , e.target.closest('input').id])) } else { - dataTable.columns().show([parseInt(id)]) + dataTable.columns.show([parseInt(id)]) const hideColumns = JSON.parse(localStorage.getItem('hideColumns')) || [] localStorage.setItem('hideColumns' , JSON.stringify(hideColumns.filter(d => d !== e.target.closest('input').id))) } @@ -212,7 +212,7 @@ export const exportData = (dataTable, type) => { const searchParam = new URLSearchParams(window.location.search).get('search') || '' - const hiddenColumns = myData.headings.filter((d,i) => !dataTable.columns().visible(i)) + const hiddenColumns = myData.headings.filter((d,i) => !dataTable.columns.visible(i)) fetch (`/datatb/${modelName}/export/`, {method: 'POST',body: JSON.stringify({ diff --git a/django_dyn_dt/templates/static/src/index.js b/django_dyn_dt/templates/static/src/index.js index 3ca4b07..02aba7d 100644 --- a/django_dyn_dt/templates/static/src/index.js +++ b/django_dyn_dt/templates/static/src/index.js @@ -39,7 +39,7 @@ myData.data.forEach((d,i) => { newColumn.push(editBtn + "   " + removeBtn) }) // add buttons -dataTable.columns().add({ +dataTable.columns.add({ heading: '', data: newColumn }) @@ -66,7 +66,7 @@ window.onload = () => { const hideColumns = JSON.parse(localStorage.getItem('hideColumns')) hideColumns.forEach(d => { - dataTable.columns().hide([myData.headings.indexOf(d)]) + dataTable.columns.hide([myData.headings.indexOf(d)]) }) const els = document.getElementsByClassName('form-check-input') From 3db0cb4f58b81ffbbb9b985f605b063520091762 Mon Sep 17 00:00:00 2001 From: Mahmood Choopani Date: Tue, 14 Feb 2023 23:27:53 +0330 Subject: [PATCH 3/4] use variable for __dict__ --- django_dyn_dt/views.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/django_dyn_dt/views.py b/django_dyn_dt/views.py index 6ae83f0..80918c7 100644 --- a/django_dyn_dt/views.py +++ b/django_dyn_dt/views.py @@ -234,10 +234,11 @@ def get_random_string(length): def _get_headings(model_class, filter_relations=True): headings = [] for field in model_class._meta.get_fields(): - is_many_to_many_field = field.__dict__.get('many_to_many', False) - is_many_to_one_field = field.__dict__.get('many_to_one', False) - is_one_to_many_field = field.__dict__.get('one_to_many', False) - is_one_to_one_field = field.__dict__.get('one_to_one', False) + field_dict = field.__dict__ + is_many_to_many_field = field_dict.get('many_to_many', False) + is_many_to_one_field = field_dict.get('many_to_one', False) + is_one_to_many_field = field_dict.get('one_to_many', False) + is_one_to_one_field = field_dict.get('one_to_one', False) if filter_relations and ( is_many_to_many_field or is_many_to_one_field or is_one_to_many_field or is_one_to_one_field): continue From 7d24f7e1bbc57c0644dc1368abc1113fda22bbd3 Mon Sep 17 00:00:00 2001 From: Mahmood Choopani Date: Tue, 14 Feb 2023 23:50:03 +0330 Subject: [PATCH 4/4] cleaner function to check is relation field --- django_dyn_dt/templates/index.html | 2 +- .../templates/static/src/controller/index.js | 4 ++-- django_dyn_dt/templates/static/src/index.js | 4 ++-- django_dyn_dt/views.py | 15 ++++++++------- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/django_dyn_dt/templates/index.html b/django_dyn_dt/templates/index.html index 5590f2f..baf25e2 100644 --- a/django_dyn_dt/templates/index.html +++ b/django_dyn_dt/templates/index.html @@ -7,7 +7,7 @@ - + diff --git a/django_dyn_dt/templates/static/src/controller/index.js b/django_dyn_dt/templates/static/src/controller/index.js index 5539e0a..e1cf867 100644 --- a/django_dyn_dt/templates/static/src/controller/index.js +++ b/django_dyn_dt/templates/static/src/controller/index.js @@ -155,11 +155,11 @@ export const columnsManage = (dataTable) => { const id = myData.headings.indexOf(e.target.closest('input').id) if (e.target.closest('input').checked) { - dataTable.columns.hide([parseInt(id)]) + dataTable.columns().hide([parseInt(id)]) const hideColumns = JSON.parse(localStorage.getItem('hideColumns')) || [] localStorage.setItem('hideColumns' , JSON.stringify([...hideColumns , e.target.closest('input').id])) } else { - dataTable.columns.show([parseInt(id)]) + dataTable.columns().show([parseInt(id)]) const hideColumns = JSON.parse(localStorage.getItem('hideColumns')) || [] localStorage.setItem('hideColumns' , JSON.stringify(hideColumns.filter(d => d !== e.target.closest('input').id))) } diff --git a/django_dyn_dt/templates/static/src/index.js b/django_dyn_dt/templates/static/src/index.js index 02aba7d..3ca4b07 100644 --- a/django_dyn_dt/templates/static/src/index.js +++ b/django_dyn_dt/templates/static/src/index.js @@ -39,7 +39,7 @@ myData.data.forEach((d,i) => { newColumn.push(editBtn + "   " + removeBtn) }) // add buttons -dataTable.columns.add({ +dataTable.columns().add({ heading: '', data: newColumn }) @@ -66,7 +66,7 @@ window.onload = () => { const hideColumns = JSON.parse(localStorage.getItem('hideColumns')) hideColumns.forEach(d => { - dataTable.columns.hide([myData.headings.indexOf(d)]) + dataTable.columns().hide([myData.headings.indexOf(d)]) }) const els = document.getElementsByClassName('form-check-input') diff --git a/django_dyn_dt/views.py b/django_dyn_dt/views.py index 80918c7..9212d8f 100644 --- a/django_dyn_dt/views.py +++ b/django_dyn_dt/views.py @@ -234,13 +234,14 @@ def get_random_string(length): def _get_headings(model_class, filter_relations=True): headings = [] for field in model_class._meta.get_fields(): - field_dict = field.__dict__ - is_many_to_many_field = field_dict.get('many_to_many', False) - is_many_to_one_field = field_dict.get('many_to_one', False) - is_one_to_many_field = field_dict.get('one_to_many', False) - is_one_to_one_field = field_dict.get('one_to_one', False) - if filter_relations and ( - is_many_to_many_field or is_many_to_one_field or is_one_to_many_field or is_one_to_one_field): + if filter_relations and _is_relation_field(field): continue headings.append(field.name) return headings + +def _is_relation_field(field): + is_many_to_many_field = field.many_to_many is not None + is_many_to_one_field = field.many_to_one is not None + is_one_to_many_field = field.one_to_many is not None + is_one_to_one_field = field.one_to_one is not None + return is_many_to_many_field or is_many_to_one_field or is_one_to_many_field or is_one_to_one_field \ No newline at end of file