task create and visualization

This commit is contained in:
Eduardo Silva 2024-07-10 16:53:55 -03:00
parent 5732cd8a6c
commit f153d16947
6 changed files with 128 additions and 3 deletions

View file

@ -1,3 +1,18 @@
from django.contrib import admin
from .models import CsvData, ImportTask
# Register your models here.
class CsvDataAdmin(admin.ModelAdmin):
list_display = ('uuid', 'created', 'updated')
search_fields = ('uuid', 'created', 'updated')
readonly_fields = ('uuid', 'created', 'updated')
admin.site.register(CsvData, CsvDataAdmin)
class ImportTaskAdmin(admin.ModelAdmin):
list_display = ('uuid', 'created', 'updated')
search_fields = ('uuid', 'created', 'updated')
readonly_fields = ('uuid', 'created', 'updated')
admin.site.register(ImportTask, ImportTaskAdmin)

View file

@ -0,0 +1,22 @@
# Generated by Django 5.0.7 on 2024-07-10 18:54
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('import_tool', '0004_importtask_backup_profile_name'),
]
operations = [
migrations.AddField(
model_name='importtask',
name='import_id',
field=models.IntegerField(default=0),
),
migrations.AlterUniqueTogether(
name='importtask',
unique_together={('csv_data', 'import_id')},
),
]

View file

@ -14,11 +14,12 @@ class CsvData(models.Model):
uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
def __str__(self):
return self.name
return str(self.id)
class ImportTask(models.Model):
csv_data = models.ForeignKey(CsvData, on_delete=models.CASCADE)
import_id = models.IntegerField(default=0)
router = models.ForeignKey(Router, on_delete=models.SET_NULL, blank=True, null=True)
name = models.CharField(max_length=100)
ssh_key = models.ForeignKey(SSHKey, on_delete=models.SET_NULL, blank=True, null=True)
@ -45,3 +46,5 @@ class ImportTask(models.Model):
def __str__(self):
return self.name
class Meta:
unique_together = ['csv_data', 'import_id']

View file

@ -31,17 +31,52 @@ def view_import_tool_list(request):
@login_required()
def view_import_details(request):
csv_data = get_object_or_404(CsvData, uuid=request.GET.get('uuid'))
import_task_list = ImportTask.objects.filter(csv_data=csv_data).order_by('-created')
import_task_list = ImportTask.objects.filter(csv_data=csv_data).order_by('import_id')
if request.GET.get('view') == 'raw':
import_view = 'raw'
elif request.GET.get('view') == 'processed':
import_view = 'processed'
else:
import_view = 'tasks'
if request.GET.get('action') == 'create_tasks':
tasks_created = 0
for task in csv_data.import_data:
import_task, import_task_created = ImportTask.objects.get_or_create(
csv_data=csv_data, import_id=task['import_id'], defaults={
'name': task['name'],
'username': task['username'],
'password': task['password'],
'address': task['address'],
'port': task['port'],
'router_type': task['router_type'],
'backup_profile_name': task['backup_profile'],
'router_group_name': task['router_group'],
'ssh_key_name': task['ssh_key'],
'monitoring': True if task['monitoring'] == 'true' else False,
}
)
if import_task_created:
tasks_created += 1
if tasks_created > 0:
messages.success(request, f'Tasks created: {tasks_created}')
else:
messages.warning(request, 'No new tasks created.')
return redirect(f'/router/import_tool/details/?uuid={csv_data.uuid}')
elif request.GET.get('action') == 'start_import':
import_view = 'tasks'
pass
elif request.GET.get('action') == 'delete':
#import_task_list.delete()
#csv_data.delete()
messages.warning(request, 'Delete action not implemented yet.')
return redirect('/router/import_tool')
data = {
'csv_data': csv_data,
'import_task_list': import_task_list,
'import_view': import_view,
'page_title': f'Import Details - {csv_data.id}',
}
return render(request, 'import_tool/import_details.html', context=data)
@ -59,3 +94,4 @@ def view_import_csv_file(request):
return redirect('success_url')
return render(request, 'generic_form.html', context=data)

View file

@ -41,6 +41,12 @@
{% endif %}
</div>
</div>
<div class="row">
<div class="col-lg-12" style="padding-top: 10px">
<a href="/router/import_tool/details/?uuid={{ csv_data.uuid }}&action=create_tasks" class="btn btn-primary">Create import Tasks</a>
<a href="/router/import_tool/details/?uuid={{ csv_data.uuid }}&action=start_tasks" class="btn btn-primary">start/resume</a>
<a href="/router/import_tool/details/?uuid={{ csv_data.uuid }}&action=delete" onclick="return confirm('Are you sure you want to remove the current import task?\n\nThis action will remove all import data associated with this task, but will not affect routers that have already been imported.\n\nPress OK to confirm or Cancel to return.');" class="btn btn-primary">Delete import</a>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,43 @@
<table class="table table-hover">
<thead>
<tr>
<th>ID</th>
<th style="display: none;">UUID</th>
<th>Name</th>
<th>Address</th>
<th>Status</th>
<th>Error message</th>
</tr>
</thead>
<tbody>
{% for task in import_task_list %}
<tr>
<td>{{ task.import_id }}</td>
<td style="display: none;">{{ task.uuid }}</td>
<td>
{% if task.router %}
<a href="/router/details/?uuid={{ task.router.uuid }}" title="Task name: {{ task.name }}">{{ task.router.name }}</a>
{% else %}
{{ task.name }}
{% endif %}
</td>
<td>{{ task.address }}</td>
<td id="status-{{ task.uuid }}">
{% if task.import_success %}
<span class="badge badge-success">Success</span>
{% elif task.import_error %}
<span class="badge badge-danger">Error</span>
{% else %}
<span class="badge badge-warning">Pending</span>
{% endif %}
{% comment %}
<span class="badge badge-info">Working...</span>
{% endcomment %}
</td>
<td>{{ task.import_error_message|default_if_none:'' }}</td>
</tr>
{% endfor %}
</tbody>
</table>