feat(members/admin): add training overview
#174
Merged
christian.merten
merged 57 commits from MK/training_tab into main 2 months ago
@ -108,15 +108,22 @@ class PermissionOnMemberInline(admin.StackedInline):
|
|||||||||||||
|
|
||||||||||||
class TrainingOnMemberInline(CommonAdminInlineMixin, admin.TabularInline):
|
class TrainingOnMemberInline(CommonAdminInlineMixin, admin.TabularInline):
|
||||||||||||
model = MemberTraining
|
model = MemberTraining
|
||||||||||||
|
description = _("Please enter all training courses and further education courses that you have already attended or will be attending soon. Please also upload your confirmation of participation so that the responsible person can fill in the 'Attended' and 'Passed' fields. If the activity selection does not match your training, please describe it in the comment field.")
|
||||||||||||
formfield_overrides = {
|
formfield_overrides = {
|
||||||||||||
TextField: {'widget': Textarea(attrs={'rows': 1, 'cols': 25})}
|
TextField: {'widget': Textarea(attrs={'rows': 1, 'cols': 25})}
|
||||||||||||
}
|
}
|
||||||||||||
ordering = ("date",)
|
ordering = ("date",)
|
||||||||||||
extra = 1
|
extra = 1
|
||||||||||||
|
|
||||||||||||
|
field_change_permissions = {
|
||||||||||||
|
marius.klein marked this conversation as resolved
|
|||||||||||||
|
'participated': 'members.manage_success_trainings',
|
||||||||||||
|
'passed': 'members.manage_success_trainings',
|
||||||||||||
|
}
|
||||||||||||
|
|
||||||||||||
|
|
||||||||||||
class EmergencyContactInline(CommonAdminInlineMixin, admin.TabularInline):
|
class EmergencyContactInline(CommonAdminInlineMixin, admin.TabularInline):
|
||||||||||||
model = EmergencyContact
|
model = EmergencyContact
|
||||||||||||
|
description = _('Please enter at least one emergency contact with contact details here. These are necessary for crisis intervention during trips.')
|
||||||||||||
|
christian.merten marked this conversation as resolved
marius.klein
commented 2 months ago
Review
das gehört hier eigentlich nicht rein, soll ich das noch rausnehmen und wann anders mal in ne merge request machen? das gehört hier eigentlich nicht rein, soll ich das noch rausnehmen und wann anders mal in ne merge request machen?
christian.merten
commented 2 months ago
Review
Ja habe es gesehen. Wäre natürlich noch besser es separat zu machen, aber ich glaube es ist okay so. Ja habe es gesehen. Wäre natürlich noch besser es separat zu machen, aber ich glaube es ist okay so.
|
|||||||||||||
formfield_overrides = {
|
formfield_overrides = {
|
||||||||||||
TextField: {'widget': Textarea(attrs={'rows': 1, 'cols': 40})}
|
TextField: {'widget': Textarea(attrs={'rows': 1, 'cols': 40})}
|
||||||||||||
}
|
}
|
||||||||||||
@ -1392,6 +1399,20 @@ class KlettertreffAdmin(admin.ModelAdmin):
|
|||||||||||||
# ForeignKey: {'widget': apply_select2(forms.Select)}
|
# ForeignKey: {'widget': apply_select2(forms.Select)}
|
||||||||||||
#}
|
#}
|
||||||||||||
|
|
||||||||||||
|
class MemberTrainingAdminForm(forms.ModelForm):
|
||||||||||||
|
class Meta:
|
||||||||||||
|
model = MemberTraining
|
||||||||||||
|
exclude = []
|
||||||||||||
|
|
||||||||||||
|
|
||||||||||||
|
class MemberTrainingAdmin(CommonAdminMixin, nested_admin.NestedModelAdmin):
|
||||||||||||
|
form = MemberTrainingAdminForm
|
||||||||||||
|
list_display = ['title', 'member', 'date', 'category', 'get_activities', 'participated', 'passed', 'certificate']
|
||||||||||||
|
search_fields = ['title']
|
||||||||||||
|
list_filter = (('date', DateFieldListFilter), 'category', 'passed', 'activity', 'member')
|
||||||||||||
|
ordering = ('-date',)
|
||||||||||||
|
|
||||||||||||
|
|
||||||||||||
|
|
||||||||||||
admin.site.register(Member, MemberAdmin)
|
admin.site.register(Member, MemberAdmin)
|
||||||||||||
admin.site.register(MemberUnconfirmedProxy, MemberUnconfirmedAdmin)
|
admin.site.register(MemberUnconfirmedProxy, MemberUnconfirmedAdmin)
|
||||||||||||
@ -1402,3 +1423,4 @@ admin.site.register(MemberNoteList, MemberNoteListAdmin)
|
|||||||||||||
admin.site.register(Klettertreff, KlettertreffAdmin)
|
admin.site.register(Klettertreff, KlettertreffAdmin)
|
||||||||||||
admin.site.register(ActivityCategory, ActivityCategoryAdmin)
|
admin.site.register(ActivityCategory, ActivityCategoryAdmin)
|
||||||||||||
admin.site.register(TrainingCategory, TrainingCategoryAdmin)
|
admin.site.register(TrainingCategory, TrainingCategoryAdmin)
|
||||||||||||
|
admin.site.register(MemberTraining, MemberTrainingAdmin)
|
||||||||||||
|
|||||||||||||
@ -0,0 +1,42 @@
|
|||||||
|
# Generated by Django 4.2.20 on 2025-10-10 15:50
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('members', '0043_waitinglist_permissions'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='membertraining',
|
||||||
|
name='activity',
|
||||||
|
field=models.ManyToManyField(to='members.activitycategory', verbose_name='Activity'),
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='membertraining',
|
||||||
|
options={'default_permissions': ('add_global', 'change_global', 'view_global', 'delete_global', 'list_global', 'view'), 'permissions': (('manage_success_trainings', 'Can edit the success status of trainings.'),), 'verbose_name': 'Training', 'verbose_name_plural': 'Trainings'},
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='membertraining',
|
||||||
|
name='title',
|
||||||
|
field=models.CharField(max_length=150, verbose_name='Title'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='membertraining',
|
||||||
|
name='member',
|
||||||
|
field=models.ForeignKey(on_delete=models.deletion.CASCADE, related_name='traininigs', to='members.member', verbose_name='Member'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='membertraining',
|
||||||
|
name='participated',
|
||||||
|
field=models.BooleanField(null=True, verbose_name='Participated'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='membertraining',
|
||||||
|
name='passed',
|
||||||
|
field=models.BooleanField(null=True, verbose_name='Passed'),
|
||||||
|
),
|
||||||
|
]
|
||||||
Loading…
Reference in New Issue
Das führt dazu, dass wenn nicht Admins eine Fortbildung eintragen, ein "Integrity Error" geworfen wird, weil
participatednicht null sein darf.Ich denke am Besten ist es einfach im
MemberTrainingmodel fürparticipatedundpassednull zu erlauben.