util.py 2.41 KB
# -*- coding: utf-8 -*-

import json
import sys
from django.conf import urls
from django.http import HttpResponseRedirect, Http404


def debug(entry, text):
  print>>sys.stderr, (u'%s: %s' % (entry, text)).encode('utf-8')

def error_redirect(request, error, url='/'):
  request.session['error'] = error
  return HttpResponseRedirect(url)

def message_redirect(request, message, url='/'):
  request.session['message'] = message
  return HttpResponseRedirect(url)

def make_form(request, form_class, **kwargs):
  if request.POST.get('det', '') == form_class.base_fields['det'].initial:
    return form_class(data=request.POST, files=request.FILES, **kwargs)
  else:
    return form_class(**kwargs)

def invert(l):
  return dict((e,nr) for (nr,e) in enumerate(l))

def generator_slice(generator, count):
  res = []
  try:
    for i in range(count):
      res.append(generator.next())
  except StopIteration:
    pass
  return res

def url(regex, view, **kwargs):
  if 'name' not in kwargs:
    kwargs['name'] = view.rsplit('.', 1)[-1]
  return urls.url(regex, view, **kwargs)

def stringify_keys(dictionary):
  return dict((keyword.encode('ascii'), value)
    for keyword, value in dictionary.iteritems())

# copypasta ze standardowego modułu bisect
def bisect_left(a, x, lo=0, hi=None, cmp=None):
  if cmp is None:
    cmp = __builtins__.cmp
  if lo < 0:
    raise ValueError('lo must be non-negative')
  if hi is None:
    hi = len(a)
  while lo < hi:
    mid = (lo+hi)//2
    if cmp(a[mid], x) < 0: lo = mid+1
    else: hi = mid
  return lo

def no_history():
  from django.db import connection
  cursor = connection.cursor()
  cursor.execute("SELECT set_config('var.user_id', '0', false)")

def reverse(seq):
  return seq[::-1]

def flatten(seq):
  return [item for subseq in seq for item in subseq]

def suffix(string, length):
  return string[-length:] if length > 0 else ''

def suffixes(s):
  return [s[i:] for i in range(len(s)+1)]

def cut_end(s, end):
  assert s.endswith(end)
  n = len(end)
  if n == 0:
    return s
  else:
    return s[:-n]

def error_messages(form):
  return '\n'.join(
    '%s: %s' % (form.fields[k].label, ' '.join(v)) if k != '__all__'
    else ' '.join(v)
    for k, v in form.errors.iteritems())

class GroupDict(dict):
  def add(self, key, value):
    if key not in self:
      self[key] = []
    self[key].append(value)

def json_encode(obj):
  return json.dumps(obj, sort_keys=True)

def json_decode(obj):
  return json.loads(obj)