Sistema de gerenciamento de tickets de suporte desenvolvido em Django.
- Python 3.8+
- Django 4.2+
- PostgreSQL (recomendado) ou SQLite
- pip (gerenciador de pacotes Python)
helpdesk/
├── manage.py
├── requirements.txt
├── tickets/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── views.py
│ ├── urls.py
│ ├── forms.py
│ └── templates/
│ └── tickets/
│ ├── base.html
│ ├── home.html
│ ├── ticket_list.html
│ ├── ticket_detail.html
│ └── ticket_form.html
└── templates/
└── admin/
└── base_site.html
- Clone o repositório:
git clone [URL_DO_REPOSITORIO]
cd helpdesk- Crie um ambiente virtual e ative-o:
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows- Instale as dependências:
pip install -r requirements.txt- Configure o banco de dados:
python manage.py makemigrations
python manage.py migrate- Crie um superusuário:
python manage.py createsuperuser- Execute o servidor de desenvolvimento:
python manage.py runserverDjango==4.2.7
django-crispy-forms==2.0
crispy-bootstrap5==2023.10
Pillow==10.1.0
python-dotenv==1.0.0
psycopg2-binary==2.9.9 # Para PostgreSQL
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tickets.apps.TicketsConfig',
'crispy_forms',
'crispy_bootstrap5',
]
CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
CRISPY_TEMPLATE_PACK = "bootstrap5"
# Configurações de Email (opcional)
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'seu-email@gmail.com'
EMAIL_HOST_PASSWORD = 'sua-senha'class Ticket(models.Model):
STATUS_CHOICES = [
('open', 'Aberto'),
('in_progress', 'Em Andamento'),
('resolved', 'Resolvido'),
('closed', 'Fechado'),
]
PRIORITY_CHOICES = [
('low', 'Baixa'),
('medium', 'Média'),
('high', 'Alta'),
('urgent', 'Urgente'),
]
title = models.CharField(max_length=200)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='open')
priority = models.CharField(max_length=20, choices=PRIORITY_CHOICES, default='medium')
category = models.ForeignKey('Category', on_delete=models.CASCADE)
created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='created_tickets')
assigned_to = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='assigned_tickets')
attachment = models.FileField(upload_to='tickets/', null=True, blank=True)class Category(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)from django.urls import path
from . import views
app_name = 'tickets'
urlpatterns = [
path('', views.home, name='home'),
path('tickets/', views.ticket_list, name='ticket_list'),
path('tickets/create/', views.ticket_create, name='ticket_create'),
path('tickets/<int:pk>/', views.ticket_detail, name='ticket_detail'),
path('tickets/<int:pk>/edit/', views.ticket_edit, name='ticket_edit'),
path('tickets/<int:pk>/delete/', views.ticket_delete, name='ticket_delete'),
]def ticket_list(request):
tickets = Ticket.objects.all().order_by('-created_at')
return render(request, 'tickets/ticket_list.html', {'tickets': tickets})def ticket_create(request):
if request.method == 'POST':
form = TicketForm(request.POST, request.FILES)
if form.is_valid():
ticket = form.save(commit=False)
ticket.created_by = request.user
ticket.save()
return redirect('tickets:ticket_detail', pk=ticket.pk)
else:
form = TicketForm()
return render(request, 'tickets/ticket_form.html', {'form': form})<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Sistema Helpdesk{% endblock %}</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
</head>
<body>
<!-- Navigation -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<!-- ... código da navegação ... -->
</nav>
<!-- Main Content -->
<main class="container my-4">
{% block content %}{% endblock %}
</main>
<!-- Footer -->
<footer class="footer mt-auto py-3 bg-light">
<!-- ... código do footer ... -->
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>-
Autenticação de Usuários
- Login/Logout
- Registro de usuários
- Recuperação de senha
-
Gerenciamento de Tickets
- Criação de tickets
- Listagem de tickets
- Detalhes do ticket
- Edição de tickets
- Exclusão de tickets
- Upload de anexos
-
Categorização
- Criação de categorias
- Associação de tickets a categorias
- Filtragem por categorias
-
Sistema de Prioridades
- Definição de prioridade para tickets
- Filtragem por prioridade
- Indicadores visuais de prioridade
-
Painel Administrativo
- Interface administrativa personalizada
- Dashboard com estatísticas
- Gerenciamento de usuários
- Gerenciamento de categorias
-
Notificações
- Notificações por email
- Atualizações de status
- Atribuição de tickets
-
Autenticação
- Login requerido para acessar o sistema
- Proteção contra CSRF
- Senhas criptografadas
-
Autorização
- Controle de acesso baseado em permissões
- Diferentes níveis de usuário (admin, staff, usuário comum)
-
Validação de Dados
- Validação de formulários
- Sanitização de entrada de dados
- Proteção contra XSS
O painel administrativo foi personalizado para corresponder ao design do site principal, incluindo:
- Tema Bootstrap 5
- Cards informativos
- Estatísticas em tempo real
- Interface responsiva
- Ícones Font Awesome
-
Backup
- Backup regular do banco de dados
- Backup de arquivos de mídia
- Logs de sistema
-
Monitoramento
- Logs de erros
- Monitoramento de performance
- Alertas de sistema
-
Atualizações
- Atualização de dependências
- Correções de segurança
- Melhorias de performance
Para suporte ou dúvidas, entre em contato através do email: [seu-email@exemplo.com]
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.