CodeWithAloha / uipa

Helping submit, track, and share public records requests in Hawaii
http://uipa.org
MIT License
10 stars 6 forks source link

Multiple attachments naming collision #77

Open tyliec opened 8 months ago

tyliec commented 8 months ago

Describe the bug

In some cases, the agency responds with multiple attachments in an email response named the same thing (i.e. AttachedImage). This causes an error when the user tries to download them - as the platform gets confused as to which attachment the user is requesting.

Error Summary ``` From: "UIPA.org Administrators" <[info@foi.uipa.org](mailto:info@foi.uipa.org)> Subject: [Froide] ERROR (EXTERNAL IP): Internal Server Error: /files/foi/4050/AttachedImage Date: March 5, 2024 at 11:07:12 AM HST To: [admin@uipa.org](mailto:admin@uipa.org), [ryan@codeforhawaii.org](mailto:ryan@codeforhawaii.org) Reply-To: [info@uipa.org](mailto:info@uipa.org) Internal Server Error: /files/foi/4050/AttachedImage MultipleObjectsReturned at /files/foi/4050/AttachedImage get() returned more than one FoiAttachment -- it returned 5! Request Method: GET Request URL: [https://uipa.org/files/foi/4050/AttachedImage](https://urldefense.com/v3/__https://uipa.org/files/foi/4050/AttachedImage__;!!PvDODwlR4mBZyAb0!Wue2czg32XxfDieDKL5HOvTYIO4s_EmFHvvb2nM4h68yzQ69hBW2slztdPMPoVBgOY5r3fSD_MxcXQ$) Django Version: 1.10.2 Python Executable: /usr/local/bin/uwsgi Python Version: 2.7.6 Python Path: ['.', '', '/var/www/applications/uipa_org/venvs/releases/20171206105506Z/src/django-overextends', '/var/www/applications/uipa_org/venvs/releases/20171206105506Z/src/froide', '/var/www/applications/uipa_org/venvs/current/lib/python2.7', '/var/www/applications/uipa_org/venvs/current/lib/python2.7/plat-x86_64-linux-gnu', '/var/www/applications/uipa_org/venvs/current/lib/python2.7/lib-tk', '/var/www/applications/uipa_org/venvs/current/lib/python2.7/lib-old', '/var/www/applications/uipa_org/venvs/current/lib/python2.7/lib-dynload', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/var/www/applications/uipa_org/venvs/current/local/lib/python2.7/site-packages', '/var/www/applications/uipa_org/app/releases/20171206105506Z', '/var/www/applications/uipa_org/venvs/releases/20171206105506Z/src/froide', '/var/www/applications/uipa_org/venvs/releases/20171206105506Z/src/froide/..'] Server time: Tue, 5 Mar 2024 11:07:09 -1000 Installed Applications: ['django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin', 'django_comments', 'django.contrib.flatpages', 'django.contrib.sitemaps', 'haystack', 'taggit', 'floppyforms', 'overextends', 'tastypie', 'storages', 'compressor', 'froide.foirequest', 'froide.foirequestfollower', 'froide.frontpage', 'froide.publicbody', 'froide.account', 'froide.redaction', 'froide.foisite', 'froide.helper', 'uipa_org.theme', 'celery_haystack', 'djcelery_email', 'django.contrib.redirects', 'uipa_org.uipa_constants', 'uipa_org.theme.templatetags.uipa_extras', 'tinymce', 'raven.contrib.django.raven_compat'] Installed Middleware: [u'raven.contrib.django.middleware.SentryMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', 'froide.account.middleware.AcceptNewTermsMiddleware'] Traceback: File "/var/www/applications/uipa_org/venvs/current/local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner 39. response = get_response(request) File "/var/www/applications/uipa_org/venvs/current/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _legacy_get_response 249. response = self._get_response(request) File "/var/www/applications/uipa_org/venvs/current/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 187. response = self.process_exception_by_middleware(e, request) File "/var/www/applications/uipa_org/venvs/current/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 185. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/var/www/applications/uipa_org/venvs/releases/20171206105506Z/src/froide/froide/foirequest/views.py" in auth_message_attachment 890. name=attachment_name) File "/var/www/applications/uipa_org/venvs/current/local/lib/python2.7/site-packages/django/shortcuts.py" in get_object_or_404 85. return queryset.get(*args, **kwargs) File "/var/www/applications/uipa_org/venvs/current/local/lib/python2.7/site-packages/django/db/models/query.py" in get 389. (self.model._meta.object_name, num) Exception Type: MultipleObjectsReturned at /files/foi/4050/AttachedImage Exception Value: get() returned more than one FoiAttachment -- it returned 5! Request information: USER: s.steiner GET: No GET data POST: No POST data FILES: No FILES data COOKIES: sessionid = 'f4j6ma6wl9pfit5m3u3qjt3u0fzcov6i' _ga = 'GA1.2.287914878.1696440220' _gid = 'GA1.2.8195141.1709671900' _gat = '1' META: CONTENT_LENGTH = '' CONTENT_TYPE = '' DOCUMENT_ROOT = '/var/www/applications/uipa_org/app/current' HTTPS = 'on' HTTP_ACCEPT = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' HTTP_ACCEPT_ENCODING = 'gzip, deflate, br' HTTP_ACCEPT_LANGUAGE = 'en-US,en;q=0.5' HTTP_CONNECTION = 'keep-alive' HTTP_COOKIE = '_ga=GA1.2.287914878.1696440220; sessionid=f4j6ma6wl9pfit5m3u3qjt3u0fzcov6i; _gid=GA1.2.8195141.1709671900; _gat=1' HTTP_DNT = '1' HTTP_HOST = '[uipa.org](http://uipa.org/)' HTTP_REFERER = '[https://uipa.org/request/production-and-injection-reports-puna-geothermal-venture-2/](https://urldefense.com/v3/__https://uipa.org/request/production-and-injection-reports-puna-geothermal-venture-2/__;!!PvDODwlR4mBZyAb0!Wue2czg32XxfDieDKL5HOvTYIO4s_EmFHvvb2nM4h68yzQ69hBW2slztdPMPoVBgOY5r3fQOTrv3RA$)' HTTP_SEC_FETCH_DEST = 'document' HTTP_SEC_FETCH_MODE = 'navigate' HTTP_SEC_FETCH_SITE = 'same-origin' HTTP_SEC_FETCH_USER = '?1' HTTP_UPGRADE_INSECURE_REQUESTS = '1' HTTP_USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0' Host = '[uipa.org](http://uipa.org/)' PATH_INFO = u'/files/foi/4050/AttachedImage' QUERY_STRING = '' REMOTE_ADDR = '147.81.46.99' REMOTE_PORT = '62190' REQUEST_METHOD = 'GET' REQUEST_SCHEME = 'https' REQUEST_URI = '/files/foi/4050/AttachedImage' SCRIPT_NAME = u'' SERVER_NAME = '[uipa.org](http://uipa.org/)' SERVER_PORT = '443' SERVER_PROTOCOL = 'HTTP/1.1' X-Forwarded-For = '147.81.46.99' X-Forwarded-Proto = '' X-Real-IP = '147.81.46.99' uwsgi.core = 23 uwsgi.node = 'CBLAW' uwsgi.version = '2.0.11.1' wsgi.errors = wsgi.file_wrapper = '' wsgi.input = wsgi.multiprocess = False wsgi.multithread = True wsgi.run_once = False wsgi.url_scheme = 'https' wsgi.version = Settings: Using settings module uipa_org.settings ABSOLUTE_URL_OVERRIDES = {} ADMINS = [('Admin', '[admin@uipa.org](mailto:admin@uipa.org)'), ('Ryan', '[ryan@codeforhawaii.org](mailto:ryan@codeforhawaii.org)')] ALLOWED_HOSTS = APPEND_SLASH = True AUTHENTICATION_BACKENDS = ['froide.helper.auth.EmailBackend', 'django.contrib.auth.backends.ModelBackend'] AUTH_PASSWORD_VALIDATORS = u'********************' AUTH_USER_MODEL = 'account.User' AWS_ACCESS_KEY_ID = u'********************' AWS_HEADERS = {'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT', 'Cache-Control': 'max-age=94608000'} AWS_IS_GZIPPED = True AWS_QUERYSTRING_AUTH = False AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat' AWS_S3_CUSTOM_DOMAIN = '[uipa-prod-media.s3-us-west-1.amazonaws.com](http://uipa-prod-media.s3-us-west-1.amazonaws.com/)' AWS_S3_FILE_OVERWRITE = False AWS_S3_HOST = '[s3-us-west-1.amazonaws.com](http://s3-us-west-1.amazonaws.com/)' AWS_S3_SECURE_URLS = True AWS_SECRET_ACCESS_KEY = u'********************' AWS_STORAGE_BUCKET_NAME = 'uipa-prod-media' BROKER_URL = 'amqp://uipa:q2131H8qUA0BW1aYl3l*8RPbzV78^9W*1IUsJvGjnaDbpfCpuNH&V5^4ZyYyyWyy@localhost:5672/prod_uipa' CACHES = {'default': {'LOCATION': 'production-uipa', 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}} CACHE_MIDDLEWARE_ALIAS = u'default' CACHE_MIDDLEWARE_KEY_PREFIX = u'********************' CACHE_MIDDLEWARE_SECONDS = 600 CELERYBEAT_SCHEDULE = {'classification-reminder': {'task': 'froide.foirequest.tasks.classification_reminder', 'schedule': }, 'detect-overdue': {'task': 'froide.foirequest.tasks.detect_overdue', 'schedule': }, 'uipa-make_public_private': {'task': 'uipa_org.tasks.make_private_public', 'schedule': }, 'update-foirequestfollowers': {'task': 'froide.foirequestfollower.tasks.batch_update', 'schedule': }, 'fetch-mail': {'task': 'froide.foirequest.tasks.fetch_mail', 'schedule': }, 'detect-asleep': {'task': 'froide.foirequest.tasks.detect_asleep', 'schedule': }, 'uipa-deferred_message_notification': {'task': 'uipa_org.tasks.deferred_message_notification', 'schedule': }, 'uipa-private_public_reminder': {'task': 'uipa_org.tasks.private_public_reminder', 'schedule': }} CELERY_ALWAYS_EAGER = True CELERY_HAYSTACK_COMMAND_AGE = None CELERY_HAYSTACK_COMMAND_APPS = [] CELERY_HAYSTACK_COMMAND_BATCH_SIZE = None CELERY_HAYSTACK_COMMAND_REMOVE = False CELERY_HAYSTACK_COMMAND_VERBOSITY = 1 CELERY_HAYSTACK_COMMAND_WORKERS = 0 CELERY_HAYSTACK_COUNTDOWN = 0 CELERY_HAYSTACK_DEFAULT_ALIAS = u'default' CELERY_HAYSTACK_DEFAULT_TASK = 'celery_haystack.tasks.CeleryHaystackSignalHandler' CELERY_HAYSTACK_MAX_RETRIES = 1 CELERY_HAYSTACK_QUEUE = None CELERY_HAYSTACK_RETRY_DELAY = 300 CELERY_HAYSTACK_TRANSACTION_SAFE = True CELERY_IMPORTS = 'uipa_org.tasks' CELERY_RESULT_BACKEND = 'rpc' CELERY_RESULT_PERSISTENT = True CELERY_ROUTES = {'froide.foirequest.tasks.fetch_mail': {'queue': 'emailfetch'}} CELERY_TIMEZONE = 'Pacific/Honolulu' COMPRESS_CACHEABLE_PRECOMPILERS = COMPRESS_CACHE_BACKEND = u'default' COMPRESS_CACHE_KEY_FUNCTION = u'********************' COMPRESS_CLEAN_CSS_ARGUMENTS = u'' COMPRESS_CLEAN_CSS_BINARY = u'cleancss' COMPRESS_CLOSURE_COMPILER_ARGUMENTS = u'' COMPRESS_CLOSURE_COMPILER_BINARY = u'java -jar compiler.jar' COMPRESS_CSS_COMPRESSOR = u'compressor.css.CssCompressor' COMPRESS_CSS_FILTERS = ['compressor.filters.css_default.CssAbsoluteFilter', 'compressor.filters.cssmin.CSSMinFilter'] COMPRESS_CSS_HASHING_METHOD = u'mtime' COMPRESS_DATA_URI_MAX_SIZE = 1024 COMPRESS_DEBUG_TOGGLE = None COMPRESS_ENABLED = True COMPRESS_JINJA2_GET_ENVIRONMENT = COMPRESS_JS_COMPRESSOR = u'compressor.js.JsCompressor' COMPRESS_JS_FILTERS = ['compressor.filters.jsmin.JSMinFilter'] COMPRESS_MINT_DELAY = 30 COMPRESS_MTIME_DELAY = 10 COMPRESS_OFFLINE = True COMPRESS_OFFLINE_CONTEXT = {u'STATIC_URL': '[https://uipa-prod-media.s3-us-west-1.amazonaws.com/static/](https://urldefense.com/v3/__https://uipa-prod-media.s3-us-west-1.amazonaws.com/static/__;!!PvDODwlR4mBZyAb0!Wue2czg32XxfDieDKL5HOvTYIO4s_EmFHvvb2nM4h68yzQ69hBW2slztdPMPoVBgOY5r3fS6fk3f8w$)'} COMPRESS_OFFLINE_MANIFEST = u'manifest.json' COMPRESS_OFFLINE_TIMEOUT = 31536000 COMPRESS_OUTPUT_DIR = u'CACHE' COMPRESS_PARSER = 'compressor.parser.HtmlParser' COMPRESS_PRECOMPILERS = COMPRESS_REBUILD_TIMEOUT = 2592000 COMPRESS_ROOT = '/var/www/applications/uipa_org/app/releases/20171206105506Z/public' COMPRESS_STORAGE = 'uipa_org.custom_storages.CachedS3BotoStorage' COMPRESS_TEMPLATE_FILTER_CONTEXT = {u'STATIC_URL': '[https://uipa-prod-media.s3-us-west-1.amazonaws.com/static/](https://urldefense.com/v3/__https://uipa-prod-media.s3-us-west-1.amazonaws.com/static/__;!!PvDODwlR4mBZyAb0!Wue2czg32XxfDieDKL5HOvTYIO4s_EmFHvvb2nM4h68yzQ69hBW2slztdPMPoVBgOY5r3fS6fk3f8w$)'} COMPRESS_URL = '[https://uipa-prod-media.s3-us-west-1.amazonaws.com/static/](https://urldefense.com/v3/__https://uipa-prod-media.s3-us-west-1.amazonaws.com/static/__;!!PvDODwlR4mBZyAb0!Wue2czg32XxfDieDKL5HOvTYIO4s_EmFHvvb2nM4h68yzQ69hBW2slztdPMPoVBgOY5r3fS6fk3f8w$)' COMPRESS_VERBOSE = False COMPRESS_YUGLIFY_BINARY = u'yuglify' COMPRESS_YUGLIFY_CSS_ARGUMENTS = u'--terminal' COMPRESS_YUGLIFY_JS_ARGUMENTS = u'--terminal' COMPRESS_YUI_BINARY = u'java -jar yuicompressor.jar' COMPRESS_YUI_CSS_ARGUMENTS = u'' COMPRESS_YUI_JS_ARGUMENTS = u'' CONFIGURATION = 'uipa_org.settings.Production' CONN_MAX_AGE = None CSRF_COOKIE_AGE = 31449600 CSRF_COOKIE_DOMAIN = None CSRF_COOKIE_HTTPONLY = True CSRF_COOKIE_NAME = u'csrftoken' CSRF_COOKIE_PATH = u'/' CSRF_COOKIE_SECURE = True CSRF_FAILURE_VIEW = 'froide.account.views.csrf_failure' CSRF_HEADER_NAME = u'HTTP_X_CSRFTOKEN' CSRF_TRUSTED_ORIGINS = [] CUSTOM_AUTH_USER_MODEL_DB = '' DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2', 'AUTOCOMMIT': True, 'ATOMIC_REQUESTS': False, 'NAME': 'prod_uipa', 'CONN_MAX_AGE': 0, 'TIME_ZONE': None, 'PORT': 5432, 'HOST': 'localhost', 'USER': 'uipa', 'TEST': {'COLLATION': None, 'CHARSET': None, 'NAME': None, 'MIRROR': None}, 'PASSWORD': u'********************', 'OPTIONS': {}}} DATABASE_ROUTERS = [] DATA_UPLOAD_MAX_MEMORY_SIZE = 26214400 DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000 DATETIME_FORMAT = u'N j, Y, P' DATETIME_INPUT_FORMATS = '%d.%m.%Y %H:%M' DATE_FORMAT = 'd. F Y' DATE_INPUT_FORMATS = '%d.%m.%Y' DEBUG = False DEBUG_PROPAGATE_EXCEPTIONS = False DECIMAL_SEPARATOR = u'.' DEFAULT_CHARSET = u'utf-8' DEFAULT_CONTENT_TYPE = u'text/html' DEFAULT_EXCEPTION_REPORTER_FILTER = u'django.views.debug.SafeExceptionReporterFilter' DEFAULT_FILE_STORAGE = u'django.core.files.storage.FileSystemStorage' DEFAULT_FROM_EMAIL = '[info@foi.uipa.org](mailto:info@foi.uipa.org)' DEFAULT_INDEX_TABLESPACE = u'' DEFAULT_TABLESPACE = u'' DISALLOWED_USER_AGENTS = [] DOTENV_LOADED = None EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = '[smtp.postmarkapp.com](http://smtp.postmarkapp.com/)' EMAIL_HOST_PASSWORD = u'********************' EMAIL_HOST_USER = '7556333d-26a2-4f93-8f4b-fe9ddc548f4f' EMAIL_PORT = 2525 EMAIL_SSL_CERTFILE = None EMAIL_SSL_KEYFILE = u'********************' EMAIL_SUBJECT_PREFIX = '[Froide] ' EMAIL_TIMEOUT = None EMAIL_USE_SSL = False EMAIL_USE_TLS = True FILE_CHARSET = u'utf-8' FILE_UPLOAD_DIRECTORY_PERMISSIONS = None FILE_UPLOAD_HANDLERS = [u'django.core.files.uploadhandler.MemoryFileUploadHandler', u'django.core.files.uploadhandler.TemporaryFileUploadHandler'] FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440 FILE_UPLOAD_PERMISSIONS = None FILE_UPLOAD_TEMP_DIR = None FIRST_DAY_OF_WEEK = 0 FIXTURE_DIRS = 'fixtures' FOI_EMAIL_ACCOUNT_NAME = '[foi@example.com](mailto:foi@example.com)' FOI_EMAIL_ACCOUNT_PASSWORD = u'********************' FOI_EMAIL_DOMAIN = '[foi.uipa.org](http://foi.uipa.org/)' FOI_EMAIL_FIXED_FROM_ADDRESS = False FOI_EMAIL_HOST = '[smtp.postmarkapp.com](http://smtp.postmarkapp.com/)' FOI_EMAIL_HOST_FROM = '[info@foi.uipa.org](mailto:info@foi.uipa.org)' FOI_EMAIL_HOST_IMAP = '[imap.example.com](http://imap.example.com/)' FOI_EMAIL_HOST_PASSWORD = u'********************' FOI_EMAIL_HOST_USER = '7556333d-26a2-4f93-8f4b-fe9ddc548f4f' FOI_EMAIL_PORT = 2525 FOI_EMAIL_PORT_IMAP = 993 FOI_EMAIL_TEMPLATE = 'request+{secret}@{domain}' FOI_EMAIL_USE_SSL = True FOI_EMAIL_USE_TLS = True FOI_MEDIA_PATH = 'foi' FORCE_SCRIPT_NAME = None FORMAT_MODULE_PATH = None FROIDE_CONFIG = {'api_activated': u'********************', 'search_engine_query': '[http://www.google.com/search?as_q=%(query)s&as_epq=&as_oq=&as_eq=&hl=en&lr=&cr=&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=%(domain)s&as_rights=&safe=images](https://urldefense.com/v3/__http://www.google.com/search?as_q=*(query)s&as_epq=&as_oq=&as_eq=&hl=en&lr=&cr=&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=*(domain)s&as_rights=&safe=images__;JSU!!PvDODwlR4mBZyAb0!Wue2czg32XxfDieDKL5HOvTYIO4s_EmFHvvb2nM4h68yzQ69hBW2slztdPMPoVBgOY5r3fTMaXRGfw$)', 'allow_pseudonym': False, 'payment_possible': True, 'currency': 'Dollars', 'publicbody_empty': False, 'create_new_publicbody': False, 'make_public_num_days_after_due_date': 365, 'default_law': 1, 'public_body_officials_public': True, 'dryrun': False, 'show_public_body_employee_name': False, 'request_throttle': None, 'closings': [<_sre.SRE_Pattern object at 0x7fc8457f1030>], 'dryrun_domain': '[beta.uipa.org](http://beta.uipa.org/)', 'request_public_after_due_days': 14, 'public_body_officials_email_public': False, 'greetings': [<_sre.SRE_Pattern object at 0x7fc845905620>], 'doc_conversion_call_func': None, 'ga_tracking_id': 'UA-87485554-1', 'public_body_boosts': {}, 'doc_conversion_binary': '/usr/bin/libreoffice', 'user_can_hide_web': True} FROIDE_THEME = 'uipa_org.theme' GEOIP_PATH = None GZIP_CONTENT_TYPES = HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': '[http://127.0.0.1:9200/](https://urldefense.com/v3/__http://127.0.0.1:9200/__;!!PvDODwlR4mBZyAb0!Wue2czg32XxfDieDKL5HOvTYIO4s_EmFHvvb2nM4h68yzQ69hBW2slztdPMPoVBgOY5r3fTmG7Q-UQ$)', 'INDEX_NAME': 'haystack'}} HAYSTACK_SIGNAL_PROCESSOR = 'celery_haystack.signals.CelerySignalProcessor' HOLIDAYS = [(1, 1), (12, 25), (12, 26)] HOLIDAYS_FOR_EASTER = HOLIDAYS_WEEKENDS = True IGNORABLE_404_URLS = [] INSTALLED_APPS = ['django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin', 'django_comments', 'django.contrib.flatpages', 'django.contrib.sitemaps', 'haystack', 'taggit', 'floppyforms', 'overextends', 'tastypie', 'storages', 'compressor', 'froide.foirequest', 'froide.foirequestfollower', 'froide.frontpage', 'froide.publicbody', 'froide.account', 'froide.redaction', 'froide.foisite', 'froide.helper', 'uipa_org.theme', 'celery_haystack', 'djcelery_email', 'django.contrib.redirects', 'uipa_org.uipa_constants', 'uipa_org.theme.templatetags.uipa_extras', 'tinymce', 'raven.contrib.django.raven_compat'] INTERNAL_IPS = '127.0.0.1' LANGUAGES = LANGUAGES_BIDI = [u'he', u'ar', u'fa', u'ur'] LANGUAGE_CODE = 'en' LANGUAGE_COOKIE_AGE = None LANGUAGE_COOKIE_DOMAIN = None LANGUAGE_COOKIE_NAME = u'django_language' LANGUAGE_COOKIE_PATH = u'/' LOCALE_PATHS = '/var/www/applications/uipa_org/venvs/releases/20171206105506Z/src/froide/locale' LOGGING = {'loggers': {'django.security': {'handlers': ['uipa_org_logfile', 'mail_admins'], 'propagate': False, 'level': 'ERROR'}, 'django': {'handlers': ['uipa_org_logfile', 'mail_admins'], 'level': 'ERROR'}, 'django.request': {'handlers': ['uipa_org_logfile', 'mail_admins'], 'propagate': False, 'level': 'ERROR'}, 'froide': {'handlers': ['uipa_org_logfile', 'mail_admins'], 'level': 'DEBUG'}, 'uipa_org': {'handlers': ['uipa_org_logfile', 'mail_admins'], 'level': 'DEBUG'}, 'django.db.backends': {'level': 'ERROR', 'propagate': False, 'handlers': ['uipa_org_logfile', 'mail_admins']}}, 'disable_existing_loggers': True, 'handlers': {'uipa_org_logfile': {'backupCount': 10, 'level': 'DEBUG', 'filename': '/var/log/uipa_org/uipa_org_app.log', 'formatter': 'verbose', 'class': 'logging.handlers.RotatingFileHandler', 'maxBytes': 5242880}, 'console': {'class': 'logging.StreamHandler', 'filters': ['require_debug_true'], 'level': 'DEBUG'}, 'mail_admins': {'class': 'django.utils.log.AdminEmailHandler', 'filters': ['require_debug_false'], 'level': 'ERROR'}}, 'formatters': {'verbose': {'datefmt': '%Y-%m-%d %H:%M:%S', 'format': '[%(asctime)s] %(levelname)s [%(module)s %(process)d %(thread)d - %(name)s.%(funcName)s:%(lineno)d] %(message)s'}}, 'version': 1, 'filters': {'require_debug_false': {'()': 'django.utils.log.RequireDebugFalse'}, 'require_debug_true': {'()': 'django.utils.log.RequireDebugTrue'}}, 'root': {'level': 'DEBUG', 'handlers': ['uipa_org_logfile']}} LOGGING_CONFIG = u'logging.config.dictConfig' LOGIN_REDIRECT_URL = u'/accounts/profile/' LOGIN_URL = u'/accounts/login/' LOGOUT_REDIRECT_URL = None MANAGERS = MEDIA_ROOT = '/var/www/applications/uipa_org/shared/media/files' MEDIA_URL = '/files/' MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage' MIDDLEWARE = None MIDDLEWARE_CLASSES = [u'raven.contrib.django.middleware.SentryMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', 'froide.account.middleware.AcceptNewTermsMiddleware'] MIGRATION_MODULES = {} MONTH_DAY_FORMAT = u'F j' NUMBER_GROUPING = 0 PASSWORD_HASHERS = u'********************' PASSWORD_RESET_TIMEOUT_DAYS = u'********************' PREPEND_WWW = False PROJECT_ROOT = '/var/www/applications/uipa_org/app/releases/20171206105506Z/uipa_org' RAVEN_CONFIG = {'dsn': '[https://766640c7e66040f880997c0e0b0a9ec5:08c62607489f450b9e8872da93debe63@sentry.io/114986](https://urldefense.com/v3/__https://766640c7e66040f880997c0e0b0a9ec5:08c62607489f450b9e8872da93debe63@sentry.io/114986__;!!PvDODwlR4mBZyAb0!Wue2czg32XxfDieDKL5HOvTYIO4s_EmFHvvb2nM4h68yzQ69hBW2slztdPMPoVBgOY5r3fS6nSX3VQ$)'} ROOT_URLCONF = 'froide.urls' SECRET_KEY = u'********************' SECRET_URLS = u'********************' SECURE_BROWSER_XSS_FILTER = False SECURE_CONTENT_TYPE_NOSNIFF = False SECURE_HSTS_INCLUDE_SUBDOMAINS = False SECURE_HSTS_SECONDS = 0 SECURE_PROXY_SSL_HEADER = SECURE_REDIRECT_EXEMPT = [] SECURE_SSL_HOST = None SECURE_SSL_REDIRECT = True SERVER_EMAIL = '[info@foi.uipa.org](mailto:info@foi.uipa.org)' SESSION_CACHE_ALIAS = u'default' SESSION_COOKIE_AGE = 3628800 SESSION_COOKIE_DOMAIN = None SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_NAME = u'sessionid' SESSION_COOKIE_PATH = u'/' SESSION_COOKIE_SECURE = True SESSION_ENGINE = u'django.contrib.sessions.backends.db' SESSION_EXPIRE_AT_BROWSER_CLOSE = False SESSION_FILE_PATH = None SESSION_SAVE_EVERY_REQUEST = False SESSION_SERIALIZER = u'django.contrib.sessions.serializers.JSONSerializer' SETTINGS_MODULE = 'uipa_org.settings' SHORT_DATETIME_FORMAT = 'd.m.Y H:i' SHORT_DATE_FORMAT = 'd.m.Y' SIGNING_BACKEND = u'django.core.signing.TimestampSigner' SILENCED_SYSTEM_CHECKS = [] SITE_EMAIL = '[info@uipa.org](mailto:info@uipa.org)' SITE_ID = 1 SITE_NAME = 'UIPA.org' SITE_URL = '[https://uipa.org](https://urldefense.com/v3/__https://uipa.org__;!!PvDODwlR4mBZyAb0!Wue2czg32XxfDieDKL5HOvTYIO4s_EmFHvvb2nM4h68yzQ69hBW2slztdPMPoVBgOY5r3fRNa_VIPA$)' STATICFILES_DIRS = '/var/www/applications/uipa_org/venvs/releases/20171206105506Z/src/froide/froide/static' STATICFILES_FINDERS = STATICFILES_LOCATION = 'static' STATICFILES_STORAGE = 'uipa_org.custom_storages.CachedS3BotoStorage' STATIC_ROOT = '/var/www/applications/uipa_org/app/releases/20171206105506Z/public' STATIC_URL = '[https://uipa-prod-media.s3-us-west-1.amazonaws.com/static/](https://urldefense.com/v3/__https://uipa-prod-media.s3-us-west-1.amazonaws.com/static/__;!!PvDODwlR4mBZyAb0!Wue2czg32XxfDieDKL5HOvTYIO4s_EmFHvvb2nM4h68yzQ69hBW2slztdPMPoVBgOY5r3fS6fk3f8w$)' TAGGING_AUTOCOMPLETE_MAX_TAGS = 100 TASTYPIE_DEFAULT_FORMATS = ['json'] TEMPLATES = [{'DIRS': ('/var/www/applications/uipa_org/venvs/releases/20171206105506Z/src/froide/froide/templates',), 'OPTIONS': {'debug': True, 'context_processors': ['django.template.context_processors.debug', 'django.template.context_processors.i18n', 'django.template.context_processors.media', 'django.template.context_processors.static', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'froide.helper.context_processors.froide', 'froide.helper.context_processors.site_settings'], 'builtins': ['overextends.templatetags.overextends_tags'], 'loaders': ['froide.helper.theme_utils.ThemeLoader', 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader']}, 'BACKEND': 'django.template.backends.django.DjangoTemplates'}] TEMPLATE_DEBUG = False TEST_NON_SERIALIZED_APPS = [] TEST_RUNNER = u'django.test.runner.DiscoverRunner' THOUSAND_SEPARATOR = u',' TIME_FORMAT = 'H:i' TIME_INPUT_FORMATS = '%H:%M' TIME_ZONE = 'Pacific/Honolulu' TINYMCE_DEFAULT_CONFIG = {'cleanup_on_startup': False, 'theme': 'advanced', 'plugins': 'table,spellchecker,paste,searchreplace'} USE_ETAGS = False USE_I18N = True USE_L10N = True USE_THOUSAND_SEPARATOR = False USE_TZ = True USE_X_ACCEL_REDIRECT = True USE_X_FORWARDED_HOST = False USE_X_FORWARDED_PORT = False WSGI_APPLICATION = None X_ACCEL_REDIRECT_PREFIX = '/protected' X_FRAME_OPTIONS = u'SAMEORIGIN' YEAR_MONTH_FORMAT = u'F Y' ```

Expected behavior User is able to download multiple attachments, even if they are named the same thing.