Skip to content

Commit 1e4c2b1

Browse files
authored
Merge pull request #146 from PythonBalkan/bojan/AbstractConferenceFilterManager
Adds a custom manager for all objects so that they always filter glob…
2 parents 972b22d + db61a4e commit 1e4c2b1

File tree

7 files changed

+44
-35
lines changed

7 files changed

+44
-35
lines changed

pyconbalkan/conference/context.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import threading
2+
3+
singleton = threading.local()

pyconbalkan/conference/managers.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from django.db import models
2+
3+
from pyconbalkan.conference.context import singleton
4+
5+
6+
class ConferenceManager(models.Manager):
7+
def get_queryset(self):
8+
if hasattr(singleton, "conference"):
9+
return (
10+
super(ConferenceManager, self)
11+
.get_queryset()
12+
.filter(conference=singleton.conference)
13+
)
14+
else:
15+
return super(ConferenceManager, self).get_queryset()

pyconbalkan/conference/middleware.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
import threading
21
from urllib.parse import urljoin
32

43
from django.conf import settings
54
from django.http import HttpResponseRedirect
65

6+
from .context import singleton
77
from pyconbalkan.conference.models import Conference
88

9-
context = threading.local()
10-
119

1210
class ConferenceSelectionMiddleware:
1311
def __init__(self, get_response):
@@ -63,5 +61,5 @@ def __call__(self, request):
6361
#
6462
# Idea taken from: https://stackoverflow.com/a/27694861/548059
6563

66-
context.conference = request.conference
64+
singleton.conference = request.conference
6765
return self.get_response(request)

pyconbalkan/conference/models.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,14 @@
33
from markdownx.models import MarkdownxField
44
from meta.models import ModelMeta
55

6+
from pyconbalkan.conference.managers import ConferenceManager
67
from pyconbalkan.core.models import SingleActiveModel
78

89

910
class Conference(SingleActiveModel, ModelMeta):
1011
INTERNATIONAL = 0
1112
NATIONAL = 1
12-
CONF_TYPE = (
13-
(INTERNATIONAL, 'International'),
14-
(NATIONAL, 'National'),
15-
)
13+
CONF_TYPE = ((INTERNATIONAL, "International"), (NATIONAL, "National"))
1614

1715
event = models.CharField(null=True, blank=True, max_length=100)
1816
name = models.CharField(null=True, blank=True, max_length=100)
@@ -37,20 +35,16 @@ class Conference(SingleActiveModel, ModelMeta):
3735
# timetable
3836
timetable_pdf = models.FileField(blank=True, null=True)
3937

40-
41-
_metadata = {
42-
'title': 'get_meta_title',
43-
'description': 'get_meta_description',
44-
}
38+
_metadata = {"title": "get_meta_title", "description": "get_meta_description"}
4539

4640
def get_meta_title(self):
47-
return '#{} {} {} {}'.format(self.number, self.event, self.name, self.year)
41+
return "#{} {} {} {}".format(self.number, self.event, self.name, self.year)
4842

4943
def get_meta_description(self):
50-
return 'Welcome to {} {} {}! '.format(self.event, self.name, self.year)
44+
return "Welcome to {} {} {}! ".format(self.event, self.name, self.year)
5145

5246
def __str__(self):
53-
return '{} {} {}'.format(self.event, self.name, self.year)
47+
return "{} {} {}".format(self.event, self.name, self.year)
5448

5549

5650
def _get_default_conference():
@@ -62,6 +56,7 @@ class AbstractConference(models.Model):
6256
conference = models.ForeignKey(
6357
Conference, on_delete=models.CASCADE, default=_get_default_conference
6458
)
59+
objects = ConferenceManager()
6560

6661
class Meta:
6762
abstract = True
@@ -80,5 +75,3 @@ class MissionStatement(AbstractConference, SingleActiveModel):
8075

8176
def __str__(self):
8277
return self.content
83-
84-

pyconbalkan/core/loaders.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@
33
from django.template import TemplateDoesNotExist
44
from django.template.loaders.app_directories import Loader
55

6-
from pyconbalkan.conference.middleware import context
6+
from pyconbalkan.conference.context import singleton
77

88

99
class PyconLoader(Loader):
1010
def get_template(self, template_name, skip=None):
11-
if not hasattr(context, "conference"):
12-
raise TemplateDoesNotExist("Conference object not be found in context, skipping.")
13-
template_basename = "{:d}_{}".format(context.conference.year, path.basename(template_name))
11+
if not hasattr(singleton, "conference"):
12+
raise TemplateDoesNotExist(
13+
"Conference object not be found in context, skipping."
14+
)
15+
template_basename = "{:d}_{}".format(
16+
singleton.conference.year, path.basename(template_name)
17+
)
1418
template_name = path.join(path.dirname(template_name), template_basename)
1519

1620
return super(PyconLoader, self).get_template(template_name, skip=None)

pyconbalkan/core/views.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,16 @@
77

88

99
def home(request):
10-
q = Q(conference=request.conference)
10+
count_down = CountDown.objects.filter(active=True)
11+
keynotes = Speaker.objects.filter(active=True, keynote=True).order_by("full_name")
1112

12-
count_down = CountDown.objects.filter(active=True).filter(q)
13-
keynotes = Speaker.objects.filter(active=True, keynote=True).order_by("full_name").filter(q)
13+
keystone_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.keystone)
14+
platinum_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.platinum)
15+
gold_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.gold)
16+
silver_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.silver)
17+
partners = Sponsor.objects.filter(level=SponsorshipLevel.partner)
1418

15-
keystone_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.keystone).filter(q)
16-
platinum_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.platinum).filter(q)
17-
gold_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.gold).filter(q)
18-
silver_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.silver).filter(q)
19-
partners = Sponsor.objects.filter(level=SponsorshipLevel.partner).filter(q)
20-
21-
mission_statement = MissionStatement.objects.filter(active=True).filter(q)
19+
mission_statement = MissionStatement.objects.filter(active=True)
2220

2321
context = {
2422
"keynotes": keynotes,

pyconbalkan/news/views.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ class PostViewSet(viewsets.ModelViewSet):
1414

1515

1616
def news_view(request):
17-
posts = Post.objects.filter(
18-
active=True, published_date__lte=timezone.now(), conference=request.conference
19-
)
17+
posts = Post.objects.filter(active=True, published_date__lte=timezone.now())
2018
context = {"news": posts}
2119
return render(request, "news.html", context)
2220

0 commit comments

Comments
 (0)