From eca02882da96f524ad32f7dc8521157079f7dd0f Mon Sep 17 00:00:00 2001 From: George Lacey Date: Tue, 11 May 2021 15:46:52 +0100 Subject: [PATCH] Create location model to keep track of filesystem paths --- borgweb/borg/models/location.py | 67 +++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 borgweb/borg/models/location.py diff --git a/borgweb/borg/models/location.py b/borgweb/borg/models/location.py new file mode 100644 index 0000000..1faae7b --- /dev/null +++ b/borgweb/borg/models/location.py @@ -0,0 +1,67 @@ +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() + + 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