Skip to content

Commit a3ada85

Browse files
authored
Merge pull request #499 from Winter-Seminar-Series/admin-panel
Admin panel
2 parents 5f52aaf + bb798e3 commit a3ada85

File tree

6 files changed

+149
-25
lines changed

6 files changed

+149
-25
lines changed

backend/core/admin.py

+57-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from core.models import *
66

7+
78
class ExportCSVMixin:
89
def export_as_csv(self, request, queryset):
910
meta = self.model._meta
@@ -18,14 +19,65 @@ def export_as_csv(self, request, queryset):
1819

1920
export_as_csv.short_description = "Export Selected As CSV"
2021

22+
23+
@admin.register(Speaker)
24+
class SpeakerAdmin(admin.ModelAdmin):
25+
list_display = ('id', 'name', 'designation')
26+
search_fields = ('name', 'designation')
27+
list_filter = ('name',)
28+
ordering = ('name', 'id')
29+
30+
31+
@admin.register(Event)
32+
class EventAdmin(admin.ModelAdmin):
33+
list_display = ('display_str', 'wss_order', 'starting_date', 'ending_date')
34+
35+
def display_str(self, obj):
36+
return str(obj)
37+
38+
def wss_order(self, obj):
39+
return obj.id
40+
41+
42+
@admin.register(SubEvent)
43+
class SubEventAdmin(admin.ModelAdmin):
44+
list_display = ('name', 'event', 'kind',)
45+
search_fields = ('name', 'event__name')
46+
list_filter = ('kind', 'event')
47+
48+
49+
@admin.register(Seminar)
50+
class SeminarAdmin(admin.ModelAdmin):
51+
list_display = ('sub_event', 'event_name', 'speaker',)
52+
autocomplete_fields = ('sub_event', 'speaker')
53+
search_fields = ('sub_event__name', 'speaker__name',)
54+
list_filter = ('sub_event__event',)
55+
56+
def event_name(self, obj):
57+
return obj.sub_event.event if obj.sub_event else None
58+
59+
60+
@admin.register(RoundTable)
61+
class RoundTableAdmin(admin.ModelAdmin):
62+
list_display = ('sub_event', 'event_name', 'display_speakers',)
63+
autocomplete_fields = ('sub_event', 'speakers',)
64+
search_fields = ('sub_event__name', 'speakers__name',)
65+
list_filter = ('sub_event__event', 'speakers',)
66+
67+
def event_name(self, obj):
68+
return obj.sub_event.event if obj.sub_event else None
69+
70+
def display_speakers(self, obj):
71+
return ", ".join([speaker.name for speaker in obj.speakers.all()]) if obj.speakers.exists() else "No Speakers"
72+
73+
display_speakers.short_description = "Speakers"
74+
75+
2176
# Register your models here.
22-
admin.site.register(Event)
23-
admin.site.register(SubEvent)
24-
admin.site.register(Speaker)
25-
admin.site.register(Seminar)
77+
78+
2679
admin.site.register(Workshop)
2780
admin.site.register(WorkshopSession)
28-
admin.site.register(RoundTable)
2981
admin.site.register(LabTalk)
3082
admin.site.register(PosterSession)
3183
admin.site.register(PosterSessionImage)

backend/core/models.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class Speaker(models.Model):
7777
image = models.ImageField(upload_to='speakers/', null=True, blank=True)
7878

7979
def __str__(self) -> str:
80-
return f'{self.name}'
80+
return f'{self.name} - {self.designation}'
8181

8282

8383
class Seminar(models.Model):
@@ -93,12 +93,16 @@ class Workshop(models.Model):
9393
description = models.TextField(max_length=5000, blank=True)
9494
poster = models.ImageField(upload_to='posters/', null=True, blank=True)
9595
thumbnail = models.ImageField(upload_to='thumbnails/', null=True, blank=True)
96+
9697
# event = models.ForeignKey(
9798
# Event,
9899
# on_delete=models.CASCADE,
99100
# null=False,
100101
# blank=False
101102
# )
103+
def __str__(self):
104+
return f'{self.name}'
105+
102106

103107
class WorkshopSession(models.Model):
104108
workshop = models.ForeignKey(Workshop, on_delete=models.CASCADE)
@@ -110,7 +114,7 @@ class WorkshopSession(models.Model):
110114
date = models.DateField()
111115

112116
def __str__(self):
113-
return f'{self.workshop} - {self.date}'
117+
return f'{self.workshop} - {self.name} - {self.speaker}'
114118

115119

116120
class RoundTable(models.Model):

backend/participant/admin.py

+34-8
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,42 @@
22
from core.admin import ExportCSVMixin
33

44
from participant.models import *
5-
# Register your models here.
6-
admin.site.register(Participant)
7-
admin.site.register(ParticipantInfo)
8-
admin.site.register(ParticipationPlan)
95

6+
7+
@admin.register(Participant)
8+
class ParticipantAdmin(admin.ModelAdmin, ExportCSVMixin):
9+
list_display = ('info', 'user', 'get_national_code')
10+
search_fields = ('info__first_name', 'info__last_name', 'user__email', 'info__national_code',)
11+
12+
def get_national_code(self, obj):
13+
return obj.info.national_code
14+
15+
get_national_code.short_description = "National Code"
16+
17+
18+
@admin.register(Participation)
1019
class ParticipationAdmin(admin.ModelAdmin, ExportCSVMixin):
11-
list_display = ('participant', 'plan')
12-
list_filter = ('plan', )
20+
list_display = ('participant', 'participant_email', 'plan')
21+
list_filter = ('plan',)
22+
autocomplete_fields = ('participant', 'info',)
23+
search_fields = ('participant__user__email', 'participant__info__national_code',)
1324
actions = ["export_as_csv"]
1425

15-
admin.site.register(Participation, ParticipationAdmin)
26+
def participant_email(self, obj):
27+
return obj.participant.user.email if obj.participant and obj.participant.user else ""
28+
29+
participant_email.short_description = "Email"
30+
31+
32+
@admin.register(ParticipantInfo)
33+
class ParticipantInfoAdmin(admin.ModelAdmin):
34+
list_display = ('full_name', 'national_code')
35+
search_fields = ('first_name', 'last_name',)
36+
37+
def full_name(self, obj):
38+
return f"{obj.first_name} {obj.last_name}"
39+
40+
41+
admin.site.register(ParticipationPlan)
1642
admin.site.register(ParticipationAttachment)
17-
admin.site.register(ModeOfAttendance)
43+
admin.site.register(ModeOfAttendance)

backend/participant/models.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ class ParticipantInfo(models.Model):
3636
github = models.CharField(max_length=100, blank=True)
3737

3838
def __str__(self):
39-
return f'{self.first_name} {self.last_name}'
39+
return f'{self.first_name} {self.last_name} - {self.national_code}'
40+
4041

4142
class Participant(models.Model):
4243
user = models.OneToOneField(User, on_delete=models.CASCADE)
@@ -45,19 +46,20 @@ class Participant(models.Model):
4546

4647
def __str__(self):
4748
if self.info:
48-
return f'{self.info.first_name} {self.info.last_name}'
49+
return f'{self.info.first_name} {self.info.last_name} - {self.user.email}'
4950
else:
5051
return f'NO INFO - user: {self.user}'
5152

53+
5254
class ModeOfAttendance(models.Model):
5355
name = models.CharField(max_length=50)
5456
is_national_code_required = models.BooleanField(default=False)
5557

5658
def __str__(self):
5759
return f'{self.name}'
5860

59-
class ParticipationPlan(models.Model):
6061

62+
class ParticipationPlan(models.Model):
6163
KIND_CHOICES = (
6264
('W', 'Workshop'),
6365
('M', 'Mode of Attendance')
@@ -73,6 +75,7 @@ class ParticipationPlan(models.Model):
7375
def __str__(self):
7476
return f'{self.event} - {self.workshop if self.kind == "W" else self.mode_of_attendance}'
7577

78+
7679
class Participation(models.Model):
7780
participant = models.ForeignKey(Participant, on_delete=models.CASCADE)
7881
info = models.ForeignKey(ParticipantInfo, on_delete=models.SET_NULL, null=True, blank=True)
@@ -83,6 +86,7 @@ class Participation(models.Model):
8386
def __str__(self):
8487
return f'{self.participant} - {self.plan}'
8588

89+
8690
class ParticipationAttachment(models.Model):
8791
participation = models.ForeignKey(Participation, on_delete=models.CASCADE)
8892
attachment = models.FileField(upload_to='participation/', null=True, blank=True)

backend/staff/admin.py

+40-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,44 @@
11
from django.contrib import admin
22

3-
# Register your models here.
4-
3+
from core.models import Event
54
from .models import Staff, StaffTeam, StaffTeamMember
65

7-
admin.site.register(Staff)
8-
admin.site.register(StaffTeam)
9-
admin.site.register(StaffTeamMember)
6+
7+
@admin.register(Staff)
8+
class StaffAdmin(admin.ModelAdmin):
9+
list_display = ('name', 'designation', 'get_teams', 'get_events')
10+
search_fields = ('name', 'designation')
11+
list_filter = ('events__staff_team__event', 'events__staff_team')
12+
13+
def get_teams(self, obj):
14+
teams = obj.events.values_list('staff_team__name', flat=True).distinct()
15+
return ", ".join(teams)
16+
17+
get_teams.short_description = "Teams"
18+
19+
def get_events(self, obj):
20+
events = obj.events.values_list('staff_team__event', flat=True).distinct()
21+
event_objects = Event.objects.filter(id__in=events)
22+
return ", ".join(str(event) for event in event_objects)
23+
24+
get_events.short_description = "Events"
25+
26+
27+
@admin.register(StaffTeam)
28+
class StaffTeamAdmin(admin.ModelAdmin):
29+
list_display = ('get_name',)
30+
list_filter = ('event', 'name',)
31+
search_fields = ('name', 'event__order')
32+
33+
def get_name(self, obj):
34+
return str(obj)
35+
36+
get_name.short_description = "Name"
37+
38+
39+
@admin.register(StaffTeamMember)
40+
class StaffTeamMemberAdmin(admin.ModelAdmin):
41+
list_display = ('staff', 'staff_team',)
42+
list_filter = ('staff_team__event', 'staff_team__name',)
43+
search_fields = ('staff__name',)
44+
autocomplete_fields = ('staff', 'staff_team',)

backend/staff/models.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,28 @@
11
from django.db import models
22
from core.models import Event
33

4+
45
class Staff(models.Model):
56
name = models.TextField(max_length=50, blank=False)
67
designation = models.TextField(max_length=150, blank=True)
78
description = models.TextField(max_length=5000, blank=True)
89
image = models.ImageField(upload_to='staff/', blank=True)
9-
10+
1011
def __str__(self) -> str:
1112
return f'{self.name} - {self.designation}'
1213

14+
1315
class StaffTeam(models.Model):
1416
name = models.TextField(max_length=50, blank=False)
1517
event = models.ForeignKey(Event, on_delete=models.CASCADE)
1618

1719
def __str__(self) -> str:
1820
return f'{self.event} - {self.name}'
1921

22+
2023
class StaffTeamMember(models.Model):
2124
staff = models.ForeignKey(Staff, on_delete=models.CASCADE, related_name='events')
2225
staff_team = models.ForeignKey(StaffTeam, on_delete=models.CASCADE, related_name='members')
2326

2427
def __str__(self) -> str:
25-
return f'{self.staff_team} - {self.staff}'
28+
return f'{self.staff_team} - {self.staff}'

0 commit comments

Comments
 (0)