Coverage for family/admin.py: 100%
118 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-05 02:45 +0800
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-05 02:45 +0800
1from django.contrib import admin
2from .models import (
3 Person, Location, Institution, Event, Story, Multimedia,
4 Relationship, Health, Heritage, Planning, Career, Assets, Timeline
5)
6from .forms import (
7 PersonAdminForm, StoryAdminForm, EventAdminForm, MultimediaAdminForm,
8 RelationshipAdminForm, HealthAdminForm, LocationAdminForm, InstitutionAdminForm
9)
10from .admin_mixins import FamilyAdminMixin
13@admin.register(Person)
14class PersonAdmin(admin.ModelAdmin):
15 form = PersonAdminForm
16 list_display = ['name', 'gender', 'birth_date', 'email', 'created_at']
17 list_filter = ['gender', 'created_at']
18 search_fields = ['name', 'email', 'bio']
19 readonly_fields = ['created_at', 'updated_at']
20 fieldsets = (
21 ('基本信息', {
22 'fields': ('name', 'gender', 'birth_date', 'death_date', 'photo')
23 }),
24 ('联系方式', {
25 'fields': ('email', 'phone')
26 }),
27 ('个人描述', {
28 'fields': ('bio',)
29 }),
30 ('时间戳', {
31 'fields': ('created_at', 'updated_at'),
32 'classes': ('collapse',)
33 })
34 )
37@admin.register(Location)
38class LocationAdmin(admin.ModelAdmin):
39 form = LocationAdminForm
40 list_display = ['name', 'location_type', 'address', 'created_at']
41 list_filter = ['location_type', 'created_at']
42 search_fields = ['name', 'address', 'description']
43 readonly_fields = ['created_at']
46@admin.register(Institution)
47class InstitutionAdmin(admin.ModelAdmin):
48 form = InstitutionAdminForm
49 list_display = ['name', 'institution_type', 'website', 'phone', 'created_at']
50 list_filter = ['institution_type', 'created_at']
51 search_fields = ['name', 'description', 'email']
52 readonly_fields = ['created_at']
55@admin.register(Event)
56class EventAdmin(FamilyAdminMixin, admin.ModelAdmin):
57 inline_create_fields = ['location', 'institution']
58 form = EventAdminForm
59 list_display = ['name', 'event_type', 'start_date', 'location', 'created_at']
60 list_filter = ['event_type', 'start_date', 'created_at']
61 search_fields = ['name', 'description']
62 readonly_fields = ['created_at', 'updated_at']
63 filter_horizontal = ['participants']
64 date_hierarchy = 'start_date'
65 fieldsets = (
66 ('事件信息', {
67 'fields': ('name', 'event_type', 'description')
68 }),
69 ('时间地点', {
70 'fields': ('start_date', 'end_date', 'location', 'institution')
71 }),
72 ('参与人员', {
73 'fields': ('participants',)
74 }),
75 ('时间戳', {
76 'fields': ('created_at', 'updated_at'),
77 'classes': ('collapse',)
78 })
79 )
82@admin.register(Story)
83class StoryAdmin(FamilyAdminMixin, admin.ModelAdmin):
84 inline_create_fields = ['location']
85 form = StoryAdminForm
86 list_display = ['title', 'story_type', 'date_occurred', 'location', 'created_at']
87 list_filter = ['story_type', 'date_occurred', 'created_at']
88 search_fields = ['title', 'content']
89 readonly_fields = ['created_at', 'updated_at']
90 filter_horizontal = ['people', 'events']
91 date_hierarchy = 'created_at'
92 fieldsets = (
93 ('故事信息', {
94 'fields': ('title', 'story_type', 'content')
95 }),
96 ('时间地点', {
97 'fields': ('date_occurred', 'location')
98 }),
99 ('相关人物事件', {
100 'fields': ('people', 'events')
101 }),
102 ('时间戳', {
103 'fields': ('created_at', 'updated_at'),
104 'classes': ('collapse',)
105 })
106 )
109@admin.register(Multimedia)
110class MultimediaAdmin(FamilyAdminMixin, admin.ModelAdmin):
111 inline_create_fields = ['location']
112 form = MultimediaAdminForm
113 list_display = ['title', 'media_type', 'file', 'created_date', 'created_at']
114 list_filter = ['media_type', 'created_date', 'created_at']
115 search_fields = ['title', 'description']
116 readonly_fields = ['created_at', 'updated_at', 'file_size']
117 filter_horizontal = ['people', 'events', 'stories']
118 fieldsets = (
119 ('媒体信息', {
120 'fields': ('title', 'media_type', 'description', 'file')
121 }),
122 ('元数据', {
123 'fields': ('file_size', 'created_date', 'location')
124 }),
125 ('相关内容', {
126 'fields': ('people', 'events', 'stories')
127 }),
128 ('时间戳', {
129 'fields': ('created_at', 'updated_at'),
130 'classes': ('collapse',)
131 })
132 )
135@admin.register(Relationship)
136class RelationshipAdmin(FamilyAdminMixin, admin.ModelAdmin):
137 inline_create_fields = ['person_from', 'person_to']
138 form = RelationshipAdminForm
139 list_display = ['person_from', 'relationship_type', 'person_to', 'start_date', 'created_at']
140 list_filter = ['relationship_type', 'start_date', 'created_at']
141 search_fields = ['person_from__name', 'person_to__name', 'description']
142 readonly_fields = ['created_at']
145@admin.register(Health)
146class HealthAdmin(FamilyAdminMixin, admin.ModelAdmin):
147 inline_create_fields = ['person', 'institution']
148 form = HealthAdminForm
149 list_display = ['person', 'record_type', 'title', 'date', 'is_hereditary', 'created_at']
150 list_filter = ['record_type', 'is_hereditary', 'date', 'created_at']
151 search_fields = ['person__name', 'title', 'description', 'doctor']
152 readonly_fields = ['created_at']
153 date_hierarchy = 'date'
156@admin.register(Heritage)
157class HeritageAdmin(FamilyAdminMixin, admin.ModelAdmin):
158 inline_create_fields = ['origin_person']
159 list_display = ['title', 'heritage_type', 'origin_person', 'importance', 'created_at']
160 list_filter = ['heritage_type', 'importance', 'created_at']
161 search_fields = ['title', 'description']
162 readonly_fields = ['created_at']
163 filter_horizontal = ['inheritors', 'stories', 'events']
166@admin.register(Planning)
167class PlanningAdmin(FamilyAdminMixin, admin.ModelAdmin):
168 inline_create_fields = []
169 list_display = ['title', 'time_range', 'priority', 'status', 'target_date', 'created_at']
170 list_filter = ['time_range', 'priority', 'status', 'created_at']
171 search_fields = ['title', 'description', 'expected_outcome']
172 readonly_fields = ['created_at', 'updated_at']
173 filter_horizontal = ['involved_people']
174 date_hierarchy = 'target_date'
177@admin.register(Career)
178class CareerAdmin(FamilyAdminMixin, admin.ModelAdmin):
179 inline_create_fields = ['person', 'institution']
180 list_display = ['person', 'career_type', 'title', 'institution', 'start_date', 'end_date']
181 list_filter = ['career_type', 'start_date', 'created_at']
182 search_fields = ['person__name', 'title', 'description', 'achievements']
183 readonly_fields = ['created_at']
184 filter_horizontal = ['events']
185 date_hierarchy = 'start_date'
188@admin.register(Assets)
189class AssetsAdmin(FamilyAdminMixin, admin.ModelAdmin):
190 inline_create_fields = []
191 list_display = ['name', 'asset_type', 'legal_status', 'estimated_value', 'importance', 'created_at']
192 list_filter = ['asset_type', 'legal_status', 'importance', 'created_at']
193 search_fields = ['name', 'description', 'location']
194 readonly_fields = ['created_at', 'updated_at']
195 filter_horizontal = ['owners', 'related_documents', 'plans']
198@admin.register(Timeline)
199class TimelineAdmin(FamilyAdminMixin, admin.ModelAdmin):
200 inline_create_fields = []
201 list_display = ['title', 'timeline_type', 'date', 'end_date', 'importance', 'created_at']
202 list_filter = ['timeline_type', 'importance', 'date', 'created_at']
203 search_fields = ['title', 'description', 'historical_context']
204 readonly_fields = ['created_at']
205 filter_horizontal = ['people', 'events', 'stories']
206 date_hierarchy = 'date'