Skip to content

Commit 26a435e

Browse files
committed
Commit zoado de última hora
1 parent cf60241 commit 26a435e

File tree

7 files changed

+91
-16
lines changed

7 files changed

+91
-16
lines changed

dados_brasil_io/urls.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616
from django.contrib import admin
1717
from django.urls import path
1818

19-
from politicos.views import DeputadoListView
19+
from empresas.views import EmpresaDetailView
20+
from politicos.views import DeputadoListView, DeputadoGastosView
2021

2122
urlpatterns = [
2223
path('admin/', admin.site.urls),
2324
path('deputados/', DeputadoListView.as_view(), name='deputados'),
25+
path('deputados-gastos', DeputadoGastosView.as_view(), name='deputados-gastos'),
26+
path('empresa/<pk>/', EmpresaDetailView.as_view(), name='empresa'),
2427
]

empresas/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.db import models
2-
from django.db.models import Case, Count, F, OuterRef, Q, Subquery, Sum, Value, When
2+
from django.db.models import Case, Count, Exists, F, OuterRef, Q, Subquery, Sum, Value, When
33
from django.db.models.functions import Coalesce
44

55

empresas/views.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1-
from django.shortcuts import render
1+
from rest_framework import generics, serializers
2+
from rest_framework.response import Response
3+
4+
from empresas.models import Empresa, Sociedade
5+
6+
7+
class EmpresaSerializer(serializers.ModelSerializer):
8+
9+
class Meta:
10+
model = Empresa
11+
fields = ['cnpj', 'nome', 'sociedades']
12+
depth = 10
13+
14+
15+
class EmpresaDetailView(generics.RetrieveAPIView):
16+
serializer_class = EmpresaSerializer
17+
queryset = Empresa.objects.all()
218

3-
# Create your views here.

politicos/filters.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import date
12
from django_filters import rest_framework as filters
23

34
from politicos.models import Deputado
@@ -6,8 +7,7 @@
67
class DeputadoFilter(filters.FilterSet):
78
nome = filters.CharFilter(field_name='nome', lookup_expr='icontains')
89
exibir_gasto_mensal = filters.BooleanFilter(method='filter_exibir_gasto_mensal')
9-
gastos_mes = filters.NumberFilter(method='add_prefetch_gastos')
10-
gastos_ano = filters.NumberFilter(method='add_prefetch_gastos')
10+
fornecedor_gasto = filters.CharFilter(field_name='gastos__empresa__nome', lookup_expr='icontains')
1111

1212
class Meta:
1313
model = Deputado
@@ -20,10 +20,23 @@ def filter_exibir_gasto_mensal(self, queryset, name, value):
2020
queryset = queryset.annotate_gasto_mensal_por_deputado()
2121
return queryset
2222

23+
24+
class DeputadoGastosFilter(filters.FilterSet):
25+
nome = filters.CharFilter(field_name='nome', lookup_expr='icontains')
26+
gastos_mes = filters.NumberFilter(method='add_prefetch_gastos')
27+
gastos_ano = filters.NumberFilter(method='add_prefetch_gastos')
28+
29+
class Meta:
30+
model = Deputado
31+
fields = [
32+
'nome', 'partido', 'uf', 'id_legislatura',
33+
]
34+
2335
def add_prefetch_gastos(self, queryset, name, value):
2436
filtros = self.data.dict()
25-
mes = filtros.get('gastos_mes')
26-
ano = filtros.get('gastos_ano')
37+
hoje = date.today()
38+
mes = filtros.get('gastos_mes', hoje.month)
39+
ano = filtros.get('gastos_ano', hoje.year)
2740
if not hasattr(self, '_prefetch_added') and mes and ano:
2841
queryset = queryset.prefetch_gastos(mes=mes, ano=ano)
2942
self._prefetch_added = True

politicos/models.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.db import models
2-
from django.db.models import Avg, F, FilteredRelation, Prefetch, Q, Sum
2+
from django.db.models import Avg, Case, Count, Exists, F, FilteredRelation, OuterRef, Prefetch, Q, Sum, Value, When
3+
from django.db.models.functions import Coalesce
34

45

56
class DeputadoQuerySet(models.QuerySet):
@@ -54,9 +55,31 @@ def prefetch_gastos(self, **kwargs):
5455
def annotate_gastos_acima_dobro(self, descricao_gasto):
5556
media = GastoCotaParlamentar.objects.filter_descricao(descricao_gasto).media()
5657
acima_dobro = Q(gastos__descricao=descricao_gasto, gastos__valor_liquido__gt=media * 2)
57-
count_acima_dobro = Count('pk', filter=acima_dobro)
58-
count_geral = Count('pk', filter=Q(gastos__descricao=descricao_gasto))
59-
return self.annotate(gastos_acima_dobro=count_acima_dobro, qtd_gastos=count_geral)
58+
return self.annotate(
59+
qtd_gastos=Count('gastos', filter=Q(gastos__descricao=descricao_gasto)),
60+
qtd_acima_dobro=Coalesce(
61+
Sum(
62+
Case(
63+
When(
64+
Q(gastos__valor_liquido__gt=media * 2, gastos__descricao=descricao_gasto),
65+
then=Value(1)
66+
),
67+
output_field=models.IntegerField()
68+
)
69+
),
70+
0
71+
)
72+
)
73+
74+
def annotate_empresas(self):
75+
from empresas.models import Empresa
76+
empresas_qs = Empresa.objects.filter(
77+
sociedades__socio_pessoa_fisica__nome=OuterRef('nome'),
78+
uf=OuterRef('uf')
79+
)
80+
return self.annotate(
81+
empresas=Exists(empresas_qs)
82+
)
6083

6184

6285
class GastoCotaParlamentarQuerySet(models.QuerySet):

politicos/serializers.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,12 @@ class Meta:
2828

2929
class DeputadoSerializer(serializers.ModelSerializer):
3030
gastos_mensais = serializers.SerializerMethodField()
31-
gastos = GastoCotaParlamentarSerializer(many=True)
3231

3332
class Meta:
3433
model = Deputado
3534
fields = [
3635
'id', 'nome', 'partido', 'uf', 'id_legislatura',
37-
'gastos', 'gastos_mensais',
36+
'gastos_mensais',
3837
]
3938
depth = 2
4039

@@ -43,3 +42,15 @@ def get_gastos_mensais(self, obj):
4342
key: value for key, value in obj.__dict__.items()
4443
if key.startswith('gastos_')
4544
}
45+
46+
47+
class DeputadoGastosSerializer(serializers.ModelSerializer):
48+
gastos = GastoCotaParlamentarSerializer(many=True)
49+
50+
class Meta:
51+
model = Deputado
52+
fields = [
53+
'id', 'nome', 'partido', 'uf', 'id_legislatura',
54+
'gastos',
55+
]
56+
depth = 2

politicos/views.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,20 @@
22

33
from politicos.filters import DeputadoFilter
44
from politicos.models import Deputado
5-
from politicos.serializers import DeputadoSerializer
5+
from politicos.serializers import DeputadoSerializer, DeputadoGastosSerializer
66

77

88
class DeputadoListView(generics.ListAPIView):
99
serializer_class = DeputadoSerializer
1010
filterset_class = DeputadoFilter
11-
queryset = Deputado.objects.all().select_related('partido', 'uf')
11+
queryset = Deputado.objects.all().select_related(
12+
'partido', 'uf'
13+
)
14+
15+
16+
class DeputadoGastosView(generics.ListAPIView):
17+
serializer_class = DeputadoGastosSerializer
18+
filterset_class = DeputadoFilter
19+
queryset = Deputado.objects.all().select_related(
20+
'partido', 'uf'
21+
).prefetch_related('gastos__empresa')

0 commit comments

Comments
 (0)