75 lines
1.9 KiB
Python
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}"
|