Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 20 additions & 7 deletions django/mdb/candidates/management/commands/ranking.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,18 @@ def fetch_expenses_from_tse_parallel(df_cand):

from multiprocessing.dummy import Pool as ThreadPool

pool = ThreadPool(settings.THREADS)
pool = ThreadPool(processes=int(settings.THREADS))
results = pool.map(process_candidate, df_cand.iterrows())

for sq_candidate, expenses in results:

logger.debug(f'appending_expenses: {sq_candidate}')

if expenses is None:
row = (None, next(
logger.debug(f'retry process_candidate: {sq_candidate}')
row = next(
df_cand.loc[df_cand['SQ_CANDIDATO'] == sq_candidate].iterrows()
))
)
_, expenses = process_candidate(row)

append_expense_to_df(df_cand, expenses, sq_candidate)
Expand Down Expand Up @@ -112,10 +115,14 @@ def handle(self, *args, **kwargs):
download = download_file(base.format(ano=2018))
df_cand = concat(download)

logger.debug(f'df_cand: {df_cand.shape}')

# fetch_expenses_from_s3(df_cand)
# fetch_expenses_from_tse(df_cand)
fetch_expenses_from_tse_parallel(df_cand)

logger.debug('saving to csv')

# CALCULATE RANKING
logger.debug('calculating stats')
df_cargo_genero = df_cand.groupby(['NR_PARTIDO', 'DS_CARGO', 'CD_CARGO', 'DS_GENERO']).agg({'SQ_CANDIDATO': 'count'})
Expand All @@ -131,8 +138,11 @@ def handle(self, *args, **kwargs):
df_cargo_genero.columns = ['party_nb', 'job_role', 'job_role_nb', 'nb_candidates', 'pct_women']
data = df_cargo_genero.to_json(orient='records')
logger.debug(f'stats data: {data}')
resp = requests.post(f'{settings.HOST}/api/meta/stats/', data=data)
logger.debug(f' => status_code: {resp.status_code} response: {resp.text}')
try:
resp = requests.post(f'{settings.HOST}/api/meta/stats/', data=data)
logger.debug(f' => status_code: {resp.status_code} response: {resp.text}')
except Exception:
pass


# CALCULATE RANKING
Expand Down Expand Up @@ -163,5 +173,8 @@ def handle(self, *args, **kwargs):
logger.debug('send data to app')
data = ranking.to_json(orient='records', index=True)
logger.debug(f'ranking data: {data}')
resp = requests.post(f'{settings.HOST}/api/meta/parties/', data=data)
logger.debug(f'ranking => status_code: {resp.status_code} response: {resp.text}')
try:
resp = requests.post(f'{settings.HOST}/api/meta/parties/', data=data)
logger.debug(f'ranking => status_code: {resp.status_code} response: {resp.text}')
except Exception:
pass
1 change: 1 addition & 0 deletions django/mdb/candidates/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class Meta:
fields = (
'id',
'name',
'name_ballot',
'political_party_initials',
'political_party_name',
'directory_national',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,15 @@ <h3 class="section_title"><span>Perfil</span></h3>
<p>Data nascimento: {{ candidate.birth_date }}</p>
<p>Estado civil: {{ candidate.marital_status }}</p>
<p>Escolaridade: {{ candidate.education }}</p>
<p>E-mail: {{ candidate.email }}</p>
<p>E-mail: <a href="mailto:{{ candidate.email|lower }}" target="_blank">{{ candidate.email|lower }}</a></p>
{% if candidate.twitter %}<p>Twitter: <a href="{{ candidate.twitter }}" target="_blank">{{ candidate.twitter }}</a></p> {% endif %}
{% if candidate.facebook %}<p>Facebook: <a href="{{ candidate.facebook }}" target="_blank">{{ candidate.facebook }}</a></p> {% endif %}
{% if candidate.instagram %}<p>Instagram: <a href="{{ candidate.instagram }}" target="_blank">{{ candidate.instagram }}</a></p> {% endif %}
<p>Ocupação: {{ candidate.job }}</p>
<p>Total bens: {{ candidate.property_value }}</p>

{% if candidate.projects %}<p>Projetos: {{ candidate.projects }}</p> {% endif %}

<p>Total bens: R$ {{ candidate.property_value|default_if_none:"0" }}</p>

<h3 class="section_title"><span>Financiamento</span></h3>
<br>
<p>Data última atualização: {{ budget.dataUltimaAtualizacaoContas }}</p>
Expand Down
24 changes: 19 additions & 5 deletions django/mdb/candidates/templates/candidates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
</div>
<div class="col col-12 col-sm-6 col-lg-4 mt-4">
<h1>Por mais mulheres eleitas no legislativo</h1>


</div>
</div>
</div>
Expand All @@ -16,7 +18,7 @@ <h1>Por mais mulheres eleitas no legislativo</h1>
{% extends "base.html" %}

{% block js %}
<script type="text/javascript" src="/static/assets/js/src/candidate.js"></script>
<script type="text/javascript" src="/static/assets/js/src/candidate.js?v=2"></script>
<script type="text/javascript">CandidateHandler($, "{{host}}")</script>
<script type="text/javascript">
(function($) {
Expand All @@ -32,6 +34,10 @@ <h1>Por mais mulheres eleitas no legislativo</h1>
$partido.show();
}
});


// CandidateHandler($, "{{host}}")

});
})(jQuery);
</script>
Expand All @@ -50,11 +56,19 @@ <h1>Por mais mulheres eleitas no legislativo</h1>

<h2 class="section_title mb-4"><span>Veja as candidaturas femininas deste ano</span></h2>

<div class="form-group search-group">
<input type="text" name="nome" id="nome" class="form-control search-input autocomplete-candidates" placeholder="Buscar por nome ou número da candidata">

<img src="/static/img/icons/icon-search.png" class="search-button">
</div>

<div class="form-group">OU</div>
<!-- lista cargo -->
<div class="form-group">
<select class="selectpicker form-control" id="cargo">
<option value="">Selecione Cargo</option>
<option value="Presidente">Presidente</option>
<option value="Vice-presidente">Vice-presidente</option>
<option value="Senador">Senadora</option>
<option value="Governador">Governadora</option>
<option value="Vice-governador">Vice-governadora</option>
Expand Down Expand Up @@ -143,7 +157,7 @@ <h2 class="section_title mb-4"><span>Veja as candidaturas femininas deste ano</s
</div>
<!-- /lista partidos -->

<!-- lista pauta
<!-- lista pauta
<div class="form-group">
<select class="selectpicker form-control" data-live-search="true" id="pauta">
<option value="">Selecione a Pauta</option>
Expand All @@ -153,7 +167,7 @@ <h2 class="section_title mb-4"><span>Veja as candidaturas femininas deste ano</s

</div>
</div>


</div>
</div><!--/filterbox-->
Expand Down Expand Up @@ -184,13 +198,13 @@ <h1 class="section_title text-center mt-5"><span>Veja os partidos que mais apoia

<div class="row legenda">
<div class="col-1 mt-1 p-2">
<img src="/static/img/icon_person.png" class="img-fluid" alt="Person" />
<img src="/static/img/icon_person.png" class="img-fluid icon-highlight" alt="Person" />
</div>
<div class="col-5 mt-2">
<p>% de mulheres no partido.</p>
</div>
<div class="col-1 mt-1 p-2">
<img src="/static/img/icon_money.png" class="img-fluid" alt="Money" />
<img src="/static/img/icon_money.png" class="img-fluid icon-highlight" alt="Money" />
</div>
<div class="col-5 mt-2">
<p>% de dinheiro destinado às mulheres pelo partido.</p>
Expand Down
10 changes: 9 additions & 1 deletion django/mdb/candidates/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from datetime import date, timedelta

from django.db.models import Q
from django.conf import settings
from django.core.mail import send_mail
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
Expand Down Expand Up @@ -74,7 +75,8 @@ def get(self, request):
page_size = int(query.get('page_size') or settings.PAGE_SIZE)
page = int(query.get('page') or 1)

candidates = Candidate.objects.all()
candidates = Candidate.objects.all().order_by('name')


# filter candiadates
if 'ano' in query:
Expand All @@ -89,6 +91,12 @@ def get(self, request):
candidates = candidates.filter(job_role__name=query['cargo'])
if 'pauta' in query:
candidates = candidates.filter(agenda__name=query['pauta'])
if 'nome' in query:
candidates = candidates.filter(
Q(name__icontains=query['nome']) |
Q(name_ballot__icontains=query['nome']) |
Q(number__iexact=query['nome'])
)

paginated_candidates = candidates[(page-1)*page_size:page*page_size]
serializer = CandidateSerializer(paginated_candidates, many=True)
Expand Down
22 changes: 12 additions & 10 deletions django/mdb/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,16 @@ def concat(files):
"""
Concat TSE files into a single pandas.DataFrame
"""
return pandas.concat([
pandas.read_csv(
pandas.compat.BytesIO(file_),
encoding='latin1',
sep=';',
)
for _, file_ in files.items()
])
records = {}
items = []
for name, file_ in files.items():
print(name)
if name == 'consulta_cand_2018_BRASIL.csv':
return pandas.read_csv(
pandas.compat.BytesIO(file_),
encoding='latin1',
sep=';',
)


def store_json(key, data, bucket='appartidarias'):
Expand Down Expand Up @@ -73,7 +75,7 @@ def fetch_2018_candidate_expenses(**kwargs):
path = '{estado}/{cargo}/{partido}/{urna}/{candidate}'
url = host + path.format(**kwargs)
logger.debug(f'fetch_expenses: {url}')
return requests.get(url).json()
return requests.get(url, timeout=5).json()


def fetch_2018_candidate(id_, state, year='2018', election='2022802018'):
Expand All @@ -86,4 +88,4 @@ def fetch_2018_candidate(id_, state, year='2018', election='2022802018'):
year=year,
)
logger.debug(f'fetch_candidate: {url}')
return requests.get(url).json()
return requests.get(url, timeout=5).json()
Loading