1+ from typing import Dict , Any , List
2+ from typing import Dict , Any , Tuple , List
13from django .forms .models import _get_foreign_key
4+ from django .urls import reverse
25
36from is_core .generic_views .table_views import DjangoTableViewMixin , BaseModelTableViewMixin
47from is_core .generic_views .inlines .base import RelatedInlineView
8+ from is_core .utils import get_export_types_with_content_type
9+ from is_core .rest .datastructures import ModelFlatRestFields
510
611
712class BaseModelInlineTableViewMixin :
813
914 template_name = 'is_core/forms/inline_table.html'
15+ inline_bulk_change = False
16+ inline_export = False
1017
1118 def _get_field_labels (self ):
1219 return (
@@ -26,6 +33,20 @@ def _get_export_fields(self):
2633 else self .export_fields
2734 )
2835
36+ def _get_export_types (self ) -> List | None :
37+ return (
38+ self .related_core .get_export_types (self .request ) if self .related_core and
39+ getattr (self , 'export_types' , None ) is None
40+ else getattr (self , 'export_types' , None )
41+ )
42+
43+ def _get_export_types (self ) -> List | None :
44+ return (
45+ self .related_core .get_export_types (self .request ) if self .related_core and
46+ getattr (self , 'export_types' , None ) is None
47+ else getattr (self , 'export_types' , None )
48+ )
49+
2950 def _get_list_per_page (self ):
3051 list_per_page = self .related_core .get_list_per_page (self .request ) if self .related_core else None
3152 return list_per_page if list_per_page is not None else super ()._get_list_per_page ()
@@ -42,6 +63,57 @@ def get_title(self):
4263 'verbose_name_plural' : self .get_verbose_name_plural ()
4364 } if self .title is None else self .title
4465
66+ def is_bulk_change_enabled (self ) -> bool :
67+ return (
68+ self .inline_bulk_change and
69+ hasattr (self .related_core , 'is_bulk_change_enabled' ) and
70+ self .related_core .is_bulk_change_enabled () and
71+ self .related_core .ui_patterns .get (self .related_core .get_bulk_change_url_name ()).has_permission (
72+ 'get' , self .request
73+ )
74+ )
75+
76+ def get_bulk_change_snippet_name (self ) -> str :
77+ return '-' .join (('default' , self .related_core .menu_group , 'form' ))
78+
79+ def get_bulk_change_form_url (self ) -> str | None :
80+ if not self .is_bulk_change_enabled ():
81+ return None
82+ return reverse (
83+ '' .join (('IS:' , self .related_core .get_bulk_change_url_name (), '-' , self .related_core .menu_group ))
84+ )
85+
86+ def _generate_rest_export_fieldset (self ) -> ModelFlatRestFields :
87+ return ModelFlatRestFields .create_from_flat_list (
88+ list (self ._get_allowed_export_fields ()), self .model
89+ )
90+
91+ def is_export_enabled (self ) -> bool :
92+ """
93+ Returns whether export is enabled for this inline table.
94+ Checks both the inline_export flag and if export types/fields are available.
95+ """
96+ return (
97+ self .inline_export and
98+ self ._get_export_types () and
99+ self ._get_allowed_export_fields ()
100+ )
101+
102+ def get_context_data (self , ** kwargs ) -> Dict [str , Any ]:
103+ context_data = super ().get_context_data (** kwargs )
104+ context_data .update ({
105+ 'inline_bulk_change' : self .is_bulk_change_enabled (),
106+ 'bulk_change_snippet_name' : self .get_bulk_change_snippet_name (),
107+ 'bulk_change_form_url' : self .get_bulk_change_form_url (),
108+ 'inline_export_enabled' : self .is_export_enabled (),
109+ })
110+ if self .is_export_enabled ():
111+ context_data .update ({
112+ 'rest_export_fieldset' : self ._generate_rest_export_fieldset (),
113+ 'export_types' : get_export_types_with_content_type (self ._get_export_types ()),
114+ })
115+ return context_data
116+
45117
46118class BaseModelInlineTableView (BaseModelInlineTableViewMixin , BaseModelTableViewMixin , RelatedInlineView ):
47119 pass
0 commit comments