Skip to content

Release Notes

4.2.0 [2025-05-30]

Enhancements:

  • Added more robust retry logic for dropped DICOM connections with automatic reconnection handling

Fixes:

  • Fixed connection error handling to properly retry on invalid server responses
  • Fixed gear execution at acquisition level without input files

Maintenance:

  • Migrated from poetry to uv for dependency management
  • Upgraded base Docker image from flywheel/python:main.66a70563 to flywheel/python:3.12-alpine
  • Updated python from 3.10.4 to 3.12.7
  • Migrated CI pipeline from sse-qa-ci to qa-ci project
  • Updated .pre-commit-config.yaml hooks: added hadolint, linkcheck, markdownlint, and ruff_format
  • Refactored Dockerfile to use pip install with requirements.txt instead of poetry
  • Removed default merge request template

Documentation:

  • Updated Orthanc server download URL from Osimis to official Orthanc website
  • Fixed Flywheel URL formatting in README.md
  • Updated source URL in manifest from flywheel-apps to scientific-solutions/gears
  • Improved formatting and line wrapping in README.md for better readability
  • Fixed relative link path in CONTRIBUTING.md changelog reference

4.1.1 [2024-04-10]

Fixes:

  • Increased default timeout values from 30s to 60s for DICOM operations (acse_timeout, dimse_timeout, network_timeout)
  • Increased default file_download_retry_time from 10s to 60s to reduce download failures
  • Fixed typo in log message

Enhancements:

  • Added Slim-Containers feature flag to exclude analyses when fetching container data
  • Added Exclude-Files feature flag for subject/session API calls to reduce payload size
  • Configured CoreClient with increased timeouts (read_timeout=60s, connect_timeout=15s) and retries (retry_total=10)
  • Added debug logging for session DICOM downloads
  • Improved logging to include container type and ID when downloading DICOM files

4.1.0 [2024-03-26]

Enhancements:

  • Added support for running at acquisition level without file input
  • Added support for running at session level to send all DICOM files across acquisitions
  • Added support for running at subject level to send all DICOM files across sessions
  • Added configuration option to disable report upload

Fixes:

  • Fixed issue where private DICOM tag group was incorrectly overridden by Flywheel group label

Maintenance:

  • Migrated CI pipeline from flywheel-io/tools/etc/qa-ci to flywheel-io/scientific-solutions/etc/sse-qa-ci
  • Updated pre-commit hooks configuration
  • Added .dockerignore file to optimize Docker build context
  • Refactored dicom_send_session() to dicom_send_container() for multi-level support
  • Updated manifest classification and suite metadata

4.0.2 [2022-09-07]

Fixes:

  • Fixed variable name conflict where Flywheel group label was incorrectly overriding DICOM group tag 0x0021 in send operations (fw_gear_dicom_send/main.py:149, fw_gear_dicom_send/main.py:235)

Maintenance:

  • Added test assertions to verify DICOM group tag 0x0021 is not overridden by Flywheel group label (GEAR-3019)

4.0.1 [2022-07-21]

Maintenance:

  • Enhanced package metadata with repository URL, keywords, and PyPI classifiers
  • Added README reference and expanded package description in pyproject.toml

4.0.0 [2022-07-21]

Enhancements:

  • Migrated from dcmtk storescu to pynetdicom for DICOM transmission with improved logging, error handling, and performance
  • Added configurable DICOM private tag parameters (group, identifier, tag_value)
  • Enabled bulk association for improved transmission performance

Fixes:

  • Fixed DICOM file filtering to properly validate files before transmission
  • Improved error reporting with specific failure codes and detailed messages
  • Fixed handling of temporary resource exhaustion with exponential backoff

Maintenance:

  • Enabled mypy, pylint, and pylint-tests pre-commit hooks for type checking and linting
  • Increased test coverage from 30% to 90%
  • Refactored codebase with full type annotations and improved code structure
  • Removed workers configuration option (bulk associations handle parallelism)
  • Removed tls_use_pem, tls_ciphers, and tls_seed configuration options
  • Simplified tls_enabled from three-state enum to boolean
  • Removed tls_security_profile configuration option
  • Updated test certificates and keys for TLS testing

Documentation:

  • Updated README to reflect migration from storescu to pynetdicom
  • Removed api_key input documentation (now handled automatically with read-only key)
  • Removed TLS cipher list documentation (no longer configurable)
  • Removed workflow section (implementation details)
  • Updated TESTING.md with alternative storescp instructions for TLS testing

Breaking Changes:

  • Changed DICOM transmission implementation from dcmtk storescu to pynetdicom library
  • Removed configuration options: workers, tls_use_pem, tls_ciphers, tls_seed, tls_security_profile
  • Changed tls_enabled from string enum (disabled/enabled/anonymous) to boolean
  • Report format changed from acquisition-centric to file-centric structure

3.0.3 [2022-05-04]

Fixes:

  • Fixed non signed-url file uploads by correcting the files parameter format in report_generator.py:242

3.0.2 [2022-04-27]

Enhancements:

  • Added configurable workers parameter to control the number of process pool workers for parallel DICOM transmission
  • Implemented parallel DICOM transmission using ProcessPoolExecutor for improved performance when sending multiple files

Fixes:

  • Removed --scan-directories flag from storescu command to resolve transmission issues

Maintenance:

  • Refactored DICOM transmission to use concurrent futures with proper error handling and result collection

3.0.1 [2022-04-12]

Fixes:

  • Fixed missing f-string prefix in log messages for zipfile and tarfile extraction
  • Fixed incorrect usage of acq.id instead of acq._id when downloading and sending DICOM files
  • Fixed gear to handle cases where no input file is provided, ensuring it correctly downloads files from the session

Maintenance:

  • Updated Dockerfile to use poetry install --no-dev for final installation step
  • Renamed api_key input to api-key in manifest for consistency with naming conventions

Documentation:

  • Added comprehensive testing guide for validating against real PACS systems
  • Documented firewall configuration and port setup for Orthanc server testing
  • Added troubleshooting steps for network connectivity verification

Enhancements:

  • Added debug configuration option to enable debug logging
  • Added environment variables section to manifest for better container configuration visibility

3.0.0 [2022-04-08]

Enhancements:

  • Added TLS support with configurable encryption modes (enabled, disabled, anonymous)
  • Added TLS configuration options including security profiles, cipher selection, and certificate validation
  • Added file download retry mechanism with configurable timeout for improved reliability
  • Added comprehensive gear execution report with transmission status details

Fixes:

  • Fixed file download error handling when no input file is provided

Maintenance:

  • Migrated from ubuntu:20.04 to flywheel/python base image
  • Updated dcmtk from 3.6.4-2.1build2 to 3.6.5-1
  • Migrated from flywheel-sdk to fw-core-client for API interactions
  • Updated pydicom from 2.1 to 2.3 with fw-file integration
  • Reorganized codebase into fw_gear_dicom_send package structure
  • Migrated dependency management to poetry with pyproject.toml
  • Added CI/CD pipeline configuration with .gitlab-ci.yml
  • Added pre-commit hooks for code quality checks (black, isort, pytest, etc.)
  • Updated Docker entrypoint to use poetry run python
  • Improved DICOM validation using fw-file DICOMCollection
  • Enhanced error logging for storescu command failures

Documentation:

  • Added CONTRIBUTING.md with development workflow and release process
  • Reorganized testing documentation into docs/TESTING.md
  • Added TLS configuration guide with Orthanc server setup instructions
  • Added changelog.md for tracking design decisions
  • Created merge request template with release notes checklist
  • Expanded README with TLS configuration details and available cipher list

2.1.1 [2021-07-30]

Fixes:

  • Fixed incorrect increment of dicoms_sent counter when DICOM transmission failed due to temporary errors

2.1.0 [2021-05-12]

Enhancements:

  • Added automatic retry logic with exponential backoff for DICOM transmissions that fail due to temporary congestion

Fixes:

  • Improved error handling for temporary DICOM transmission failures by detecting congestion errors and retrying up to 60 seconds

Maintenance:

  • Added backoff library dependency for retry functionality

2.0.3 [2021-05-12]

Fixes:

  • Fixed incorrect indentation in error handling code that could cause syntax errors

Maintenance:

  • Removed trailing whitespace from source files

2.0.2 [2021-05-12]

Fixes:

  • Fixed indentation error in run.py exit statement when not all DICOM files are successfully transmitted

2.0.1 [2021-05-12]

Fixes:

  • Fixed inconsistent exit behavior when DICOM transmission fails - now uses os.sys.exit(1) in all error cases to ensure proper error code propagation

2.0.0 [2021-05-12]

Enhancements:

  • Enhanced exit status handling to distinguish between partial and complete transmission failures, improving error reporting accuracy

Fixes:

  • Fixed gear success reporting to accurately reflect when not all DICOM files were successfully transmitted

Documentation:

  • Added clarification that gear only reports success when all DICOM files are successfully transmitted
  • Added port forwarding setup note for local testing with DICOM servers

1.1.2 [2020-09-09]

Fixes:

  • Fixed timestamp format in report filenames to use hyphens instead of colons for filesystem compatibility
  • Added filename sanitization to handle special characters and ensure valid filenames across different operating systems
  • Added special handling for t2* naming patterns to replace asterisks with star in filenames

Maintenance:

  • Added pathvalidate dependency for robust filename sanitization

1.1.1 [2020-09-08]

Fixes:

  • Fixed session ID retrieval when a file input is provided by getting the parent session from the acquisition
  • Refactored API key and Flywheel client handling to reduce redundant client instantiations

Maintenance:

  • Refactored run() function to accept api_key string instead of flywheel.Client object
  • Updated report_generator functions to accept api_key instead of flywheel.Client object
  • Improved argument handling in parse_config.py by sanitizing printed output to exclude sensitive API keys

Documentation:

  • Clarified that images are successfully sent when storescu returns a "0" exit code

1.1.0 [2020-08-26]

Enhancements:

  • Added CSV report generation that tracks export status for each DICOM file/archive, including acquisition ID, Flywheel path, filename, image counts, and completion status
  • Report is automatically uploaded as an attachment to the session container after gear execution
  • Report is printed to the log file in human-readable format for immediate visibility
  • Add count to track DICOM images present versus successfully sent

Maintenance:

  • Initialized logging via gear_context.init_logging() in main execution flow
  • Added new report_generator utility module for CSV report handling
  • Updated dicom_send.run() to pass flywheel.Client instance and acquisition ID for report generation
  • Modified tag_and_transmit.run() to return both present and sent DICOM counts

Documentation:

  • Added gear outputs section describing the CSV report format and columns
  • Added testing section with reference to TESTING.md
  • Updated workflow documentation to reflect report generation

1.0.0 [2020-08-18]

Enhancements:

  • Added support for tar archive (.tgz) input in addition to zip archives and single DICOM files
  • Added validation to check for empty archives and exit with error if detected
  • Added TESTING.md with instructions for local testing using Orthanc DICOM server

Fixes:

  • Fixed port configuration default value type from string to integer in manifest

Maintenance:

  • Upgraded base image from ubuntu:16.04 to ubuntu:20.04
  • Upgraded python from 2.7 to 3.8
  • Upgraded dcmtk to version 3.6.4-2.1build2
  • Migrated from bash script (run) to Python-based implementation (run.py)
  • Refactored codebase into modular utility functions in utils/ directory
  • Added flywheel-gear-toolkit for improved gear context handling
  • Replaced download_dicoms.py standalone script with integrated download functionality in utils/dicom_send.py
  • Replaced tagger.py standalone script with tag and transmit functionality in utils/tag_and_transmit.py
  • Added utils/parse_config.py for centralized configuration parsing

Documentation:

  • Updated manifest description to clarify gear behavior and private tag usage
  • Updated input description to explicitly mention support for zip, tar, and single DICOM files
  • Updated destination configuration description to clarify "engine host" requirement
  • Updated README workflow section to clarify session-level DICOM download behavior
  • Added gear category converter in manifest

0.15.0 [2020-07-15]

Enhancements:

  • Added read-only flag to api_key input for improved security
  • Expanded README with comprehensive gear description, inputs, configuration settings, and workflow documentation

Maintenance:

  • Consolidated dependency installation in Dockerfile to use requirements.txt
  • Reformatted all Python code to follow standardized formatting guidelines
  • Updated manifest structure to use gear-builder custom configuration format
  • Changed source URL from https://flywheel.io to https://github.com/flywheel-apps/dicom-send
  • Updated gear label from "DCMTK: DICOM Send - storescu" to "DCMTK: DICOM Send"
  • Added tests/__init__.py file to properly structure test package

0.14.1 [2019-01-28]

Fixes:

  • Fixed crash when processing non-DICOM files in directory by catching pydicom.errors.InvalidDicomError and skipping invalid files
  • Added warning message when no DICOM files were successfully tagged

0.14.0 [2018-12-03]

Enhancements:

  • Added automatic site admin privilege detection and usage for DICOM downloads when authenticated user has root access

0.13.0 [2018-09-07]

Enhancements:

  • Added validation to check if DICOM files have recognized SOPClassUID before attempting to send
  • Added counter to track number of successfully sent DICOM files
  • Changed exit behavior to only fail if no DICOM files were successfully sent, allowing partial success when some files have unrecognized SOPClassUID

Fixes:

  • Fixed potential issue with file path handling by adding quotes around $input_file variable in cp command

0.12.0 [2018-08-28]

Enhancements:

  • Added DICOM file tagging to prevent re-reaping of sent files using private DICOM tags

Fixes:

  • Fixed zip extraction handling to correctly identify directory structure and avoid path resolution errors

Maintenance:

  • Added pydicom>=1.1.0 dependency for DICOM file manipulation

0.11.0 [2018-07-10]

Enhancements:

  • Added support for sending all DICOMs from a session when no input file is provided
  • Added api_key input to enable authentication with Flywheel API
  • Made file input optional to support session-level DICOM operations
  • Added batch processing to send multiple DICOM files sequentially

Maintenance:

  • Installed python2.7 and python-pip system packages
  • Added flywheel-sdk Python package
  • Added download_dicoms.py script for retrieving DICOMs from Flywheel sessions

0.10.0 [2018-06-27]

Enhancements:

  • Added configurable calling_ae parameter to allow customization of the Calling AE title (defaults to flywheel)

Fixes:

  • Removed handling for PAR/REC files, which are not valid DICOM format
  • Fixed configuration parsing logic to properly handle both config.json and manifest.json fallback scenarios
  • Added verbose output flag (-v) to storescu command for better debugging
  • Added proper quoting to shell variables to prevent word splitting issues
  • Fixed file copy command to preserve file attributes using cp -a

Maintenance:

  • Refactored configuration parsing into reusable parse_config function
  • Improved code organization and comments in run script
  • Removed default values from configuration fields that should be user-specified (destination, called_ae)
  • Updated gear label to include DCMTK suite branding
  • Updated author from individual to organization (Flywheel)
  • Added flywheel.suite metadata field for gear categorization

Documentation:

  • Added README with Docker Hub badges and gear description
  • Improved configuration field descriptions with clearer usage notes
  • Fixed typo in called_ae description ("recieving" → "receiving")
  • Enhanced destination field description to note server reachability requirement

0.9.0 [2018-03-29]

Enhancements:

  • Added input type validation to restrict file input to dicom files only

Maintenance:

  • Removed trailing whitespace from shell script comments

0.6.3 [2018-02-21]

Maintenance:

  • Added unzip system package to Docker image

0.6.2 [2018-02-07]

Fixes:

  • Added execute permissions to the run script in the Docker container to ensure proper execution

0.6.1 [2018-02-07]

Enhancements:

  • Added DICOM file sending capability using dcmtk storescu to transmit DICOM data to remote DICOM servers
  • Added support for multiple input formats including zip archives, gzipped files, and raw DICOM files
  • Added configurable destination server, Called AE title, and port number through gear configuration
  • Added automatic extraction and handling of compressed DICOM archives

Documentation:

  • Added initial README
  • Added gear manifest with configuration options for destination server, Called AE title, and port settings