borg-web/borgweb/borg/views/json.py
2022-04-11 07:02:05 +01:00

93 lines
2.7 KiB
Python

from datetime import datetime, timedelta
from django.shortcuts import get_object_or_404
from django.http import JsonResponse
from ..models import Repo, Label
from ..utility import data
from ..utility.time import last_day_previous_months
def repo_json(request, repo_label):
repo = get_object_or_404(Repo, label__label=repo_label)
repo_dict = {'location': repo.location,
'latest_backup': repo.last_backup(),
'size': repo.size_string(),
'recent_errors': len(repo.recent_errors()),
'warning': repo.warning(),
'error': repo.error()}
return JsonResponse(repo_dict)
def repo_monthly_size_json(request, repo_label, months_ago: int = 12):
repo = get_object_or_404(Repo, label__label=repo_label)
date_labels = [date.strftime("%b %Y") for date in last_day_previous_months(months_ago)]
max_unit = get_units([repo])
repo_dict = {"id": repo.id,
"label": repo.label.label,
"size": repo.size_on_months(max_unit, months_ago)}
response_dict = {
"dates": date_labels,
"repo": repo_dict,
"units": max_unit
}
return JsonResponse(response_dict)
def repo_list_json(request):
return JsonResponse({'labels': [repo.label.label for repo in Repo.objects.all()]})
def repo_monthly_json(request, months_ago: int = 12):
date_labels = [date.strftime("%b %Y") for date in last_day_previous_months(months_ago)]
repo_list = Repo.objects.all()
max_unit = get_units(repo_list)
repo_dicts = [{
"id": repo.id,
"label": repo.label.label,
"size": repo.size_on_months(max_unit, months_ago)
} for repo in repo_list]
response_dict = {
"dates": date_labels,
"repos": repo_dicts,
"units": max_unit
}
return JsonResponse(response_dict)
def repo_daily_json(request, days_ago: int = 30):
repo_list = Repo.objects.all()
dates = [(datetime.utcnow() - timedelta(days=day)) for day in range(days_ago)][::-1]
return JsonResponse(repo_size_dict(repo_list, dates, "%d %b"))
def repo_size_dict(repo_list, dates: list, date_format: str):
date_labels = list([day.strftime(date_format) for day in dates])
max_unit = get_units(repo_list)
repo_dicts = [{
"id": repo.id,
"label": repo.label.label,
"size": repo.size_on_dates(max_unit, dates)
} for repo in repo_list]
return {
"dates": date_labels,
"repos": repo_dicts,
"units": max_unit
}
def get_units(repo_list):
max_repo_size = max(repo.latest_archive().cache.unique_csize for repo in repo_list)
_, max_unit = data.convert_bytes(max_repo_size)
return max_unit