| Conditions | 4 | 
| Total Lines | 54 | 
| Code Lines | 27 | 
| Lines | 0 | 
| Ratio | 0 % | 
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | #!/usr/bin/env python3  | 
            ||
| 82 | @login_required  | 
            ||
| 83 | def protected_view(request, path):  | 
            ||
| 84 | """  | 
            ||
| 85 | Redirect the request to the path used by nginx for protected media.  | 
            ||
| 86 | """  | 
            ||
| 87 | |||
| 88 |     logger.debug("Received path %s for download" % (path)) | 
            ||
| 89 | |||
| 90 | # test for submission ownership  | 
            ||
| 91 | dirname = os.path.dirname(path)  | 
            ||
| 92 | |||
| 93 | if dirname == 'data_source':  | 
            ||
| 94 | # I got a submission. Get a submission belonging to owner or 404  | 
            ||
| 95 | submission = get_object_or_404(  | 
            ||
| 96 | Submission,  | 
            ||
| 97 | owner=request.user,  | 
            ||
| 98 | uploaded_file=path)  | 
            ||
| 99 | |||
| 100 |         logger.debug("Got submission %s" % (submission)) | 
            ||
| 101 | |||
| 102 | # derive downloadable path. Applies to any protected file  | 
            ||
| 103 | full_path = os.path.join(  | 
            ||
| 104 | settings.PROTECTED_MEDIA_LOCATION_PREFIX, path  | 
            ||
| 105 | )  | 
            ||
| 106 | |||
| 107 | file_name = os.path.basename(path)  | 
            ||
| 108 | |||
| 109 | # try to determine file type  | 
            ||
| 110 | file_type, encoding = mimetypes.guess_type(path)  | 
            ||
| 111 | |||
| 112 |     logger.debug("Detected content type: %s" % (file_type)) | 
            ||
| 113 | |||
| 114 | # get file size using protected storage  | 
            ||
| 115 | storage = ProtectedFileSystemStorage()  | 
            ||
| 116 | file_size = storage.size(path)  | 
            ||
| 117 | |||
| 118 | # try to set file type to response  | 
            ||
| 119 | # https://djangosnippets.org/snippets/1710/  | 
            ||
| 120 | if file_type is None:  | 
            ||
| 121 | file_type = 'application/octet-stream'  | 
            ||
| 122 | |||
| 123 | # force django to attach file in response  | 
            ||
| 124 | response = HttpResponse(content_type=file_type)  | 
            ||
| 125 | |||
| 126 | if encoding is not None:  | 
            ||
| 127 | response['Content-Encoding'] = encoding  | 
            ||
| 128 | |||
| 129 | # https://stackoverflow.com/a/1158750/4385116  | 
            ||
| 130 | response["X-Accel-Redirect"] = smart_str(full_path)  | 
            ||
| 131 |     response['Content-Disposition'] = 'attachment; filename="{}"'.format( | 
            ||
| 132 | file_name)  | 
            ||
| 133 | response['Content-Length'] = file_size  | 
            ||
| 134 | |||
| 135 | return response  | 
            ||
| 136 |