X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/f681a59fe987944e665fca8b0796b38ae24d0d98..da0c65e6008cc1dbc88b05ed53553d70ec04e3fd:/apps/catalogue/helpers.py?ds=sidebyside diff --git a/apps/catalogue/helpers.py b/apps/catalogue/helpers.py index d340b461..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('-')]) @@ -70,7 +129,7 @@ class GalleryMerger(object): @property def was_merged(self): - "Check if we have gallery size recorded" + """Check if we have gallery size recorded""" return self.dest_size is not None def merge(self): @@ -106,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 @@ -122,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]) @@ -138,11 +198,9 @@ class GalleryMerger(object): # finally, move / rename files. 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