Skip to content

Commit

Permalink
example of a tool abstraction
Browse files Browse the repository at this point in the history
  • Loading branch information
ejucovy committed Mar 25, 2013
1 parent 2dcbdf7 commit 9f1f80f
Show file tree
Hide file tree
Showing 9 changed files with 142 additions and 17 deletions.
Binary file modified thing.sqlite
Binary file not shown.
61 changes: 45 additions & 16 deletions thing/models.py
@@ -1,6 +1,8 @@
from django.conf import settings
from django.db import models
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
from zope.dottedname.resolve import resolve

class Project(models.Model):

Expand Down Expand Up @@ -94,17 +96,29 @@ def nav_entries(self):
(self.summary_url(), _("Summary")),
(self.team_url(), _("Team")),
]
for tool in self.tools.all():
nav.append((tool.relative_path(), _(tool.title)))
for tool in self.project_tools():
tool_nav = tool.nav_entries()
if tool_nav:
nav.extend(tool_nav)
return nav

def project_tools(self):
tools = list(self.tools.all())
for tool_provider in settings.THING_TOOL_PROVIDERS:
tool_provider = resolve(tool_provider)
tool_provider = tool_provider(self)
tools.insert(0, tool_provider)
return tools

def nav_management_entries(self):
nav = [
(self.manage_team_url(), _("Team")),
(self.preferences_url(), _("Preferences")),
]
#for tool in self.tools.all():
# nav.append((tool.
for tool in self.project_tools():
tool_nav = tool.nav_management_entries()
if tool_nav:
nav.extend(tool_nav)
return nav

def dispatch(self, path_info):
Expand Down Expand Up @@ -132,19 +146,15 @@ def dispatch(self, path_info):
Also how to handle proxying to a downstream site whose root
lives exclusively at "/" (not /index.php)?
"""
path_info = path_info.lstrip("/")

if '/' in path_info:
app, path = path_info.split("/", 1)
else:
app = path_info
path = '/'
try:
return ProjectTool.objects.get(project=self, app=app).bound(path)
except ProjectTool.DoesNotExist:
pass
for tool in self.project_tools():
new_path = tool.match_request(path_info)
if new_path is not None:
return tool.bind_request(new_path)

# Fallback tool
try:
return ProjectTool.objects.get(project=self, app='/').bound(path_info)
return ProjectTool.objects.get(project=self, app='/').bind_request(path_info)
except ProjectTool.DoesNotExist:
return None

Expand Down Expand Up @@ -230,7 +240,18 @@ class Meta:

url = models.CharField(_('app url'), max_length=200)

def bound(self, path_info):
def match_request(self, path_info):
path_info = path_info.lstrip("/")

if '/' in path_info:
app, path = path_info.split("/", 1)
else:
app = path_info
path = '/'
if self.app == app:
return path

def bind_request(self, path_info):
self.script_name = self.project.homepage_url().rstrip("/") + "/%s/" % (
self.app.strip("/"))
self.path_info = path_info
Expand All @@ -242,6 +263,14 @@ def relative_path(self):
return "%s%s" % (self.project.homepage_url(),
path.strip("/"))

def nav_entries(self):
return [
(self.relative_path(), self.title),
]

def nav_management_entries(self):
return None

class ProjectMember(models.Model):

class Meta:
Expand Down
6 changes: 6 additions & 0 deletions thing/settings.py
Expand Up @@ -155,9 +155,15 @@
'contact_manager',
'registration_workflow',
'thing',

'thing_sympa',
)
ACCOUNT_ACTIVATION_DAYS = 7
LOGIN_REDIRECT_URL = "home"
THING_SYMPA_BASE_URL = 'http://lists.occupy.net/lists/'
THING_TOOL_PROVIDERS = [
'thing_sympa.tool.ToolProvider',
]

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
Expand Down
4 changes: 3 additions & 1 deletion thing/views.py
Expand Up @@ -205,9 +205,11 @@ def projects_project_dispatch(request, slug, path_info):
"base_url": tool.url,
"script_name": tool.script_name,
"path_info": tool.path_info,
"theme": request.project.theme_url(),
"deliverance_rules": tool.deliverance_rules,

"theme": request.project.theme_url(),
"project": request.project.to_json(),

"user": request.user.username,
"cookie_blacklist": [
"__ac",
Expand Down
Empty file added thing_sympa/__init__.py
Empty file.
14 changes: 14 additions & 0 deletions thing_sympa/models.py
@@ -0,0 +1,14 @@
from django.conf import settings
from django.db import models
from django.utils.translation import ugettext_lazy as _

from thing.models import Project

class ProjectSympaTool(models.Model):
project = models.ForeignKey(Project, verbose_name=_("project"), unique=True)

list_path = models.CharField(_('sympa list path'), max_length=80)
list_name = models.CharField(_('sympa list name'), max_length=200)

from django.contrib import admin
admin.site.register(ProjectSympaTool)
16 changes: 16 additions & 0 deletions thing_sympa/tests.py
@@ -0,0 +1,16 @@
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""

from django.test import TestCase


class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)
57 changes: 57 additions & 0 deletions thing_sympa/tool.py
@@ -0,0 +1,57 @@
from django.conf import settings

from thing_sympa.models import ProjectSympaTool

class ToolProvider(object):

_SYMPA_BASE_URL = settings.THING_SYMPA_BASE_URL
_SYMPA_TOOL_PATH = 'lists'
_DELIVERANCE_RULES = """
<ruleset>
<rule class="default">
<drop content="div#Menus .MenuBlock:first-child" />
<drop content="div#Menus" />
<replace theme="children://div[@id='oc-content-container']"
content="div#Menus" collapse-sources="1" />
<append theme="children://div[@id='oc-content-container']"
content="//div[@id='Stretcher']"
collapse-sources="1"
/>
</rule>
</ruleset>
"""

def __init__(self, project):
self._project = project
try:
self._tool = ProjectSympaTool.objects.get(project=project)
except ProjectSympaTool.DoesNotExist:
self._tool = None

def nav_entries(self):
if self._tool is None:
return None
return [(self._project.homepage_url()
+ self._SYMPA_TOOL_PATH
+ '/arc/%s' % self._tool.list_path,
self._tool.list_name)]

def nav_management_entries(self):
return None

def match_request(self, path_info):
if self._tool is None:
return None
path_info = path_info.lstrip("/").split("/")
if path_info[0] == self._SYMPA_TOOL_PATH:
return '/'.join(path_info[1:])

def bind_request(self, path_info):
self.script_name = self._project.homepage_url().rstrip("/") + "/%s/" % (
self._SYMPA_TOOL_PATH)
self.path_info = path_info
self.url = self._SYMPA_BASE_URL
self.deliverance_rules = self._DELIVERANCE_RULES
return self

1 change: 1 addition & 0 deletions thing_sympa/views.py
@@ -0,0 +1 @@
# Create your views here.

0 comments on commit 9f1f80f

Please sign in to comment.