old_console/storage/models.py
2024-11-02 14:12:45 +03:00

115 lines
4.4 KiB
Python

import logging
import os
from django.conf import settings
from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import gettext_lazy
from core.fields import IntegerField
from core.utils import dtnow
from storage.enums import CrcType
from storage.services import verify_file_from_json, get_json_crc
_log = logging.getLogger(__name__)
MEDIA_ROOT = settings.MEDIA_ROOT
def get_storage_path(instance, file_name):
""" Get file name for storage
:param instance: DataStorage record to save
:param file_name: Original file name
:return: String with filename
"""
path_no_ext, ext = os.path.splitext(file_name)
return '{0}/{1}/{2}/{3}_{4}{5}'.format(
instance.user,
instance.type,
instance.format,
path_no_ext,
instance.created.strftime('%Y%m%d%H%M%S'),
ext
)
class DataStorage(models.Model):
""" One record in storage """
class Type(models.IntegerChoices):
UNKNOWN = 0, gettext_lazy('Unknown')
DB_DUMP = 1, gettext_lazy('DB dump')
CSV_EXPORT = 2, gettext_lazy('CSV export')
JSON_EXPORT = 3, gettext_lazy('JSON export')
CLAMAV = 4, gettext_lazy('ClamAV updates')
FIREWALL = 5, gettext_lazy('Firewall')
class Format(models.IntegerChoices):
UNKNOWN = 0, gettext_lazy('Unknown')
PLAIN = 1, gettext_lazy('Plain')
JSON = 2, gettext_lazy('JSON')
CSV = 3, gettext_lazy('CSV')
ZIP = 4, gettext_lazy('ZIP')
TAR = 5, gettext_lazy('TAR')
XML = 6, gettext_lazy('XML')
type = IntegerField(choices=Type.choices,
verbose_name=gettext_lazy('Type'),
help_text=gettext_lazy('Type of storage record'),
default=Type.UNKNOWN)
format = IntegerField(choices=Format.choices,
verbose_name=gettext_lazy('Format'),
help_text=gettext_lazy('Format of storage record'),
default=Format.UNKNOWN)
created = models.DateTimeField(auto_now_add=True,
verbose_name=gettext_lazy('Created'),
help_text=gettext_lazy('Date and time, when record was created'))
last_access = models.DateTimeField(auto_now=True,
verbose_name=gettext_lazy('Last access'),
help_text=gettext_lazy('Date and time, when record was downloaded last time'))
user = models.ForeignKey(User,
on_delete=models.CASCADE,
verbose_name=gettext_lazy('User'),
help_text=gettext_lazy('User, who own this record'))
size = IntegerField(verbose_name=gettext_lazy('Size'),
help_text=gettext_lazy('Size of record in MB'),
min_value=0)
crc = models.JSONField(verbose_name=gettext_lazy('CRC'),
help_text=gettext_lazy('Checksum of record'),
blank=True, null=True)
description = models.TextField(null=True,
blank=True,
verbose_name=gettext_lazy('Description'),
help_text=gettext_lazy('Description'))
free_date = models.DateField(verbose_name=gettext_lazy('Remove date'),
help_text=gettext_lazy('When record will be removed'),
blank=True, null=True)
file = models.FileField(upload_to=get_storage_path,
verbose_name=gettext_lazy('File'),
help_text=gettext_lazy('Actual file name'))
def get_full_path(self):
return os.path.join(MEDIA_ROOT, self.file.name)
def update_crc(self):
self.crc = get_json_crc(self.get_full_path(), CrcType.SHA512)
self.save()
def verify_file(self):
try:
return verify_file_from_json(self.get_full_path(), self.crc)
except KeyError:
return False
except TypeError:
_log.error(f"Can't calculate crc for {self.file} crc is {self.crc}")
return False
except Exception as e:
_log.error(e)
return False
def save(self, *args, **kwargs):
self.last_access = dtnow()
super().save(*args, **kwargs)