logs-collector/logs_collector/collector/models.py

93 lines
3.0 KiB
Python
Raw Normal View History

import hashlib
from functools import partial
from django.contrib.auth.models import User
2023-07-25 14:29:17 +08:00
from django.db import models
from django.conf import settings
from django.core.files.storage import FileSystemStorage
2023-07-29 12:56:42 +08:00
from django.urls import reverse
from .utils import logs_dir_path, get_file_size
# Create a custom storage location, using a value from your settings file
sensitive_upload_storage = FileSystemStorage(
location=settings.MEDIA_ROOT_FOR_SENSITIVE_FILES,
base_url=settings.MEDIA_URL_FOR_SENSITIVE_FILES
)
# ... and a file field that will use the custom storage
2023-07-29 12:56:42 +08:00
AuthenticatedFileField = partial(
models.FileField,
storage=sensitive_upload_storage
)
class Archive(models.Model):
file = AuthenticatedFileField(
upload_to=logs_dir_path,
blank=True,
null=True
)
2023-07-29 12:56:42 +08:00
size = models.CharField(max_length=50, blank=True, editable=False)
sha1 = models.CharField(max_length=1024, editable=False)
time_create = models.DateTimeField(auto_now_add=True)
time_update = models.DateTimeField(auto_now=True)
ticket = models.ForeignKey('Ticket', on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def save(self, *args, **kwargs):
# calculate sha 1 hash sum and write sha1 field to db
with self.file.open('rb') as f:
sha1 = hashlib.sha1()
for byte_block in iter(lambda: f.read(4096), b""):
sha1.update(byte_block)
self.sha1 = sha1.hexdigest()
2023-07-29 12:56:42 +08:00
# calculate size and write size field to db
try:
mr = settings.MEDIA_ROOT_FOR_SENSITIVE_FILES
unit = 'gb'
file_path = mr / self.ticket / self.file.replace(" ", "_")
file_size = get_file_size(file_path, unit)
self.size = f"{file_size} {unit.title()}"
except Exception as error:
print(error)
self.size = '?'
# Call the "real" save() method
super().save(*args, **kwargs)
2023-07-29 12:56:42 +08:00
def get_absolute_url(self):
return reverse('download', kwargs={'path': self.file})
def __str__(self):
return str(self.file)
class Platform(models.Model):
name = models.CharField(max_length=20)
2023-07-29 12:56:42 +08:00
pretty_name = models.CharField(max_length=20)
def get_absolute_url(self):
return reverse('platform', kwargs={'platform': self.name})
def __str__(self):
return self.name
class Ticket(models.Model):
number = models.IntegerField()
resolved = models.BooleanField(default=False)
note = models.TextField(blank=True)
time_create = models.DateTimeField(auto_now_add=True)
time_update = models.DateTimeField(auto_now=True)
platform = models.ForeignKey('Platform', on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
2023-07-25 14:29:17 +08:00
2023-07-29 12:56:42 +08:00
def get_absolute_url(self):
return reverse(
'ticket',
kwargs={'platform': self.platform.name, 'ticket': self.number}
)
def __str__(self):
return str(self.number)