OpenREM 1.0.0b2__py3-none-any.whl → 1.0.0b3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openrem/locale/de/LC_MESSAGES/django.po +1060 -1059
- openrem/locale/django.pot +973 -972
- openrem/locale/es_MX/LC_MESSAGES/django.po +1049 -1048
- openrem/locale/it/LC_MESSAGES/django.po +1044 -1043
- openrem/locale/lt/LC_MESSAGES/django.po +989 -988
- openrem/locale/nb_NO/LC_MESSAGES/django.po +985 -984
- openrem/locale/pt_BR/LC_MESSAGES/django.po +1003 -1002
- openrem/manage.py +10 -10
- openrem/openremproject/__init__.py +1 -1
- openrem/openremproject/local_settings.py.linux +128 -128
- openrem/openremproject/local_settings.py.windows +144 -144
- openrem/openremproject/local_settings.py.windows-sqlite3 +129 -129
- openrem/openremproject/settings.py +278 -278
- openrem/openremproject/urls.py +32 -32
- openrem/openremproject/wsgi.py.example +28 -28
- openrem/remapp/__init__.py +2 -2
- openrem/remapp/admin.py +31 -31
- openrem/remapp/exports/ct_export.py +780 -753
- openrem/remapp/exports/dx_export.py +817 -805
- openrem/remapp/exports/export_common.py +931 -951
- openrem/remapp/exports/export_common_pandas.py +2422 -0
- openrem/remapp/exports/exportviews.py +815 -860
- openrem/remapp/exports/mg_csv_nhsbsp.py +292 -292
- openrem/remapp/exports/mg_export.py +673 -510
- openrem/remapp/exports/nm_export.py +796 -575
- openrem/remapp/exports/rf_export.py +1418 -1431
- openrem/remapp/extractors/ct_philips.py +424 -414
- openrem/remapp/extractors/ct_toshiba.py +2116 -2108
- openrem/remapp/extractors/dx.py +1033 -952
- openrem/remapp/extractors/extract_common.py +817 -817
- openrem/remapp/extractors/import_views.py +426 -426
- openrem/remapp/extractors/mam.py +685 -672
- openrem/remapp/extractors/nm_image.py +439 -431
- openrem/remapp/extractors/ptsizecsv2db.py +368 -368
- openrem/remapp/extractors/rdsr.py +667 -654
- openrem/remapp/extractors/rdsr_methods.py +1771 -1768
- openrem/remapp/extractors/rrdsr_methods.py +630 -622
- openrem/remapp/fixtures/openskin_safelist.json +11 -11
- openrem/remapp/forms.py +2286 -2277
- openrem/remapp/interface/chart_functions.py +2412 -2393
- openrem/remapp/interface/mod_filters.py +1241 -1243
- openrem/remapp/migrations/0001_initial.py.1-0-upgrade +1043 -1043
- openrem/remapp/models.py +3418 -3407
- openrem/remapp/netdicom/dicomviews.py +681 -683
- openrem/remapp/netdicom/qrscu.py +2646 -2646
- openrem/remapp/netdicom/tools.py +134 -134
- openrem/remapp/static/css/bootstrap-theme.css +587 -587
- openrem/remapp/static/css/bootstrap-theme.min.css +4 -4
- openrem/remapp/static/css/bootstrap.css +6800 -6800
- openrem/remapp/static/css/bootstrap.min.css +4 -4
- openrem/remapp/static/css/datepicker3.css +790 -790
- openrem/remapp/static/css/jquery.qtip.min.css +2 -2
- openrem/remapp/static/css/openrem-extra.css +442 -442
- openrem/remapp/static/css/openrem.css +96 -96
- openrem/remapp/static/css/registration.css +34 -34
- openrem/remapp/static/fonts/glyphicons-halflings-regular.svg +287 -287
- openrem/remapp/static/js/bootstrap-datepicker.js +1671 -1671
- openrem/remapp/static/js/bootstrap.js +2363 -2363
- openrem/remapp/static/js/bootstrap.min.js +6 -6
- openrem/remapp/static/js/charts/chartCommonFunctions.js +75 -75
- openrem/remapp/static/js/charts/chartFullScreen.js +41 -41
- openrem/remapp/static/js/charts/ctChartAjax.js +331 -331
- openrem/remapp/static/js/charts/dxChartAjax.js +290 -290
- openrem/remapp/static/js/charts/mgChartAjax.js +144 -144
- openrem/remapp/static/js/charts/nmChartAjax.js +64 -64
- openrem/remapp/static/js/charts/plotly-2.35.2.min.js +8 -0
- openrem/remapp/static/js/charts/rfChartAjax.js +128 -128
- openrem/remapp/static/js/chroma.min.js +32 -32
- openrem/remapp/static/js/datepicker.js +5 -5
- openrem/remapp/static/js/dicom.js +115 -115
- openrem/remapp/static/js/django_reverse/reverse.js +13 -13
- openrem/remapp/static/js/formatDate.js +7 -7
- openrem/remapp/static/js/html5shiv.min.js +8 -8
- openrem/remapp/static/js/jquery-1.11.0.min.js +4 -4
- openrem/remapp/static/js/npm.js +12 -12
- openrem/remapp/static/js/respond.min.js +4 -4
- openrem/remapp/static/js/skin-dose-maps/jquery.qtip.min.js +4 -4
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMap3dHUDObject.js +112 -112
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMap3dObject.js +367 -367
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMap3dPersonObject.js +158 -158
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMapColourScaleObject.js +153 -153
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMapObject.js +367 -367
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMapping.js +584 -584
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMapping3d.js +255 -255
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMappingAjax.js +267 -212
- openrem/remapp/static/js/skin-dose-maps/three.min.js +835 -835
- openrem/remapp/static/js/sorttable.js +495 -495
- openrem/remapp/templates/base.html +253 -253
- openrem/remapp/templates/registration/changepassword.html +25 -25
- openrem/remapp/templates/registration/changepassworddone.html +12 -12
- openrem/remapp/templates/registration/login.html +42 -42
- openrem/remapp/templates/remapp/backgroundtaskmaximumrows_form.html +29 -29
- openrem/remapp/templates/remapp/base.html +1 -1
- openrem/remapp/templates/remapp/ctdetail.html +235 -235
- openrem/remapp/templates/remapp/ctfiltered.html +310 -310
- openrem/remapp/templates/remapp/dicomdeletesettings_form.html +31 -31
- openrem/remapp/templates/remapp/dicomqr.html +147 -147
- openrem/remapp/templates/remapp/dicomquerydetails.html +83 -83
- openrem/remapp/templates/remapp/dicomqueryimages.html +49 -49
- openrem/remapp/templates/remapp/dicomqueryseries.html +109 -109
- openrem/remapp/templates/remapp/dicomquerysummary.html +48 -48
- openrem/remapp/templates/remapp/dicomremoteqr_confirm_delete.html +60 -60
- openrem/remapp/templates/remapp/dicomremoteqr_form.html +32 -32
- openrem/remapp/templates/remapp/dicomstorescp_confirm_delete.html +53 -53
- openrem/remapp/templates/remapp/dicomstorescp_form.html +48 -48
- openrem/remapp/templates/remapp/dicomsummary.html +257 -257
- openrem/remapp/templates/remapp/displaychartoptions.html +184 -184
- openrem/remapp/templates/remapp/displayhomepageoptions.html +57 -57
- openrem/remapp/templates/remapp/displayname-count.html +6 -6
- openrem/remapp/templates/remapp/displayname-last-date.html +3 -3
- openrem/remapp/templates/remapp/displayname-modality.html +86 -105
- openrem/remapp/templates/remapp/displayname-skinmap.html +18 -18
- openrem/remapp/templates/remapp/displaynameupdate.html +100 -100
- openrem/remapp/templates/remapp/displaynameview.html +222 -219
- openrem/remapp/templates/remapp/dxdetail.html +176 -176
- openrem/remapp/templates/remapp/dxfiltered.html +324 -324
- openrem/remapp/templates/remapp/exports-active.html +25 -25
- openrem/remapp/templates/remapp/exports-complete.html +35 -35
- openrem/remapp/templates/remapp/exports-error.html +26 -26
- openrem/remapp/templates/remapp/exports-queue.html +18 -18
- openrem/remapp/templates/remapp/exports.html +191 -191
- openrem/remapp/templates/remapp/failed_summary_list.html +27 -27
- openrem/remapp/templates/remapp/filteredbase.html +162 -162
- openrem/remapp/templates/remapp/highdosemetricalertsettings_form.html +76 -76
- openrem/remapp/templates/remapp/home-list-modalities.html +94 -94
- openrem/remapp/templates/remapp/home.html +202 -202
- openrem/remapp/templates/remapp/list_filters.html +24 -24
- openrem/remapp/templates/remapp/mgdetail.html +160 -138
- openrem/remapp/templates/remapp/mgfiltered.html +311 -311
- openrem/remapp/templates/remapp/nmdetail.html +300 -300
- openrem/remapp/templates/remapp/nmfiltered.html +255 -255
- openrem/remapp/templates/remapp/notpatient.html +190 -190
- openrem/remapp/templates/remapp/notpatientindicators_form_base.html +81 -81
- openrem/remapp/templates/remapp/notpatientindicatorsid_confirm_delete.html +54 -54
- openrem/remapp/templates/remapp/notpatientindicatorsid_form.html +23 -23
- openrem/remapp/templates/remapp/notpatientindicatorsname_confirm_delete.html +54 -54
- openrem/remapp/templates/remapp/notpatientindicatorsname_form.html +23 -23
- openrem/remapp/templates/remapp/notpatientindicatorsname_form_base.html +85 -85
- openrem/remapp/templates/remapp/openskinsafelist_add.html +130 -130
- openrem/remapp/templates/remapp/openskinsafelist_confirm_delete.html +100 -100
- openrem/remapp/templates/remapp/openskinsafelist_form.html +207 -207
- openrem/remapp/templates/remapp/patientidsettings_form.html +83 -83
- openrem/remapp/templates/remapp/populate_summary_progress.html +83 -83
- openrem/remapp/templates/remapp/populate_summary_progress_error.html +36 -36
- openrem/remapp/templates/remapp/review_failed_imports.html +157 -157
- openrem/remapp/templates/remapp/review_failed_study.html +41 -41
- openrem/remapp/templates/remapp/review_studies_delete_button.html +20 -20
- openrem/remapp/templates/remapp/review_study.html +19 -19
- openrem/remapp/templates/remapp/review_summary_list.html +245 -245
- openrem/remapp/templates/remapp/rf_dose_alert_email_template.html +14 -1
- openrem/remapp/templates/remapp/rfalertnotificationsview.html +59 -59
- openrem/remapp/templates/remapp/rfdetail.html +547 -543
- openrem/remapp/templates/remapp/rfdetailbase.html +18 -18
- openrem/remapp/templates/remapp/rffiltered.html +404 -404
- openrem/remapp/templates/remapp/sizeimports.html +119 -119
- openrem/remapp/templates/remapp/sizeprocess.html +96 -96
- openrem/remapp/templates/remapp/sizeupload.html +110 -110
- openrem/remapp/templates/remapp/skindosemapcalcsettings_form.html +28 -28
- openrem/remapp/templates/remapp/standardname-modality.html +69 -69
- openrem/remapp/templates/remapp/standardnames_confirm_delete.html +71 -71
- openrem/remapp/templates/remapp/standardnames_form.html +87 -87
- openrem/remapp/templates/remapp/standardnamesettings_form.html +41 -41
- openrem/remapp/templates/remapp/standardnamesrefreshall.html +92 -92
- openrem/remapp/templates/remapp/standardnameview.html +103 -103
- openrem/remapp/templates/remapp/study_confirm_delete.html +147 -147
- openrem/remapp/templates/remapp/task_admin.html +265 -265
- openrem/remapp/templates/remapp/tasks.html +76 -76
- openrem/remapp/templatetags/formfilters.py +13 -13
- openrem/remapp/templatetags/proper_paginate.py +38 -38
- openrem/remapp/templatetags/remappduration.py +36 -36
- openrem/remapp/templatetags/sigdig.py +38 -38
- openrem/remapp/templatetags/sort_class_property_value.py +15 -15
- openrem/remapp/templatetags/update_variable.py +20 -20
- openrem/remapp/templatetags/url_replace.py +25 -25
- openrem/remapp/tests/test_charts_common.py +202 -202
- openrem/remapp/tests/test_charts_ct.py +7111 -7111
- openrem/remapp/tests/test_charts_dx.py +3513 -3513
- openrem/remapp/tests/test_charts_mg.py +1116 -1115
- openrem/remapp/tests/test_dcmdatetime.py +189 -189
- openrem/remapp/tests/test_dicom_qr.py +2580 -2580
- openrem/remapp/tests/test_display_name.py +274 -274
- openrem/remapp/tests/test_export_ct_xlsx.py +272 -248
- openrem/remapp/tests/test_export_dx_xlsx.py +137 -134
- openrem/remapp/tests/test_export_mammo_csv.py +242 -242
- openrem/remapp/tests/test_export_rf_xlsx.py +246 -246
- openrem/remapp/tests/test_files/DX-Im-DRGEM.dcm +0 -0
- openrem/remapp/tests/test_files/MG-RDSR-GEPristina-2D.dcm +0 -0
- openrem/remapp/tests/test_files/MG-RDSR-GEPristina-DBT.dcm +0 -0
- openrem/remapp/tests/test_files/MG-RDSR-Giotto-DBT.dcm +0 -0
- openrem/remapp/tests/test_files/skin_map_alphenix.py +590 -590
- openrem/remapp/tests/test_files/skin_map_zee.py +354 -354
- openrem/remapp/tests/test_filters_ct.py +321 -321
- openrem/remapp/tests/test_filters_dx.py +92 -92
- openrem/remapp/tests/test_filters_mammo.py +183 -183
- openrem/remapp/tests/test_filters_rf.py +118 -118
- openrem/remapp/tests/test_get_values.py +72 -72
- openrem/remapp/tests/test_hash_id.py +65 -65
- openrem/remapp/tests/test_import_ct_esr_ge.py +3034 -3034
- openrem/remapp/tests/test_import_ct_philips_rdsr.py +42 -42
- openrem/remapp/tests/test_import_ct_rdsr_multiple.py +256 -256
- openrem/remapp/tests/test_import_ct_rdsr_siemens.py +827 -827
- openrem/remapp/tests/test_import_ct_rdsr_spectrumdynamics.py +91 -91
- openrem/remapp/tests/test_import_ct_rdsr_toshiba_dosecheck.py +67 -67
- openrem/remapp/tests/test_import_ct_rdsr_toshiba_multivaluesd.py +33 -33
- openrem/remapp/tests/test_import_ct_rdsr_toshiba_pixelmed.py +118 -118
- openrem/remapp/tests/test_import_ct_sc_philips.py +44 -44
- openrem/remapp/tests/test_import_dual_rdsr.py +110 -110
- openrem/remapp/tests/test_import_dx.py +1267 -1191
- openrem/remapp/tests/test_import_dx_rdsr.py +1250 -1253
- openrem/remapp/tests/test_import_mam.py +438 -438
- openrem/remapp/tests/test_import_mg_im_hol_proj.py +46 -46
- openrem/remapp/tests/test_import_mg_rdsr.py +586 -586
- openrem/remapp/tests/test_import_nm_image.py +420 -420
- openrem/remapp/tests/test_import_nm_siemens_rdsr.py +396 -396
- openrem/remapp/tests/test_import_px.py +161 -161
- openrem/remapp/tests/test_import_rf_rdsr.py +420 -418
- openrem/remapp/tests/test_missing_date.py +42 -42
- openrem/remapp/tests/test_not_patient.py +60 -60
- openrem/remapp/tests/test_openskin.py +272 -272
- openrem/remapp/tests/test_patient_id_settings.py +72 -72
- openrem/remapp/tests/test_pt_size_import.py +232 -232
- openrem/remapp/tests/test_rf_detail.py +113 -113
- openrem/remapp/tests/test_rf_high_dose_alert.py +361 -361
- openrem/remapp/tools/background.py +361 -361
- openrem/remapp/tools/check_standard_name_status.py +47 -0
- openrem/remapp/tools/check_uid.py +70 -70
- openrem/remapp/tools/dcmdatetime.py +248 -248
- openrem/remapp/tools/default_import.py +44 -47
- openrem/remapp/tools/get_values.py +230 -230
- openrem/remapp/tools/hash_id.py +58 -58
- openrem/remapp/tools/make_skin_map.py +448 -406
- openrem/remapp/tools/not_patient_indicators.py +72 -72
- openrem/remapp/tools/openskin/calc_exp_map.py +173 -173
- openrem/remapp/tools/openskin/geomclass.py +475 -475
- openrem/remapp/tools/openskin/geomfunc.py +433 -432
- openrem/remapp/tools/openskin/skinmap.py +417 -417
- openrem/remapp/tools/populate_summary.py +185 -193
- openrem/remapp/tools/save_skin_map_structure.py +73 -73
- openrem/remapp/tools/send_high_dose_alert_emails.py +238 -207
- openrem/remapp/urls.py +456 -448
- openrem/remapp/version.py +11 -11
- openrem/remapp/views.py +1147 -1052
- openrem/remapp/views_admin.py +3876 -3936
- openrem/remapp/views_charts_ct.py +2110 -2058
- openrem/remapp/views_charts_dx.py +1906 -1836
- openrem/remapp/views_charts_mg.py +1349 -1196
- openrem/remapp/views_charts_nm.py +535 -535
- openrem/remapp/views_charts_rf.py +1219 -1241
- openrem/remapp/views_openskin.py +379 -384
- openrem/sample-config/openrem-consumer.service +12 -12
- openrem/sample-config/openrem-gunicorn.service +13 -13
- openrem/sample-config/openrem-server +14 -13
- openrem/sample-config/openrem_orthanc_config_linux.lua +454 -454
- openrem/sample-config/openrem_orthanc_config_windows.lua +455 -455
- openrem/sample-config/queue-init.bat +73 -73
- openrem/scripts/openrem_ctphilips.py +25 -25
- openrem/scripts/openrem_cttoshiba.py +28 -28
- openrem/scripts/openrem_dx.py +22 -22
- openrem/scripts/openrem_mg.py +22 -22
- openrem/scripts/openrem_nm.py +22 -22
- openrem/scripts/openrem_ptsizecsv.py +17 -17
- openrem/scripts/openrem_qr.py +12 -12
- openrem/scripts/openrem_rdsr.py +25 -25
- {OpenREM-1.0.0b2.dist-info → openrem-1.0.0b3.dist-info}/METADATA +39 -29
- openrem-1.0.0b3.dist-info/RECORD +379 -0
- {OpenREM-1.0.0b2.dist-info → openrem-1.0.0b3.dist-info}/WHEEL +1 -1
- {OpenREM-1.0.0b2.dist-info → openrem-1.0.0b3.dist-info/licenses}/COPYING-GPLv3 +674 -674
- {OpenREM-1.0.0b2.dist-info → openrem-1.0.0b3.dist-info/licenses}/LICENSE +22 -22
- OpenREM-1.0.0b2.dist-info/RECORD +0 -373
- openrem/remapp/static/js/charts/plotly-2.17.1.min.js +0 -8
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_ctphilips.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_cttoshiba.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_dx.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_mg.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_nm.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_ptsizecsv.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_qr.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_rdsr.py +0 -0
- {OpenREM-1.0.0b2.dist-info → openrem-1.0.0b3.dist-info}/top_level.txt +0 -0
openrem/remapp/netdicom/tools.py
CHANGED
|
@@ -1,134 +1,134 @@
|
|
|
1
|
-
# This Python file uses the following encoding: utf-8
|
|
2
|
-
|
|
3
|
-
# OpenREM root UID: 1.2.826.0.1.3680043.9.5224.
|
|
4
|
-
# Provided by Medical Connections https://www.medicalconnections.co.uk/FreeUID
|
|
5
|
-
|
|
6
|
-
# OpenREM root UID: 1.3.6.1.4.1.45593.
|
|
7
|
-
# Provided by IANA as a private enterprise number
|
|
8
|
-
|
|
9
|
-
# ImplementationUID 1.2.826.0.1.3680043.9.5224.1.0.6.0.1
|
|
10
|
-
# = 1.2.826.0.1.3680043.9.5224.1.versionnumber.betanumber
|
|
11
|
-
# IANA version
|
|
12
|
-
# = 1.3.6.1.4.1.45593.1.0.7.0.1
|
|
13
|
-
|
|
14
|
-
# UID root for objects
|
|
15
|
-
# = 1.2.826.0.1.3680043.9.5224.2.machine-root.machineID.numberperimage
|
|
16
|
-
# where numberperimage might consist of yyyymmddhhmmssss.number
|
|
17
|
-
|
|
18
|
-
# pydicom has a UID generator of the form:
|
|
19
|
-
# root + mac + pid + second + microsecond, eg
|
|
20
|
-
# 1.2.826.0.1.3680043.9.5224.2.+8796759879378+15483+44+908342
|
|
21
|
-
# 1.2.826.0.1.3680043.9.5224.2.87967598793781548344908342
|
|
22
|
-
# which is 54 characters but process ID could be longer.
|
|
23
|
-
|
|
24
|
-
# 1.3.6.1.4.1.45593.1.2.879675987937815483yyyymmddssssssss
|
|
25
|
-
# would be 55 characters - process ID could be longer.
|
|
26
|
-
# Includes an extra 1. after the root UID to enable future use for
|
|
27
|
-
# anything else.
|
|
28
|
-
|
|
29
|
-
# UIDs used for test code will be pydicom.uid.generate_uid with prefix of
|
|
30
|
-
# 1.3.6.1.4.1.45593.999.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
import logging
|
|
34
|
-
|
|
35
|
-
from django.conf import settings
|
|
36
|
-
from django.utils.translation import gettext as _
|
|
37
|
-
from pynetdicom import AE, VerificationPresentationContexts
|
|
38
|
-
|
|
39
|
-
from remapp.models import DicomRemoteQR, DicomStoreSCP
|
|
40
|
-
|
|
41
|
-
logger = logging.getLogger("remapp.netdicom.qrscu")
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def echoscu(scp_pk=None, store_scp=False, qr_scp=False):
|
|
45
|
-
"""
|
|
46
|
-
Function to check if built-in Store SCP or remote Query-Retrieve SCP returns a DICOM echo
|
|
47
|
-
:param scp_pk: Primary key if either Store or QR SCP in database
|
|
48
|
-
:param store_scp: True if checking Store SCP
|
|
49
|
-
:param qr_scp: True if checking QR SCP
|
|
50
|
-
:return: 'AssocFail', Success or ?
|
|
51
|
-
"""
|
|
52
|
-
|
|
53
|
-
if store_scp and scp_pk:
|
|
54
|
-
scp = DicomStoreSCP.objects.get(pk=scp_pk)
|
|
55
|
-
if not scp.peer:
|
|
56
|
-
if settings.DOCKER_INSTALL:
|
|
57
|
-
msg = _("Store Docker container name is missing")
|
|
58
|
-
else:
|
|
59
|
-
msg = _("Store hostname is missing (normally localhost)")
|
|
60
|
-
logger.error(f"{scp.name} (Database ID {scp_pk}): {msg}")
|
|
61
|
-
return f"{msg} - modify to add"
|
|
62
|
-
remote_host = scp.peer
|
|
63
|
-
our_aet = "OPENREMECHO"
|
|
64
|
-
elif qr_scp and scp_pk:
|
|
65
|
-
scp = DicomRemoteQR.objects.get(pk=scp_pk)
|
|
66
|
-
if scp.hostname:
|
|
67
|
-
remote_host = scp.hostname
|
|
68
|
-
else:
|
|
69
|
-
remote_host = scp.ip
|
|
70
|
-
our_aet = scp.callingaet
|
|
71
|
-
if not our_aet:
|
|
72
|
-
our_aet = "OPENREMECHO"
|
|
73
|
-
else:
|
|
74
|
-
logger.warning("echoscu called without SCP information")
|
|
75
|
-
return 0
|
|
76
|
-
|
|
77
|
-
remote_port = scp.port
|
|
78
|
-
remote_aet = scp.aetitle
|
|
79
|
-
|
|
80
|
-
ae = AE()
|
|
81
|
-
ae.requested_contexts = VerificationPresentationContexts
|
|
82
|
-
ae.ae_title = our_aet
|
|
83
|
-
|
|
84
|
-
assoc = ae.associate(remote_host, remote_port, ae_title=remote_aet)
|
|
85
|
-
|
|
86
|
-
if assoc.is_established:
|
|
87
|
-
status = assoc.send_c_echo()
|
|
88
|
-
|
|
89
|
-
if status:
|
|
90
|
-
if status.Status == 0x0000:
|
|
91
|
-
logger.info(
|
|
92
|
-
f"Returning Success response from echo to {remote_host} {remote_port} {remote_aet}"
|
|
93
|
-
)
|
|
94
|
-
assoc.release()
|
|
95
|
-
return "Success"
|
|
96
|
-
else:
|
|
97
|
-
logger.info(
|
|
98
|
-
"Returning EchoFail response from echo to {0} {1} {2}. Type is {3}.".format(
|
|
99
|
-
remote_host, remote_port, remote_aet, status.Status
|
|
100
|
-
)
|
|
101
|
-
)
|
|
102
|
-
assoc.release()
|
|
103
|
-
return "Association created, but EchoFail"
|
|
104
|
-
else:
|
|
105
|
-
print("Connection timed out, was aborted or received invalid response")
|
|
106
|
-
logger.info(
|
|
107
|
-
"Returning EchoFail response from echo to {0} {1} {2}. No status.".format(
|
|
108
|
-
remote_host, remote_port, remote_aet
|
|
109
|
-
)
|
|
110
|
-
)
|
|
111
|
-
assoc.release()
|
|
112
|
-
return "EchoFail"
|
|
113
|
-
else:
|
|
114
|
-
if assoc.is_rejected:
|
|
115
|
-
msg = "{0}: {1}".format(
|
|
116
|
-
assoc.acceptor.primitive.result_str, assoc.acceptor.primitive.reason_str
|
|
117
|
-
)
|
|
118
|
-
logger.info(
|
|
119
|
-
"Association rejected from {0} {1} {2}. {3}".format(
|
|
120
|
-
remote_host, remote_port, remote_aet, msg
|
|
121
|
-
)
|
|
122
|
-
)
|
|
123
|
-
return msg
|
|
124
|
-
if assoc.is_aborted:
|
|
125
|
-
msg = "Association aborted or never connected"
|
|
126
|
-
logger.info(
|
|
127
|
-
"{3} to {0} {1} {2}".format(remote_host, remote_port, remote_aet, msg)
|
|
128
|
-
)
|
|
129
|
-
return msg
|
|
130
|
-
msg = "Association Failed"
|
|
131
|
-
logger.info(
|
|
132
|
-
"{3} with {0} {1} {2}".format(remote_host, remote_port, remote_aet, msg)
|
|
133
|
-
)
|
|
134
|
-
return msg
|
|
1
|
+
# This Python file uses the following encoding: utf-8
|
|
2
|
+
|
|
3
|
+
# OpenREM root UID: 1.2.826.0.1.3680043.9.5224.
|
|
4
|
+
# Provided by Medical Connections https://www.medicalconnections.co.uk/FreeUID
|
|
5
|
+
|
|
6
|
+
# OpenREM root UID: 1.3.6.1.4.1.45593.
|
|
7
|
+
# Provided by IANA as a private enterprise number
|
|
8
|
+
|
|
9
|
+
# ImplementationUID 1.2.826.0.1.3680043.9.5224.1.0.6.0.1
|
|
10
|
+
# = 1.2.826.0.1.3680043.9.5224.1.versionnumber.betanumber
|
|
11
|
+
# IANA version
|
|
12
|
+
# = 1.3.6.1.4.1.45593.1.0.7.0.1
|
|
13
|
+
|
|
14
|
+
# UID root for objects
|
|
15
|
+
# = 1.2.826.0.1.3680043.9.5224.2.machine-root.machineID.numberperimage
|
|
16
|
+
# where numberperimage might consist of yyyymmddhhmmssss.number
|
|
17
|
+
|
|
18
|
+
# pydicom has a UID generator of the form:
|
|
19
|
+
# root + mac + pid + second + microsecond, eg
|
|
20
|
+
# 1.2.826.0.1.3680043.9.5224.2.+8796759879378+15483+44+908342
|
|
21
|
+
# 1.2.826.0.1.3680043.9.5224.2.87967598793781548344908342
|
|
22
|
+
# which is 54 characters but process ID could be longer.
|
|
23
|
+
|
|
24
|
+
# 1.3.6.1.4.1.45593.1.2.879675987937815483yyyymmddssssssss
|
|
25
|
+
# would be 55 characters - process ID could be longer.
|
|
26
|
+
# Includes an extra 1. after the root UID to enable future use for
|
|
27
|
+
# anything else.
|
|
28
|
+
|
|
29
|
+
# UIDs used for test code will be pydicom.uid.generate_uid with prefix of
|
|
30
|
+
# 1.3.6.1.4.1.45593.999.
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
import logging
|
|
34
|
+
|
|
35
|
+
from django.conf import settings
|
|
36
|
+
from django.utils.translation import gettext as _
|
|
37
|
+
from pynetdicom import AE, VerificationPresentationContexts
|
|
38
|
+
|
|
39
|
+
from remapp.models import DicomRemoteQR, DicomStoreSCP
|
|
40
|
+
|
|
41
|
+
logger = logging.getLogger("remapp.netdicom.qrscu")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def echoscu(scp_pk=None, store_scp=False, qr_scp=False):
|
|
45
|
+
"""
|
|
46
|
+
Function to check if built-in Store SCP or remote Query-Retrieve SCP returns a DICOM echo
|
|
47
|
+
:param scp_pk: Primary key if either Store or QR SCP in database
|
|
48
|
+
:param store_scp: True if checking Store SCP
|
|
49
|
+
:param qr_scp: True if checking QR SCP
|
|
50
|
+
:return: 'AssocFail', Success or ?
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
if store_scp and scp_pk:
|
|
54
|
+
scp = DicomStoreSCP.objects.get(pk=scp_pk)
|
|
55
|
+
if not scp.peer:
|
|
56
|
+
if settings.DOCKER_INSTALL:
|
|
57
|
+
msg = _("Store Docker container name is missing")
|
|
58
|
+
else:
|
|
59
|
+
msg = _("Store hostname is missing (normally localhost)")
|
|
60
|
+
logger.error(f"{scp.name} (Database ID {scp_pk}): {msg}")
|
|
61
|
+
return f"{msg} - modify to add"
|
|
62
|
+
remote_host = scp.peer
|
|
63
|
+
our_aet = "OPENREMECHO"
|
|
64
|
+
elif qr_scp and scp_pk:
|
|
65
|
+
scp = DicomRemoteQR.objects.get(pk=scp_pk)
|
|
66
|
+
if scp.hostname:
|
|
67
|
+
remote_host = scp.hostname
|
|
68
|
+
else:
|
|
69
|
+
remote_host = scp.ip
|
|
70
|
+
our_aet = scp.callingaet
|
|
71
|
+
if not our_aet:
|
|
72
|
+
our_aet = "OPENREMECHO"
|
|
73
|
+
else:
|
|
74
|
+
logger.warning("echoscu called without SCP information")
|
|
75
|
+
return 0
|
|
76
|
+
|
|
77
|
+
remote_port = scp.port
|
|
78
|
+
remote_aet = scp.aetitle
|
|
79
|
+
|
|
80
|
+
ae = AE()
|
|
81
|
+
ae.requested_contexts = VerificationPresentationContexts
|
|
82
|
+
ae.ae_title = our_aet
|
|
83
|
+
|
|
84
|
+
assoc = ae.associate(remote_host, remote_port, ae_title=remote_aet)
|
|
85
|
+
|
|
86
|
+
if assoc.is_established:
|
|
87
|
+
status = assoc.send_c_echo()
|
|
88
|
+
|
|
89
|
+
if status:
|
|
90
|
+
if status.Status == 0x0000:
|
|
91
|
+
logger.info(
|
|
92
|
+
f"Returning Success response from echo to {remote_host} {remote_port} {remote_aet}"
|
|
93
|
+
)
|
|
94
|
+
assoc.release()
|
|
95
|
+
return "Success"
|
|
96
|
+
else:
|
|
97
|
+
logger.info(
|
|
98
|
+
"Returning EchoFail response from echo to {0} {1} {2}. Type is {3}.".format(
|
|
99
|
+
remote_host, remote_port, remote_aet, status.Status
|
|
100
|
+
)
|
|
101
|
+
)
|
|
102
|
+
assoc.release()
|
|
103
|
+
return "Association created, but EchoFail"
|
|
104
|
+
else:
|
|
105
|
+
print("Connection timed out, was aborted or received invalid response")
|
|
106
|
+
logger.info(
|
|
107
|
+
"Returning EchoFail response from echo to {0} {1} {2}. No status.".format(
|
|
108
|
+
remote_host, remote_port, remote_aet
|
|
109
|
+
)
|
|
110
|
+
)
|
|
111
|
+
assoc.release()
|
|
112
|
+
return "EchoFail"
|
|
113
|
+
else:
|
|
114
|
+
if assoc.is_rejected:
|
|
115
|
+
msg = "{0}: {1}".format(
|
|
116
|
+
assoc.acceptor.primitive.result_str, assoc.acceptor.primitive.reason_str
|
|
117
|
+
)
|
|
118
|
+
logger.info(
|
|
119
|
+
"Association rejected from {0} {1} {2}. {3}".format(
|
|
120
|
+
remote_host, remote_port, remote_aet, msg
|
|
121
|
+
)
|
|
122
|
+
)
|
|
123
|
+
return msg
|
|
124
|
+
if assoc.is_aborted:
|
|
125
|
+
msg = "Association aborted or never connected"
|
|
126
|
+
logger.info(
|
|
127
|
+
"{3} to {0} {1} {2}".format(remote_host, remote_port, remote_aet, msg)
|
|
128
|
+
)
|
|
129
|
+
return msg
|
|
130
|
+
msg = "Association Failed"
|
|
131
|
+
logger.info(
|
|
132
|
+
"{3} with {0} {1} {2}".format(remote_host, remote_port, remote_aet, msg)
|
|
133
|
+
)
|
|
134
|
+
return msg
|