Skip to content

Commit 3607547

Browse files
authored
Merge pull request #141 from PythonBalkan/bojan/better_conf_switching
Bojan/better conf switching
2 parents 351a2ea + c4c2617 commit 3607547

File tree

9 files changed

+134
-8
lines changed

9 files changed

+134
-8
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from django.contrib import admin
2+
from django.db import models
3+
from django.utils.translation import ugettext_lazy as _
4+
5+
from pyconbalkan.conference.models import Conference
6+
7+
8+
def _get_default_conference():
9+
return Conference.objects.first().id
10+
11+
12+
class AbstractConference(models.Model):
13+
conference = models.ForeignKey(
14+
Conference, on_delete=models.CASCADE, default=_get_default_conference
15+
)
16+
17+
class Meta:
18+
abstract = True
19+
20+
21+
class ConferenceFilter(admin.SimpleListFilter):
22+
title = _('Conference year')
23+
parameter_name = 'conference'
24+
25+
def choices(self, changelist):
26+
for lookup, title in self.lookup_choices:
27+
yield {
28+
'selected': self.value() is lookup or self.value() == str(lookup),
29+
'query_string': changelist.get_query_string(
30+
{self.parameter_name: lookup}
31+
),
32+
'display': title,
33+
}
34+
35+
def lookups(self, request, model_admin):
36+
choices = []
37+
for _ in Conference.objects.all():
38+
if _ == request.conference:
39+
choices.append((None, "{} Current".format(_)))
40+
else:
41+
choices.append((_.id, str(_)))
42+
return choices
43+
44+
def queryset(self, request, queryset):
45+
return queryset.filter(conference=self.value() or request.conference.pk)
46+
47+
48+
class ConferenceAbstractAdmin(admin.ModelAdmin):
49+
list_filter = (ConferenceFilter,)

pyconbalkan/conference/middleware.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ class ConferenceSelectionMiddleware:
1010
def __init__(self, get_response):
1111
self.get_response = get_response
1212

13+
def _get_year_from_domain(self, request):
14+
domain = request.META.get('HTTP_HOST', 'localhost')
15+
try:
16+
return int(domain.split('.')[0])
17+
except ValueError:
18+
# Adding a non existing year, so it will never find this one, and will default to current.
19+
return 9999
20+
1321
def __call__(self, request):
1422
"""
1523
Code to be executed for each request before
@@ -20,12 +28,15 @@ def __call__(self, request):
2028
`conference` is the conference.models.Conference object for the
2129
respective year fetched from it's domain.
2230
"""
31+
if 'year' in request.GET.keys():
32+
domain_year = int(request.GET['year'])
33+
else:
34+
domain_year = self._get_year_from_domain(request)
35+
2336

24-
domain = request.META.get('HTTP_HOST', 'localhost')
2537
try:
26-
domain_year = int(domain.split('.')[0])
2738
request.conference = Conference.objects.get(year=domain_year)
28-
except (Conference.DoesNotExist, ValueError):
39+
except Conference.DoesNotExist:
2940
request.conference = Conference.objects.filter(active=True).first()
3041
if not request.conference:
3142
return self.get_response(request)

pyconbalkan/speaker/admin.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
from django.contrib import admin
22
from markdownx.admin import MarkdownxModelAdmin
33

4+
from pyconbalkan.conference.abstractions import ConferenceAbstractAdmin
45
from pyconbalkan.speaker.models import Speaker, SpeakerPhoto
56

67

78
class SpeakerImageInline(admin.TabularInline):
89
model = SpeakerPhoto
910

1011

11-
class SpeakerAdmin(MarkdownxModelAdmin):
12+
class SpeakerAdmin(ConferenceAbstractAdmin, MarkdownxModelAdmin):
1213
inlines = [SpeakerImageInline]
1314

1415

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 2.1.7 on 2019-03-03 16:46
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
import pyconbalkan.conference.abstractions
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('conference', '0007_auto_20190227_0738'),
12+
('speaker', '0010_speaker_country'),
13+
]
14+
15+
operations = [
16+
migrations.AddField(
17+
model_name='speaker',
18+
name='conference',
19+
field=models.ForeignKey(default=pyconbalkan.conference.abstractions._get_default_conference, on_delete=django.db.models.deletion.CASCADE, to='conference.Conference'),
20+
),
21+
]

pyconbalkan/speaker/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from django.db import models
22
from django.db.models import CASCADE
33

4+
from pyconbalkan.conference.abstractions import AbstractConference
45
from pyconbalkan.core.models import Person, ActiveModel
56

67

7-
class Speaker(ActiveModel, Person):
8+
class Speaker(AbstractConference, ActiveModel, Person):
89
keynote = models.BooleanField(default=False)
910

1011
def __str__(self):

pyconbalkan/sponsors/admin.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from django.contrib import admin
2+
3+
from pyconbalkan.conference.abstractions import ConferenceAbstractAdmin
24
from pyconbalkan.sponsors.models import Package, PackageItem, Sponsor, Sponsoring
35

4-
admin.site.register(Sponsor)
6+
7+
admin.site.register(Sponsor, ConferenceAbstractAdmin)
58
admin.site.register(Sponsoring)
69
admin.site.register(Package)
710
admin.site.register(PackageItem)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 2.1.7 on 2019-03-03 14:26
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('sponsors', '0008_auto_20180811_1903'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='sponsor',
15+
name='logo',
16+
field=models.ImageField(upload_to='sponsors/logo'),
17+
),
18+
]
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 2.1.7 on 2019-03-03 14:42
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
import pyconbalkan.conference.abstractions
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('conference', '0007_auto_20190227_0738'),
12+
('sponsors', '0009_auto_20190303_1426'),
13+
]
14+
15+
operations = [
16+
migrations.AddField(
17+
model_name='sponsor',
18+
name='conference',
19+
field=models.ForeignKey(default=pyconbalkan.conference.abstractions._get_default_conference, on_delete=django.db.models.deletion.CASCADE, to='conference.Conference'),
20+
),
21+
]

pyconbalkan/sponsors/models.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from markdownx.models import MarkdownxField
66
from djmoney.models.fields import MoneyField
77

8+
from pyconbalkan.conference.abstractions import AbstractConference
89
from pyconbalkan.core.models import ActiveModel
910

1011

@@ -25,11 +26,11 @@ class SponsorshipLevel(DjangoChoices):
2526
}
2627

2728

28-
class Sponsor(models.Model):
29+
class Sponsor(AbstractConference):
2930
name = models.CharField(max_length=256)
3031
description = MarkdownxField()
3132
level = models.CharField(max_length=16, choices=SponsorshipLevel.choices)
32-
logo = models.ImageField(upload_to="sponsors/logo", blank=True, null=True)
33+
logo = models.ImageField(upload_to="sponsors/logo")
3334

3435
def __str__(self):
3536
return f'Sponsor [{ self.name }]'

0 commit comments

Comments
 (0)