borg-web/borgweb/borg/models/location.py

75 lines
1.9 KiB
Python

from django.db import models
from pathlib import Path
from datetime import datetime
ACCESS_DENIED = -2
INVALID_PATH = -1
NON_EXISTENT = 0
FILE = 1
DIRECTORY = 2
SYMLINK = 3
MOUNT_POINT = 4
DESCRIPTION = {
INVALID_PATH: "path",
NON_EXISTENT: "path",
FILE: "file",
DIRECTORY: "directory",
SYMLINK: "symbolic link",
MOUNT_POINT: "mount point",
ACCESS_DENIED: "access denied",
}
class Location(models.Model):
label = models.TextField(unique=True)
path = models.TextField()
last_checked = models.DateTimeField(null=True)
def __path_type(self):
try:
path = Path(self.path)
path.exists()
except OSError:
return INVALID_PATH
except ValueError:
return INVALID_PATH
try:
if not path.exists():
return NON_EXISTENT
elif path.is_symlink():
return SYMLINK
elif path.is_mount():
return MOUNT_POINT
elif path.is_dir():
return DIRECTORY
elif path.is_file():
return FILE
except PermissionError:
return ACCESS_DENIED
def exists(self):
path_type = self.__path_type()
if self.invalid():
return False
elif path_type in [FILE, DIRECTORY, SYMLINK, MOUNT_POINT]:
self.last_checked = datetime.utcnow()
return True
def type_description(self):
return DESCRIPTION[self.__path_type()]
def invalid(self):
return self.__path_type() in [INVALID_PATH, NON_EXISTENT, ACCESS_DENIED]
def have_permission(self):
return self.__path_type() != ACCESS_DENIED
def short_description(self):
type = self.__path_type()
type_description = self.type_description()
existence = "exists" if self.exists() else "does not exist"
return f"{type_description} {self.path} {existence}"