TiledViz
Loading...
Searching...
No Matches
migration_admin.html
1{% extends "base_main_template.html" %}
2
3 {% block content %}
4 <style>
5 .dark-theme {
6 background-color: #1a1a1a;
7 color: #ffffff;
8 }
9 .dark-card {
10 background-color: #2d2d2d;
11 border: 1px solid #404040;
12 color: #ffffff;
13 }
14 .dark-card-header {
15 background-color: #3d3d3d;
16 border-bottom: 1px solid #404040;
17 color: #ffffff;
18 }
19 .dark-text-muted {
20 color: #b0b0b0 !important;
21 }
22 .dark-alert-success {
23 background-color: #1e4d2b;
24 border-color: #2d5a3d;
25 color: #d4edda;
26 }
27 .dark-alert-warning {
28 background-color: #4d3a1e;
29 border-color: #5a4d2d;
30 color: #fff3cd;
31 }
32 .dark-alert-danger {
33 background-color: #4d1e1e;
34 border-color: #5a2d2d;
35 color: #f8d7da;
36 }
37 .dark-alert-info {
38 background-color: #1e3d4d;
39 border-color: #2d4d5a;
40 color: #d1ecf1;
41 }
42 .dark-btn-primary {
43 background-color: #0d6efd;
44 border-color: #0d6efd;
45 }
46 .dark-btn-info {
47 background-color: #0dcaf0;
48 border-color: #0dcaf0;
49 color: #000;
50 }
51 .dark-btn-danger {
52 background-color: #dc3545;
53 border-color: #dc3545;
54 }
55 .dark-border-primary {
56 border-color: #0d6efd !important;
57 }
58 .dark-border-info {
59 border-color: #0dcaf0 !important;
60 }
61 .dark-border-danger {
62 border-color: #dc3545 !important;
63 }
64 .dark-text-primary {
65 color: #0d6efd !important;
66 }
67 .dark-text-info {
68 color: #0dcaf0 !important;
69 }
70 .dark-text-danger {
71 color: #dc3545 !important;
72 }
73 .dark-text-success {
74 color: #198754 !important;
75 }
76 .dark-text-warning {
77 color: #ffc107 !important;
78 }
79 code {
80 background-color: #404040;
81 color: #ff6b6b;
82 padding: 2px 4px;
83 border-radius: 3px;
84 }
85 </style>
86
87 <div class="container-fluid dark-theme">
88 <div class="row">
89 <div class="col-12">
90 <h2 class="text-white"><i class="fas fa-database"></i> Migration Management</h2>
91 <p class="dark-text-muted">Manage database migrations for project ownership system</p>
92 </div>
93 </div>
94
95 <!-- Migration Status -->
96 <div class="row mb-4">
97 <div class="col-12">
98
99 <div class="card-header dark-card-header">
100 <h5 class="text-white"><i class="fas fa-info-circle"></i> Migration Status</h5>
101 </div>
102 <div class="card-body">
103 {% if status %}
104 <div class="row">
105 <div class="col-md-3">
106 <div class="text-center">
107 <h3 class="dark-text-primary">{{ status.total_projects_with_owners }}</h3>
108 <p class="dark-text-muted">Total Projects with Owners</p>
109 </div>
110 </div>
111 <div class="col-md-3">
112 <div class="text-center">
113 <h3 class="dark-text-success">{{ status.migrated_projects }}</h3>
114 <p class="dark-text-muted">Migrated Projects</p>
115 </div>
116 </div>
117 <div class="col-md-3">
118 <div class="text-center">
119 <h3 class="dark-text-warning">{{ status.unmigrated_projects }}</h3>
120 <p class="dark-text-muted">Unmigrated Projects</p>
121 </div>
122 <div class="col-md-3">
123 <div class="text-center">
124 {% if status.migration_complete %}
125 <h3 class="dark-text-success"><i class="fas fa-check-circle"></i></h3>
126 <p class="dark-text-success">Migration Complete</p>
127 {% else %}
128 <h3 class="dark-text-warning"><i class="fas fa-exclamation-triangle"></i></h3>
129 <p class="dark-text-warning">Migration Needed</p>
130 {% endif %}
131 </div>
132 </div>
133 </div>
134 {% else %}
135 <div class="alert alert-danger">
136 <i class="fas fa-exclamation-triangle"></i> Unable to retrieve migration status
137 </div>
138 {% endif %}
139 </div>
140 </div>
141 </div>
142 </div>
143
144 <!-- Validation Status -->
145 {% if validation %}
146 <div class="row mb-4">
147 <div class="col-12">
148 <div class="card dark-card">
149 <div class="card-header dark-card-header">
150 <h5><i class="fas fa-shield-alt"></i> Data Validation</h5>
151 </div>
152 <div class="card-body">
153 {% if validation.is_valid %}
154 <div class="alert dark-alert-success">
155 <i class="fas fa-check-circle"></i> <strong>Data validation passed!</strong> All data is consistent.
156 </div>
157 {% else %}
158 <div class="alert dark-alert-warning">
159 <i class="fas fa-exclamation-triangle"></i> <strong>Data validation issues detected:</strong>
160 <ul class="mb-0 mt-2">
161 {% if validation.orphaned_members > 0 %}
162 <li>{{ validation.orphaned_members }} orphaned project members</li>
163 {% endif %}
164 {% if validation.projects_without_owner_membership > 0 %}
165 <li>{{ validation.projects_without_owner_membership }} projects without owner membership</li>
166 {% endif %}
167 {% if validation.projects_with_multiple_owners > 0 %}
168 <li>{{ validation.projects_with_multiple_owners }} projects with multiple owners</li>
169 {% endif %}
170 </ul>
171 </div>
172 {% endif %}
173 </div>
174 </div>
175 </div>
176 </div>
177 {% endif %}
178
179 <!-- Migration Actions -->
180 <div class="row">
181 <div class="col-12">
182 <div class="card dark-card">
183 <div class="card-header dark-card-header">
184 <h5 class="text-white"><i class="fas fa-tools"></i> Migration Actions</h5>
185 </div>
186 <div class="card-body">
187 <div class="row">
188 <div class="col-md-4">
189 <div class="card border-primary dark-card border-primary">
190 <div class="card-body text-center">
191 <h5 class="card-title dark-text-primary">Run Migration</h5>
192 <p class="card-text dark-text-muted">Migrate project owners from projects.id_users to project_members table</p>
193 <form method="POST" class="d-inline">
194 <input type="hidden" name="action" value="run_migration">
195 <button type="submit" class="btn btn-primary dark-btn-primary"
196 onclick="return confirm('Are you sure you want to run the migration?')">
197 <i class="fas fa-play"></i> Run Migration
198 </button>
199 </form>
200 </div>
201 </div>
202 </div>
203
204 <div class="col-md-4">
205 <div class="card border-info dark-card border-info">
206 <div class="card-body text-center">
207 <h5 class="card-title dark-text-info">Validate Data</h5>
208 <p class="card-text dark-text-muted">Check data consistency and validate migration results</p>
209 <form method="POST" class="d-inline">
210 <input type="hidden" name="action" value="validate_migration">
211 <button type="submit" class="btn btn-info dark-btn-info">
212 <i class="fas fa-search"></i> Validate
213 </button>
214 </form>
215 </div>
216 </div>
217 </div>
218
219 <div class="col-md-4">
220 <div class="card border-danger dark-card border-danger">
221 <div class="card-body text-center">
222 <h5 class="card-title dark-text-danger">Rollback Migration</h5>
223 <p class="card-text dark-text-muted">Remove all owner memberships (WARNING: This will remove ALL owner memberships)</p>
224 <form method="POST" class="d-inline">
225 <input type="hidden" name="action" value="rollback_migration">
226 <button type="submit" class="btn btn-danger dark-btn-danger"
227 onclick="return confirm('WARNING: This will remove ALL owner memberships. Are you absolutely sure?')">
228 <i class="fas fa-undo"></i> Rollback
229 </button>
230 </form>
231 </div>
232 </div>
233 </div>
234 </div>
235 </div>
236 </div>
237 </div>
238 </div>
239
240 <!-- Information -->
241 <div class="row mt-4">
242 <div class="col-12">
243 <div class="card dark-card">
244 <div class="card-header dark-card-header">
245 <h5 class="text-white"><i class="fas fa-info-circle"></i> Migration Information</h5>
246 </div>
247 <div class="card-body">
248 <h6 class="text-white">What does this migration do?</h6>
249 <ul class="text-white">
250 <li>Migrates project owners from the old <code>projects.id_users</code> field to the new <code>project_members</code> table</li>
251 <li>Creates owner membership records with <code>role_type='owner'</code></li>
252 <li>Maintains backward compatibility by keeping the old fields</li>
253 <li>Is idempotent - can be run multiple times safely</li>
254 </ul>
255
256 <h6 class="mt-3 text-white">When is migration needed?</h6>
257 <ul class="text-white">
258 <li>When upgrading from version</li>
259 <li>When projects exist with <code>id_users</code> but no corresponding <code>project_members</code> record</li>
260 </ul>
261
262 <h6 class="mt-3 text-white">Safety features:</h6>
263 <ul class="text-white">
264 <li>Automatic validation after migration</li>
265 <li>Detailed logging of all operations</li>
266 <li>Rollback capability (use with caution)</li>
267 <li>Checks for data consistency</li>
268 </ul>
269 </div>
270 </div>
271 </div>
272 </div>
273 </div>
274 {% endblock %}
275
276
277
278
279