Skip to content

Commit

Permalink
Adds the option to create static pages with several options to custom…
Browse files Browse the repository at this point in the history
…ize its behaviour.

git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@381 0cfe37f9-358a-4d5e-be75-b63607b5c754
  • Loading branch information
hernani committed Jun 7, 2010
1 parent 01eed15 commit 9308d78
Show file tree
Hide file tree
Showing 32 changed files with 433 additions and 61 deletions.
3 changes: 2 additions & 1 deletion forum/actions/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from meta import *
from node import *
from user import *
from user import *
from page import *
2 changes: 1 addition & 1 deletion forum/actions/meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ def describe(self, viewer=None):

return _("%(user)s accepted %(answerer)s answer on %(asker)s question %(question)s") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'answerer': self.hyperlink(answer.author.get_profile_url(), self.friendly_username(viewer, answer.author)),
'answerer': self.hyperlink(answer.author.get_profile_url(), self.friendly_ownername(viewer, answer.author)),
'asker': asker,
'question': self.hyperlink(question.get_absolute_url(), question.title)
}
Expand Down
58 changes: 58 additions & 0 deletions forum/actions/page.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from django.utils.translation import ugettext as _
from forum.models.action import ActionProxy
from forum.models import Page

class NewPageAction(ActionProxy):
verb = _("created")

def process_data(self, **data):
title = data.pop('title')
body = data.pop('content')

page = Page(author=self.user, title=title, body=body, extra=data)
page.save()
self.node = page

def describe(self, viewer=None):
return _("%(user)s created a new page titled %(page)s") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'page': self.hyperlink(self.node.get_absolute_url(), self.node.title)
}

class EditPageAction(ActionProxy):
verb = _("edited")

def process_data(self, **data):
title = data.pop('title')
body = data.pop('content')

if (title != self.node.title) and (body != self.node.body):
self.node.create_revision(self.user, title=title, body=body)

self.node.extra = data
self.node.save()

def describe(self, viewer=None):
return _("%(user)s edited the page titled %(page)s") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'page': self.hyperlink(self.node.get_absolute_url(), self.node.title)
}

class PublishAction(ActionProxy):
verb = _("published")

def process_action(self):
self.node.marked = True
self.node.nstate.published = self
self.node.save()

def cancel_action(self):
self.node.marked = False
self.node.nstate.published = None
self.node.save()

def describe(self, viewer=None):
return _("%(user)s published a new page titled %(page)s") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'page': self.hyperlink(self.node.get_absolute_url(), self.node.title)
}
2 changes: 1 addition & 1 deletion forum/actions/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class EditProfileAction(ActionProxy):
def describe(self, viewer=None):
return _("%(user)s edited %(hes_or_your)s %(profile_link)s") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'hes_or_your': self.viewer_or_user_verb(viewer, self.user, _('your'), _('hes')),
'hes_or_your': self.viewer_or_user_verb(viewer, self.user, _('your'), _('his')),
'profile_link': self.hyperlink(self.user.get_profile_url(), _('profile')),
}

Expand Down
4 changes: 4 additions & 0 deletions forum/forms/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from qanda import *
from admin import *
from auth import *
from general import *
86 changes: 86 additions & 0 deletions forum/forms/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import socket
from django import forms
from django.utils.translation import ugettext as _
from qanda import TitleField, EditorField
from forum import settings

class IPListField(forms.CharField):
def clean(self, value):
ips = [ip.strip() for ip in value.strip().strip(',').split(',')]
iplist = []

if len(ips) < 1:
raise forms.ValidationError(_('Please input at least one ip address'))

for ip in ips:
try:
socket.inet_aton(ip)
except socket.error:
raise forms.ValidationError(_('Invalid ip address: %s' % ip))

if not len(ip.split('.')) == 4:
raise forms.ValidationError(_('Please use the dotted quad notation for the ip addresses'))

iplist.append(ip)

return iplist

class MaintenanceModeForm(forms.Form):
ips = IPListField(label=_('Allow ips'),
help_text=_('Comma separated list of ips allowed to access the site while in maintenance'),
required=True,
widget=forms.TextInput(attrs={'class': 'longstring'}))

message = forms.CharField(label=_('Message'),
help_text=_('A message to display to your site visitors while in maintainance mode'),
widget=forms.Textarea)


TEMPLATE_CHOICES = (
('default', _('Default')),
('sidebar', _('Default with sidebar')),
('none', _('None')),
)

RENDER_CHOICES = (
('markdown', _('Markdown')),
('html', _('HTML')),
('escape', _('Escaped'))
)

class UrlFieldWidget(forms.TextInput):
def render(self, name, value, attrs=None):
if not value:
value = ''

return """
<input class="url_field" type="text" name="%(name)s" value="%(value)s" />
<a class="url_field_anchor" target="_blank" href="%(app_url)s%(script_alias)s"></a>
""" % {'name': name, 'value': value, 'app_url': settings.APP_URL, 'script_alias': settings.FORUM_SCRIPT_ALIAS}


class PageForm(forms.Form):

def __init__(self, page, *args, **kwargs):
if page:
initial = page.extra
initial.update(dict(title=page.title, content=page.body))
super(PageForm, self).__init__(initial=initial, *args, **kwargs)
else:
super(PageForm, self).__init__(*args, **kwargs)


title = forms.CharField(label=_('Title'), max_length=255, widget=forms.TextInput(attrs={'class': 'longstring'}), initial='New page')
path = forms.CharField(label=_('Page URL'), widget=UrlFieldWidget, initial='pages/new/')

content = forms.CharField(label=_('Page Content'), widget=forms.Textarea(attrs={'rows': 30}))
render = forms.ChoiceField(widget=forms.RadioSelect, choices=RENDER_CHOICES, initial='markdown', label=_('Render Mode'))

template = forms.ChoiceField(widget=forms.RadioSelect, choices=TEMPLATE_CHOICES, initial='default', label=_('Template'))
sidebar = forms.CharField(label=_('Sidebar Content'), widget=forms.Textarea(attrs={'rows': 20}), required=False)
sidebar_wrap = forms.BooleanField(label=_("Wrap sidebar block"), initial=True, required=False)
sidebar_render = forms.ChoiceField(widget=forms.RadioSelect, choices=RENDER_CHOICES, initial='markdown', label=_('Sidebar Render Mode'))

comments = forms.BooleanField(label=_("Allow comments"), initial=False, required=False)


2 changes: 1 addition & 1 deletion forum/authentication/forms.py → forum/forms/auth.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from forum.utils.forms import NextUrlField, UserNameField, UserEmailField, SetPasswordForm
from general import NextUrlField, UserNameField, UserEmailField, SetPasswordForm
from forum.models import Question, User
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import ugettext as _
Expand Down
File renamed without changes.
6 changes: 3 additions & 3 deletions forum/forms.py → forum/forms/qanda.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import re
from datetime import date
from django import forms
from models import *
from forum.models import *
from django.utils.translation import ugettext as _
from django.contrib.humanize.templatetags.humanize import apnumber
from forum.models import User

from django.utils.safestring import mark_safe
from forum.utils.forms import NextUrlField, UserNameField, SetPasswordForm
from general import NextUrlField, UserNameField, SetPasswordForm
from forum import settings
import logging

Expand Down Expand Up @@ -255,6 +254,7 @@ def clean_email(self):
if self.user.email != self.cleaned_data['email']:
if settings.EMAIL_UNIQUE == True:
if 'email' in self.cleaned_data:
from forum.models import User
try:
User.objects.get(email = self.cleaned_data['email'])
except User.DoesNotExist:
Expand Down
2 changes: 1 addition & 1 deletion forum/middleware/anon_user.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django.http import HttpResponseRedirect
from forum.utils.forms import get_next_url
from forum.forms import get_next_url
from django.utils.translation import ugettext as _
from forum.user_messages import create_message, get_and_delete_messages
from forum import settings
Expand Down
2 changes: 1 addition & 1 deletion forum/middleware/cancel.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django.http import HttpResponseRedirect
from forum.utils.forms import get_next_url
from forum.forms import get_next_url
import logging
class CancelActionMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
Expand Down
3 changes: 2 additions & 1 deletion forum/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from action import Action, ActionRepute
from meta import Vote, Flag, Badge, Award
from utils import KeyValue
from page import Page

try:
from south.modelsinspector import add_introspection_rules
Expand All @@ -22,7 +23,7 @@
'Answer', 'AnswerRevision',
'Tag', 'Comment', 'MarkedTag', 'Badge', 'Award',
'ValidationHash', 'AuthKeyUserAssociation', 'SubscriptionSettings', 'KeyValue', 'User',
'Action', 'ActionRepute', 'Vote', 'Flag'
'Action', 'ActionRepute', 'Vote', 'Flag', 'Page'
]


Expand Down
6 changes: 5 additions & 1 deletion forum/models/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,12 @@ def user(self):
def html(self):
return self.as_markdown()

@classmethod
def _as_markdown(cls, content, *extensions):
return mark_safe(sanitize_html(markdown.markdown(content, extensions=extensions)))

def as_markdown(self, *extensions):
return mark_safe(sanitize_html(markdown.markdown(self.body, extensions=extensions)))
return self._as_markdown(self.body, *extensions)

@property
def headline(self):
Expand Down
40 changes: 40 additions & 0 deletions forum/models/page.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from base import *
from django.utils.translation import ugettext as _

class Page(Node):
friendly_name = _("page")

@property
def published(self):
return self.marked

def save(self, *args, **kwargs):
old_options = self._original_state.get('extra', None)

super(Page, self).save(*args, **kwargs)

registry = settings.STATIC_PAGE_REGISTRY

if old_options:
registry.pop(old_options.get('path', ''), None)

registry[self.extra['path']] = self.id


settings.STATIC_PAGE_REGISTRY.set_value(registry)

@property
def headline(self):
if self.published:
return self.title
else:
return _("[Unpublished] %s") % self.title

@models.permalink
def get_absolute_url(self):
return ('static_page', (), {'path': self.extra['path']})

class Meta(Node.Meta):
proxy = True


3 changes: 2 additions & 1 deletion forum/settings/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import os.path
from base import Setting, SettingSet
from forms import ImageFormWidget

from django.forms.widgets import Textarea
from django.utils.translation import ugettext_lazy as _
Expand All @@ -18,6 +17,8 @@
APP_URL = djsettings.APP_URL
FORUM_SCRIPT_ALIAS = djsettings.FORUM_SCRIPT_ALIAS

STATIC_PAGE_REGISTRY = Setting('STATIC_PAGE_REGISTRY', {})


from basic import *
from sidebar import *
Expand Down
34 changes: 1 addition & 33 deletions forum/settings/forms.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import os
import socket
from string import strip
from django import forms
from base import Setting
from forum.settings.base import Setting
from django.utils.translation import ugettext as _
from django.core.files.storage import FileSystemStorage

Expand Down Expand Up @@ -110,36 +109,5 @@ def value_from_datadict(self, data, files, name):
return ', '.join(data[name])


class IPListField(forms.CharField):
def clean(self, value):
ips = [ip.strip() for ip in value.strip().strip(',').split(',')]
iplist = []

if len(ips) < 1:
raise forms.ValidationError(_('Please input at least one ip address'))

for ip in ips:
try:
socket.inet_aton(ip)
except socket.error:
raise forms.ValidationError(_('Invalid ip address: %s' % ip))

if not len(ip.split('.')) == 4:
raise forms.ValidationError(_('Please use the dotted quad notation for the ip addresses'))

iplist.append(ip)

return iplist

class MaintenanceModeForm(forms.Form):
ips = IPListField(label=_('Allow ips'),
help_text=_('Comma separated list of ips allowed to access the site while in maintenance'),
required=True,
widget=forms.TextInput(attrs={'class': 'longstring'}))

message = forms.CharField(label=_('Message'),
help_text=_('A message to display to your site visitors while in maintainance mode'),
widget=forms.Textarea)



17 changes: 17 additions & 0 deletions forum/skins/default/media/js/osqa.admin.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,21 @@ $(function() {
}
}
});

$('.url_field').each(function() {
var $input = $(this);
var $anchor = $input.parent().find('.url_field_anchor');
var app_url = $anchor.attr('href');

function rewrite_anchor() {
var val = app_url + $input.val();

$anchor.attr('href', val);
$anchor.html(val);

}

$input.keyup(rewrite_anchor);
rewrite_anchor();
});
});
3 changes: 2 additions & 1 deletion forum/skins/default/templates/osqaadmin/djstyle_base.html
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ <h1 id="site-name"><a href="{% url admin_index %}">{{ settings.APP_SHORT_NAME }}
</div>
</div>
<div class="breadcrumbs">
<a href="{% url index %}">{% trans "Home" %}</a> &gt
<a href="{% url index %}">{% trans "Home" %}</a> &gt;
<a href="{% url admin_index %}">{% trans "Dashboard" %}</a> &gt;
{% block pagename %}{% endblock %} -
{% block description %}{% endblock %}
Expand Down Expand Up @@ -82,6 +82,7 @@ <h2>{% trans "Forum settings" %}</h2>
<div id="pages-sets-menu" class="module">
<h2>{% trans "Static content" %}</h2>
<ul>
<li><a href="{% url admin_static_pages %}">{% trans "Custom Pages" %}</a></li>
<li><a href="{% url admin_set allsets.about.name %}">{{ allsets.about.title }}</a></li>
<li><a href="{% url admin_set allsets.faq.name %}">{{ allsets.faq.title }}</a></li>
<li><a href="{% url admin_set allsets.sidebar.name %}">{{ allsets.sidebar.title }}</a></li>
Expand Down
Loading

0 comments on commit 9308d78

Please sign in to comment.