mirror of
https://github.com/ferdzo/serviceCRM.git
synced 2026-04-04 21:06:24 +00:00
Uraden veliki servis
This commit is contained in:
19
.vscode/launch.json
vendored
Normal file
19
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Python Debugger: Django",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}\\manage.py",
|
||||||
|
"args": [
|
||||||
|
"runserver"
|
||||||
|
],
|
||||||
|
"django": true,
|
||||||
|
"autoStartBrowser": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"cmake.configureOnOpen": false
|
||||||
|
}
|
||||||
79
index.html
79
index.html
@@ -1,6 +1,73 @@
|
|||||||
<index>
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
<body>
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
</body>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
</index>
|
<title>Servicing Ticket</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
.header img {
|
||||||
|
max-width: 150px;
|
||||||
|
}
|
||||||
|
.ticket {
|
||||||
|
border: 2px solid #000;
|
||||||
|
padding: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
.ticket-info {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
.ticket-info label {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.ticket-description {
|
||||||
|
border-top: 2px solid #000;
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="header">
|
||||||
|
<img src="fer-logo.png" style="max-width:65%" alt="Company Logo">
|
||||||
|
</div>
|
||||||
|
<div class="ticket">
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Име и презиме:</label> {{ ticket.name }}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Телефонски број:</label> {{ticket.phone}}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Датум:</label> {{ticket.date}}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-description">
|
||||||
|
<label><b>Опис на дефект:</b></label>{% if ticket.description %} {{ ticket.description }} {% else %} Нема опис {% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="height:150px;"></div>
|
||||||
|
<div class="ticket">
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Име и презиме:</label> {{ ticket.name }}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Телефонски број:</label> {{ ticket.phone }}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Датум:</label> {{ ticket.date }}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-description">
|
||||||
|
<label><b>Опис на дефект:</b></label>{% if ticket.description %} {{ ticket.description }} {% else %} Нема опис {% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
serviceCRM/filter.py
Normal file
14
serviceCRM/filter.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
from .models import Insert
|
||||||
|
import django_filters as filters
|
||||||
|
from django_filters import FilterSet
|
||||||
|
|
||||||
|
class DoneTable(FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = Insert
|
||||||
|
fields = ["done"]
|
||||||
|
|
||||||
|
def filter_done(self, queryset, name, value):
|
||||||
|
if value:
|
||||||
|
return queryset.filter(done=True)
|
||||||
|
else:
|
||||||
|
return queryset.filter(done=False)
|
||||||
@@ -20,7 +20,15 @@ class InputForm(forms.ModelForm):
|
|||||||
|
|
||||||
field_order = ["name", "phone", "date", "description", "done"]
|
field_order = ["name", "phone", "date", "description", "done"]
|
||||||
|
|
||||||
# name = forms.CharField(label="Name", max_length=30)
|
# class EditForm(forms.ModelForm):
|
||||||
# phone = forms.CharField(label="Phone", max_length=30)
|
# class Meta:
|
||||||
# date = forms.DateField()
|
# model = Insert
|
||||||
# description = forms.CharField(label="Write description of the problem...", max_length=300)
|
# fields = {"name", "phone", "description", "done"}
|
||||||
|
# labels = {'name': "Name", 'phone': "Phone", 'description': "Description", 'done': "Done"}
|
||||||
|
# widgets = {
|
||||||
|
# 'name': forms.TextInput(attrs={'class': 'form-control'}),
|
||||||
|
# 'phone': forms.TextInput(attrs={'class': 'form-control'}),
|
||||||
|
# 'description': forms.Textarea(attrs={'class': 'form-control'})
|
||||||
|
# }
|
||||||
|
|
||||||
|
# field_order = ["name", "phone", "description", "done"]
|
||||||
BIN
serviceCRM/static/fer-logo.png
Normal file
BIN
serviceCRM/static/fer-logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
@@ -1,13 +1,22 @@
|
|||||||
import django_tables2 as tables
|
import django_tables2 as tables
|
||||||
|
from django_tables2 import TemplateColumn
|
||||||
|
from django_filters import FilterSet
|
||||||
|
from django.db.models.query import QuerySet # Add missing import
|
||||||
from .models import Insert
|
from .models import Insert
|
||||||
from django_tables2.utils import A
|
|
||||||
|
|
||||||
|
|
||||||
class InsertTable(tables.Table):
|
class InsertTable(tables.Table):
|
||||||
|
|
||||||
|
actions = TemplateColumn(template_code='<a class="btn btn-secondary" href="{% url \'update\' record.id %}">Edit</a>')
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Insert
|
model = Insert
|
||||||
template_name = "list.html"
|
fields = ("id","name","phone","description","date","done")
|
||||||
sequence = ("name", "phone", "description","date","done" )
|
|
||||||
delete = tables.LinkColumn('main:delete_item', args=[A('pk')], attrs={
|
|
||||||
'a': {'class': 'btn'}
|
class DoneInsertTable(InsertTable):
|
||||||
})
|
class Meta:
|
||||||
|
model = Insert
|
||||||
|
fields = ("id","name","phone","description","date","done")
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
print(self.data)
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
{% load render_table from django_tables2 %}
|
{% load render_table from django_tables2 %}
|
||||||
|
|
||||||
|
|
||||||
{% render_table table %}
|
{% render_table object_list %}
|
||||||
|
|
||||||
{% endblock%}
|
{% endblock%}
|
||||||
0
serviceCRM/templates/serviceCRM/delete.html
Normal file
0
serviceCRM/templates/serviceCRM/delete.html
Normal file
6
serviceCRM/templates/serviceCRM/done.html
Normal file
6
serviceCRM/templates/serviceCRM/done.html
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load render_table from django_tables2 %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% render_table table %}
|
||||||
|
{%endblock%}
|
||||||
@@ -1 +1,13 @@
|
|||||||
<a class="btn btn-info btn-sm" href="{% url 'edit' record.id %}">Edit</a>
|
{% extends 'base.html' %}
|
||||||
|
{% block title %}Edit{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
{% csrf_token %}
|
||||||
|
<form method="post">
|
||||||
|
<div class="form-group">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{form.as_p}}
|
||||||
|
<input type="submit" class="btn btn-success" value="Update">
|
||||||
|
<input type="submit" class="btn btn-danger" value="Delete" formaction="{% url 'delete' id=object.id %}">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endblock%}
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
{% load render_table from django_tables2 %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% load render_table from django_tables2 %}
|
|
||||||
|
|
||||||
|
|
||||||
{% render_table table %}
|
{% render_table table %}
|
||||||
|
|
||||||
{% endblock%}
|
{% endblock%}
|
||||||
83
serviceCRM/templates/serviceCRM/nalog.html
Normal file
83
serviceCRM/templates/serviceCRM/nalog.html
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
{% block content %}
|
||||||
|
{% load static %}
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Servicing Ticket</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
.header img {
|
||||||
|
max-width: 150px;
|
||||||
|
}
|
||||||
|
.ticket {
|
||||||
|
border: 2px solid #000;
|
||||||
|
padding: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
.ticket-info {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
.ticket-info label {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.ticket-description {
|
||||||
|
border-top: 2px solid #000;
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
.center {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
margin-bottom: 5 0px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="header">
|
||||||
|
<img src="{% static 'fer-logo.png' %}" class="center" alt="Company Logo">
|
||||||
|
</div>
|
||||||
|
<div class="ticket">
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Име и презиме:</label> {{ name }}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Телефонски број:</label> {{phone}}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Датум:</label> {{date}}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-description">
|
||||||
|
<label><b>Опис на дефект:</b></label> {{ desc }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="height:150px;"></div>
|
||||||
|
<div class="ticket">
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Име и презиме:</label> {{ name }}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Телефонски број:</label> {{ phone }}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-info">
|
||||||
|
<label>Датум:</label> {{ date }}
|
||||||
|
</div>
|
||||||
|
<div class="ticket-description">
|
||||||
|
<label><b>Опис на дефект:</b></label> {{ desc }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
{% endblock %}
|
||||||
@@ -19,8 +19,11 @@ from django.urls import path
|
|||||||
import serviceCRM.views as view
|
import serviceCRM.views as view
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("", view.TableView.as_view(), name="index"),
|
path("", view.InsertListView.as_view(), name="index"),
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path("<int:question_id>/", view.ReportById.ReportById, name="detail"),
|
|
||||||
path("insert/", view.InsertNew.insert, name="insert"),
|
path("insert/", view.InsertNew.insert, name="insert"),
|
||||||
path("done/<int:id>/", view.done, name="done"),]
|
path("edit/<int:pk>/", view.Update.as_view(), name="update"),
|
||||||
|
path("nalog/<int:id>/", view.Nalog, name="nalog"),
|
||||||
|
path("delete/<int:id>/", view.Delete.Delete, name="delete"),
|
||||||
|
path("done/", view.Done.as_view(), name="done"),
|
||||||
|
]
|
||||||
|
|||||||
@@ -1,36 +1,23 @@
|
|||||||
from django.http import HttpResponse, HttpResponseRedirect
|
from django.http import HttpResponse, HttpResponseRedirect
|
||||||
from django.shortcuts import get_object_or_404, render
|
from django.shortcuts import get_object_or_404, render
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
from django.views.generic import UpdateView
|
||||||
from .forms import InputForm
|
from .forms import InputForm
|
||||||
from .tables import InsertTable
|
|
||||||
from .models import Insert
|
from .models import Insert
|
||||||
|
from .tables import DoneInsertTable, InsertTable
|
||||||
from django_tables2 import SingleTableView
|
from django_tables2 import SingleTableView
|
||||||
|
class InsertListView(SingleTableView):
|
||||||
|
|
||||||
# from django.template import loader
|
|
||||||
|
|
||||||
def index(request):
|
|
||||||
if request.user.is_authenticated:
|
|
||||||
return HttpResponse("You are logged in")
|
|
||||||
proba = Insert.objects.order_by("date")
|
|
||||||
return HttpResponse(proba)
|
|
||||||
else:
|
|
||||||
return HttpResponse("You are not logged in")
|
|
||||||
|
|
||||||
|
|
||||||
# def detail(request,question_id):
|
|
||||||
# req = get_object_or_404(Insert,id=question_id)
|
|
||||||
# context = {"name":req.name, "phone":req.phone,"desc":req.description,"date":req.date}
|
|
||||||
# return HttpResponse(render(request,"serviceCRM/id.html", context))
|
|
||||||
#
|
|
||||||
class ReportById(generic.DetailView):
|
|
||||||
model = Insert
|
model = Insert
|
||||||
template_name = "serviceCRM/id.html"
|
table_class = InsertTable
|
||||||
|
template_name = 'serviceCRM/list.html'
|
||||||
|
|
||||||
def ReportById(request, question_id):
|
# class ReportById(generic.DetailView):
|
||||||
req = get_object_or_404(Insert, id=question_id)
|
# model = Insert
|
||||||
context = {"name": req.name, "phone": req.phone, "desc": req.description, "date": req.date}
|
# template_name = "serviceCRM/id.html"
|
||||||
return HttpResponse(f"Report ID: {question_id} \nName: {req.name} \nPhone: {req.phone} \nDescription: {req.description} \nDate: {req.date} \nDone: {req.done}")
|
# def ReportById(request, question_id):
|
||||||
|
# req = get_object_or_404(Insert, id=question_id)
|
||||||
|
# context = {"name": req.name, "phone": req.phone, "desc": req.description, "date": req.date}
|
||||||
|
# return HttpResponse(f"Report ID: {question_id} \nName: {req.name} \nPhone: {req.phone} \nDescription: {req.description} \nDate: {req.date} \nDone: {req.done}")
|
||||||
|
|
||||||
class InsertNew(generic.View):
|
class InsertNew(generic.View):
|
||||||
model = Insert
|
model = Insert
|
||||||
@@ -40,23 +27,42 @@ class InsertNew(generic.View):
|
|||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
form = InputForm(request.POST)
|
form = InputForm(request.POST)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
form.save()
|
ticket=form.save()
|
||||||
print("Raboti")
|
print("Raboti")
|
||||||
return HttpResponseRedirect("/admin/")
|
return HttpResponseRedirect(f"/nalog/{ticket.id}/")
|
||||||
else:
|
else:
|
||||||
form = InputForm()
|
form = InputForm()
|
||||||
|
|
||||||
return render(request, InsertNew.template_name, {'form': form})
|
return render(request, InsertNew.template_name, {'form': form})
|
||||||
|
|
||||||
|
class Update(UpdateView):
|
||||||
class TableView(SingleTableView):
|
model = Insert
|
||||||
table_class = Insert
|
template_name = "serviceCRM/edit.html"
|
||||||
queryset = Insert.objects.all()
|
fields = ["name", "phone", "description", "done"]
|
||||||
template_name = "serviceCRM/list.html"
|
success_url = '/'
|
||||||
|
|
||||||
|
|
||||||
def done(request, id):
|
def done(request, id):
|
||||||
req = get_object_or_404(Insert, id=id)
|
req = get_object_or_404(Insert, id=id)
|
||||||
if req.isDone():
|
if req.isDone():
|
||||||
return HttpResponse("Done")
|
return HttpResponse("Done")
|
||||||
return HttpResponse("Not Done")
|
return HttpResponse("Not Done")
|
||||||
|
|
||||||
|
def Nalog(request, id):
|
||||||
|
data = Insert.objects.get(id=id)
|
||||||
|
template = "serviceCRM/nalog.html"
|
||||||
|
context = {"name": data.name, "phone": data.phone, "desc": data.description, "date": data.date}
|
||||||
|
return render(request, template, context)
|
||||||
|
|
||||||
|
class Delete():
|
||||||
|
model = Insert
|
||||||
|
def Delete(request, id):
|
||||||
|
req = get_object_or_404(Insert, id=id)
|
||||||
|
req.delete()
|
||||||
|
return HttpResponseRedirect("/")
|
||||||
|
|
||||||
|
class Done(SingleTableView):
|
||||||
|
model = Insert
|
||||||
|
table_data = Insert.objects.filter(done=True)
|
||||||
|
table_class = DoneInsertTable
|
||||||
|
template_name = 'serviceCRM/done.html'
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user