From 0c980b4706900247c9f800f15608113a5efcbc52 Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Wed, 13 Aug 2025 19:41:02 +0300 Subject: [PATCH] update --- logs/hospital_management.log | 159 +++++ radiology/__pycache__/urls.cpython-312.pyc | Bin 4790 -> 4816 bytes radiology/__pycache__/views.cpython-312.pyc | Bin 48825 -> 48863 bytes radiology/urls.py | 8 +- radiology/views.py | 18 +- .../series/imaging_series_confirm_delete.html | 441 ++++++++++++ .../series/imaging_series_detail.html | 628 ++++++++++++++++++ .../radiology/series/imaging_series_form.html | 565 ++++++++++++++++ 8 files changed, 1809 insertions(+), 10 deletions(-) create mode 100644 templates/radiology/series/imaging_series_confirm_delete.html create mode 100644 templates/radiology/series/imaging_series_detail.html create mode 100644 templates/radiology/series/imaging_series_form.html diff --git a/logs/hospital_management.log b/logs/hospital_management.log index 4ea94fed..fc3709ed 100644 --- a/logs/hospital_management.log +++ b/logs/hospital_management.log @@ -63479,3 +63479,162 @@ Traceback (most recent call last): raise FieldError( django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'order'. Choices are: tenant, patient, referring_physician, radiologist, encounter, imaging_order, created_by, report ERROR 2025-08-13 19:30:12,351 basehttp 56119 6167998464 "GET /en/radiology/studies/ HTTP/1.1" 500 210392 +INFO 2025-08-13 19:39:49,795 autoreload 60497 8601149632 Watching for file changes with StatReloader +ERROR 2025-08-13 19:39:54,177 log 60497 6204993536 Internal Server Error: /en/radiology/studies/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 326, in render + if match: + ^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 398, in __bool__ + self._fetch_all() + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1949, in _fetch_all + self._result_cache = list(self._iterable_class(self)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 91, in __iter__ + results = compiler.execute_sql( + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1610, in execute_sql + sql, params = self.as_sql() + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 766, in as_sql + extra_select, order_by, group_by = self.pre_sql_setup( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 85, in pre_sql_setup + self.setup_query(with_col_aliases=with_col_aliases) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 74, in setup_query + self.select, self.klass_info, self.annotation_col_map = self.get_select( + ^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 299, in get_select + related_klass_infos = self.get_related_selections(select, select_mask) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1396, in get_related_selections + raise FieldError( +django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'order'. Choices are: tenant, patient, referring_physician, radiologist, encounter, imaging_order, created_by, report +ERROR 2025-08-13 19:39:54,180 basehttp 60497 6204993536 "GET /en/radiology/studies/ HTTP/1.1" 500 210392 +ERROR 2025-08-13 19:39:55,602 log 60497 6204993536 Internal Server Error: /en/radiology/studies/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 326, in render + if match: + ^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 398, in __bool__ + self._fetch_all() + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1949, in _fetch_all + self._result_cache = list(self._iterable_class(self)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 91, in __iter__ + results = compiler.execute_sql( + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1610, in execute_sql + sql, params = self.as_sql() + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 766, in as_sql + extra_select, order_by, group_by = self.pre_sql_setup( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 85, in pre_sql_setup + self.setup_query(with_col_aliases=with_col_aliases) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 74, in setup_query + self.select, self.klass_info, self.annotation_col_map = self.get_select( + ^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 299, in get_select + related_klass_infos = self.get_related_selections(select, select_mask) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1396, in get_related_selections + raise FieldError( +django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'order'. Choices are: tenant, patient, referring_physician, radiologist, encounter, imaging_order, created_by, report +ERROR 2025-08-13 19:39:55,605 basehttp 60497 6204993536 "GET /en/radiology/studies/ HTTP/1.1" 500 210392 diff --git a/radiology/__pycache__/urls.cpython-312.pyc b/radiology/__pycache__/urls.cpython-312.pyc index ac103e7a2f2bd351ea4f1f4c5990dce8ab8e6f1e..647a324724ef180873601ced8d6b6b44a0330f8c 100644 GIT binary patch delta 186 zcmdm{dO?-%G%qg~0}!0wKPRI_Y$M-$PD%OVlG2pS)M9;`($dTnD-f?Tz98F9fAT+0 zSzf{7)FQa#WIrz1$BY|baQIgd|_k$EB_Y8NFD}O&JM{5 zuGdBMFN)}27csvmVt!e~@`6L?6_&7@EF2d&C1;pkm$tYlZE;=N;i9y|Wof4io(Wf2 z62X$vGeWP+T3wX2x-RQGXq1hC&Od`UWv(eRUDIL+B&4~GXcf)fzJ5R z!tjxaiIw968w0OQgX;|ur^)-<4h!jF8rjpX$;c=msqyAH w^EKHRk8M7-^gJu$$Ia7LPiJG4-mJIDl#R`u1*j+xqG*RME2GEcQ+wY705#cv_W%F@ delta 347 zcmccrmucr;Cf?J$yj%=GFk$bUjM|O7IoVt)MTsey`8oONm7BY=6PX#UCcnu$#HEA~ z-Jf61!f3JCyrhenam(gI<=IS(hbQY*-D6z6nYa2oBjeS{thG&yXD4^mK0r3Cs*anL z@!96K=2j*~_Q^bL>lp7&-rXh%H2-SbVJ/series/', views.ImagingSeriesListView.as_view(), name='imaging_series_list'), + path('series//', views.ImagingSeriesDetailView.as_view(), name='imaging_series_detail'), path('series/create/', views.ImagingSeriesCreateView.as_view(), name='imaging_series_create'), - path('series//', views.ImagingSeriesDetailView.as_view(), name='imaging_series_detail'), + # path('series//edit/', views.ImagingSeriesUpdateView.as_view(), name='imaging_series_edit'), + # path('series//delete/', views.ImagingSeriesDeleteView.as_view(), name='imaging_series_delete'), + # Note: Limited update capabilities for series data # ============================================================================ diff --git a/radiology/views.py b/radiology/views.py index 5eba41af..ff3a1545 100644 --- a/radiology/views.py +++ b/radiology/views.py @@ -630,7 +630,7 @@ class ImagingSeriesDetailView(LoginRequiredMixin, DetailView): Display detailed information about an imaging series. """ model = ImagingSeries - template_name = 'radiology/imaging_series_detail.html' + template_name = 'radiology/series/imaging_series_detail.html' context_object_name = 'imaging_series' def get_queryset(self): @@ -652,14 +652,14 @@ class ImagingSeriesCreateView(LoginRequiredMixin, PermissionRequiredMixin, Creat """ model = ImagingSeries form_class = ImagingSeriesForm - template_name = 'radiology/imaging_series_form.html' + template_name = 'radiology/series/imaging_series_form.html' permission_required = 'radiology.add_imagingseries' success_url = reverse_lazy('radiology:imaging_series_list') - + def form_valid(self, form): form.instance.tenant = self.request.user.tenant response = super().form_valid(form) - + # Log the action AuditLogger.log_action( user=self.request.user, @@ -671,11 +671,13 @@ class ImagingSeriesCreateView(LoginRequiredMixin, PermissionRequiredMixin, Creat 'study_id': str(self.object.study.study_id) } ) - + messages.success(self.request, 'Imaging series created successfully.') return response + + # ============================================================================ # DICOM IMAGE VIEWS (READ-ONLY - System Generated) # ============================================================================ @@ -735,7 +737,7 @@ class RadiologyReportListView(LoginRequiredMixin, ListView): List all radiology reports with filtering and search. """ model = RadiologyReport - template_name = 'radiology/radiology_report_list.html' + template_name = 'radiology/reports/radiology_report_list.html' context_object_name = 'radiology_reports' paginate_by = 25 @@ -785,7 +787,7 @@ class RadiologyReportDetailView(LoginRequiredMixin, DetailView): Display detailed information about a radiology report. """ model = RadiologyReport - template_name = 'radiology/radiology_report_detail.html' + template_name = 'radiology/reports/radiology_report_detail.html' context_object_name = 'radiology_report' def get_queryset(self): @@ -798,7 +800,7 @@ class RadiologyReportCreateView(LoginRequiredMixin, PermissionRequiredMixin, Cre """ model = RadiologyReport form_class = RadiologyReportForm - template_name = 'radiology/radiology_report_form.html' + template_name = 'radiology/reports/radiology_report_form.html' permission_required = 'radiology.add_radiologyreport' success_url = reverse_lazy('radiology:radiology_report_list') diff --git a/templates/radiology/series/imaging_series_confirm_delete.html b/templates/radiology/series/imaging_series_confirm_delete.html new file mode 100644 index 00000000..ec6f0162 --- /dev/null +++ b/templates/radiology/series/imaging_series_confirm_delete.html @@ -0,0 +1,441 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Delete Imaging Series - {{ series.series_description|default:"Series" }} - Hospital Management{% endblock %} + +{% block content %} +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+
+
+
+ Series to be Deleted +
+
+
+
+
+
+ +

{{ series.series_number }}

+
+
+ +

{{ series.series_description|default:"No description" }}

+
+
+ +

{{ series.protocol_name|default:"N/A" }}

+
+
+ +

{{ series.get_modality_display }}

+
+
+
+
+ +

{{ series.series_instance_uid }}

+
+
+ +

{{ series.series_date|date:"F d, Y" }}

+
+
+ +

{{ series.series_time|time:"H:i:s" }}

+
+
+ +

{{ series.number_of_images|default:0 }}

+
+
+
+
+
+
+
+ + +
+
+
+
+
+ Study Context +
+
+
+
+
+
+ +

{{ series.study.patient.get_full_name }}

+
+
+
+
+ +

{{ series.study.study_description }}

+
+
+
+
+ +

{{ series.study.accession_number }}

+
+
+
+
+ +

{{ series.study.study_date|date:"M d, Y" }}

+
+
+
+
+
+
+
+ + +
+
+
+
+
+ Deletion Impact Analysis +
+
+
+
+
+
Data to be Deleted:
+
    +
  • {{ series.number_of_images|default:0 }} DICOM images
  • +
  • Series metadata and technical parameters
  • +
  • Associated annotations and measurements
  • +
  • Processing history and logs
  • + {% if series.reports.exists %} +
  • {{ series.reports.count }} associated report(s)
  • + {% endif %} +
+
+
+
What will remain:
+
    +
  • Parent study will remain intact
  • +
  • Other series in the study
  • +
  • Patient information
  • +
  • Study-level reports
  • +
+
+
+ + {% if blocking_conditions %} +
+
+ Deletion Blocked +
+

This series cannot be deleted due to the following conditions:

+
    + {% for condition in blocking_conditions %} +
  • {{ condition }}
  • + {% endfor %} +
+
+ {% endif %} +
+
+
+
+ + + {% if not blocking_conditions %} +
+
+
+
+
+ Alternative Actions +
+
+
+

Consider these alternatives before permanently deleting the series:

+
+
+
+
Archive Series
+

Move the series to archive storage instead of deleting

+ +
+
+
+
+
Backup First
+

Download a backup before deletion

+ + Download Backup + +
+
+
+
+
+
+
+ {% endif %} + + + {% if not blocking_conditions %} +
+
+
+
+
+ Confirm Deletion +
+
+
+
+ {% csrf_token %} + +
+ + + + This confirmation is required to prevent accidental deletion. + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ + Cancel + + +
+
+ +
+
+
+
+
+
+
+ {% else %} + +
+
+
+
+ +
Deletion Not Allowed
+

This series cannot be deleted due to the conditions listed above.

+ + Return to Series + +
+
+
+
+ {% endif %} +
+
+ + + + +{% endblock %} + diff --git a/templates/radiology/series/imaging_series_detail.html b/templates/radiology/series/imaging_series_detail.html new file mode 100644 index 00000000..98da9dc1 --- /dev/null +++ b/templates/radiology/series/imaging_series_detail.html @@ -0,0 +1,628 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Series {{ series.series_number }} - {{ series.series_description|default:"Imaging Series" }} - Hospital Management{% endblock %} + +{% block content %} +
+
+ +
+
+ +
+
+ + +
+
+
+
+
+ Series Information +
+
+ + {{ series.get_status_display|default:'Completed' }} + +
+
+
+
+
+
+ +

{{ series.series_number }}

+
+
+ +

{{ series.series_description|default:"No description provided" }}

+
+
+ +

{{ series.protocol_name|default:"N/A" }}

+
+
+ +

{{ series.get_modality_display }}

+
+
+
+
+ +

{{ series.series_instance_uid }}

+
+
+ +

{{ series.series_date|date:"F d, Y" }}

+
+
+ +

{{ series.series_time|time:"H:i:s" }}

+
+
+ +

{{ series.number_of_images|default:0 }}

+
+
+
+
+
+
+
+
+
+
+ Series Statistics +
+
+
+
+
+ +
+
+
{{ series.number_of_images|default:0 }}
+

Total Images

+
+
+
+
+ +
+
+
{{ series.total_size|default:"N/A" }}
+

Total Size

+
+
+
+
+ +
+
+
{{ series.acquisition_duration|default:"N/A" }}
+

Acquisition Time

+
+
+
+
+
+
+ + +
+
+
+
+
+ Study Context +
+
+
+
+
+
+ +

{{ series.study.patient.get_full_name }}

+
+
+
+
+ +

{{ series.study.study_description }}

+
+
+
+
+ +

{{ series.study.accession_number }}

+
+
+
+
+ +

{{ series.study.referring_physician.get_full_name }}

+
+
+
+
+
+
+
+ + +
+
+
+
+
+ Technical Parameters +
+
+
+
+
+
+ +

{{ series.slice_thickness|default:"N/A" }}{% if series.slice_thickness %} mm{% endif %}

+
+
+
+
+ +

{{ series.spacing_between_slices|default:"N/A" }}{% if series.spacing_between_slices %} mm{% endif %}

+
+
+
+
+ +

{{ series.pixel_spacing|default:"N/A" }}

+
+
+
+
+ +

{{ series.image_orientation|default:"N/A" }}

+
+
+
+ {% if series.acquisition_parameters %} +
+
+
+ +
+ {% for key, value in series.acquisition_parameters.items %} +
+ {{ key }}: + {{ value }} +
+ {% endfor %} +
+
+
+
+ {% endif %} +
+
+
+
+ + +
+
+
+
+
+ Image Viewer +
+
+ +
+
+
+
+ {% if series.number_of_images > 0 %} +
+
+
+ + + +
+
+ + + +
+
+ 1 / {{ series.number_of_images }} +
+
+
+
+ +
+
+ +

DICOM Viewer Loading...

+ +
+
+
+
+
+ +
+
+ {% else %} +
+ +
No Images Available
+

This series does not contain any images yet.

+
+ {% endif %} +
+
+
+
+
+ + + {% if related_series %} +
+
+
+
+
+ Related Series in Study +
+
+
+
+ {% for related in related_series %} +
+
+
+
+
Series {{ related.series_number }}
+ {% if related.pk == series.pk %} + Current + {% endif %} +
+

+ {{ related.series_description|default:"No description" }} +

+
+ + {{ related.get_modality_display }} + + {% if related.pk != series.pk %} + + View + + {% endif %} +
+
+
+
+ {% endfor %} +
+
+
+
+
+ {% endif %} + + +
+
+
+
+
+
+ + Edit Series + + + +
+ +
+
+
+
+
+
+
+ + + + +{% endblock %} + diff --git a/templates/radiology/series/imaging_series_form.html b/templates/radiology/series/imaging_series_form.html new file mode 100644 index 00000000..bf3d4ea6 --- /dev/null +++ b/templates/radiology/series/imaging_series_form.html @@ -0,0 +1,565 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{% if form.instance.pk %}Edit{% else %}Add{% endif %} Imaging Series - Hospital Management{% endblock %} + +{% block content %} +
+
+ +
+
+ +
+
+ +
+ {% csrf_token %} + + +
+
+
+
+
+ Basic Information +
+
+
+
+
+
+ + {{ form.series_number }} + {% if form.series_number.errors %} +
+ {% for error in form.series_number.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} + Unique series number within the study +
+
+
+
+ + {{ form.modality }} + {% if form.modality.errors %} +
+ {% for error in form.modality.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} +
+
+
+
+
+
+ + {{ form.series_description }} + {% if form.series_description.errors %} +
+ {% for error in form.series_description.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} + Descriptive name for this imaging series +
+
+
+
+
+
+ + {{ form.protocol_name }} + {% if form.protocol_name.errors %} +
+ {% for error in form.protocol_name.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} +
+
+
+
+ + {{ form.series_instance_uid }} + {% if form.series_instance_uid.errors %} +
+ {% for error in form.series_instance_uid.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} + DICOM Series Instance UID +
+
+
+
+
+
+
+ + +
+
+
+
+
+ Date and Time Information +
+
+
+
+
+
+ + {{ form.series_date }} + {% if form.series_date.errors %} +
+ {% for error in form.series_date.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} +
+
+
+
+ + {{ form.series_time }} + {% if form.series_time.errors %} +
+ {% for error in form.series_time.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} +
+
+
+
+ + {{ form.series_datetime }} + {% if form.series_datetime.errors %} +
+ {% for error in form.series_datetime.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} + Combined date and time +
+
+
+
+
+
+
+ + +
+
+
+
+
+ Technical Parameters +
+
+
+
+
+
+ + {{ form.slice_thickness }} + {% if form.slice_thickness.errors %} +
+ {% for error in form.slice_thickness.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} +
+
+
+
+ + {{ form.spacing_between_slices }} + {% if form.spacing_between_slices.errors %} +
+ {% for error in form.spacing_between_slices.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} +
+
+
+
+
+
+ + {{ form.pixel_spacing }} + {% if form.pixel_spacing.errors %} +
+ {% for error in form.pixel_spacing.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} + Format: row spacing\column spacing +
+
+
+
+ + {{ form.image_orientation }} + {% if form.image_orientation.errors %} +
+ {% for error in form.image_orientation.errors %} + {{ error }} + {% endfor %} +
+ {% endif %} + DICOM Image Orientation Patient +
+
+
+
+
+
+
+ + + {% if form.instance.pk %} +
+
+
+
+
+ Additional Information +
+
+
+
+
+
+ +

{{ form.instance.series_id }}

+
+
+
+
+ +

{{ form.instance.number_of_images|default:0 }}

+
+
+
+ {% if form.instance.created_at %} +
+
+
+ +

{{ form.instance.created_at|date:"M d, Y H:i" }}

+
+
+
+
+ +

{{ form.instance.updated_at|date:"M d, Y H:i" }}

+
+
+
+ {% endif %} +
+
+
+
+ {% endif %} + + +
+
+
+
+
+
+ + + + Cancel + +
+ {% if form.instance.pk %} + + {% endif %} +
+
+
+
+
+
+
+
+ + + + +{% endblock %} +