borg-web/borgweb/borg/views.py

146 lines
4.9 KiB
Python

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth.decorators import permission_required
from django.core.cache import cache
from django.http import JsonResponse
from .models import Repo, Label, Archive, Cache, Error, Location
from .forms import RepoForm, ArchiveForm, ErrorForm, LocationForm
from datetime import datetime, timedelta
from .utility import data
def index(request):
repo_list = Repo.objects.all()
location_list = Location.objects.all()
context = {
'repo_list': repo_list,
'location_list': location_list,
}
return render(request, 'borg/index.html', context)
def repo_daily_dict(repo_list, n_days=14):
date_labels = list(reversed([(datetime.utcnow() - timedelta(days=day)).strftime("%d %b") for day in range(n_days)]))
max_repo_size = max(repo.latest_archive().cache.unique_csize for repo in repo_list)
_, max_unit = data.convert_bytes(max_repo_size)
repo_dicts = [repo.daily_dict(max_unit, n_days) for repo in repo_list]
return {
"date_labels": date_labels,
"repos": repo_dicts,
"units": max_unit
}
def repo_daily_json(request):
repo_list = Repo.objects.all()
return JsonResponse(repo_daily_dict(repo_list, 31))
def repo(request, repo_label: str):
s_repo = get_object_or_404(Repo, label__label=repo_label)
return render(request, 'borg/repo.html', {'repo': s_repo})
@permission_required("borg.add_repo")
def post_repo(request):
if request.method == 'POST':
form = RepoForm(request.POST)
if form.is_valid():
cdata = form.cleaned_data
repo_query = Repo.objects.all().filter(fingerprint=cdata['fingerprint'])
if len(repo_query) > 0:
label = repo_query[0].label
label.label = cdata['label']
label.save()
label, _ = Label.objects.get_or_create(label=cdata['label'])
label.save()
repo, repo_exists = Repo.objects.update_or_create(fingerprint=cdata['fingerprint'],
defaults={'location': cdata['location'],
'last_modified': cdata['last_modified'],
'label': label})
repo.save()
cache.clear()
return HttpResponseRedirect(reverse('index'))
else:
form = RepoForm()
return render(request, 'borg/post/repo.html', {'form': form})
@permission_required("borg.add_archive")
def post_archive(request):
if request.method == 'POST':
form = ArchiveForm(request.POST)
if form.is_valid():
cdata = form.cleaned_data
repo = get_object_or_404(Repo, label__label=cdata['label'])
cache_dict = {k: cdata[k] for k in ('total_chunks', 'total_csize', 'total_size',
'total_unique_chunks', 'unique_csize', 'unique_size')}
cache = Cache(**cache_dict)
cache.save()
archive_dict = {k: cdata[k] for k in ('fingerprint', 'name', 'start', 'end', 'file_count',
'original_size', 'compressed_size', 'deduplicated_size')}
archive = Archive(**archive_dict, repo=repo, cache=cache)
archive.save()
cache.clear()
return HttpResponseRedirect(reverse('index'))
else:
form = ArchiveForm()
return render(request, 'borg/post/archive.html', {'form': form})
@permission_required("borg.add_error")
def post_error(request):
if request.method == 'POST':
form = ErrorForm(request.POST)
if form.is_valid():
cdata = form.cleaned_data
label, _ = Label.objects.get_or_create(label=cdata['label'])
error = Error(label=label, error=cdata['error'], time=cdata['time'])
error.save()
cache.clear()
return HttpResponseRedirect(reverse('index'))
else:
form = ErrorForm()
return render(request, 'borg/post/error.html', {'form': form})
@permission_required("borg.add_location")
def post_location(request):
if request.method == 'POST':
form = LocationForm(request.POST)
if form.is_valid():
cdata = form.cleaned_data
label, _ = Location.objects.get_or_create(label=cdata['label'],
defaults={"path": cdata["path"]})
label.save()
cache.clear()
return HttpResponseRedirect(reverse('index'))
else:
form = LocationForm ()
return render(request, 'borg/post/location.html', {'form': form})
def axes(request, credentials, *args, **kwargs):
return render(request, 'error/axes.html', {})