Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 30 additions & 12 deletions src/events/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,13 +116,25 @@ class EndTimeRangeFilter(EventTimeRangeFilter):
field_name = 'end_time'


class EventLocationAdminMixin:

@admin.display(description=_('location'), ordering='location')
def display_location(self, instance):
value = instance.location
field = instance._meta.get_field('location')
if value and value not in dict(field.flatchoices):
return _('Custom: %(value)s') % {'value': value}

return instance.get_location_display()


@admin.register(CustomEvent)
class CustomEventAdmin(ImportExportMixin, admin.ModelAdmin):
class CustomEventAdmin(EventLocationAdminMixin, ImportExportMixin, admin.ModelAdmin):

form = CustomEventForm
search_fields = ['title']
list_display = [
'title', 'begin_time', 'end_time', 'location', 'break_event',
'title', 'begin_time', 'end_time', 'display_location', 'break_event',
'description', 'link_path', 'get_edit_link',
]
list_filter = [
Expand All @@ -141,7 +153,7 @@ def get_edit_link(self, instance):


@admin.register(KeynoteEvent)
class KeynoteEventAdmin(TranslationAdmin):
class KeynoteEventAdmin(EventLocationAdminMixin, TranslationAdmin):
fields = [
'conference', 'speaker_name', 'speaker_bio', 'speaker_photo',
'session_title', 'session_description', 'session_slides',
Expand All @@ -150,56 +162,62 @@ class KeynoteEventAdmin(TranslationAdmin):
'location', 'is_remote',
]
search_fields = ['speaker_name']
list_display = ['speaker_name', 'begin_time', 'end_time', 'location', 'is_remote']
list_display = [
'speaker_name', 'begin_time', 'end_time', 'display_location', 'is_remote',
]
list_filter = [BeginTimeRangeFilter, EndTimeRangeFilter, 'location', 'is_remote']


@admin.register(JobListingsEvent)
class JobListingEventAdmin(admin.ModelAdmin):
class JobListingEventAdmin(EventLocationAdminMixin, admin.ModelAdmin):
fields = [
'conference',
'sponsor',
'begin_time', 'end_time', 'location',
]
list_display = [
'sponsor',
'begin_time', 'end_time', 'location']
'begin_time', 'end_time', 'display_location']
list_filter = [BeginTimeRangeFilter, EndTimeRangeFilter, 'location']
raw_id_fields = ['sponsor']


@admin.register(ProposedTalkEvent)
class ProposedTalkEventAdmin(admin.ModelAdmin):
class ProposedTalkEventAdmin(EventLocationAdminMixin, admin.ModelAdmin):
fields = [
'conference', 'proposal', 'begin_time', 'end_time', 'location', 'is_remote',
'youtube_id'
]
list_display = ['proposal', 'begin_time', 'end_time', 'location', 'is_remote']
list_display = [
'proposal', 'begin_time', 'end_time', 'display_location', 'is_remote',
]
list_filter = [BeginTimeRangeFilter, EndTimeRangeFilter, 'location', 'is_remote']
raw_id_fields = ['proposal']


@admin.register(ProposedTutorialEvent)
class ProposedTutorialEventAdmin(admin.ModelAdmin):
class ProposedTutorialEventAdmin(EventLocationAdminMixin, admin.ModelAdmin):
fields = [
'conference', 'proposal', 'begin_time', 'end_time', 'location', 'is_remote',
'youtube_id'
]
list_display = ['proposal', 'begin_time', 'end_time', 'location', 'is_remote']
list_display = [
'proposal', 'begin_time', 'end_time', 'display_location', 'is_remote',
]
list_filter = [BeginTimeRangeFilter, EndTimeRangeFilter, 'location', 'is_remote']
raw_id_fields = ['proposal']


@admin.register(SponsoredEvent)
class SponsoredEventAdmin(admin.ModelAdmin):
class SponsoredEventAdmin(EventLocationAdminMixin, admin.ModelAdmin):
fields = [
'conference', 'host', 'title', 'slug', 'category', 'language',
'abstract', 'python_level', 'detailed_description',
'recording_policy', 'slide_link',
'slido_embed_link', 'hackmd_embed_link', 'youtube_id',
'begin_time', 'end_time', 'location',
]
list_display = ['title', 'begin_time', 'end_time', 'location']
list_display = ['title', 'begin_time', 'end_time', 'display_location']
list_filter = [
BeginTimeRangeFilter, EndTimeRangeFilter, 'location',
'category', 'language', 'python_level',
Expand Down
14 changes: 14 additions & 0 deletions src/events/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from django.contrib.admin import site
from django.contrib.admin.views.main import ChangeList
from django.contrib.auth.models import AnonymousUser
from django.urls import reverse
from django.utils.encoding import force_str

from events.admin import (
Expand Down Expand Up @@ -57,6 +58,19 @@ def conv_choice(choice):
)


@pytest.mark.django_db
def test_event_admin_displays_custom_location(admin_client):
CustomEvent.objects.create(title='Off-site event', location='lobby')

response = admin_client.get(reverse('admin:events_customevent_changelist'))

assert response.status_code == 200
assert (
b'<td class="field-display_location">Custom: lobby</td>'
in response.content
)


@pytest.fixture
def time_admin():
return TimeAdmin(Time, site)
Expand Down
Loading
Loading