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

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


def uniopen(filename):
    return (line.decode('utf-8').rstrip('\n') for line in open(filename))


def uniprint(text):
    print text.encode('utf-8')


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)