--- a/Allura/allura/controllers/attachments.py
+++ b/Allura/allura/controllers/attachments.py
@@ -2,8 +2,10 @@
from webob import exc
from tg import expose, request, response, redirect
+from ming.utils import LazyProperty
+
from allura.lib.security import require, has_artifact_access
-from allura.controllers import BaseController
+from .base import BaseController
class AttachmentsController(BaseController):
AttachmentControllerClass = None
@@ -17,7 +19,7 @@
if not args:
filename = request.path.rsplit('/', 1)[-1]
filename=unquote(filename)
- return self.AttachmentControllerClass(filename), args
+ return self.AttachmentControllerClass(filename, self.artifact), args
else:
raise exc.HTTPNotFound
@@ -28,24 +30,41 @@
def _check_security(self):
require(has_artifact_access('read', self.artifact))
- def __init__(self, filename):
+ def __init__(self, filename, artifact):
self.filename = filename
- self.attachment = self.AttachmentClass.query.get(filename=filename)
- if self.attachment is None:
- self.attachment = self.AttachmentClass.by_metadata(filename=filename).first()
- if self.attachment is None:
- raise exc.HTTPNotFound()
- self.thumbnail = self.AttachmentClass.by_metadata(filename=filename).first()
- self.artifact = self.attachment.artifact
+ self.artifact = artifact
+ @LazyProperty
+ def attachment(self):
+ metadata = self.AttachmentClass.metadata_for(self.artifact)
+ metadata_query = dict(
+ ('metadata.%s' % k, v)
+ for k, v in metadata.iteritems())
+ attachment = self.AttachmentClass.query.get(filename=self.filename, **metadata_query)
+ if attachment is None:
+ attachment = self.AttachmentClass.by_metadata(filename=self.filename, **metadata).first()
+ if attachment is None:
+ raise exc.HTTPNotFound
+ return attachment
+
+ @LazyProperty
+ def thumbnail(self):
+ thumbnail = self.AttachmentClass.by_metadata(filename=self.attachment.filename).first()
+ if thumbnail is None:
+ raise exc.HTTPNotFound
+ return thumbnail
+
@expose()
def index(self, delete=False, embed=True, **kw):
if request.method == 'POST':
require(has_artifact_access(self.edit_perm, self.artifact))
if delete:
self.attachment.delete()
- if self.thumbnail:
- self.thumbnail.delete()
+ try:
+ if self.thumbnail:
+ self.thumbnail.delete()
+ except exc.HTTPNotFound:
+ pass
redirect(request.referer)
with self.attachment.open() as fp:
if fp is None: