Merge branch 'devel'
[qcg-portal.git] / filex / utils.py
1 from functools import wraps
2 import logging
3
4 from django.core.validators import RegexValidator
5 from django.http import JsonResponse
6 from django.views.decorators.csrf import csrf_protect, csrf_exempt
7
8 from filex.ftp import FTPError
9
10
11 _msg = u'Invalid value'
12 host_validator = RegexValidator(r'^(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+'
13                                 r'(?:[a-zA-Z]{2,6}\.?|[a-zA-Z0-9-]{2,}(?<!-)\.?))(?::\d+)?$', _msg)
14 path_validator = RegexValidator(r'^~?(?:/[^/\0]*)*$', _msg)
15 name_validator = RegexValidator(r'^[^/\0]+$', _msg)
16
17
18 def with_ftp_upload_handler(view_func):
19     from filex.uploadhandler import FtpUploadHandler
20
21     @wraps(view_func)
22     def wrapped_view(request, *args, **kwargs):
23         request.upload_handlers = [FtpUploadHandler(request)]
24
25         try:
26             return csrf_protect(view_func)(request, *args, **kwargs)
27         except FTPError as e:
28             msg, status = parse_ftp_error(e)
29
30             logger = logging.getLogger('gridftp')
31             logger.error(e.verbose,
32                          extra={'user': request.user, 'path': request.path, 'params': dict(request.GET.iterlists())})
33
34             return JsonResponse({'error': msg}, status=status)
35
36     return csrf_exempt(wrapped_view)
37
38
39 def parse_ftp_error(e):
40     msg, status = e.message, 400
41
42     if 'No such file or directory' in msg:
43         status = 404
44     elif 'Permission denied' in msg:
45         status = 403
46
47     return msg, status