mirror of
https://github.com/MOIS3Y/logs-collector.git
synced 2025-02-01 09:20:52 +01:00
Add: CreateTicket view and form
This commit is contained in:
parent
eb80d72153
commit
138b8f26ad
@ -1,9 +1,27 @@
|
|||||||
from django.forms import ModelForm
|
from django import forms
|
||||||
|
from crispy_forms.helper import FormHelper
|
||||||
|
from crispy_forms.layout import Layout, Submit, Div
|
||||||
|
from crispy_bootstrap5.bootstrap5 import FloatingField
|
||||||
|
|
||||||
from .models import Ticket
|
from .models import Ticket
|
||||||
|
|
||||||
|
|
||||||
class TicketForm(ModelForm):
|
class CreateTicketForm(forms.ModelForm):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Ticket
|
model = Ticket
|
||||||
fields = ['number', 'platform', 'resolved', 'note']
|
fields = ['number', 'platform', 'note']
|
||||||
|
widgets = {
|
||||||
|
'platform': forms.RadioSelect()
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(CreateTicketForm, self).__init__(*args, **kwargs)
|
||||||
|
self.helper = FormHelper(self)
|
||||||
|
# self.helper.attrs = {"novalidate": ''}
|
||||||
|
|
||||||
|
self.helper.layout = Layout(
|
||||||
|
Div(FloatingField('number'), 'platform', css_class='col-md-2'),
|
||||||
|
Div('note', css_class='col-md-6'),
|
||||||
|
Submit('submit', 'Create', css_class='btn btn-success'),
|
||||||
|
)
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
# Generated by Django 4.2 on 2023-08-05 11:14
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('collector', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='ticket',
|
||||||
|
options={'ordering': ['-time_create']},
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='archive',
|
||||||
|
name='size',
|
||||||
|
field=models.CharField(blank=True, editable=False, max_length=50),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='ticket',
|
||||||
|
name='number',
|
||||||
|
field=models.IntegerField(db_index=True, unique=True),
|
||||||
|
),
|
||||||
|
]
|
@ -60,11 +60,11 @@ class Platform(models.Model):
|
|||||||
return reverse('collector:platform', kwargs={'platform': self.name})
|
return reverse('collector:platform', kwargs={'platform': self.name})
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.pretty_name
|
||||||
|
|
||||||
|
|
||||||
class Ticket(models.Model):
|
class Ticket(models.Model):
|
||||||
number = models.IntegerField()
|
number = models.IntegerField(unique=True, db_index=True)
|
||||||
resolved = models.BooleanField(default=False)
|
resolved = models.BooleanField(default=False)
|
||||||
note = models.TextField(blank=True)
|
note = models.TextField(blank=True)
|
||||||
time_create = models.DateTimeField(auto_now_add=True)
|
time_create = models.DateTimeField(auto_now_add=True)
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
type="checkbox"
|
type="checkbox"
|
||||||
role="switch"
|
role="switch"
|
||||||
name="ticket-state"
|
name="ticket-state"
|
||||||
ticket-state-url="{% url 'collector:ajax_update_state_ticket' ticket.platform ticket.number %}"
|
ticket-state-url="{% url 'collector:ajax_update_state_ticket' ticket.platform.name ticket.number %}"
|
||||||
{% if ticket.resolved %} ticket-state-switch="1" {% endif %}
|
{% if ticket.resolved %} ticket-state-switch="1" {% endif %}
|
||||||
{% if ticket.resolved %} checked {% endif %}>
|
{% if ticket.resolved %} checked {% endif %}>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
{% extends 'collector/base.html' %}
|
{% extends 'collector/base.html' %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
{% block title %}<title>Collector - create</title>{% endblock title %}
|
{% block title %}<title>Collector - create</title>{% endblock title %}
|
||||||
{% block main %}
|
{% block main %}
|
||||||
<div class="container mt-3">
|
<div class="container mt-3">
|
||||||
<div class="row">
|
<div class="card">
|
||||||
<form action="{% url 'collector:create' %}" method="post">
|
<div class="card-header">
|
||||||
{% csrf_token %}
|
<h4>New ticket:</h4>
|
||||||
{{ form.as_p }}
|
</div>
|
||||||
<button type="submit" class="btn btn-success">
|
<div class="card-body">
|
||||||
Create
|
{% crispy form %}
|
||||||
</button>
|
</div>
|
||||||
</form>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock main %}
|
{% endblock main %}
|
||||||
|
@ -9,6 +9,7 @@ from rest_framework import status
|
|||||||
# from rest_framework.response import Response
|
# from rest_framework.response import Response
|
||||||
|
|
||||||
from .models import Archive, Ticket
|
from .models import Archive, Ticket
|
||||||
|
from .forms import CreateTicketForm
|
||||||
from .utils import is_ajax
|
from .utils import is_ajax
|
||||||
|
|
||||||
|
|
||||||
@ -30,8 +31,8 @@ class ArchiveHandlerView(LoginRequiredMixin, SingleObjectMixin, generic.View):
|
|||||||
|
|
||||||
class CreateTicket(LoginRequiredMixin, generic.CreateView):
|
class CreateTicket(LoginRequiredMixin, generic.CreateView):
|
||||||
model = Ticket
|
model = Ticket
|
||||||
|
form_class = CreateTicketForm
|
||||||
template_name = 'collector/ticket_create.html'
|
template_name = 'collector/ticket_create.html'
|
||||||
fields = ['number', 'platform', 'resolved', 'note']
|
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
form.instance.user = self.request.user
|
form.instance.user = self.request.user
|
||||||
|
@ -35,6 +35,8 @@ INSTALLED_APPS = [
|
|||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
'collector.apps.CollectorConfig', # main app
|
'collector.apps.CollectorConfig', # main app
|
||||||
'rest_framework',
|
'rest_framework',
|
||||||
|
"crispy_forms",
|
||||||
|
"crispy_bootstrap5",
|
||||||
'django_cleanup.apps.CleanupConfig', # required bottom
|
'django_cleanup.apps.CleanupConfig', # required bottom
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -126,3 +128,10 @@ MEDIA_URL = 'media/'
|
|||||||
|
|
||||||
MEDIA_ROOT_FOR_SENSITIVE_FILES = BASE_DIR / 'archives'
|
MEDIA_ROOT_FOR_SENSITIVE_FILES = BASE_DIR / 'archives'
|
||||||
MEDIA_URL_FOR_SENSITIVE_FILES = '/archives/'
|
MEDIA_URL_FOR_SENSITIVE_FILES = '/archives/'
|
||||||
|
|
||||||
|
|
||||||
|
# django-crispy-forms and crispy-bootstrap5
|
||||||
|
# https://django-crispy-forms.readthedocs.io/en/latest/
|
||||||
|
CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
|
||||||
|
|
||||||
|
CRISPY_TEMPLATE_PACK = "bootstrap5"
|
||||||
|
Loading…
Reference in New Issue
Block a user