system_db_schema.html 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. {% load i18n %}
  2. {% load humanize %}
  3. {% if db_schema %}
  4. {# Summary boxes #}
  5. <div class="row mb-3">
  6. <div class="col-md-4">
  7. <div class="card text-center">
  8. <div class="card-body">
  9. <div class="display-6 fw-bold">{{ db_schema_stats.total_tables|intcomma }}</div>
  10. <div class="text-muted">{% trans "Tables" %}</div>
  11. </div>
  12. </div>
  13. </div>
  14. <div class="col-md-4">
  15. <div class="card text-center">
  16. <div class="card-body">
  17. <div class="display-6 fw-bold">{{ db_schema_stats.total_columns|intcomma }}</div>
  18. <div class="text-muted">{% trans "Columns" %}</div>
  19. </div>
  20. </div>
  21. </div>
  22. <div class="col-md-4">
  23. <div class="card text-center">
  24. <div class="card-body">
  25. <div class="display-6 fw-bold">{{ db_schema_stats.total_indexes|intcomma }}</div>
  26. <div class="text-muted">{% trans "Indexes" %}</div>
  27. </div>
  28. </div>
  29. </div>
  30. </div>
  31. {# Tables grouped by app prefix #}
  32. {% for group in db_schema_groups %}
  33. <div class="card mb-3">
  34. <h2 class="card-header">
  35. <button class="accordion-button collapsed p-0 w-100" type="button"
  36. data-bs-toggle="collapse" data-bs-target="#db-group-body-{{ group.name }}"
  37. aria-expanded="false" aria-controls="db-group-body-{{ group.name }}">
  38. {{ group.name }}
  39. {% if group.is_plugin %}<span class="badge text-bg-purple ms-1">{% trans "plugin" %}</span>{% endif %}
  40. <span class="badge bg-secondary text-bg-gray ms-1">{{ group.tables|length }} {% trans "tables" %}</span>
  41. <span class="badge bg-secondary text-bg-gray ms-1">{{ group.index_count }} {% trans "indexes" %}</span>
  42. <span class="accordion-button-toggle"><i class="mdi mdi-chevron-down"></i></span>
  43. </button>
  44. </h2>
  45. <div id="db-group-body-{{ group.name }}" class="collapse">
  46. <div class="accordion accordion-flush" id="db-group-{{ group.name }}">
  47. {% for table in group.tables %}
  48. <div class="accordion-item">
  49. <h5 class="accordion-header" id="table-heading-{{ group.name }}-{{ forloop.counter }}">
  50. <button class="accordion-button border-bottom collapsed font-monospace" type="button"
  51. data-bs-toggle="collapse" data-bs-target="#table-collapse-{{ group.name }}-{{ forloop.counter }}"
  52. aria-expanded="false" aria-controls="table-collapse-{{ group.name }}-{{ forloop.counter }}">
  53. {{ table.name }}
  54. <span class="badge bg-secondary text-white ms-2">{{ table.columns|length }} {% trans "columns" %}</span>
  55. {% if table.indexes %}
  56. <span class="badge bg-secondary text-white ms-1">{{ table.indexes|length }} {% trans "indexes" %}</span>
  57. {% endif %}
  58. <span class="accordion-button-toggle"><i class="mdi mdi-chevron-down"></i></span>
  59. </button>
  60. </h5>
  61. <div id="table-collapse-{{ group.name }}-{{ forloop.counter }}" class="accordion-collapse collapse"
  62. aria-labelledby="table-heading-{{ group.name }}-{{ forloop.counter }}">
  63. <div class="accordion-body p-0">
  64. <div class="px-3 py-2">
  65. <strong>{% trans "Columns" %}</strong>
  66. <table class="table table-hover table-sm mb-0 mt-1">
  67. <thead>
  68. <tr>
  69. <th>{% trans "Column" %}</th>
  70. <th>{% trans "Type" %}</th>
  71. <th>{% trans "Nullable" %}</th>
  72. <th>{% trans "Default" %}</th>
  73. </tr>
  74. </thead>
  75. <tbody>
  76. {% for column in table.columns %}
  77. <tr>
  78. <td class="font-monospace">{{ column.name }}</td>
  79. <td class="font-monospace text-muted">{{ column.type }}</td>
  80. <td>
  81. {% if column.nullable %}
  82. <span class="text-success">{% trans "yes" %}</span>
  83. {% else %}
  84. <span class="text-muted">{% trans "no" %}</span>
  85. {% endif %}
  86. </td>
  87. <td class="font-monospace text-muted">{{ column.default|default:"" }}</td>
  88. </tr>
  89. {% endfor %}
  90. </tbody>
  91. </table>
  92. </div>
  93. {% if table.indexes %}
  94. <div class="px-3 py-2 border-top">
  95. <strong>{% trans "Indexes" %}</strong>
  96. <table class="table table-hover table-sm mb-0 mt-1">
  97. <thead>
  98. <tr>
  99. <th>{% trans "Name" %}</th>
  100. <th>{% trans "Definition" %}</th>
  101. </tr>
  102. </thead>
  103. <tbody>
  104. {% for index in table.indexes %}
  105. <tr>
  106. <td class="font-monospace">{{ index.name }}</td>
  107. <td class="font-monospace text-muted">{{ index.definition }}</td>
  108. </tr>
  109. {% endfor %}
  110. </tbody>
  111. </table>
  112. </div>
  113. {% endif %}
  114. </div>
  115. </div>
  116. </div>
  117. {% endfor %}
  118. </div>
  119. </div>
  120. </div>
  121. {% endfor %}
  122. {% else %}
  123. <div class="card mb-3">
  124. <div class="card-body text-muted">
  125. {% trans "Schema information unavailable." %}
  126. </div>
  127. </div>
  128. {% endif %}