Switch to side-by-side view

--- 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: