X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/c4599df2f08c95fd317967746a3325c3b168acdd..507752b933a466dd8e962c0e34d0ec74d6de55b7:/apps/catalogue/helpers.py?ds=inline diff --git a/apps/catalogue/helpers.py b/apps/catalogue/helpers.py index a97a0400..060d106c 100644 --- a/apps/catalogue/helpers.py +++ b/apps/catalogue/helpers.py @@ -1,13 +1,18 @@ +# -*- coding: utf-8 -*- +import filecmp +import json +import re from datetime import date from functools import wraps +from inspect import getargspec +from os import listdir from os.path import join -from os import listdir, stat from shutil import move, rmtree -from django.conf import settings -import re -import filecmp -from django.db.models import Count +from django.conf import settings +from django.http import HttpResponse +from django.template import RequestContext +from django.template.loader import render_to_string def active_tab(tab): @@ -37,6 +42,60 @@ def cached_in_field(field_name): return decorator +class AjaxError(Exception): + pass + + +def ajax(method, template=None, login_required=False, permission_required=None): + def decorator(fun): + @wraps(fun) + def ajax_view(request): + kwargs = {} + request_params = None + if method == 'post': + request_params = request.POST + elif method == 'get': + request_params = request.GET + fun_params, xx, fun_kwargs, defaults = getargspec(fun) + if defaults: + required_params = fun_params[1:-len(defaults)] + else: + required_params = fun_params[1:] + missing_params = set(required_params) - set(request_params) + if missing_params: + res = { + 'result': 'error', + 'msg': 'missing params: %s' % ', '.join(missing_params), + } + else: + if request_params: + request_params = dict( + (key, json.loads(value)) + for key, value in request_params.iteritems() + if fun_kwargs or key in fun_params) + kwargs.update(request_params) + res = None + if login_required and not request.user.is_authenticated(): + res = {'result': 'error', 'msg': 'logout'} + if (permission_required and + not request.user.has_perm(permission_required)): + res = {'result': 'error', 'msg': 'access denied'} + if not res: + try: + res = fun(request, **kwargs) + if res and template: + res = {'html': render_to_string(template, res, RequestContext(request))} + except AjaxError as e: + res = {'result': e.args[0]} + if 'result' not in res: + res['result'] = 'ok' + return HttpResponse(json.dumps(res), content_type='application/json; charset=utf-8') + + return ajax_view + + return decorator + + def parse_isodate(isodate): try: return date(*[int(p) for p in isodate.split('-')]) @@ -46,8 +105,6 @@ def parse_isodate(isodate): class GalleryMerger(object): def __init__(self, dest_gallery, src_gallery): - assert isinstance(dest_gallery, str) - assert isinstance(src_gallery, str) self.dest = dest_gallery self.src = src_gallery self.dest_size = None @@ -70,6 +127,11 @@ class GalleryMerger(object): m = not always and re.match(r"^([0-9])-", name) return "%1d-%s" % (prefix, m and name[2:] or name) + @property + def was_merged(self): + """Check if we have gallery size recorded""" + return self.dest_size is not None + def merge(self): if not self.dest: return self.src @@ -77,8 +139,10 @@ class GalleryMerger(object): return self.dest files = listdir(self.path(self.dest)) + files.sort() self.dest_size = len(files) files_other = listdir(self.path(self.src)) + files_other.sort() self.src_size = len(files_other) if files and files_other: @@ -101,7 +165,8 @@ class GalleryMerger(object): for f in files: p = self.get_prefix(f) if p: - if p > last_pfx: last_pfx = p + if p > last_pfx: + last_pfx = p else: files_prefixed = False break @@ -117,7 +182,7 @@ class GalleryMerger(object): for f in files_other: pfx = self.get_prefix(f) if pfx is not None: - if not pfx in prefixes: + if pfx not in prefixes: last_pfx += 1 prefixes[pfx] = last_pfx renamed_files_other[f] = self.set_prefix(f, prefixes[pfx]) @@ -132,14 +197,10 @@ class GalleryMerger(object): renamed_files_other[f] = self.set_prefix(f, 1, True) # finally, move / rename files. - from nose.tools import set_trace - # set_trace() for frm, to in renamed_files.items(): - move(join(self.path(self.dest), frm), - join(self.path(self.dest), to)) + move(join(self.path(self.dest), frm), join(self.path(self.dest), to)) for frm, to in renamed_files_other.items(): - move(join(self.path(self.src), frm), - join(self.path(self.dest), to)) + move(join(self.path(self.src), frm), join(self.path(self.dest), to)) rmtree(join(self.path(self.src))) return self.dest