Compare commits

...

4 Commits

9 changed files with 79 additions and 25 deletions

View File

@ -1,5 +1,5 @@
"""Site processors to add additional template tags and whatnot.""" """Site processors to add additional template tags and whatnot."""
from django.conf import settings
from django.contrib.sites.shortcuts import get_current_site from django.contrib.sites.shortcuts import get_current_site
from django.utils.functional import SimpleLazyObject from django.utils.functional import SimpleLazyObject
@ -11,4 +11,5 @@ def site(request):
return { return {
'site': site, 'site': site,
'site_root': SimpleLazyObject(lambda: "{0}://{1}".format(protocol, site.domain)), 'site_root': SimpleLazyObject(lambda: "{0}://{1}".format(protocol, site.domain)),
'WEB_ENABLED_APPS': settings.WEB_ENABLED_APPS,
} }

View File

@ -145,6 +145,16 @@ BOOTSTRAP3 = {
'javascript_in_head': True, 'javascript_in_head': True,
} }
###############
# web options #
###############
# choose which apps to display in the web UI, for those that support this config
WEB_ENABLED_APPS = [
'karma',
'races',
]
# IRC module stuff # IRC module stuff
@ -172,10 +182,6 @@ STORYCRAFT_DEFAULT_GAME_LENGTH = 20
STORYCRAFT_DEFAULT_LINE_LENGTH = 140 STORYCRAFT_DEFAULT_LINE_LENGTH = 140
STORYCRAFT_DEFAULT_LINES_PER_TURN = 2 STORYCRAFT_DEFAULT_LINES_PER_TURN = 2
# weather
WEATHER_WEATHER_UNDERGROUND_API_KEY = None
# load local settings # load local settings

View File

@ -30,9 +30,9 @@
{% block navbar_menu %} {% block navbar_menu %}
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li><a href="{% url 'facts_index' %}">Item Sets</a></li> <li><a href="{% url 'facts_index' %}">Item Sets</a></li>
<li><a href="{% url 'karma_index' %}">Karma</a></li> {% if "karma" in WEB_ENABLED_APPS %}<li><a href="{% url 'karma_index' %}">Karma</a></li>{% endif %}
<li><a href="{% url 'markov_index' %}">Markov</a></li> <li><a href="{% url 'markov_index' %}">Markov</a></li>
<li><a href="{% url 'races_index' %}">Races</a></li> {% if "races" in WEB_ENABLED_APPS %}<li><a href="{% url 'races_index' %}">Races</a></li>{% endif %}
</ul> </ul>
{% endblock %} {% endblock %}
<div class="navbar-right"> <div class="navbar-right">

View File

@ -1,27 +1,32 @@
"""Present karma data.""" """Present karma data."""
import logging import logging
from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from rest_framework import viewsets from rest_framework import viewsets
from karma.models import KarmaKey from karma.models import KarmaKey
from karma.serializers import KarmaKeySerializer from karma.serializers import KarmaKeySerializer
log = logging.getLogger('karma.views') log = logging.getLogger(__name__)
def index(request): def index(request):
"""Display all karma keys.""" """Display all karma keys."""
entries = KarmaKey.objects.all().order_by('key') if 'karma' not in settings.WEB_ENABLED_APPS:
raise PermissionDenied()
entries = KarmaKey.objects.all().order_by('key')
return render(request, 'karma/index.html', {'entries': entries}) return render(request, 'karma/index.html', {'entries': entries})
def key_detail(request, karma_key): def key_detail(request, karma_key):
"""Display the requested karma key.""" """Display the requested karma key."""
entry = get_object_or_404(KarmaKey, key=karma_key.lower()) if 'karma' not in settings.WEB_ENABLED_APPS:
raise PermissionDenied()
entry = get_object_or_404(KarmaKey, key=karma_key.lower())
return render(request, 'karma/karma_key.html', {'entry': entry, 'entry_history': entry.history(mode='date')}) return render(request, 'karma/karma_key.html', {'entry': entry, 'entry_history': entry.history(mode='date')})

View File

@ -1,26 +1,28 @@
"""Display race statuses and whatnot.""" """Display race statuses and whatnot."""
import logging import logging
from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from races.models import Race, Racer, RaceUpdate from races.models import Race, Racer, RaceUpdate
log = logging.getLogger(__name__)
log = logging.getLogger('races.views')
def index(request): def index(request):
"""Display a list of races.""" """Display a list of races."""
if 'races' not in settings.WEB_ENABLED_APPS:
raise PermissionDenied()
races = Race.objects.all() races = Race.objects.all()
return render(request, 'races/index.html', {'races': races}) return render(request, 'races/index.html', {'races': races})
def race_detail(request, race_id): def race_detail(request, race_id):
"""Display a race detail.""" """Display a race detail."""
if 'races' not in settings.WEB_ENABLED_APPS:
raise PermissionDenied()
race = get_object_or_404(Race, pk=race_id) race = get_object_or_404(Race, pk=race_id)
return render(request, 'races/race_detail.html', {'race': race}) return render(request, 'races/race_detail.html', {'race': race})

View File

@ -1,8 +1,5 @@
"""Test the race views.""" """Test the race views."""
from unittest import mock
from django.test import TestCase from django.test import TestCase
from django.utils.timezone import now
from races.models import Race, Racer, RaceUpdate from races.models import Race, Racer, RaceUpdate

View File

@ -0,0 +1,46 @@
"""Test views and templates' adherence to WEB_ENABLED_APPS."""
from django.conf import settings
from django.test import TestCase
class WebEnabledAppsAPITest(TestCase):
"""Test that certain display elements and views can be enabled/disabled via settings."""
def setUp(self):
"""Store the old setting so that we can restore it later."""
self.old_sites_list = settings.WEB_ENABLED_APPS
print("butt")
def tearDown(self):
"""Restore the old setting stored earlier."""
settings.WEB_ENABLED_APPS = self.old_sites_list
print("butt")
def test_default_enabled(self):
"""Test that the expected sites can be reached and displayed by default."""
resp = self.client.get('/karma/')
self.assertEqual(resp.status_code, 200)
self.assertIn(b'<a href="/karma/">', resp.content)
resp = self.client.get('/races/')
self.assertEqual(resp.status_code, 200)
self.assertIn(b'<a href="/races/">', resp.content)
def test_one_disabled(self):
"""Test that we can disable one site but not all sites using this setting."""
settings.WEB_ENABLED_APPS = ['karma']
resp = self.client.get('/karma/')
self.assertEqual(resp.status_code, 200)
self.assertIn(b'<a href="/karma/">', resp.content)
resp = self.client.get('/races/')
self.assertEqual(resp.status_code, 403)
self.assertNotIn(b'<a href="/races/">', resp.content)
def test_all_disabled(self):
"""Test that we can disable all sites using this setting."""
settings.WEB_ENABLED_APPS = []
resp = self.client.get('/karma/')
self.assertEqual(resp.status_code, 403)
self.assertNotIn(b'<a href="/karma/">', resp.content)
resp = self.client.get('/races/')
self.assertEqual(resp.status_code, 403)
self.assertNotIn(b'<a href="/races/">', resp.content)

View File

@ -181,7 +181,7 @@ exclude =
.tox/ .tox/
versioneer.py versioneer.py
_version.py _version.py
instance/ **/migrations/
extend-ignore = T101 extend-ignore = T101
max-complexity = 10 max-complexity = 10
max-line-length = 120 max-line-length = 120

View File

@ -1,20 +1,17 @@
"""Report on the weather via wttr.in."""
import logging import logging
from ircbot.lib import Plugin from ircbot.lib import Plugin
from weather.lib import weather_summary from weather.lib import weather_summary
log = logging.getLogger('weather.ircplugin') log = logging.getLogger('weather.ircplugin')
class Weather(Plugin): class Weather(Plugin):
"""Have IRC commands to do IRC things (join channels, quit, etc.).""" """Have IRC commands to do IRC things (join channels, quit, etc.)."""
def start(self): def start(self):
"""Set up the handlers.""" """Set up the handlers."""
self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!weather\s+(.*)$', self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!weather\s+(.*)$',
self.handle_weather, -20) self.handle_weather, -20)
@ -22,12 +19,12 @@ class Weather(Plugin):
def stop(self): def stop(self):
"""Tear down handlers.""" """Tear down handlers."""
self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.handle_weather) self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.handle_weather)
super(Weather, self).stop() super(Weather, self).stop()
def handle_weather(self, connection, event, match): def handle_weather(self, connection, event, match):
"""Make the weather query and format it for IRC."""
query = match.group(1) query = match.group(1)
queryitems = query.split(" ") queryitems = query.split(" ")
if len(queryitems) <= 0: if len(queryitems) <= 0: