diff --git a/pyconbalkan/conference/context.py b/pyconbalkan/conference/context.py new file mode 100644 index 00000000..df7555ad --- /dev/null +++ b/pyconbalkan/conference/context.py @@ -0,0 +1,3 @@ +import threading + +singleton = threading.local() diff --git a/pyconbalkan/conference/managers.py b/pyconbalkan/conference/managers.py new file mode 100644 index 00000000..93f95c46 --- /dev/null +++ b/pyconbalkan/conference/managers.py @@ -0,0 +1,15 @@ +from django.db import models + +from pyconbalkan.conference.context import singleton + + +class ConferenceManager(models.Manager): + def get_queryset(self): + if hasattr(singleton, "conference"): + return ( + super(ConferenceManager, self) + .get_queryset() + .filter(conference=singleton.conference) + ) + else: + return super(ConferenceManager, self).get_queryset() diff --git a/pyconbalkan/conference/middleware.py b/pyconbalkan/conference/middleware.py index b6b3bc19..9ce801c8 100644 --- a/pyconbalkan/conference/middleware.py +++ b/pyconbalkan/conference/middleware.py @@ -1,13 +1,11 @@ -import threading from urllib.parse import urljoin from django.conf import settings from django.http import HttpResponseRedirect +from .context import singleton from pyconbalkan.conference.models import Conference -context = threading.local() - class ConferenceSelectionMiddleware: def __init__(self, get_response): @@ -63,5 +61,5 @@ def __call__(self, request): # # Idea taken from: https://stackoverflow.com/a/27694861/548059 - context.conference = request.conference + singleton.conference = request.conference return self.get_response(request) diff --git a/pyconbalkan/conference/models.py b/pyconbalkan/conference/models.py index ddb66606..a7252598 100644 --- a/pyconbalkan/conference/models.py +++ b/pyconbalkan/conference/models.py @@ -3,16 +3,14 @@ from markdownx.models import MarkdownxField from meta.models import ModelMeta +from pyconbalkan.conference.managers import ConferenceManager from pyconbalkan.core.models import SingleActiveModel class Conference(SingleActiveModel, ModelMeta): INTERNATIONAL = 0 NATIONAL = 1 - CONF_TYPE = ( - (INTERNATIONAL, 'International'), - (NATIONAL, 'National'), - ) + CONF_TYPE = ((INTERNATIONAL, "International"), (NATIONAL, "National")) event = models.CharField(null=True, blank=True, max_length=100) name = models.CharField(null=True, blank=True, max_length=100) @@ -37,20 +35,16 @@ class Conference(SingleActiveModel, ModelMeta): # timetable timetable_pdf = models.FileField(blank=True, null=True) - - _metadata = { - 'title': 'get_meta_title', - 'description': 'get_meta_description', - } + _metadata = {"title": "get_meta_title", "description": "get_meta_description"} def get_meta_title(self): - return '#{} {} {} {}'.format(self.number, self.event, self.name, self.year) + return "#{} {} {} {}".format(self.number, self.event, self.name, self.year) def get_meta_description(self): - return 'Welcome to {} {} {}! '.format(self.event, self.name, self.year) + return "Welcome to {} {} {}! ".format(self.event, self.name, self.year) def __str__(self): - return '{} {} {}'.format(self.event, self.name, self.year) + return "{} {} {}".format(self.event, self.name, self.year) def _get_default_conference(): @@ -62,6 +56,7 @@ class AbstractConference(models.Model): conference = models.ForeignKey( Conference, on_delete=models.CASCADE, default=_get_default_conference ) + objects = ConferenceManager() class Meta: abstract = True @@ -80,5 +75,3 @@ class MissionStatement(AbstractConference, SingleActiveModel): def __str__(self): return self.content - - diff --git a/pyconbalkan/core/loaders.py b/pyconbalkan/core/loaders.py index 21bb95d0..9a33e9b6 100644 --- a/pyconbalkan/core/loaders.py +++ b/pyconbalkan/core/loaders.py @@ -3,14 +3,18 @@ from django.template import TemplateDoesNotExist from django.template.loaders.app_directories import Loader -from pyconbalkan.conference.middleware import context +from pyconbalkan.conference.context import singleton class PyconLoader(Loader): def get_template(self, template_name, skip=None): - if not hasattr(context, "conference"): - raise TemplateDoesNotExist("Conference object not be found in context, skipping.") - template_basename = "{:d}_{}".format(context.conference.year, path.basename(template_name)) + if not hasattr(singleton, "conference"): + raise TemplateDoesNotExist( + "Conference object not be found in context, skipping." + ) + template_basename = "{:d}_{}".format( + singleton.conference.year, path.basename(template_name) + ) template_name = path.join(path.dirname(template_name), template_basename) return super(PyconLoader, self).get_template(template_name, skip=None) diff --git a/pyconbalkan/core/views.py b/pyconbalkan/core/views.py index 37439fce..abe4af81 100644 --- a/pyconbalkan/core/views.py +++ b/pyconbalkan/core/views.py @@ -7,18 +7,16 @@ def home(request): - q = Q(conference=request.conference) + count_down = CountDown.objects.filter(active=True) + keynotes = Speaker.objects.filter(active=True, keynote=True).order_by("full_name") - count_down = CountDown.objects.filter(active=True).filter(q) - keynotes = Speaker.objects.filter(active=True, keynote=True).order_by("full_name").filter(q) + keystone_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.keystone) + platinum_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.platinum) + gold_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.gold) + silver_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.silver) + partners = Sponsor.objects.filter(level=SponsorshipLevel.partner) - keystone_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.keystone).filter(q) - platinum_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.platinum).filter(q) - gold_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.gold).filter(q) - silver_sponsors = Sponsor.objects.filter(level=SponsorshipLevel.silver).filter(q) - partners = Sponsor.objects.filter(level=SponsorshipLevel.partner).filter(q) - - mission_statement = MissionStatement.objects.filter(active=True).filter(q) + mission_statement = MissionStatement.objects.filter(active=True) context = { "keynotes": keynotes, diff --git a/pyconbalkan/news/views.py b/pyconbalkan/news/views.py index cc3d5189..978fb9f6 100644 --- a/pyconbalkan/news/views.py +++ b/pyconbalkan/news/views.py @@ -14,9 +14,7 @@ class PostViewSet(viewsets.ModelViewSet): def news_view(request): - posts = Post.objects.filter( - active=True, published_date__lte=timezone.now(), conference=request.conference - ) + posts = Post.objects.filter(active=True, published_date__lte=timezone.now()) context = {"news": posts} return render(request, "news.html", context)