Release Notes¶
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.
- When acting as the Acceptor and calling one of the
Enhancements¶
- Added
Event.move_destination
(forevt.EVT_C_MOVE
),Event.action_type
(forevt.EVT_N_ACTION
),Event.event_type
(forevt.EVT_N_EVENT_REPORT
) andEvent.event
properties (#353) - Added
meta_uid
keyword parameters to theAssociation.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
andcontexts
keyword arguments added toAE.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()
andAssociation.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
andEvent.description
properties removed, useEvent.event.name
andEvent.event.description
instead.
1.3.1¶
1.3.0¶
Fixes¶
- Exceptions raised during generator operation for C-GET and C-MOVE services now handled properly.
fsm.AA_4
andfsm.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()
andget_events()
toAssociation
andAssociationServer
classes. - Add
assoc
properties toDIMSEServiceProvider
andACSE
classes
_config.ENFORCE_UID_CONFORMANCE
added which determines the level of conformance required for UIDs. IfTrue
then all UIDs are required to meet the UID rules in the DICOM Standard, ifFalse
(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 theAssociation
as its only parameter.dul
,dimse_timeout
andmaximum_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 clientsocket.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
, andThreadedAssociationServer
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 forAE.associate()
andssl_context
keyword parameter forAE.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)
- Added
- 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()
andDIMSEServiceProvider.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 toAE.on_c_get()
,AE.on_c_find()
andAE.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
- 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()
andACSE.release_association()
removed as per planned deprecation.AE.start()
is deprecated and will be removed in v1.3, useAE.start_server()
instead.AE.stop()
is deprecated and will be removed in v1.3, useAE.shutdown()
instead.- The
AE.port
property andport
argument forAE()
are deprecated and will be removed in v1.3. Use theaddress
parameter forAE.start_server()
and thebind_address
keyword parameter forAE.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 theaddress
parameter forAE.start_server()
and thebind_address
keyword parameter forAE.associate()
instead. - Changed the default DIMSE timeout to 30 s.
- Changed the default number of maximum associations to 10.
- The
acse_timeout
parameter toACSE()
andACSE.acse_timeout
attribute removed, theAssociation.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()
andsend_c_cancel_move()
are deprecated and will be removed in v1.3. UseAssociation.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 inAE.add_requested_context()
,AE.add_supported_context()
andpresentation.build_context()
- Completely fixed handling a maximum PDU length of 0. (#193)
DIMSEMessage
subclass creation andDIMSEMessage.primitive_to_message
should now be thread-safe (#137)- Fixed A-RELEASE collision not being implemented correctly. (#269)
- Fixed bugs in
fsm.AR_8
andfsm.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¶
Changes¶
AE.quit()
is deprecated and will be removed in v1.2. UseAE.stop()
instead.DIMSEMessage.ID
is deprecated and will be removed in v1.2. UseDIMSEMessage.context_id
instead.- Added
_globals.py
for frequently used global constants. utils.validate_ae_title
changed to only return bytes for Python 3AE.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 matchesAE.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. UseACSE.is_release_requested
instead.ACSE.release_association
is deprecated and will be removed in v1.2. UseACSE.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 renamedae
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
andbind_addr
arguments removed fromAE
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 the following:
- Removed
VerificationSOPClass
,StorageSOPClassList
andQueryRetrieveSOPClassList
. - Added
VerificationPresentationContexts
,StoragePresentationContexts
,QueryRetrievePresentationContexts
andBasicWorklistManagmentPresentationContexts
to replace them - Added
service_class
module and moved the service class implementations fromsop_class
toservice_class
. - The three Query/Retrieve service class implementations (Find, Get, Move) have been consolidated into one.
BasicWorklistManagementServiceClass
reimplemented separately from QR.SOPClass
class added tosop_class
module and all SOP Class objects now inherit from it rather than the corresponding service class.utils.PresentationContextManager
removedMaximumLengthNegotiation
changed toMaximumLengthNotification
ImplementationClassUIDNegotiation
changed toImplementationClassUIDNotification
ImplementationVersionNameNegotiation
changed toImplementationVersioNameNotification
- 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
- Added
association.ServiceUser
class Association
refactored to do less association negotiation work and to operate independently of the ACSE instance.- Added
Association.requestor
andAssociation.acceptor
attributes which areServiceUser
instances that track the association requestor and acceptor.
- Added
- Project named changed from pynetdicom3 to pynetdicom
Enhancements¶
- Add
context
andinfo
parameters to on_c_* callbacks (#45, #54, #65, #106) - Added contribution, issue and PR guides (#66)
- Added PEP8 conformant
PYNETDICOM_IMPLEMENTATION_VERSION
andPYNETDICOM_IMPLEMENTATION_UID
variables. The old ones will be removed in v1.0 - Added
AE.implementation_version_name
andAE.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