remove project files, now hosted at single app http://bitbucket.org/slav0nic/djangobb_project. This repo contains only app files
--HG-- rename : djangobb/djangobb_forum/__init__.py => djangobb_forum/__init__.py rename : djangobb/djangobb_forum/admin.py => djangobb_forum/admin.py rename : djangobb/djangobb_forum/context_processors.py => djangobb_forum/context_processors.py rename : djangobb/djangobb_forum/feeds.py => djangobb_forum/feeds.py rename : djangobb/djangobb_forum/fields.py => djangobb_forum/fields.py rename : djangobb/djangobb_forum/fixtures/test_forum.json => djangobb_forum/fixtures/test_forum.json rename : djangobb/djangobb_forum/forms.py => djangobb_forum/forms.py rename : djangobb/djangobb_forum/locale/ca/LC_MESSAGES/django.mo => djangobb_forum/locale/ca/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/ca/LC_MESSAGES/django.po => djangobb_forum/locale/ca/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/cs/LC_MESSAGES/django.mo => djangobb_forum/locale/cs/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/cs/LC_MESSAGES/django.po => djangobb_forum/locale/cs/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/de/LC_MESSAGES/django.mo => djangobb_forum/locale/de/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/de/LC_MESSAGES/django.po => djangobb_forum/locale/de/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/en/LC_MESSAGES/django.mo => djangobb_forum/locale/en/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/en/LC_MESSAGES/django.po => djangobb_forum/locale/en/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/es/LC_MESSAGES/django.mo => djangobb_forum/locale/es/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/es/LC_MESSAGES/django.po => djangobb_forum/locale/es/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/fo/LC_MESSAGES/django.mo => djangobb_forum/locale/fo/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/fo/LC_MESSAGES/django.po => djangobb_forum/locale/fo/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/fr/LC_MESSAGES/django.mo => djangobb_forum/locale/fr/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/fr/LC_MESSAGES/django.po => djangobb_forum/locale/fr/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/hi/LC_MESSAGES/django.mo => djangobb_forum/locale/hi/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/hi/LC_MESSAGES/django.po => djangobb_forum/locale/hi/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/it/LC_MESSAGES/django.mo => djangobb_forum/locale/it/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/it/LC_MESSAGES/django.po => djangobb_forum/locale/it/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/lt/LC_MESSAGES/django.mo => djangobb_forum/locale/lt/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/lt/LC_MESSAGES/django.po => djangobb_forum/locale/lt/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/mn/LC_MESSAGES/django.mo => djangobb_forum/locale/mn/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/mn/LC_MESSAGES/django.po => djangobb_forum/locale/mn/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/pl/LC_MESSAGES/django.mo => djangobb_forum/locale/pl/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/pl/LC_MESSAGES/django.po => djangobb_forum/locale/pl/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/pt_BR/LC_MESSAGES/django.mo => djangobb_forum/locale/pt_BR/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/pt_BR/LC_MESSAGES/django.po => djangobb_forum/locale/pt_BR/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/ru/LC_MESSAGES/django.mo => djangobb_forum/locale/ru/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/ru/LC_MESSAGES/django.po => djangobb_forum/locale/ru/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/uk_UA/LC_MESSAGES/django.mo => djangobb_forum/locale/uk_UA/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/uk_UA/LC_MESSAGES/django.po => djangobb_forum/locale/uk_UA/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/vi/LC_MESSAGES/django.mo => djangobb_forum/locale/vi/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/vi/LC_MESSAGES/django.po => djangobb_forum/locale/vi/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/locale/zh_CN/LC_MESSAGES/django.mo => djangobb_forum/locale/zh_CN/LC_MESSAGES/django.mo rename : djangobb/djangobb_forum/locale/zh_CN/LC_MESSAGES/django.po => djangobb_forum/locale/zh_CN/LC_MESSAGES/django.po rename : djangobb/djangobb_forum/management/__init__.py => djangobb_forum/management/__init__.py rename : djangobb/djangobb_forum/management/commands/__init__.py => djangobb_forum/management/commands/__init__.py rename : djangobb/djangobb_forum/management/commands/djangobb_unban.py => djangobb_forum/management/commands/djangobb_unban.py rename : djangobb/djangobb_forum/markups/__init__.py => djangobb_forum/markups/__init__.py rename : djangobb/djangobb_forum/middleware.py => djangobb_forum/middleware.py rename : djangobb/djangobb_forum/migrations/0001_initial.py => djangobb_forum/migrations/0001_initial.py rename : djangobb/djangobb_forum/migrations/0002_auto__add_field_profile_show_smilies.py => djangobb_forum/migrations/0002_auto__add_field_profile_show_smilies.py rename : djangobb/djangobb_forum/migrations/__init__.py => djangobb_forum/migrations/__init__.py rename : djangobb/djangobb_forum/models.py => djangobb_forum/models.py rename : djangobb/djangobb_forum/search_indexes.py => djangobb_forum/search_indexes.py rename : djangobb/djangobb_forum/settings.py => djangobb_forum/settings.py rename : djangobb/djangobb_forum/signals.py => djangobb_forum/signals.py rename : djangobb/djangobb_forum/subscription.py => djangobb_forum/subscription.py rename : djangobb/djangobb_forum/templates/forum/add_post.html => djangobb_forum/templates/forum/add_post.html rename : djangobb/djangobb_forum/templates/forum/base.html => djangobb_forum/templates/forum/base.html rename : djangobb/djangobb_forum/templates/forum/delete_posts.html => djangobb_forum/templates/forum/delete_posts.html rename : djangobb/djangobb_forum/templates/forum/edit_post.html => djangobb_forum/templates/forum/edit_post.html rename : djangobb/djangobb_forum/templates/forum/feeds/posts_description.html => djangobb_forum/templates/forum/feeds/posts_description.html rename : djangobb/djangobb_forum/templates/forum/feeds/posts_title.html => djangobb_forum/templates/forum/feeds/posts_title.html rename : djangobb/djangobb_forum/templates/forum/feeds/topics_description.html => djangobb_forum/templates/forum/feeds/topics_description.html rename : djangobb/djangobb_forum/templates/forum/feeds/topics_title.html => djangobb_forum/templates/forum/feeds/topics_title.html rename : djangobb/djangobb_forum/templates/forum/forum.html => djangobb_forum/templates/forum/forum.html rename : djangobb/djangobb_forum/templates/forum/forum_row.html => djangobb_forum/templates/forum/forum_row.html rename : djangobb/djangobb_forum/templates/forum/header.html => djangobb_forum/templates/forum/header.html rename : djangobb/djangobb_forum/templates/forum/index.html => djangobb_forum/templates/forum/index.html rename : djangobb/djangobb_forum/templates/forum/lofi/base.html => djangobb_forum/templates/forum/lofi/base.html rename : djangobb/djangobb_forum/templates/forum/lofi/footer.html => djangobb_forum/templates/forum/lofi/footer.html rename : djangobb/djangobb_forum/templates/forum/lofi/forum.html => djangobb_forum/templates/forum/lofi/forum.html rename : djangobb/djangobb_forum/templates/forum/lofi/header.html => djangobb_forum/templates/forum/lofi/header.html rename : djangobb/djangobb_forum/templates/forum/lofi/index.html => djangobb_forum/templates/forum/lofi/index.html rename : djangobb/djangobb_forum/templates/forum/lofi/pagination.html => djangobb_forum/templates/forum/lofi/pagination.html rename : djangobb/djangobb_forum/templates/forum/lofi/topic.html => djangobb_forum/templates/forum/lofi/topic.html rename : djangobb/djangobb_forum/templates/forum/mail_to.html => djangobb_forum/templates/forum/mail_to.html rename : djangobb/djangobb_forum/templates/forum/moderate.html => djangobb_forum/templates/forum/moderate.html rename : djangobb/djangobb_forum/templates/forum/moderators.html => djangobb_forum/templates/forum/moderators.html rename : djangobb/djangobb_forum/templates/forum/move_topic.html => djangobb_forum/templates/forum/move_topic.html rename : djangobb/djangobb_forum/templates/forum/pagination.html => djangobb_forum/templates/forum/pagination.html rename : djangobb/djangobb_forum/templates/forum/post_preview.html => djangobb_forum/templates/forum/post_preview.html rename : djangobb/djangobb_forum/templates/forum/profile/profile_admin.html => djangobb_forum/templates/forum/profile/profile_admin.html rename : djangobb/djangobb_forum/templates/forum/profile/profile_display.html => djangobb_forum/templates/forum/profile/profile_display.html rename : djangobb/djangobb_forum/templates/forum/profile/profile_essentials.html => djangobb_forum/templates/forum/profile/profile_essentials.html rename : djangobb/djangobb_forum/templates/forum/profile/profile_menu.html => djangobb_forum/templates/forum/profile/profile_menu.html rename : djangobb/djangobb_forum/templates/forum/profile/profile_messaging.html => djangobb_forum/templates/forum/profile/profile_messaging.html rename : djangobb/djangobb_forum/templates/forum/profile/profile_personal.html => djangobb_forum/templates/forum/profile/profile_personal.html rename : djangobb/djangobb_forum/templates/forum/profile/profile_personality.html => djangobb_forum/templates/forum/profile/profile_personality.html rename : djangobb/djangobb_forum/templates/forum/profile/profile_privacy.html => djangobb_forum/templates/forum/profile/profile_privacy.html rename : djangobb/djangobb_forum/templates/forum/report.html => djangobb_forum/templates/forum/report.html rename : djangobb/djangobb_forum/templates/forum/reputation.html => djangobb_forum/templates/forum/reputation.html rename : djangobb/djangobb_forum/templates/forum/reputation_form.html => djangobb_forum/templates/forum/reputation_form.html rename : djangobb/djangobb_forum/templates/forum/search_form.html => djangobb_forum/templates/forum/search_form.html rename : djangobb/djangobb_forum/templates/forum/search_posts.html => djangobb_forum/templates/forum/search_posts.html rename : djangobb/djangobb_forum/templates/forum/search_topics.html => djangobb_forum/templates/forum/search_topics.html rename : djangobb/djangobb_forum/templates/forum/topic.html => djangobb_forum/templates/forum/topic.html rename : djangobb/djangobb_forum/templates/forum/upload_avatar.html => djangobb_forum/templates/forum/upload_avatar.html rename : djangobb/djangobb_forum/templates/forum/user.html => djangobb_forum/templates/forum/user.html rename : djangobb/djangobb_forum/templates/forum/users.html => djangobb_forum/templates/forum/users.html rename : djangobb/djangobb_forum/templates/search/indexes/djangobb_forum/post_text.txt => djangobb_forum/templates/search/indexes/djangobb_forum/post_text.txt rename : djangobb/djangobb_forum/templatetags/__init__.py => djangobb_forum/templatetags/__init__.py rename : djangobb/djangobb_forum/templatetags/forum_extras.py => djangobb_forum/templatetags/forum_extras.py rename : djangobb/djangobb_forum/tests/__init__.py => djangobb_forum/tests/__init__.py rename : djangobb/djangobb_forum/tests/test_forum.py => djangobb_forum/tests/test_forum.py rename : djangobb/djangobb_forum/tests/test_profile.py => djangobb_forum/tests/test_profile.py rename : djangobb/djangobb_forum/tests/test_reputation.py => djangobb_forum/tests/test_reputation.py rename : djangobb/djangobb_forum/tests/test_templatetags.py => djangobb_forum/tests/test_templatetags.py rename : djangobb/djangobb_forum/tests/test_utils.py => djangobb_forum/tests/test_utils.py rename : djangobb/djangobb_forum/urls.py => djangobb_forum/urls.py rename : djangobb/djangobb_forum/util.py => djangobb_forum/util.py rename : djangobb/djangobb_forum/views.py => djangobb_forum/views.py
This commit is contained in:
parent
f883852286
commit
24bba12e07
422 changed files with 7 additions and 7201 deletions
275
djangobb_forum/util.py
Normal file
275
djangobb_forum/util.py
Normal file
|
@ -0,0 +1,275 @@
|
|||
import re
|
||||
from HTMLParser import HTMLParser
|
||||
from postmarkup import render_bbcode
|
||||
try:
|
||||
import markdown
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
from django.shortcuts import render_to_response
|
||||
from django.template import RequestContext
|
||||
from django.http import HttpResponse, Http404
|
||||
from django.utils.functional import Promise
|
||||
from django.utils.translation import force_unicode, check_for_language
|
||||
from django.utils.simplejson import JSONEncoder
|
||||
from django.template.defaultfilters import urlize as django_urlize
|
||||
from django.core.paginator import Paginator, EmptyPage, InvalidPage
|
||||
from django.contrib.sites.models import Site
|
||||
|
||||
from djangobb_forum import settings as forum_settings
|
||||
|
||||
|
||||
#compile smiles regexp
|
||||
_SMILES = [(re.compile(smile_re), path) for smile_re, path in forum_settings.SMILES]
|
||||
|
||||
|
||||
def render_to(template):
|
||||
"""
|
||||
Decorator for Django views that sends returned dict to render_to_response function.
|
||||
|
||||
Template name can be decorator parameter or TEMPLATE item in returned dictionary.
|
||||
RequestContext always added as context instance.
|
||||
If view doesn't return dict then decorator simply returns output.
|
||||
|
||||
Parameters:
|
||||
- template: template name to use
|
||||
|
||||
Examples:
|
||||
# 1. Template name in decorator parameters
|
||||
|
||||
@render_to('template.html')
|
||||
def foo(request):
|
||||
bar = Bar.object.all()
|
||||
return {'bar': bar}
|
||||
|
||||
# equals to
|
||||
def foo(request):
|
||||
bar = Bar.object.all()
|
||||
return render_to_response('template.html',
|
||||
{'bar': bar},
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
# 2. Template name as TEMPLATE item value in return dictionary
|
||||
|
||||
@render_to()
|
||||
def foo(request, category):
|
||||
template_name = '%s.html' % category
|
||||
return {'bar': bar, 'TEMPLATE': template_name}
|
||||
|
||||
#equals to
|
||||
def foo(request, category):
|
||||
template_name = '%s.html' % category
|
||||
return render_to_response(template_name,
|
||||
{'bar': bar},
|
||||
context_instance=RequestContext(request))
|
||||
"""
|
||||
|
||||
def renderer(function):
|
||||
def wrapper(request, *args, **kwargs):
|
||||
output = function(request, *args, **kwargs)
|
||||
if not isinstance(output, dict):
|
||||
return output
|
||||
tmpl = output.pop('TEMPLATE', template)
|
||||
return render_to_response(tmpl, output, context_instance=RequestContext(request))
|
||||
return wrapper
|
||||
return renderer
|
||||
|
||||
|
||||
def absolute_url(path):
|
||||
return 'http://%s%s' % (Site.objects.get_current().domain, path)
|
||||
|
||||
|
||||
def paged(paged_list_name, per_page):
|
||||
"""
|
||||
Parse page from GET data and pass it to view. Split the
|
||||
query set returned from view.
|
||||
"""
|
||||
|
||||
def decorator(func):
|
||||
def wrapper(request, *args, **kwargs):
|
||||
result = func(request, *args, **kwargs)
|
||||
if not isinstance(result, dict) or 'paged_qs' not in result:
|
||||
return result
|
||||
try:
|
||||
page = int(request.GET.get('page', 1))
|
||||
except ValueError:
|
||||
page = 1
|
||||
|
||||
real_per_page = per_page
|
||||
|
||||
#if per_page_var:
|
||||
#try:
|
||||
#value = int(request.GET[per_page_var])
|
||||
#except (ValueError, KeyError):
|
||||
#pass
|
||||
#else:
|
||||
#if value > 0:
|
||||
#real_per_page = value
|
||||
|
||||
from django.core.paginator import Paginator
|
||||
paginator = Paginator(result['paged_qs'], real_per_page)
|
||||
try:
|
||||
page_obj = paginator.page(page)
|
||||
except (InvalidPage, EmptyPage):
|
||||
raise Http404
|
||||
result[paged_list_name] = page_obj.object_list
|
||||
result['is_paginated'] = page_obj.has_other_pages(),
|
||||
result['page_obj'] = page_obj,
|
||||
result['page'] = page
|
||||
result['page_range'] = paginator.page_range,
|
||||
result['pages'] = paginator.num_pages
|
||||
result['results_per_page'] = paginator.per_page,
|
||||
result['request'] = request
|
||||
return result
|
||||
return wrapper
|
||||
|
||||
return decorator
|
||||
|
||||
|
||||
class LazyJSONEncoder(JSONEncoder):
|
||||
"""
|
||||
This fing need to save django from crashing.
|
||||
"""
|
||||
|
||||
def default(self, o):
|
||||
if isinstance(o, Promise):
|
||||
return force_unicode(o)
|
||||
else:
|
||||
return super(LazyJSONEncoder, self).default(o)
|
||||
|
||||
|
||||
class JsonResponse(HttpResponse):
|
||||
"""
|
||||
HttpResponse subclass that serialize data into JSON format.
|
||||
"""
|
||||
|
||||
def __init__(self, data, mimetype='application/json'):
|
||||
json_data = LazyJSONEncoder().encode(data)
|
||||
super(JsonResponse, self).__init__(
|
||||
content=json_data, mimetype=mimetype)
|
||||
|
||||
|
||||
def build_form(Form, _request, GET=False, *args, **kwargs):
|
||||
"""
|
||||
Shorcut for building the form instance of given form class
|
||||
"""
|
||||
|
||||
if not GET and 'POST' == _request.method:
|
||||
form = Form(_request.POST, _request.FILES, *args, **kwargs)
|
||||
elif GET and 'GET' == _request.method:
|
||||
form = Form(_request.GET, _request.FILES, *args, **kwargs)
|
||||
else:
|
||||
form = Form(*args, **kwargs)
|
||||
return form
|
||||
|
||||
|
||||
class ExcludeTagsHTMLParser(HTMLParser):
|
||||
"""
|
||||
Class for html parsing with excluding specified tags.
|
||||
"""
|
||||
|
||||
def __init__(self, func, tags=('a', 'pre', 'span')):
|
||||
HTMLParser.__init__(self)
|
||||
self.func = func
|
||||
self.is_ignored = False
|
||||
self.tags = tags
|
||||
self.html = []
|
||||
|
||||
def handle_starttag(self, tag, attrs):
|
||||
self.html.append('<%s%s>' % (tag, self.__html_attrs(attrs)))
|
||||
if tag in self.tags:
|
||||
self.is_ignored = True
|
||||
|
||||
def handle_data(self, data):
|
||||
if not self.is_ignored:
|
||||
data = self.func(data)
|
||||
self.html.append(data)
|
||||
|
||||
def handle_startendtag(self, tag, attrs):
|
||||
self.html.append('<%s%s/>' % (tag, self.__html_attrs(attrs)))
|
||||
|
||||
def handle_endtag(self, tag):
|
||||
self.is_ignored = False
|
||||
self.html.append('</%s>' % (tag))
|
||||
|
||||
def handle_entityref(self, name):
|
||||
self.html.append('&%s;' % name)
|
||||
|
||||
def handle_charref(self, name):
|
||||
self.html.append('&#%s;' % name)
|
||||
|
||||
def unescape(self, s):
|
||||
#we don't need unescape data (without this possible XSS-attack)
|
||||
return s
|
||||
|
||||
def __html_attrs(self, attrs):
|
||||
_attrs = ''
|
||||
if attrs:
|
||||
_attrs = ' %s' % (' '.join([('%s="%s"' % (k,v)) for k,v in attrs]))
|
||||
return _attrs
|
||||
|
||||
def feed(self, data):
|
||||
HTMLParser.feed(self, data)
|
||||
self.html = ''.join(self.html)
|
||||
|
||||
|
||||
def urlize(data):
|
||||
"""
|
||||
Urlize plain text links in the HTML contents.
|
||||
|
||||
Do not urlize content of A and CODE tags.
|
||||
"""
|
||||
|
||||
parser = ExcludeTagsHTMLParser(django_urlize)
|
||||
parser.feed(data)
|
||||
urlized_html = parser.html
|
||||
parser.close()
|
||||
return urlized_html
|
||||
|
||||
def _smile_replacer(data):
|
||||
for smile, path in _SMILES:
|
||||
data = smile.sub(path, data)
|
||||
return data
|
||||
|
||||
def smiles(data):
|
||||
"""
|
||||
Replace text smiles.
|
||||
"""
|
||||
|
||||
parser = ExcludeTagsHTMLParser(_smile_replacer)
|
||||
parser.feed(data)
|
||||
smiled_html = parser.html
|
||||
parser.close()
|
||||
return smiled_html
|
||||
|
||||
def paginate(items, request, per_page, total_count=None):
|
||||
try:
|
||||
page_number = int(request.GET.get('page', 1))
|
||||
except ValueError:
|
||||
page_number = 1
|
||||
|
||||
paginator = Paginator(items, per_page)
|
||||
pages = paginator.num_pages
|
||||
try:
|
||||
paged_list_name = paginator.page(page_number).object_list
|
||||
except (InvalidPage, EmptyPage):
|
||||
raise Http404
|
||||
return pages, paginator, paged_list_name
|
||||
|
||||
def set_language(request, language):
|
||||
"""
|
||||
Change the language of session of authenticated user.
|
||||
"""
|
||||
|
||||
if check_for_language(language):
|
||||
request.session['django_language'] = language
|
||||
|
||||
|
||||
def convert_text_to_html(text, markup):
|
||||
if markup == 'bbcode':
|
||||
text = render_bbcode(text)
|
||||
elif markup == 'markdown':
|
||||
text = markdown.markdown(text, safe_mode='escape')
|
||||
else:
|
||||
raise Exception('Invalid markup property: %s' % markup)
|
||||
return urlize(text)
|
Reference in a new issue