progress saved
[qcg-portal.git] / filex / utils.py
index 9a96949..49c4d79 100644 (file)
@@ -1,21 +1,23 @@
 from functools import wraps
+import logging
 
 from django.core.validators import RegexValidator
 from django.http import JsonResponse
 from django.views.decorators.csrf import csrf_protect, csrf_exempt
 
 from filex.ftp import FTPError
-from filex.uploadhandler import FtpUploadHandler
 
 
-msg = u'Invalid value'
+_msg = u'Invalid value'
 host_validator = RegexValidator(r'^(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+'
-                                r'(?:[a-zA-Z]{2,6}\.?|[a-zA-Z0-9-]{2,}(?<!-)\.?))(?::\d+)?$', msg)
-path_validator = RegexValidator(r'^~?(?:/[^/\0]*)*$', msg)
-name_validator = RegexValidator(r'^[^/\0]+$', msg)
+                                r'(?:[a-zA-Z]{2,6}\.?|[a-zA-Z0-9-]{2,}(?<!-)\.?))(?::\d+)?$', _msg)
+path_validator = RegexValidator(r'^~?(?:/[^/\0]*)*$', _msg)
+name_validator = RegexValidator(r'^[^/\0]+$', _msg)
 
 
 def with_ftp_upload_handler(view_func):
+    from filex.uploadhandler import FtpUploadHandler
+
     @wraps(view_func)
     def wrapped_view(request, *args, **kwargs):
         request.upload_handlers = [FtpUploadHandler(request)]
@@ -23,12 +25,23 @@ def with_ftp_upload_handler(view_func):
         try:
             return csrf_protect(view_func)(request, *args, **kwargs)
         except FTPError as e:
-            status = 400
-            if 'No such file or directory' in e.message:
-                status = 404
-            elif 'Permission denied' in e.message:
-                status = 403
+            msg, status = parse_ftp_error(e)
+
+            logger = logging.getLogger('gridftp')
+            logger.error(e.verbose,
+                         extra={'user': request.user, 'path': request.path, 'params': dict(request.GET.iterlists())})
 
-            return JsonResponse({'error': e.message}, status=status)
+            return JsonResponse({'error': msg}, status=status)
 
     return csrf_exempt(wrapped_view)
+
+
+def parse_ftp_error(e):
+    msg, status = e.message, 400
+
+    if 'No such file or directory' in msg:
+        status = 404
+    elif 'Permission denied' in msg:
+        status = 403
+
+    return msg, status