1
from datetime import datetime
4
from BeautifulSoup import BeautifulSoup
7
from django.shortcuts import render_to_response
8
from django.template import RequestContext
9
from django.http import HttpResponse
10
from django.utils.functional import Promise
11
from django.utils.translation import force_unicode, check_for_language
12
from django.utils.simplejson import JSONEncoder
13
from django import forms
14
from django.template.defaultfilters import urlize as django_urlize
15
from django.core.paginator import Paginator, EmptyPage, InvalidPage
16
from django.conf import settings
18
from pybb import settings as pybb_settings
21
def render_to(template_path):
23
Expect the dict from view. Render returned dict with
28
def wrapper(request, *args, **kwargs):
30
#output = pdb.runcall(func, request, *args, **kwargs)
31
output = func(request, *args, **kwargs)
32
if not isinstance(output, dict):
34
kwargs = {'context_instance': RequestContext(request)}
35
if 'MIME_TYPE' in output:
36
kwargs['mimetype'] = output.pop('MIME_TYPE')
37
if 'TEMPLATE' in output:
38
template = output.pop('TEMPLATE')
40
template = template_path
41
return render_to_response(template, output, **kwargs)
47
def paged(paged_list_name, per_page):#, per_page_var='per_page'):
49
Parse page from GET data and pass it to view. Split the
50
query set returned from view.
54
def wrapper(request, *args, **kwargs):
55
result = func(request, *args, **kwargs)
56
if not isinstance(result, dict):
59
page = int(request.GET.get('page', 1))
63
real_per_page = per_page
67
#value = int(request.GET[per_page_var])
68
#except (ValueError, KeyError):
72
#real_per_page = value
74
from django.core.paginator import Paginator
75
paginator = Paginator(result['paged_qs'], real_per_page)
76
result[paged_list_name] = paginator.page(page).object_list
78
result['page_list'] = range(1, paginator.num_pages + 1)
79
result['pages'] = paginator.num_pages
80
result['per_page'] = real_per_page
81
result['request'] = request
90
Checks request.method is POST. Return error in JSON in other case.
92
If view returned dict, returns JsonResponse with this dict as content.
94
def wrapper(request, *args, **kwargs):
95
if request.method == 'POST':
97
response = func(request, *args, **kwargs)
99
response = {'error': traceback.format_exc()}
101
response = {'error': {'type': 403, 'message': 'Accepts only POST request'}}
102
if isinstance(response, dict):
103
return JsonResponse(response)
109
class LazyJSONEncoder(JSONEncoder):
111
This fing need to save django from crashing.
114
def default(self, o):
115
if isinstance(o, Promise):
116
return force_unicode(o)
118
return super(LazyJSONEncoder, self).default(o)
121
class JsonResponse(HttpResponse):
123
HttpResponse subclass that serialize data into JSON format.
126
def __init__(self, data, mimetype='application/json'):
127
json_data = LazyJSONEncoder().encode(data)
128
super(JsonResponse, self).__init__(
129
content=json_data, mimetype=mimetype)
132
def build_form(Form, _request, GET=False, *args, **kwargs):
134
Shorcut for building the form instance of given form class.
137
if not GET and 'POST' == _request.method:
138
form = Form(_request.POST, _request.FILES, *args, **kwargs)
139
elif GET and 'GET' == _request.method:
140
form = Form(_request.GET, _request.FILES, *args, **kwargs)
142
form = Form(*args, **kwargs)
148
Urlize plain text links in the HTML contents.
150
Do not urlize content of A and CODE tags.
153
soup = BeautifulSoup(data)
154
for chunk in soup.findAll(text=True):
158
if ptr.name == 'a' or ptr.name == 'code':
164
chunk = chunk.replaceWith(django_urlize(unicode(chunk)))
169
def quote_text(text, user, markup):
171
Quote message using selected markup.
173
text = user.username + " wrote:\n" + text
175
if markup == 'markdown':
176
return '>'+text.replace('\n','\n>').replace('\r','\n>') + '\n'
177
elif markup == 'bbcode':
178
return '[quote]\n%s\n[/quote]\n' % text
183
def absolute_url(path):
184
return 'http://%s%s' % (pybb_settings.HOST, path)
187
def memoize_method(func):
189
Cached result of function call.
192
def wrapper(self, *args, **kwargs):
193
CACHE_NAME = '__memcache'
195
cache = getattr(self, CACHE_NAME)
196
except AttributeError:
198
setattr(self, CACHE_NAME, cache)
199
key = (func, tuple(args), frozenset(kwargs.items()))
201
cache[key] = func(self, *args, **kwargs)
206
def paginate(items, request, per_page, total_count=None):
208
page_number = int(request.GET.get('page', 1))
212
paginator = Paginator(items, per_page)
214
paginator._count = total_count
217
page = paginator.page(page_number)
218
except (EmptyPage, InvalidPage):
219
page = paginator.page(1)
221
if page.has_previous:
222
get = request.GET.copy()
223
get['page'] = page.number - 1
224
page.previous_link = '?%s' % get.urlencode()
226
page.previous_link = None
229
get = request.GET.copy()
230
get['page'] = page.number + 1
231
page.next_link = '?%s' % get.urlencode()
233
page.next_link = None
235
#import pdb; pdb.set_trace()
237
return page, paginator
240
def set_language(request, language):
242
Change the language of session of authenticated user.
245
if language and check_for_language(language):
246
if hasattr(request, 'session'):
247
request.session['django_language'] = language
249
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language)
257
text = text.replace('&', '&')
258
text = text.replace('<', '<')
259
text = text.replace('>', '>')
260
text = text.replace('"', '"')
261
text = text.replace(''', '\'')