Skip to content

Commit f787f04

Browse files
feature/docker-ux-improvement
1 parent f058b48 commit f787f04

File tree

13 files changed

+662
-293
lines changed

13 files changed

+662
-293
lines changed

Dockerfile

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Use uma imagem oficial do Python
2+
FROM python:3.10-slim
3+
4+
# Defina o diretório de trabalho dentro do container
5+
WORKDIR /app
6+
7+
# Copie os arquivos de requirements e instale as dependências
8+
COPY requirements.txt .
9+
RUN pip install --upgrade pip
10+
RUN pip install -r requirements.txt
11+
12+
# Copie todo o projeto para dentro do container
13+
COPY . .
14+
15+
# Exponha a porta que o Django vai rodar
16+
EXPOSE 8000
17+
18+
# Comando para rodar o servidor Django
19+
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

argus_ia/settings.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,19 @@
5555
WSGI_APPLICATION = 'argus_ia.wsgi.application'
5656

5757
# Database Configuration
58+
# DATABASES
5859
DATABASES = {
5960
'default': {
6061
'ENGINE': 'django.db.backends.sqlite3',
6162
'NAME': BASE_DIR / 'db.sqlite3',
6263
}
6364
}
6465

65-
# Railway PostgreSQL (automático)
6666
if 'DATABASE_URL' in os.environ:
6767
import dj_database_url
6868
DATABASES['default'] = dj_database_url.config(
6969
conn_max_age=600,
70-
ssl_require=True
70+
ssl_require=False
7171
)
7272

7373
# Password validation

detection/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
urlpatterns = [
77
path('', views.DashboardView.as_view(), name='dashboard'),
88
path('generate-dataset/', views.GenerateDatasetPageView.as_view(), name='generate_dataset_page'),
9+
path('analyze/', views.analyze_page, name='analyze_page'),
10+
path('analyses/', views.AllAnalysesView.as_view(), name='all_analyses'),
911
path('generate-download/', views.GenerateAndDownloadDatasetView.as_view(), name='generate_and_download_dataset'),
1012
path('download-posts-csv/', views.DownloadPostsCSVView.as_view(), name='download_posts_csv'),
1113
path('download-comments-csv/', views.DownloadCommentsCSVView.as_view(), name='download_comments_csv'),

detection/views.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,59 @@
1111
import zipfile
1212
import numpy as np
1313

14+
1415
from .models import Dataset, AnalysisSession, SuspiciousComment, UserBehavior, PostAnalysis
1516
from .ml.data_generator import DataGenerator
1617
from .ml.detector import SuspiciousPatternDetector
1718
from .utils.exporters import export_to_csv, export_to_excel
19+
from django.shortcuts import render
20+
from django.db.models import Sum
21+
from django.core.paginator import Paginator
22+
from django.views import View
23+
from django.shortcuts import render
24+
from .models import AnalysisSession
25+
26+
27+
def analyze_page(request):
28+
return render(request, 'detection/analyze.html')
1829

1930
class DashboardView(View):
2031
def get(self, request):
2132
datasets = Dataset.objects.all().order_by('-created_at')
2233
analyses = AnalysisSession.objects.all().order_by('-created_at')[:10]
23-
34+
35+
total_posts_analyzed = AnalysisSession.objects.aggregate(
36+
total_posts=Sum('dataset__posts_count')
37+
)['total_posts'] or 0
38+
39+
total_comments_analyzed = AnalysisSession.objects.aggregate(
40+
total_comments=Sum('total_comments')
41+
)['total_comments'] or 0
42+
2443
context = {
2544
'datasets': datasets,
2645
'recent_analyses': analyses,
2746
'total_analyses': analyses.count(),
2847
'total_datasets': datasets.count(),
48+
'total_posts_analyzed': total_posts_analyzed,
49+
'total_comments_analyzed': total_comments_analyzed
2950
}
3051
return render(request, 'detection/dashboard.html', context)
3152

53+
class AllAnalysesView(View):
54+
def get(self, request):
55+
analyses = AnalysisSession.objects.all().order_by('-created_at')
56+
57+
paginator = Paginator(analyses, 10) # 10 análises por página
58+
page_number = request.GET.get('page')
59+
page_obj = paginator.get_page(page_number)
60+
61+
context = {
62+
'page_obj': page_obj
63+
}
64+
65+
return render(request, 'detection/all_analyses.html', context)
66+
3267
class GenerateDatasetPageView(View):
3368
"""Página para gerar datasets"""
3469
def get(self, request):

docker-compose.yml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
version: '3.9'
2+
3+
services:
4+
db:
5+
image: postgres:15
6+
container_name: argus_db
7+
environment:
8+
POSTGRES_USER: argususer
9+
POSTGRES_PASSWORD: arguspass
10+
POSTGRES_DB: argusdb
11+
ports:
12+
- "5433:5433"
13+
volumes:
14+
- postgres_data:/var/lib/postgresql/data
15+
16+
web:
17+
build: .
18+
container_name: argus_web
19+
command: python manage.py runserver 0.0.0.0:8000
20+
volumes:
21+
- .:/app
22+
ports:
23+
- "8000:8000"
24+
depends_on:
25+
- db
26+
environment:
27+
- DATABASE_URL=postgres://argususer:arguspass@db:5432/argusdb
28+
29+
volumes:
30+
postgres_data:

requirements.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ gunicorn==20.1.0
88
whitenoise==6.4.0
99
psycopg2-binary==2.9.6
1010
python-dotenv==1.0.0
11-
dj-database-url==1.2.0
11+
dj-database-url==1.2.0
12+
psycopg2-binary
13+
dj-database-url

static/detection/css/style.css

Lines changed: 52 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,25 @@
1414
--info-color: #00bfff;
1515
}
1616

17-
*{
17+
* {
1818
color: beige;
1919
}
2020

21+
.gradient-bg {
22+
background: linear-gradient(135deg, #0f0f23 0%, #1a1a2e 50%, #6a0dad 100%);
23+
min-height: 100vh;
24+
}
25+
2126
.table td {
22-
color: #ffffff !important; /* Força texto branco */
27+
color: #ffffff !important;
28+
/* Força texto branco */
2329
background: rgba(26, 26, 46, 0.8) !important;
2430
border-color: rgba(138, 43, 226, 0.3) !important;
2531
}
2632

2733
.table th {
28-
color: #ffffff !important; /* Texto branco nos cabeçalhos */
34+
color: #ffffff !important;
35+
/* Texto branco nos cabeçalhos */
2936
background: linear-gradient(135deg, var(--primary-purple) 0%, var(--secondary-purple) 100%) !important;
3037
border: none !important;
3138
}
@@ -129,27 +136,27 @@ body {
129136
transition: all 0.3s ease;
130137
}
131138

132-
.stat-card.bg-primary {
139+
.stat-card.bg-primary {
133140
background: linear-gradient(135deg, var(--primary-purple) 0%, #5a0ca8 100%) !important;
134141
border-left-color: var(--secondary-purple);
135142
}
136143

137-
.stat-card.bg-success {
144+
.stat-card.bg-success {
138145
background: linear-gradient(135deg, #00cc00 0%, #009900 100%) !important;
139146
border-left-color: #00ff00;
140147
}
141148

142-
.stat-card.bg-warning {
149+
.stat-card.bg-warning {
143150
background: linear-gradient(135deg, #ff9900 0%, #cc7700 100%) !important;
144151
border-left-color: #ffa500;
145152
}
146153

147-
.stat-card.bg-info {
154+
.stat-card.bg-info {
148155
background: linear-gradient(135deg, #0099cc 0%, #006699 100%) !important;
149156
border-left-color: #00bfff;
150157
}
151158

152-
.stat-card.bg-danger {
159+
.stat-card.bg-danger {
153160
background: linear-gradient(135deg, #ff4444 0%, #cc0000 100%) !important;
154161
border-left-color: #ff6666;
155162
}
@@ -191,12 +198,29 @@ body {
191198
padding: 0.4em 0.8em;
192199
}
193200

194-
.bg-primary { background: linear-gradient(45deg, var(--primary-purple), var(--secondary-purple)) !important; }
195-
.bg-success { background: linear-gradient(45deg, #00cc00, #00ff00) !important; }
196-
.bg-warning { background: linear-gradient(45deg, #ff9900, #ffa500) !important; }
197-
.bg-info { background: linear-gradient(45deg, #0099cc, #00bfff) !important; }
198-
.bg-danger { background: linear-gradient(45deg, #ff4444, #ff6666) !important; }
199-
.bg-secondary { background: linear-gradient(45deg, #6c757d, #495057) !important; }
201+
.bg-primary {
202+
background: linear-gradient(45deg, var(--primary-purple), var(--secondary-purple)) !important;
203+
}
204+
205+
.bg-success {
206+
background: linear-gradient(45deg, #00cc00, #00ff00) !important;
207+
}
208+
209+
.bg-warning {
210+
background: linear-gradient(45deg, #ff9900, #ffa500) !important;
211+
}
212+
213+
.bg-info {
214+
background: linear-gradient(45deg, #0099cc, #00bfff) !important;
215+
}
216+
217+
.bg-danger {
218+
background: linear-gradient(45deg, #ff4444, #ff6666) !important;
219+
}
220+
221+
.bg-secondary {
222+
background: linear-gradient(45deg, #6c757d, #495057) !important;
223+
}
200224

201225
/* Botões Estilizados */
202226
.btn {
@@ -277,22 +301,22 @@ body {
277301
background: rgba(26, 26, 46, 0.9);
278302
}
279303

280-
.alert-success {
304+
.alert-success {
281305
border-left-color: var(--success-color);
282306
color: var(--success-color);
283307
}
284308

285-
.alert-danger {
309+
.alert-danger {
286310
border-left-color: var(--danger-color);
287311
color: var(--danger-color);
288312
}
289313

290-
.alert-warning {
314+
.alert-warning {
291315
border-left-color: var(--warning-color);
292316
color: var(--warning-color);
293317
}
294318

295-
.alert-info {
319+
.alert-info {
296320
border-left-color: var(--info-color);
297321
color: var(--info-color);
298322
}
@@ -353,13 +377,14 @@ footer.bg-dark {
353377

354378
/* Animações */
355379
@keyframes fadeIn {
356-
from {
357-
opacity: 0;
358-
transform: translateY(20px);
380+
from {
381+
opacity: 0;
382+
transform: translateY(20px);
359383
}
360-
to {
361-
opacity: 1;
362-
transform: translateY(0);
384+
385+
to {
386+
opacity: 1;
387+
transform: translateY(0);
363388
}
364389
}
365390

@@ -372,16 +397,16 @@ footer.bg-dark {
372397
.card-body {
373398
padding: 1rem;
374399
}
375-
400+
376401
.table-responsive {
377402
font-size: 0.85rem;
378403
}
379-
404+
380405
.btn {
381406
font-size: 0.9rem;
382407
padding: 0.5rem 1rem;
383408
}
384-
409+
385410
.navbar-brand {
386411
font-size: 1.4rem;
387412
}

0 commit comments

Comments
 (0)