From 96ae8647e105ac1319eea31678d53386675ae60a Mon Sep 17 00:00:00 2001 From: MOIS3Y Date: Sat, 29 Jul 2023 13:56:42 +0900 Subject: [PATCH] Create: views and templates --- .../collector/migrations/0001_initial.py | 8 +- logs_collector/collector/models.py | 39 ++++++-- .../collector/templates/collector/base.html | 26 +++++ .../templates/collector/navigation.html | 58 +++++++++++ .../collector/templates/collector/ticket.html | 95 ++++++++++++++++++ .../templates/collector/tickets.html | 97 +++++++++++++++++++ logs_collector/collector/urls.py | 25 ++++- logs_collector/collector/utils.py | 18 ++++ logs_collector/collector/views.py | 52 ++++++++-- 9 files changed, 395 insertions(+), 23 deletions(-) create mode 100644 logs_collector/collector/templates/collector/base.html create mode 100644 logs_collector/collector/templates/collector/navigation.html create mode 100644 logs_collector/collector/templates/collector/ticket.html create mode 100644 logs_collector/collector/templates/collector/tickets.html diff --git a/logs_collector/collector/migrations/0001_initial.py b/logs_collector/collector/migrations/0001_initial.py index 911dd53..68419ac 100644 --- a/logs_collector/collector/migrations/0001_initial.py +++ b/logs_collector/collector/migrations/0001_initial.py @@ -1,6 +1,6 @@ -# Generated by Django 4.2 on 2023-07-27 02:04 +# Generated by Django 4.2 on 2023-07-28 14:40 -import collector.models +import collector.utils from django.conf import settings import django.core.files.storage from django.db import migrations, models @@ -22,6 +22,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=20)), + ('pretty_name', models.CharField(max_length=20)), ], ), migrations.CreateModel( @@ -41,7 +42,8 @@ class Migration(migrations.Migration): name='Archive', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('file', models.FileField(blank=True, null=True, storage=django.core.files.storage.FileSystemStorage(base_url='/archives/', location=pathlib.PurePosixPath('/home/stepan/Documents/Dev/ISPsystem/logs-collector/logs_collector/archives')), upload_to=collector.models.logs_dir_path)), + ('file', models.FileField(blank=True, null=True, storage=django.core.files.storage.FileSystemStorage(base_url='/archives/', location=pathlib.PurePosixPath('/home/stepan/Documents/Dev/ISPsystem/logs-collector/logs_collector/archives')), upload_to=collector.utils.logs_dir_path)), + ('size', models.CharField(blank=True, max_length=50)), ('sha1', models.CharField(editable=False, max_length=1024)), ('time_create', models.DateTimeField(auto_now_add=True)), ('time_update', models.DateTimeField(auto_now=True)), diff --git a/logs_collector/collector/models.py b/logs_collector/collector/models.py index 913ad4a..61f7c62 100644 --- a/logs_collector/collector/models.py +++ b/logs_collector/collector/models.py @@ -5,7 +5,9 @@ from django.contrib.auth.models import User from django.db import models from django.conf import settings from django.core.files.storage import FileSystemStorage -from django.db.models import FileField +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 @@ -14,13 +16,10 @@ sensitive_upload_storage = FileSystemStorage( base_url=settings.MEDIA_URL_FOR_SENSITIVE_FILES ) # ... and a file field that will use the custom storage -AuthenticatedFileField = partial(FileField, storage=sensitive_upload_storage) - - -def logs_dir_path(instance, filename): - # file will be uploaded to - # MEDIA_ROOT_FOR_SENSITIVE_FILES// - return f'{instance.ticket}/{filename}' +AuthenticatedFileField = partial( + models.FileField, + storage=sensitive_upload_storage +) class Archive(models.Model): @@ -29,6 +28,7 @@ class Archive(models.Model): blank=True, null=True ) + 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) @@ -42,15 +42,32 @@ class Archive(models.Model): for byte_block in iter(lambda: f.read(4096), b""): sha1.update(byte_block) self.sha1 = sha1.hexdigest() + # 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) + 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) + 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 @@ -65,5 +82,11 @@ class Ticket(models.Model): platform = models.ForeignKey('Platform', on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE) + def get_absolute_url(self): + return reverse( + 'ticket', + kwargs={'platform': self.platform.name, 'ticket': self.number} + ) + def __str__(self): return str(self.number) diff --git a/logs_collector/collector/templates/collector/base.html b/logs_collector/collector/templates/collector/base.html new file mode 100644 index 0000000..2965829 --- /dev/null +++ b/logs_collector/collector/templates/collector/base.html @@ -0,0 +1,26 @@ + + + + + + + Document + + + {% block content %}{% endblock content %} + + + + diff --git a/logs_collector/collector/templates/collector/navigation.html b/logs_collector/collector/templates/collector/navigation.html new file mode 100644 index 0000000..b029eb1 --- /dev/null +++ b/logs_collector/collector/templates/collector/navigation.html @@ -0,0 +1,58 @@ +
+ +
diff --git a/logs_collector/collector/templates/collector/ticket.html b/logs_collector/collector/templates/collector/ticket.html new file mode 100644 index 0000000..9f8e651 --- /dev/null +++ b/logs_collector/collector/templates/collector/ticket.html @@ -0,0 +1,95 @@ +{% extends 'collector/base.html' %} +{% block content %} +{% include 'collector/navigation.html' %} +
+
+
+
+
+
+
+
Ticket: {{ ticket.number }}
+ {{ ticket.time_create }} +
+
+
Platform: {{ ticket.platform.pretty_name }}
+
Owner: {{ ticket.user.username }}
+
+
+ {% if ticket.note %} + Note: +
+

{{ ticket.note }}

+
+ {% endif %} +
+ + {% if ticket.archive_set.all %} + Logs: +
    + {% for archive in ticket.archive_set.all %} +
  • +

    File: {{ archive.file }}

    + + SHA1: + {{ archive.sha1 }} + +
    + + Size: + {{ archive.size }} + +
    +
    + GET + +
    +
    +
  • + {% endfor %} +
+ {% endif %} + +
+ Edit + Delete +
+
+
+
+ + {% for archive in ticket.archive_set.all %} + + {% endfor %} +
+
+
+{% endblock content %} diff --git a/logs_collector/collector/templates/collector/tickets.html b/logs_collector/collector/templates/collector/tickets.html new file mode 100644 index 0000000..926c1a2 --- /dev/null +++ b/logs_collector/collector/templates/collector/tickets.html @@ -0,0 +1,97 @@ +{% extends 'collector/base.html' %} + +{% block content %} + +{% include 'collector/navigation.html' %} + +
+
+
+ {% for ticket in tickets %} +
+ +
+
+
+
Ticket: {{ ticket.number }}
+ {{ ticket.time_create }} +
+
+ +
Platform: {{ ticket.platform.pretty_name }}
+
Owner: {{ ticket.user.username }}
+
+
+
+ {% if ticket.note %} +
+

+ +

+
+
+

{{ ticket.note }}

+
+
+
+ {% endif %} + {% if ticket.archive_set.all %} + +
+

+ +

+
+
+ +
+
+
+ {% endif %} +
+
+
+ Open +
+
+
+
+ {% endfor %} +
+
+
+{% endblock content %} diff --git a/logs_collector/collector/urls.py b/logs_collector/collector/urls.py index 7c45f84..e9ee5e3 100644 --- a/logs_collector/collector/urls.py +++ b/logs_collector/collector/urls.py @@ -1,9 +1,28 @@ from django.urls import path + from . import views urlpatterns = [ - path('', views.index, name='index',), - path('test//', views.test_page, name='test_page'), - path('archives//', views.download, name="download") + path( + '', + views.ListAllTickets.as_view(), + name='index' + ), + path( + 'tickets/', + views.ListAllTickets.as_view(), + name='index' + ), + path( + 'tickets//', + views.ListPlatformTickets.as_view(), + name='platform' + ), + path( + 'tickets///', + views.DetailTicket.as_view(), + name='ticket' + ), + path('archives/', views.download, name="download") ] diff --git a/logs_collector/collector/utils.py b/logs_collector/collector/utils.py index e69de29..4d9c79f 100644 --- a/logs_collector/collector/utils.py +++ b/logs_collector/collector/utils.py @@ -0,0 +1,18 @@ +import os + + +def logs_dir_path(instance, filename): + # file will be uploaded to + # MEDIA_ROOT_FOR_SENSITIVE_FILES// + return f'{instance.ticket}/{filename}' + + +def get_file_size(file_path, unit='bytes'): + file_size = os.path.getsize(file_path) + exponents_map = {'bytes': 0, 'kb': 1, 'mb': 2, 'gb': 3} + if unit not in exponents_map: + raise ValueError("Must select from \ + ['bytes', 'kb', 'mb', 'gb']") + else: + size = file_size / 1024 ** exponents_map[unit] + return round(size, 3) diff --git a/logs_collector/collector/views.py b/logs_collector/collector/views.py index 0f9ac07..6a33a9f 100644 --- a/logs_collector/collector/views.py +++ b/logs_collector/collector/views.py @@ -1,14 +1,14 @@ # from django.shortcuts import render from django.contrib.auth.decorators import login_required -from django.http import FileResponse, HttpResponse, Http404 -from .models import Archive +from django.http import FileResponse, Http404 +from django.views import generic + +from .models import Archive, Ticket, Platform -# Create your views here. # handles the url "/archives/{PATH}"". @login_required -def download(request, ticket, file): - path = f'{ticket}/{file}' +def download(request, path): try: file = Archive.objects.get(file=path) except Archive.DoesNotExist: @@ -17,9 +17,43 @@ def download(request, ticket, file): return FileResponse(file.file) -def index(request): - return HttpResponse('

Index Page

') +class ListAllTickets(generic.ListView): + model = Ticket + template_name = 'collector/tickets.html' + context_object_name = 'tickets' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['platforms'] = Platform.objects.all() + return context -def test_page(request, path): - return HttpResponse(f'

{path} Page

') +class ListPlatformTickets(generic.ListView): + model = Ticket + template_name = 'collector/tickets.html' + context_object_name = 'tickets' + allow_empty = False + + def get_queryset(self): + return Ticket.objects.filter( + platform__name=self.kwargs.get('platform') + ) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['platforms'] = Platform.objects.all() + return context + + +class DetailTicket(generic.DetailView): + model = Ticket + template_name = 'collector/ticket.html' + context_object_name = 'ticket' + + def get_object(self, queryset=None): + return Ticket.objects.get(number=self.kwargs.get('ticket')) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['platforms'] = Platform.objects.all() + return context