import django_tables2 as tables from django_tables2.utils import A from generic.tables import SeriesImageColumn, SelectionTable from .models import ( Case, CaseCollection, Condition, PathologicalProcess, Presentation, QuestionSchema, Series, Structure, Finding, Subspecialty, Resource, ) from django.utils.html import format_html from easy_thumbnails.files import get_thumbnailer from easy_thumbnails.exceptions import InvalidImageFormatError from django.db.models import Prefetch class CaseTable(SelectionTable): def __init__(self, data=None, *args, **kwargs): # Optimize prefetching for casecollection_set #case_collections_prefetch = Prefetch( # "casecollection_set", # queryset=CaseCollection.objects.select_related("author"), # Adjust fields as needed #) super().__init__( data.prefetch_related( "author", # Many-to-many or reverse relationship "series", # Many-to-many relationship "series__examination", # ForeignKey in the related model "series__plane", # ForeignKey in the related model "series__images", # Reverse relationship "previous_case", # Prefetch the previous case relationship "next_case", # Prefetch the next case relationship "casecollection_set", # Prefetch the case collection set #case_collections_prefetch, # Optimized prefetch for collections ), *args, **kwargs, ) def render_title(self, value, record): return value def render_description(self, value): max_length = 50 # Set the maximum length for truncation if len(value) > max_length: truncated_value = f"{value[:max_length]}..." # Truncate and add ellipsis else: truncated_value = value # Add a tooltip with the full text return format_html( '{}', value, # Full text for the tooltip truncated_value, # Truncated text for display ) def render_series(self, value): max_length = 50 # Set the maximum length for truncation series_list = [str(series) for series in value.all()] full_text = ", ".join(series_list) # Full text for the tooltip if len(full_text) > max_length: truncated_text = f"{full_text[:max_length]}..." # Truncate and add ellipsis else: truncated_text = full_text # Add a tooltip with the full text return format_html( '{}', full_text, # Full text for the tooltip truncated_text, # Truncated text for display ) def get_view_cell(record): if record.open_access: return format_html(f""" View""") else: return f'View' def render_author(self, value): max_length = 15 # Set the maximum length for truncating individual author names authors = [] for author in value.all(): full_name = str(author) # Convert the author object to a string (e.g., full name) if len(full_name) > max_length: truncated_name = f"{full_name[:max_length]}..." # Truncate and add ellipsis else: truncated_name = full_name # Add a tooltip with the full name authors.append( format_html( '{}', full_name, # Full name for the tooltip truncated_name, # Truncated name for display ) ) # Join all authors with commas return format_html(", ".join(authors)) def render_associated_cases(self, record): links = [] if record.previous_case: links.append( format_html( 'Previous Case', record.previous_case.get_absolute_url(), ) ) try: if record.next_case: links.append( format_html( 'Next Case', record.next_case.get_absolute_url(), ) ) except Case.DoesNotExist: pass if links: return format_html(", ".join(links)) return "No associated cases" def render_collections(self, record): collections = [ collection for collection in record.casecollection_set.all() if ( hasattr(self, 'request') and self.request.user in collection.author.all() ) or collection.open_access ] if collections: links = [ format_html( '{}', collection.get_absolute_url(), collection.name, ) for collection in collections ] return format_html(", ".join(links)) return "No collections" associated_cases = tables.Column( verbose_name="Associated Cases", accessor="pk", orderable=False ) collections = tables.Column( verbose_name="Collections", accessor="pk", orderable=False ) edit = tables.LinkColumn( "atlas:case_update", text="Edit", args=[A("pk")], orderable=False ) view = tables.LinkColumn( "atlas:case_detail", text=get_view_cell, args=[A("pk")], orderable=False ) clone = tables.LinkColumn( "atlas:case_clone", text="Clone", args=[A("pk")], orderable=False ) delete = tables.LinkColumn( "atlas:case_delete", text="Delete", args=[A("pk")], orderable=False ) class Meta(SelectionTable.Meta): model = Case template_name = "django_tables2/bootstrap4.html" fields = ( "title", "description", "created_date", "series", "author", "associated_cases", "collections", ) sequence = ("view", ) order_by = "-created_date" class PopupLinkColumn(tables.Column): def render(self, value): return format_html("test: {}", value) obj = value.first() if obj is None: return format_html("No image") return obj.get_thumbnail()[0] class SeriesTable(SelectionTable): edit = tables.LinkColumn( "atlas:series_update", text="Edit", args=[A("pk")], orderable=False ) view = tables.LinkColumn( "atlas:series_detail", text="View", args=[A("pk")], orderable=False ) popup = tables.Column(empty_values=(), orderable=False) images = SeriesImageColumn("Images", orderable=False) delete = tables.LinkColumn( "atlas:series_delete", text="Delete", args=[A("pk")], orderable=False ) case = tables.ManyToManyColumn(verbose_name="Cases") findings = tables.ManyToManyColumn(verbose_name="Findings") structures = tables.ManyToManyColumn(verbose_name="Structures") class Meta(SelectionTable.Meta): model = Series template_name = "django_tables2/bootstrap4.html" fields = ( "modality", "description", "examination", "plane", "contrast", "author", "created_date", "modified_date", ) sequence = ("view", "popup", "images", "case") order_by = "-created_date" def __init__(self, data=None, *args, **kwargs): super().__init__( data.prefetch_related( "modality", "case", "examination", "plane", "contrast", "author", "findings", "images" ), *args, **kwargs, ) def render_popup(self, value, record): return format_html( """Popup""", record.pk, ) class ConditionTable(SelectionTable): name = tables.Column( linkify=("atlas:condition_detail", {"pk": tables.A("pk")}), verbose_name="Condition", ) edit = tables.LinkColumn( "atlas:condition_update", text="Edit", args=[A("pk")], orderable=False ) delete = tables.LinkColumn( "atlas:condition_delete", text="Delete", args=[A("pk")], orderable=False ) # synonym = tables.ManyToManyColumn(verbose_name="Synonyms") synonym = tables.Column(empty_values=()) parent = tables.ManyToManyColumn(verbose_name="Parents") class Meta(SelectionTable.Meta): model = Condition template_name = "django_tables2/bootstrap4.html" fields = ("subspecialty", "rcr_curriculum_map", "rcr_curriculum") sequence = ("name",) def __init__(self, data=None, *args, **kwargs): super().__init__( data.prefetch_related( "subspecialty", "rcr_curriculum_map", "parent" ), *args, **kwargs, ) def render_synonym(self, value, record): return format_html(record.get_synonym_link()) return f"{record.get_synonym_link()}" class FindingTable(SelectionTable): name = tables.Column( linkify=("atlas:finding_detail", {"pk": tables.A("pk")}), verbose_name="Finding" ) edit = tables.LinkColumn( "atlas:finding_update", text="Edit", args=[A("pk")], orderable=False ) delete = tables.LinkColumn( "atlas:finding_delete", text="Delete", args=[A("pk")], orderable=False ) # synonym = tables.ManyToManyColumn(verbose_name="Synonyms") synonym = tables.Column(empty_values=()) parent = tables.ManyToManyColumn(verbose_name="Parents") class Meta(SelectionTable.Meta): model = Finding template_name = "django_tables2/bootstrap4.html" fields = ("name",) sequence = ("name",) def render_synonym(self, value, record): return format_html(record.get_synonym_link()) class StructureTable(SelectionTable): name = tables.Column( linkify=("atlas:structure_detail", {"pk": tables.A("pk")}), verbose_name="Structure", ) edit = tables.LinkColumn( "atlas:structure_update", text="Edit", args=[A("pk")], orderable=False ) delete = tables.LinkColumn( "atlas:structure_delete", text="Delete", args=[A("pk")], orderable=False ) # synonym = tables.ManyToManyColumn(verbose_name="Synonyms") synonym = tables.Column(empty_values=()) parent = tables.ManyToManyColumn(verbose_name="Parents") class Meta(SelectionTable.Meta): model = Structure template_name = "django_tables2/bootstrap4.html" fields = ("name",) sequence = ("name",) def render_synonym(self, value, record): return format_html(record.get_synonym_link()) class PresentationTable(SelectionTable): name = tables.Column( linkify=("atlas:presentation_detail", {"pk": tables.A("pk")}), verbose_name="Presentation", ) # edit = tables.LinkColumn( # "atlas:presentation_update", text="Edit", args=[A("pk")], orderable=False # ) # delete = tables.LinkColumn( # "atlas:presentation_delete", text="Delete", args=[A("pk")], orderable=False # ) subspecialty = tables.ManyToManyColumn(verbose_name="Subspecialty") class Meta(SelectionTable.Meta): model = Presentation template_name = "django_tables2/bootstrap4.html" fields = ("name",) sequence = ("name",) class PathologicalProcessTable(SelectionTable): name = tables.Column( linkify=("atlas:pathological_process_detail", {"pk": tables.A("pk")}), verbose_name="PathologicalProcess", ) # edit = tables.LinkColumn( # "atlas:pathological_process_update", text="Edit", args=[A("pk")], orderable=False # ) # delete = tables.LinkColumn( # "atlas:pathological_process_delete", text="Delete", args=[A("pk")], orderable=False # ) class Meta(SelectionTable.Meta): model = PathologicalProcess template_name = "django_tables2/bootstrap4.html" fields = ("name",) sequence = ("name",) class SubspecialtyTable(SelectionTable): name = tables.Column( linkify=("atlas:subspecialty_detail", {"pk": tables.A("pk")}), verbose_name="Subspecialty", ) # edit = tables.LinkColumn( # "atlas:subspecialty_update", text="Edit", args=[A("pk")], orderable=False # ) # delete = tables.LinkColumn( # "atlas:subspecialty_delete", text="Delete", args=[A("pk")], orderable=False # ) class Meta(SelectionTable.Meta): model = Subspecialty template_name = "django_tables2/bootstrap4.html" fields = () sequence = ("name",) def render_synonym(self, value, record): return format_html(record.get_synonym_link()) return f"{record.get_synonym_link()}" class ResourceTable(SelectionTable): name = tables.Column(linkify=("atlas:resource_detail", {"pk": tables.A("pk")}), verbose_name="Resource") edit = tables.LinkColumn("atlas:resource_update", text="Edit", args=[A("pk")], orderable=False) delete = tables.LinkColumn("atlas:resource_delete", text="Delete", args=[A("pk")], orderable=False) class Meta(SelectionTable.Meta): model = Resource template_name = "django_tables2/bootstrap4.html" fields = ("name", "description") class CaseCollectionTable(SelectionTable): edit = tables.LinkColumn( "atlas:exam_update", text="Edit", args=[A("pk")], orderable=False ) view = tables.LinkColumn( "atlas:collection_detail", text="View", args=[A("pk")], orderable=False ) #clone = tables.LinkColumn( # "atlas:case_clone", text="Clone", args=[A("pk")], orderable=False #) delete = tables.LinkColumn( "atlas:exam_deleted", text="Delete", args=[A("pk")], orderable=False ) #differential = tables.ManyToManyColumn(verbose_name="Differential") class Meta(SelectionTable.Meta): model = CaseCollection template_name = "django_tables2/bootstrap4.html" fields = ( "name", "collection_type", "publish_results", "active", "author", ) sequence = ("view", )#, "series") def __init__(self, data=None, *args, **kwargs): super().__init__( data.prefetch_related( "author", #"conditionI"", "condition__synonym" ), *args, **kwargs, ) class QuestionSchemaTable(SelectionTable): name = tables.Column( linkify=("atlas:question_schema_detail", {"pk": tables.A("pk")}), verbose_name="QuestionSchema", ) edit = tables.LinkColumn( "atlas:question_schema_update", text="Edit", args=[A("pk")], orderable=False ) delete = tables.LinkColumn( "atlas:question_schema_delete", text="Delete", args=[A("pk")], orderable=False ) class Meta(SelectionTable.Meta): model = QuestionSchema template_name = "django_tables2/bootstrap4.html" fields = ("name", "description", "schema") def render_schema(self, value, record): return format_html("
Schema{}
", value)