objectchange.html 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. {% extends 'generic/object.html' %}
  2. {% load helpers %}
  3. {% load plugins %}
  4. {% load i18n %}
  5. {% block title %}{{ object }}{% endblock %}
  6. {% block breadcrumbs %}
  7. <li class="breadcrumb-item"><a href="{% url 'core:objectchange_list' %}">{% trans "Change Log" %}</a></li>
  8. {% if object.related_object and object.related_object.get_absolute_url %}
  9. <li class="breadcrumb-item"><a href="{{ object.related_object.get_absolute_url }}changelog/">{{ object.related_object }}</a></li>
  10. {% elif object.changed_object and object.changed_object.get_absolute_url %}
  11. <li class="breadcrumb-item"><a href="{{ object.changed_object.get_absolute_url }}changelog/">{{ object.changed_object }}</a></li>
  12. {% elif object.changed_object and object.changed_object.get_display %}
  13. <li class="breadcrumb-item">{{ object.changed_object }}</li>
  14. {% else %}
  15. <li class="breadcrumb-item">{{ object.object_repr }}</li>
  16. {% endif %}
  17. {% endblock %}
  18. {# ObjectChange does not support the default add/edit/delete controls #}
  19. {% block control-buttons %}{% endblock %}
  20. {% block subtitle %}{% endblock %}
  21. {% block content %}
  22. <div class="row">
  23. <div class="col col-12 col-md-5">
  24. <div class="card">
  25. <h2 class="card-header">{% trans "Change" %}</h2>
  26. <table class="table table-hover attr-table">
  27. <tr>
  28. <th scope="row">{% trans "Time" %}</th>
  29. <td>{{ object.time|isodatetime }}</td>
  30. </tr>
  31. <tr>
  32. <th scope="row">{% trans "User" %}</th>
  33. <td>
  34. {% if object.user.get_full_name %}
  35. {{ object.user.get_full_name }} ({{ object.user_name }})
  36. {% else %}
  37. {{ object.user_name }}
  38. {% endif %}
  39. </td>
  40. </tr>
  41. <tr>
  42. <th scope="row">{% trans "Action" %}</th>
  43. <td>
  44. {{ object.get_action_display }}
  45. </td>
  46. </tr>
  47. <tr>
  48. <th scope="row">{% trans "Object Type" %}</th>
  49. <td>
  50. {{ object.changed_object_type }}
  51. </td>
  52. </tr>
  53. <tr>
  54. <th scope="row">{% trans "Object" %}</th>
  55. <td>
  56. {% if object.changed_object and object.changed_object.get_absolute_url %}
  57. {{ object.changed_object|linkify }}
  58. {% else %}
  59. {{ object.object_repr }}
  60. {% endif %}
  61. </td>
  62. </tr>
  63. <tr>
  64. <th scope="row">{% trans "Request ID" %}</th>
  65. <td>
  66. {{ object.request_id }}
  67. </td>
  68. </tr>
  69. </table>
  70. </div>
  71. </div>
  72. <div class="col col-12 col-md-7">
  73. <div class="card">
  74. <h2 class="card-header d-flex justify-content-between">
  75. {% trans "Difference" %}
  76. <div class="btn-group btn-group-sm d-print-none">
  77. <a {% if prev_change %}href="{% url 'core:objectchange' pk=prev_change.pk %}"{% else %}disabled{% endif %} class="btn btn-outline-secondary">
  78. <i class="mdi mdi-chevron-left" aria-hidden="true"></i> {% trans "Previous" %}
  79. </a>
  80. <a {% if next_change %}href="{% url 'core:objectchange' pk=next_change.pk %}"{% else %}disabled{% endif %} class="btn btn-outline-secondary">
  81. {% trans "Next" %} <i class="mdi mdi-chevron-right" aria-hidden="true"></i>
  82. </a>
  83. </div>
  84. </h2>
  85. <div class="card-body">
  86. {% if diff_added == diff_removed %}
  87. <span class="text-muted" style="margin-left: 10px;">
  88. {% if object.action == 'create' %}
  89. {% trans "Object Created" %}
  90. {% elif object.action == 'delete' %}
  91. {% trans "Object Deleted" %}
  92. {% else %}
  93. {% trans "No Changes" %}
  94. {% endif %}
  95. </span>
  96. {% else %}
  97. <pre class="change-diff change-removed">{{ diff_removed|json }}</pre>
  98. <pre class="change-diff change-added">{{ diff_added|json }}</pre>
  99. {% endif %}
  100. </div>
  101. </div>
  102. </div>
  103. </div>
  104. <div class="row">
  105. <div class="col col-12 col-md-6">
  106. <div class="card">
  107. <h2 class="card-header">{% trans "Pre-Change Data" %}</h2>
  108. <div class="card-body">
  109. {% if object.prechange_data %}
  110. {% spaceless %}
  111. <pre class="change-data">
  112. {% for k, v in object.prechange_data_clean.items %}
  113. <span{% if k in diff_removed %} class="removed"{% endif %}>{{ k }}: {{ v|json }}</span>
  114. {% endfor %}
  115. </pre>
  116. {% endspaceless %}
  117. {% elif non_atomic_change %}
  118. {% trans "Warning: Comparing non-atomic change to previous change record" %} (<a href="{% url 'core:objectchange' pk=prev_change.pk %}">{{ prev_change.pk }}</a>)
  119. {% else %}
  120. <span class="text-muted">{% trans "None" %}</span>
  121. {% endif %}
  122. </div>
  123. </div>
  124. </div>
  125. <div class="col col-12 col-md-6">
  126. <div class="card">
  127. <h2 class="card-header">{% trans "Post-Change Data" %}</h2>
  128. <div class="card-body">
  129. {% if object.postchange_data %}
  130. {% spaceless %}
  131. <pre class="change-data">
  132. {% for k, v in object.postchange_data_clean.items %}
  133. <span{% if k in diff_added %} class="added"{% endif %}>{{ k }}: {{ v|json }}</span>
  134. {% endfor %}
  135. </pre>
  136. {% endspaceless %}
  137. {% else %}
  138. <span class="text-muted">{% trans "None" %}</span>
  139. {% endif %}
  140. </div>
  141. </div>
  142. </div>
  143. </div>
  144. <div class="row">
  145. <div class="col col-12 col-md-6">
  146. {% plugin_left_page object %}
  147. </div>
  148. <div class="col col-12 col-md-6">
  149. {% plugin_right_page object %}
  150. </div>
  151. </div>
  152. <div class="row">
  153. <div class="col col-md-12">
  154. {% include 'inc/panel_table.html' with table=related_changes_table heading='Related Changes' panel_class='default' %}
  155. {% if related_changes_count > related_changes_table.rows|length %}
  156. <div class="float-end">
  157. <a href="{% url 'core:objectchange_list' %}?request_id={{ object.request_id }}" class="btn btn-primary">
  158. {% blocktrans trimmed with count=related_changes_count|add:"1" %}
  159. See All {{ count }} Changes
  160. {% endblocktrans %}
  161. </a>
  162. </div>
  163. {% endif %}
  164. </div>
  165. </div>
  166. <div class="row">
  167. <div class="col col-md-12">
  168. {% plugin_full_width_page object %}
  169. </div>
  170. </div>
  171. {% endblock %}