Skip to content

Commit 58430db

Browse files
refactor: no delete from inline admins (#10113)
* refactor: no delete from TabularInlines * refactor: no delete from StackedInlines
1 parent fb50ac0 commit 58430db

File tree

8 files changed

+40
-18
lines changed

8 files changed

+40
-18
lines changed

ietf/doc/admin.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
ReviewAssignmentDocEvent, IanaExpertDocEvent, IRSGBallotDocEvent, DocExtResource, DocumentActionHolder,
1616
BofreqEditorDocEvent, BofreqResponsibleDocEvent, StoredObject )
1717

18+
from ietf.utils.admin import SaferTabularInline
1819
from ietf.utils.validators import validate_external_resource_value
1920

2021
class StateTypeAdmin(admin.ModelAdmin):
@@ -28,17 +29,19 @@ class StateAdmin(admin.ModelAdmin):
2829
filter_horizontal = ["next_states"]
2930
admin.site.register(State, StateAdmin)
3031

31-
class DocAuthorInline(admin.TabularInline):
32+
class DocAuthorInline(SaferTabularInline):
3233
model = DocumentAuthor
3334
raw_id_fields = ['person', 'email']
3435
extra = 1
36+
can_delete = False
37+
show_change_link = True
3538

36-
class DocActionHolderInline(admin.TabularInline):
39+
class DocActionHolderInline(SaferTabularInline):
3740
model = DocumentActionHolder
3841
raw_id_fields = ['person']
3942
extra = 1
4043

41-
class RelatedDocumentInline(admin.TabularInline):
44+
class RelatedDocumentInline(SaferTabularInline):
4245
model = RelatedDocument
4346
fk_name= 'source'
4447
def this(self, instance):
@@ -48,7 +51,7 @@ def this(self, instance):
4851
raw_id_fields = ['target']
4952
extra = 1
5053

51-
class AdditionalUrlInLine(admin.TabularInline):
54+
class AdditionalUrlInLine(SaferTabularInline):
5255
model = DocumentURL
5356
fields = ['tag','desc','url',]
5457
extra = 1

ietf/group/admin.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@
2626
MilestoneGroupEvent, GroupExtResource, Appeal, AppealArtifact )
2727
from ietf.name.models import GroupTypeName
2828

29-
from ietf.utils.validators import validate_external_resource_value
29+
from ietf.utils.admin import SaferTabularInline
3030
from ietf.utils.response import permission_denied
31+
from ietf.utils.validators import validate_external_resource_value
3132

32-
class RoleInline(admin.TabularInline):
33+
class RoleInline(SaferTabularInline):
3334
model = Role
3435
raw_id_fields = ["person", "email"]
3536

36-
class GroupURLInline(admin.TabularInline):
37+
class GroupURLInline(SaferTabularInline):
3738
model = GroupURL
3839

3940
class GroupForm(forms.ModelForm):

ietf/ipr/admin.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
NonDocSpecificIprDisclosure,
1818
LegacyMigrationIprEvent,
1919
)
20+
from ietf.utils.admin import SaferTabularInline
2021

2122
# ------------------------------------------------------
2223
# ModelAdmins
@@ -29,13 +30,13 @@ class Meta:
2930
'sections':forms.TextInput,
3031
}
3132

32-
class IprDocRelInline(admin.TabularInline):
33+
class IprDocRelInline(SaferTabularInline):
3334
model = IprDocRel
3435
form = IprDocRelAdminForm
3536
raw_id_fields = ['document']
3637
extra = 1
3738

38-
class RelatedIprInline(admin.TabularInline):
39+
class RelatedIprInline(SaferTabularInline):
3940
model = RelatedIpr
4041
raw_id_fields = ['target']
4142
fk_name = 'source'

ietf/liaisons/admin.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@
77

88
from ietf.liaisons.models import ( LiaisonStatement, LiaisonStatementEvent,
99
RelatedLiaisonStatement, LiaisonStatementAttachment )
10+
from ietf.utils.admin import SaferTabularInline
1011

1112

12-
class RelatedLiaisonStatementInline(admin.TabularInline):
13+
class RelatedLiaisonStatementInline(SaferTabularInline):
1314
model = RelatedLiaisonStatement
1415
fk_name = 'source'
1516
raw_id_fields = ['target']
1617
extra = 1
1718

18-
class LiaisonStatementAttachmentInline(admin.TabularInline):
19+
class LiaisonStatementAttachmentInline(SaferTabularInline):
1920
model = LiaisonStatementAttachment
2021
raw_id_fields = ['document']
2122
extra = 1

ietf/meeting/admin.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
SessionPresentation, ImportantDate, SlideSubmission, SchedulingEvent, BusinessConstraint,
1111
ProceedingsMaterial, MeetingHost, Registration, RegistrationTicket,
1212
AttendanceTypeName)
13+
from ietf.utils.admin import SaferTabularInline
1314

1415

1516
class UrlResourceAdmin(admin.ModelAdmin):
@@ -18,7 +19,7 @@ class UrlResourceAdmin(admin.ModelAdmin):
1819
raw_id_fields = ['room', ]
1920
admin.site.register(UrlResource, UrlResourceAdmin)
2021

21-
class UrlResourceInline(admin.TabularInline):
22+
class UrlResourceInline(SaferTabularInline):
2223
model = UrlResource
2324

2425
class RoomAdmin(admin.ModelAdmin):
@@ -28,7 +29,7 @@ class RoomAdmin(admin.ModelAdmin):
2829

2930
admin.site.register(Room, RoomAdmin)
3031

31-
class RoomInline(admin.TabularInline):
32+
class RoomInline(SaferTabularInline):
3233
model = Room
3334

3435
class MeetingAdmin(admin.ModelAdmin):
@@ -93,7 +94,7 @@ def name_lower(self, instance):
9394

9495
admin.site.register(Constraint, ConstraintAdmin)
9596

96-
class SchedulingEventInline(admin.TabularInline):
97+
class SchedulingEventInline(SaferTabularInline):
9798
model = SchedulingEvent
9899
raw_id_fields = ["by"]
99100

@@ -244,7 +245,7 @@ def queryset(self, request, queryset):
244245
return queryset.filter(tickets__attendance_type__slug=self.value()).distinct()
245246
return queryset
246247

247-
class RegistrationTicketInline(admin.TabularInline):
248+
class RegistrationTicketInline(SaferTabularInline):
248249
model = RegistrationTicket
249250

250251
class RegistrationAdmin(admin.ModelAdmin):

ietf/name/admin.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757

5858

5959
from ietf.stats.models import CountryAlias
60+
from ietf.utils.admin import SaferTabularInline
6061

6162

6263
class NameAdmin(admin.ModelAdmin):
@@ -86,7 +87,7 @@ class GroupTypeNameAdmin(NameAdmin):
8687
admin.site.register(GroupTypeName, GroupTypeNameAdmin)
8788

8889

89-
class CountryAliasInline(admin.TabularInline):
90+
class CountryAliasInline(SaferTabularInline):
9091
model = CountryAlias
9192
extra = 1
9293

ietf/person/admin.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from ietf.person.models import Email, Alias, Person, PersonalApiKey, PersonEvent, PersonApiKeyEvent, PersonExtResource
88
from ietf.person.name import name_parts
99

10+
from ietf.utils.admin import SaferStackedInline, SaferTabularInline
1011
from ietf.utils.validators import validate_external_resource_value
1112

1213

@@ -16,7 +17,7 @@ class EmailAdmin(simple_history.admin.SimpleHistoryAdmin):
1617
search_fields = ["address", "person__name", ]
1718
admin.site.register(Email, EmailAdmin)
1819

19-
class EmailInline(admin.TabularInline):
20+
class EmailInline(SaferTabularInline):
2021
model = Email
2122

2223
class AliasAdmin(admin.ModelAdmin):
@@ -25,7 +26,7 @@ class AliasAdmin(admin.ModelAdmin):
2526
raw_id_fields = ["person"]
2627
admin.site.register(Alias, AliasAdmin)
2728

28-
class AliasInline(admin.StackedInline):
29+
class AliasInline(SaferStackedInline):
2930
model = Alias
3031

3132
class PersonAdmin(simple_history.admin.SimpleHistoryAdmin):

ietf/utils/admin.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,19 @@ def _link(self):
5151
_link.admin_order_field = ordering
5252
return _link
5353

54+
55+
class SaferStackedInline(admin.StackedInline):
56+
"""StackedInline without delete by default"""
57+
can_delete = False # no delete button
58+
show_change_link = True # show a link to the resource (where it can be deleted)
59+
60+
61+
class SaferTabularInline(admin.TabularInline):
62+
"""TabularInline without delete by default"""
63+
can_delete = False # no delete button
64+
show_change_link = True # show a link to the resource (where it can be deleted)
65+
66+
5467
from .models import DumpInfo
5568
class DumpInfoAdmin(admin.ModelAdmin):
5669
list_display = ['date', 'host', 'tz']

0 commit comments

Comments
 (0)