add create and delete views for backups
This commit is contained in:
parent
273d4da42b
commit
72b8c86a98
|
@ -23,9 +23,10 @@ class Backup(models.Model):
|
||||||
software = models.ForeignKey(Software, models.SET_NULL, blank=True,
|
software = models.ForeignKey(Software, models.SET_NULL, blank=True,
|
||||||
null=True)
|
null=True)
|
||||||
source_path = models.CharField(max_length=200, blank=True)
|
source_path = models.CharField(max_length=200, blank=True)
|
||||||
exec_time = models.TimeField()
|
exec_time = models.TimeField(null=True, blank=True)
|
||||||
exec_days = models.ManyToManyField(Weekday)
|
exec_days = models.ManyToManyField(Weekday, blank=True)
|
||||||
target_device = models.ManyToManyField(Computer, through='TargetDevice')
|
target_device = models.ManyToManyField(Computer, through='TargetDevice',
|
||||||
|
blank=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return str(self.name)
|
return str(self.name)
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
{% extends "core/base.html" %}
|
||||||
|
{% block section_title %}Delete Backup{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<form method="post">{% csrf_token %}
|
||||||
|
<p>Are you sure you want delete the backup "{{ object }}" for "{{ object.computer }}"?</p>
|
||||||
|
<button type="submit" class="btn btn-danger">Delete</button>
|
||||||
|
<a href="{{ request.META.HTTP_REFERER }}" class="btn btn-primary">Cancel</a>
|
||||||
|
<input type="hidden" id="previous_page" name="previous_page" value="/previous/page/url">
|
||||||
|
</form>
|
||||||
|
<script>
|
||||||
|
prev = document.getElementById("previous_page");
|
||||||
|
prev.value = document.referrer;
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,14 @@
|
||||||
|
{% extends "core/base.html" %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
|
||||||
|
{% block section_title %}Add Backup{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<form method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form|crispy }}
|
||||||
|
<input type="submit" value="Save" class="btn btn-primary">
|
||||||
|
<a href="{% url 'computer' view.kwargs.pk %}" class="btn btn-secondary">Cancel</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,37 @@
|
||||||
|
from django.test import Client
|
||||||
|
from mixer.backend.django import mixer
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
pytestmark = pytest.mark.django_db
|
||||||
|
|
||||||
|
|
||||||
|
def test_backup_with_computer_create_view(create_admin_user):
|
||||||
|
create_admin_user()
|
||||||
|
client = Client()
|
||||||
|
client.login(username="pharma-admin", password="password")
|
||||||
|
computer = mixer.blend('computers.Computer', customer=mixer.SELECT)
|
||||||
|
target_device = mixer.blend('computers.Computer', customer=mixer.SELECT)
|
||||||
|
data = {
|
||||||
|
'name': "foo",
|
||||||
|
'computer': computer.id,
|
||||||
|
'amount': 1,
|
||||||
|
'exec_time': '12:00',
|
||||||
|
'method': 1,
|
||||||
|
'exec_days': 3,
|
||||||
|
'target_device': target_device.id
|
||||||
|
}
|
||||||
|
url = '/create/backup-for-computer/{}/'.format(computer.id)
|
||||||
|
response = client.post(url, data)
|
||||||
|
assert response.status_code == 302
|
||||||
|
|
||||||
|
|
||||||
|
def test_backup_with_computer_delete_view(create_admin_user):
|
||||||
|
create_admin_user()
|
||||||
|
client = Client()
|
||||||
|
client.login(username="pharma-admin", password="password")
|
||||||
|
computer = mixer.blend('computers.Computer', customer=mixer.SELECT)
|
||||||
|
backup = mixer.blend('backups.Backup', computer=computer)
|
||||||
|
url = '/delete/backup/{}/'.format(backup.id)
|
||||||
|
response = client.post(url)
|
||||||
|
assert response.status_code == 302
|
|
@ -6,4 +6,8 @@ urlpatterns = [
|
||||||
path('customer/<int:pk>/backups/', views.backups_table_view,
|
path('customer/<int:pk>/backups/', views.backups_table_view,
|
||||||
name='backups'),
|
name='backups'),
|
||||||
path('backup/<int:pk>/', views.backup_detail_view, name='backup'),
|
path('backup/<int:pk>/', views.backup_detail_view, name='backup'),
|
||||||
|
path('create/backup-for-computer/<int:pk>/',
|
||||||
|
views.BackupCreateView.as_view(), name='backup_create'),
|
||||||
|
path('delete/backup/<int:pk>/',
|
||||||
|
views.BackupDeleteView.as_view(), name='backup_delete'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.shortcuts import render
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
|
from django.shortcuts import render
|
||||||
|
from django.urls import reverse
|
||||||
|
from django.views.generic import CreateView
|
||||||
|
from django.views.generic import DeleteView
|
||||||
|
|
||||||
from django_tables2 import RequestConfig
|
from django_tables2 import RequestConfig
|
||||||
|
|
||||||
|
@ -33,3 +37,32 @@ def backup_detail_view(request, pk):
|
||||||
{'backup': backup,
|
{'backup': backup,
|
||||||
'target_device_list': target_device_list,
|
'target_device_list': target_device_list,
|
||||||
'notifications': notifications})
|
'notifications': notifications})
|
||||||
|
|
||||||
|
|
||||||
|
class BackupCreateView(LoginRequiredMixin, CreateView):
|
||||||
|
model = Backup
|
||||||
|
template_name = 'backups/backup_create.html'
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
return reverse('computer', args=(self.computer.pk,))
|
||||||
|
|
||||||
|
def get_initial(self):
|
||||||
|
"""
|
||||||
|
Set the device and customer dropdown to the device from the previous
|
||||||
|
view and the customer related to the device.
|
||||||
|
"""
|
||||||
|
self.computer = get_object_or_404(Computer, id=self.kwargs.get('pk'))
|
||||||
|
return {
|
||||||
|
'computer': self.computer,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class BackupDeleteView(LoginRequiredMixin, DeleteView):
|
||||||
|
model = Backup
|
||||||
|
template_name = 'backups/backup_confirm_delete.html'
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
return reverse('computer', args=(self.object.computer.pk,))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -64,10 +64,10 @@
|
||||||
<h2>Backup</h2>
|
<h2>Backup</h2>
|
||||||
<ul>
|
<ul>
|
||||||
{% for backup in backup_relations %}
|
{% for backup in backup_relations %}
|
||||||
<li><a href="{% url 'backup' backup.id %}">{{ backup }}</a></li>
|
<li><a href="{% url 'backup' backup.id %}">{{ backup }}</a> <a href="{% url 'backup_delete' backup.pk %}" class="delete" title="Delete" data-toggle="tooltip"><i class="material-icons">clear</i></a></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
<p><a href="{% url 'warranty_create' pk %}" class="add" title="Add" data-toggle="tooltip"><i class="material-icons">add</i></a></p>
|
<p><a href="{% url 'backup_create' pk %}" class="add" title="Add" data-toggle="tooltip"><i class="material-icons">add</i></a></p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue