+# -*- 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):
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('-')])
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
@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):
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
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])
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