6
6
from sys import version_info as python_version
7
7
from django .utils .timezone import now
8
8
from lxml import etree
9
+ import mimetypes
10
+ import urllib
9
11
10
12
from django .http import HttpResponseForbidden , HttpResponseNotAllowed , HttpResponseBadRequest , \
11
- HttpResponseNotModified , HttpResponseRedirect , Http404
13
+ HttpResponseNotModified , HttpResponseRedirect , Http404 , HttpResponse
12
14
from django .utils .decorators import method_decorator
13
15
from django .utils .functional import cached_property
14
- from django .utils .http import parse_etags
15
- from django .shortcuts import render_to_response
16
+ from django .utils .http import parse_etags , http_date
16
17
from django .views .decorators .csrf import csrf_exempt
17
- from django .views .generic import View
18
+ from django .views .generic import TemplateView
18
19
19
- from djangodav .responses import ResponseException , HttpResponsePreconditionFailed , HttpResponseCreated , HttpResponseNoContent , \
20
+ from djangodav .responses import HttpResponsePreconditionFailed , HttpResponseCreated , HttpResponseNoContent , \
20
21
HttpResponseConflict , HttpResponseMediatypeNotSupported , HttpResponseBadGateway , \
21
- HttpResponseMultiStatus , HttpResponseLocked , HttpResponse
22
- from djangodav .utils import WEBDAV_NSMAP , D , url_join , get_property_tag_list , rfc1123_date
22
+ HttpResponseMultiStatus , HttpResponseLocked , RedirectFSException , ResponseException , AsSendFileFS
23
+ from djangodav .utils import WEBDAV_NSMAP , D , get_property_tag_list , rfc1123_date
23
24
from djangodav import VERSION as djangodav_version
24
25
from django import VERSION as django_version , get_version
25
26
27
+ from sendfile import sendfile
28
+
26
29
PATTERN_IF_DELIMITER = re .compile (r'(<([^>]+)>)|(\(([^\)]+)\))' )
27
30
28
- class DavView (View ):
31
+
32
+ class DavView (TemplateView ):
29
33
resource_class = None
30
34
lock_class = None
31
35
acl_class = None
@@ -173,6 +177,12 @@ def evaluate_conditions(self, res):
173
177
cond_if = '<*>' + cond_if
174
178
#for (tmpurl, url, tmpcontent, content) in PATTERN_IF_DELIMITER.findall(cond_if):
175
179
180
+ def get_context_data (self , ** kwargs ):
181
+ context = super (DavView , self ).get_context_data (** kwargs )
182
+ context ['resource' ] = self .resource
183
+ context ['base_url' ] = self .base_url
184
+ return context
185
+
176
186
def get (self , request , path , head = False , * args , ** kwargs ):
177
187
if not self .resource .exists :
178
188
raise Http404 ("Resource doesn't exists" )
@@ -190,9 +200,26 @@ def get(self, request, path, head=False, *args, **kwargs):
190
200
response ['ETag' ] = self .resource .getetag
191
201
if not head :
192
202
response ['Content-Length' ] = self .resource .getcontentlength
193
- response .content = self .resource .read ()
203
+ try :
204
+ response .content = self .resource .read ()
205
+ except AsSendFileFS :
206
+ assert sendfile is not None , "django-sendfile is not installed."
207
+ full_path = self .resource .get_abs_path ().encode ('utf-8' )
208
+ if self .resource .quote :
209
+ full_path = urllib .quote (full_path )
210
+ response = sendfile (request , full_path )
211
+ return response
212
+ except RedirectFSException :
213
+ response = HttpResponse ()
214
+ response ['X-Accel-Redirect' ] = url_join (self .resource .prefix , self .resource .get_path ().encode ('utf-8' ))
215
+ response ['X-Accel-Charset' ] = 'utf-8'
216
+ response ['Content-Type' ] = mimetypes .guess_type (self .resource .displayname )
217
+ response ['Content-Length' ] = self .resource .getcontentlength
218
+ response ['Last-Modified' ] = http_date (self .resource .getlastmodified )
219
+ response ['ETag' ] = self .resource .getetag
220
+ raise ResponseException (response )
194
221
elif not head :
195
- response = render_to_response ( self . template_name , dict ( resource = self . resource , base_url = self . base_url ) )
222
+ response = super ( DavView , self ). get ( request , * args , ** kwargs )
196
223
response ['Last-Modified' ] = self .resource .getlastmodified
197
224
return response
198
225
0 commit comments