Release Notes

1.4.1

Fixes

  • Fixed server socket not closing properly after association release (#382)

1.4.0

Fixes

  • Fixed Query Retrieve service class not responded with 0x0000 (Success) if no matches were yielded by the C-FIND request handler.

  • Fixed association being aborted due to failure to decode a rejected presentation context when the transfer syntax value is empty (#342)

  • Checkpoint added to the reactor in Association to prevent possible race conditions:

    • When acting as the Acceptor and calling one of the Association.send_*() methods.

    • During an A-RELEASE collision.

Enhancements

  • Added Event.move_destination (for evt.EVT_C_MOVE), Event.action_type (for evt.EVT_N_ACTION), Event.event_type (for evt.EVT_N_EVENT_REPORT) and Event.event properties (#353)

  • Added meta_uid keyword parameters to the Association.send_n_*() methods to allow the use of Meta SOP Classes (such as those used in the Print Management service class)

  • Added Basic Grayscale Print Management Meta SOP Class and Basic Color Print Management Meta SOP Class to sop_class.

  • Added support for the following service classes:

    • Protocol Approval Query Retrieve (#327)

    • Application Event Logging

    • Instance Availability Notification

    • Media Creation Management

    • Print Management

    • Unified Procedure Step

    • RT Machine Verification

    • Storage Commitment

  • Added handling of non-conformant Presentation Context AC (reject) PDUs which contain no Transfer Syntax Sub-item (#361)

  • ae_title and contexts keyword arguments added to AE.start_server()

  • Invalid (0000,1030) Move Originator Application Entity Title values received in C-STORE service requests are now logged and ignored rather than raising an exception and aborting the association.

  • Improved handling of DIMSE service messages with empty element values.

  • Added handling for DIMSE service requests when acting as the association Requestor

Changes

  • The following have been removed as per planned deprecation:

    • AE.on_c_store(), AE.on_c_echo(), AE.on_c_find(), AE.on_c_get(), AE.on_c_move(), AE.on_n_get(), AE.on_async_ops_window(), AE.on_sop_class_common_extended(), AE.on_sop_class_extended(), AE.on_user_identity(), AE.on_association_accepted(), AE.on_association_rejected(), AE.on_association_released(), AE.on_association_aborted(),

    • _config.DECODE_STORE_DATASETS

    • DIMSEServiceProvider.on_send_dimse_message(), DIMSEServiceProvider.on_receive_dimse_message()

  • Association.send_c_find(), Association.send_c_get() and Association.send_c_move() now require a query_model parameter that is used to set the Affected SOP Class UID value. The parameter should pass a pydicom UID or UID string. Passing a key that corresponds to a given UID is deprecated and will be removed in v1.5. (#348)

  • Event.name and Event.description properties removed, use Event.event.name and Event.event.description instead.

1.3.1

Fixes

  • Fixed association being aborted due to a rejected presentation context performing a validation check on the transfer syntax value (#342)

1.3.0

Fixes

  • Exceptions raised during generator operation for C-GET and C-MOVE services now handled properly.

  • fsm.AA_4 and fsm.AA_8 now send A-P-ABORT to the service user rather than an A-ABORT

  • Fixed rejected contexts not being included in the Presentation Context Definition Results List when acting as the association Acceptor.

  • The Message ID values for C-MOVE and C-GET sub-operations now iterate instead of just re-using 1. (#315)

  • The default logging configuration no longer uses a non-NullHandler (#321)

  • Fixed Unified Procedure Step’s SOP Class UID variable names

  • Fixed memory leak caused by keeping old Association threads around after they died (#328)

Enhancements

  • Added event-handler system as a replacement for the callback system

    • Added events.py module with the defined events, Event class and event-related support functions.

    • Added _handlers.py module with standard logging handlers

    • Added bind(), unbind(), get_handlers() and get_events() to Association and AssociationServer classes.

    • Add assoc properties to DIMSEServiceProvider and ACSE classes

  • _config.ENFORCE_UID_CONFORMANCE added which determines the level of conformance required for UIDs. If True then all UIDs are required to meet the UID rules in the DICOM Standard, if False (default) then UIDs only need to meet the length requirement. (#316, #322)

  • Support added for Modality Performed Procedure Step Management - only with the event-handler system. (#56)

Changes

  • The following have been removed as per planned deprecation:

    • AE.start(), AE.stop(), AE.address, AE.bind_address, AE.local_socket, AE.port

    • Association.send_c_cancel_find(), Association.send_c_cancel_get(), Association.send_c_cancel_move()

  • All callback related class methods are deprecated and will be removed in v1.4. Use the event-handler system instead.

  • _config.DECODE_STORE_DATASETS is deprecated and will be removed in v1.4. Use the event-handler system instead.

  • DIMSEServiceProvider init now takes the Association as its only parameter. dul, dimse_timeout and maximum_pdu_size properties added instead.

1.2.0

Fixes

  • Fixed network_timeout not working when acting as the association requestor and an A-ABORT not being sent when the timeout expired. (#286)

  • Fixed changing network_timeout value not propagating to the actual timer.

  • All DIMSE service requests should now properly abort the association if no response is received within the DIMSE timeout window and return/yield expected values. (#119)

  • Any outgoing primitives are now sent to the peer before incoming PDUs are processed (#120)

  • Fixed not setting requestor presentation context roles to False when only one role is specified during Role Selection negotiation. (#293)

Enhancements

  • Added _config module and the ability to skip the dataset decoding step in C-STORE operations by setting _config.DECODE_STORE_DATASETS to False (#282)

  • Consolidated and improved the robustness of the transport related code (#42):

    • Added transport module

    • Added AssociationSocket class that wraps a client socket.socket to provide integration with the Association state machine. In particular all receive and send operations should emit state machine event ‘Evt17’ when the connection is closed. (#204)

    • Added AssociationServer, and ThreadedAssociationServer classes to provide association acceptor services.

    • fsm.AE_1 is now properly implemented and state machine event ‘Evt2’ is now emitted in a non-trivial manner.

    • Added AE.start_server() which allows operation in both blocking and non-blocking modes.

    • Added AE.shutdown() which allows the user to shutdown all non-blocking association servers that may be running.

    • Support for TLS added via the tls_args keyword parameter for AE.associate() and ssl_context keyword parameter for AE.start_server() (#175, #71)

    • It should now be possible to both request a C-MOVE operation and act as the destination for the request’s C-STORE sub-operations over a new association within the same AE instance by running a non-blocking Storage SCP. (#5, #181)

  • Received P-DATA primitives are now processed when received rather than when processing is requested.

  • Added DIMSEServiceProvider.get_msg(), DIMSEServiceProvider.receive_primitive(), DIMSEServiceProvider.peek_msg() and DIMSEServiceProvider.msg_queue to be used with the new P-DATA processing.

  • Time required to start an association improved significantly.

  • Implemented C-CANCEL support

    • Added ServiceClass.is_cancelled() method to allow checking whether a C-CANCEL message corresponding to a message ID value has been received.

    • Added ‘cancelled’ key to the info parameter passed to AE.on_c_get(), AE.on_c_find() and AE.on_c_move(). The corresponding value is a callable function (is_cancelled()) that takes a Message ID value and and returns True if a C-CANCEL message with a corresponding Message ID Being Responded To value has been received.

  • Added thread names (‘threadtype@timestamp’).

  • Added build_role() to simplify creating SCP/SCU Role Selection Negotiation items.

Changes

  • AE.quit(), DIMSEMessage.ID, ACSE.is_released() and ACSE.release_association() removed as per planned deprecation.

  • AE.start() is deprecated and will be removed in v1.3, use AE.start_server() instead.

  • AE.stop() is deprecated and will be removed in v1.3, use AE.shutdown() instead.

  • The AE.port property and port argument for AE() are deprecated and will be removed in v1.3. Use the address parameter for AE.start_server() and the bind_address keyword parameter for AE.associate() instead.

  • The AE.local_socket attribute is deprecated and will be removed in v1.3.

  • The AE.address attribute is deprecated and will be removed in v1.3.

  • The AE.bind_addr attribute is deprecated and will be removed in v1.3. Use the address parameter for AE.start_server() and the bind_address keyword parameter for AE.associate() instead.

  • Changed the default DIMSE timeout to 30 s.

  • Changed the default number of maximum associations to 10.

  • The acse_timeout parameter to ACSE() and ACSE.acse_timeout attribute removed, the Association.acse_timeout value is used instead.

  • AE.active_associations changed from an attribute to a property and returns a list of all the AE’s active Association threads.

  • AE.associate() is now synchronous until association negotiation has completed or the connection closed (#108).

  • Removed DIMSEServiceProvider.receive_msg().

  • Association.send_c_cancel_get(), send_c_cancel_find() and send_c_cancel_move() are deprecated and will be removed in v1.3. Use Association.send_c_cancel() instead.

  • Removed AE.on_c_get_cancel(), AE.on_c_find_cancel(), AE.on_c_move_cancel().

1.1.0

Fixes

  • No longer using a list as the default value for the transfer_syntax keyword argument in AE.add_requested_context(), AE.add_supported_context() and presentation.build_context()

  • Completely fixed handling a maximum PDU length of 0. (#193)

  • DIMSEMessage subclass creation and DIMSEMessage.primitive_to_message should now be thread-safe (#137)

  • Fixed A-RELEASE collision not being implemented correctly. (#269)

  • Fixed bugs in fsm.AR_8 and fsm.AA_7.

  • Fixed DUL not handling the service user sending A-P-ABORT primitives. (#270)

  • Fixed the DUL endlessly waiting in State 13 if the remote didn’t close the connection and there was data still available to be read. (#272)

Enhancements

  • Added select_timeout parameter to Association.start() to allow the user to specify how long the select.select() call blocks for. (#260)

  • Improved the CPU usage of the AE when running idle as an SCP (#60).

Changes

  • AE.quit() is deprecated and will be removed in v1.2. Use AE.stop() instead.

  • DIMSEMessage.ID is deprecated and will be removed in v1.2. Use DIMSEMessage.context_id instead.

  • Added _globals.py for frequently used global constants.

  • utils.validate_ae_title changed to only return bytes for Python 3

  • AE.require_calling_aet now takes a list of AE titles (as bytes) rather than a single AE title. If set to a non-empty list then association requests will be rejected unless the value of the Calling AE Title parameter matches one of those in the list. If set to an empty list (default) then all associations will be accepted (unless rejected for other reasons). (#192)

  • AE.require_called_aet should now be set using a bool. If True then any association requests will be rejected unless the value of the Called AE Title parameter matches AE.ae_title. If False (default) then no matching will be performed and all associations accepted (unless rejected for other reasons). (#184)

  • ACSE.is_released is deprecated and will be removed in v1.2. Use ACSE.is_release_requested instead.

  • ACSE.release_association is deprecated and will be removed in v1.2. Use ACSE.negotiate_release instead.

  • The association acceptor no longer aborts an accepted association if there are no accepted presentation contexts. The association requestor still does.

  • Default ACSE timeout changed to 30 s and default network timeout to 60 s.

1.0.0

Fixes

  • Fixed upstream pydicom changes to AE elements breaking logging (#195)

  • Fixed typos in SOP class names, fix bad UID

  • Fixed SCP/SCU Role Negotiation requiring both SCP and SCU role values to be set (as association requestor)

  • Starting with v1.0.0, versioning should be consistent

Changes

  • applicationentity module renamed ae

  • ApplicationEntity interface updated

    • Removed the following: AE.scu_supported_sop, AE.scp_supported_sop, AE.transfer_syntax, AE.presentation_contexts_scu, AE.presentation_contexts_scp.

    • scu_sop_class, scp_sop_class, transfer_syntax and bind_addr arguments removed from AE initialisation.

    • Added AE.bind_addr attribute to allow the user to specify the network adapter.

    • Added AE.add_supported_context(), AE.supported_contexts, AE.remove_supported_context() for adding and removing the presentation contexts supported as an SCP.

    • Added AE.add_requested_context(), AE.requested_contexts, AE.remove_requested_context() for adding and removing the presentation contexts requested as an SCU.

  • Removed VerificationSOPClass, StorageSOPClassList and QueryRetrieveSOPClassList.

  • Added VerificationPresentationContexts, StoragePresentationContexts, QueryRetrievePresentationContexts and BasicWorklistManagmentPresentationContexts to replace them

  • Added service_class module and moved the service class implementations from sop_class to service_class.

  • The three Query/Retrieve service class implementations (Find, Get, Move) have been consolidated into one.

  • BasicWorklistManagementServiceClass reimplemented separately from QR.

  • SOPClass class added to sop_class module and all SOP Class objects now inherit from it rather than the corresponding service class.

  • utils.PresentationContextManager removed

  • MaximumLengthNegotiation changed to MaximumLengthNotification

  • ImplementationClassUIDNegotiation changed to ImplementationClassUIDNotification

  • ImplementationVersionNameNegotiation changed to ImplementationVersioNameNotification

  • Simplified service_class.ServiceClass interface

  • ACSE refactored to do more of the association negotiation work and to operate independently of the Association instance.

    • Added send_abort, send_ap_abort, send_reject, send_release send_request, send_accept methods

    • Added negotiate_association method

    • Added release_association method

  • Added association.ServiceUser class

  • Association refactored to do less association negotiation work and to operate independently of the ACSE instance.

    • Added Association.requestor and Association.acceptor attributes which are ServiceUser instances that track the association requestor and acceptor.

  • Project named changed from pynetdicom3 to pynetdicom

Enhancements

  • Add context and info parameters to on_c_* callbacks (#45, #54, #65, #106)

  • Added contribution, issue and PR guides (#66)

  • Added PEP8 conformant PYNETDICOM_IMPLEMENTATION_VERSION and PYNETDICOM_IMPLEMENTATION_UID variables. The old ones will be removed in v1.0

  • Added AE.implementation_version_name and AE.implementation_class_uid attributes so user’s can specify the values used during association negotiation.

  • Allow per-association presentation context requests (SCU)

  • Allow more than 128 supported presentation contexts (SCP)

  • Documentation added: user guide, examples, API reference (#1, #45, #49, #50)

  • Add support for QR Instance and Frame Level Retrieve

  • Add support for QR Composite Instance Root Retrieval

  • Add support for the Relevant Patient Information Query service

  • Add support for the Hanging Protocol QR service

  • Add support for the Substance Administration Query service

  • Add support for the Color Palette QR service

  • Add support for the Implant Template QR service

  • Add support for the Non-Patient Information Storage service

  • Add support for the Defined Procedure Protocol QR service

  • Add support for the Display System Management service

  • Add support for N-GET, N-SET, N-EVENT-REPORT, N-DELETE, N-ACTION, N-CREATE as SCU.

  • Add full support for SCP/SCU Role Selection Negotiation

  • Add support for SOP Class Extended Negotiation

  • Add support for Asynchronous Operations Window Negotiation, however pynetdicom does not support asynchronous operations.

  • Add support for User Identity Negotiation

  • Add support for SOP Class Common Extended Negotiation

  • Non-conformant (null trailing padded) UIDs in A-ASSOCIATE messages are now handled