def populate_export_download_task(export_instances, filters, download_id, filename=None, expiry=10 * 60): """ :param expiry: Time period for the export to be available for download in minutes """ domain = export_instances[0].domain with TransientTempfile() as temp_path, datadog_track_errors( 'populate_export_download_task'): export_file = get_export_file( export_instances, filters, temp_path, # We don't have a great way to calculate progress if it's a bulk download, # so only track the progress for single instance exports. progress_tracker=populate_export_download_task if len(export_instances) == 1 else None) file_format = Format.from_format(export_file.format) filename = filename or export_instances[0].name with export_file as file_: db = get_blob_db() db.put( file_, domain=domain, parent_id=domain, type_code=CODES.data_export, key=download_id, timeout=expiry, ) expose_blob_download( download_id, expiry=expiry * 60, mimetype=file_format.mimetype, content_disposition=safe_filename_header( filename, file_format.extension), download_id=download_id, ) email_requests = EmailExportWhenDoneRequest.objects.filter( domain=domain, download_id=download_id) for email_request in email_requests: try: couch_user = CouchUser.get_by_user_id(email_request.user_id, domain=domain) except CouchUser.AccountTypeError: pass else: if couch_user is not None: process_email_request(domain, download_id, couch_user.get_email()) email_requests.delete()
def add_export_email_request(request, domain): download_id = request.POST.get('download_id') user_id = request.couch_user.user_id if download_id is None or user_id is None: return HttpResponseBadRequest(gettext_lazy('Download ID or User ID blank/not provided')) try: download_context = get_download_context(download_id) except TaskFailedError: return HttpResponseServerError(gettext_lazy('Export failed')) if download_context.get('is_ready', False): try: couch_user = CouchUser.get_by_user_id(user_id, domain=domain) except CouchUser.AccountTypeError: return HttpResponseBadRequest(gettext_lazy('Invalid user')) if couch_user is not None: process_email_request(domain, download_id, couch_user.get_email()) else: EmailExportWhenDoneRequest.objects.create(domain=domain, download_id=download_id, user_id=user_id) return HttpResponse(gettext_lazy('Export e-mail request sent.'))
def add_export_email_request(request, domain): download_id = request.POST.get('download_id') user_id = request.couch_user.user_id if download_id is None or user_id is None: return HttpResponseBadRequest(ugettext_lazy('Download ID or User ID blank/not provided')) try: download_context = get_download_context(download_id) except TaskFailedError: return HttpResponseServerError(ugettext_lazy('Export failed')) if download_context.get('is_ready', False): try: couch_user = CouchUser.get_by_user_id(user_id, domain=domain) except CouchUser.AccountTypeError: return HttpResponseBadRequest(ugettext_lazy('Invalid user')) if couch_user is not None: process_email_request(domain, download_id, couch_user.get_email()) else: EmailExportWhenDoneRequest.objects.create(domain=domain, download_id=download_id, user_id=user_id) return HttpResponse(ugettext_lazy('Export e-mail request sent.'))
def populate_export_download_task(export_instances, filters, download_id, filename=None, expiry=10 * 60 * 60): export_file = get_export_file( export_instances, filters, # We don't have a great way to calculate progress if it's a bulk download, # so only track the progress for single instance exports. progress_tracker=populate_export_download_task if len(export_instances) == 1 else None) file_format = Format.from_format(export_file.format) filename = filename or export_instances[0].name with export_file as file_: db = get_blob_db() db.put(file_, download_id, timeout=expiry) expose_blob_download( download_id, mimetype=file_format.mimetype, content_disposition=safe_filename_header(filename, file_format.extension), download_id=download_id, ) domain = export_instances[0].domain email_requests = EmailExportWhenDoneRequest.objects.filter( domain=domain, download_id=download_id) for email_request in email_requests: try: couch_user = CouchUser.get_by_user_id(email_request.user_id, domain=domain) except CouchUser.AccountTypeError: pass else: if couch_user is not None: process_email_request(domain, download_id, couch_user.get_email()) email_requests.delete()
def populate_export_download_task(domain, export_ids, exports_type, username, es_filters, download_id, owner_id, filename=None, expiry=10 * 60): """ :param expiry: Time period for the export to be available for download in minutes """ email_requests = EmailExportWhenDoneRequest.objects.filter( domain=domain, download_id=download_id) if settings.STALE_EXPORT_THRESHOLD is not None and not email_requests.count( ): delay = get_task_time_to_start( populate_export_download_task.request.id) if delay.total_seconds() > settings.STALE_EXPORT_THRESHOLD: metrics_counter('commcare.exports.rejected_unfresh_export') raise RejectedStaleExport() export_instances = [ get_export(exports_type, domain, export_id, username) for export_id in export_ids ] with TransientTempfile() as temp_path, metrics_track_errors( 'populate_export_download_task'): export_file = get_export_file( export_instances, es_filters, temp_path, # We don't have a great way to calculate progress if it's a bulk download, # so only track the progress for single instance exports. progress_tracker=populate_export_download_task if len(export_instances) == 1 else None) file_format = Format.from_format(export_file.format) filename = filename or export_instances[0].name with export_file as file_: db = get_blob_db() db.put( file_, domain=domain, parent_id=domain, type_code=CODES.data_export, key=download_id, timeout=expiry, ) expose_blob_download( download_id, expiry=expiry * 60, mimetype=file_format.mimetype, content_disposition=safe_filename_header( filename, file_format.extension), download_id=download_id, owner_ids=[owner_id], ) for email_request in email_requests: try: couch_user = CouchUser.get_by_user_id(email_request.user_id, domain=domain) except CouchUser.AccountTypeError: pass else: if couch_user is not None: process_email_request(domain, download_id, couch_user.get_email()) email_requests.delete()