<commit_before>from urllib import unquote
from webob import exc

from tg import expose, request, response, redirect
from allura.lib.security import require, has_artifact_access
from allura.controllers import BaseController

class AttachmentsController(BaseController):
    AttachmentControllerClass = None

    def __init__(self, artifact):
        self.artifact = artifact

    @expose()
    def _lookup(self, filename=None, *args):
        if filename:
            if not args:
                filename = request.path.rsplit('/', 1)[-1]
            filename=unquote(filename)
            return self.AttachmentControllerClass(filename), args
        else:
            raise exc.HTTPNotFound

class AttachmentController(BaseController):
    AttachmentClass = None
    edit_perm = 'edit'

    def _check_security(self):
        require(has_artifact_access('read', self.artifact))

    def __init__(self, filename):
        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

    @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()
            redirect(request.referer)
        with self.attachment.open() as fp:
            if fp is None:
                raise exc.HTTPNotFound()
            filename = fp.metadata['filename'].encode('utf-8')
            response.headers['Content-Type'] = fp.content_type.encode('utf-8')
            response.content_type = fp.content_type.encode('utf-8')
            if not embed:
                response.headers.add('Content-Disposition',
                                     'attachment;filename=%s' % filename)
            return fp.read()
        return self.filename

    @expose()
    def thumb(self, embed=True):
        with self.thumbnail.open() as fp:
            filename = fp.metadata['filename'].encode('utf-8')
            response.headers['Content-Type'] = ''<commit_msg>[#903] - fix 500 error on attachments with unknown content_types<commit_after>from urllib import unquote
from webob import exc

from tg import expose, request, response, redirect
from allura.lib.security import require, has_artifact_access
from allura.controllers import BaseController

class AttachmentsController(BaseController):
    AttachmentControllerClass = None

    def __init__(self, artifact):
        self.artifact = artifact

    @expose()
    def _lookup(self, filename=None, *args):
        if filename:
            if not args:
                filename = request.path.rsplit('/', 1)[-1]
            filename=unquote(filename)
            return self.AttachmentControllerClass(filename), args
        else:
            raise exc.HTTPNotFound

class AttachmentController(BaseController):
    AttachmentClass = None
    edit_perm = 'edit'

    def _check_security(self):
        require(has_artifact_access('read', self.artifact))

    def __init__(self, filename):
        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

    @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()
            redirect(request.referer)
        with self.attachment.open() as fp:
            if fp is None:
                raise exc.HTTPNotFound()
            filename = fp.metadata['filename'].encode('utf-8')
            if fp.content_type is None:
                fp.content_type = 'application/octet-stream'
            response.headers['Content-Type'] = fp.content_type.encode('utf-8')
            response.content_type = fp.content_type.encode('utf-8')
            if not embed:
                response.headers.add('Content-Disposition',
                                     'attachment;filename=%s' % filename)
            return fp.read()
        return self.filename

    @expose()
    def thumb(self, embed=True):
        with self.thumbnail.open() as fp:
            filename = fp.metadata['filename'].encode('utf-8')
            response.headers['Content-Type'] = ''
{'fraction_non_alphanumeric': 0.10180817610062894, 'fraction_numerical': 0.003537735849056604, 'mean_word_length': 2.352437417654809, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1445012', 'n_tokens_mistral': 1351, 'n_tokens_neox': 1304, 'n_words': 296}