-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcoordenacao.py
208 lines (173 loc) · 7.91 KB
/
coordenacao.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# -*- coding: utf-8 -*-
# @package: coordenacao.py
# @author: Guilherme N. Ramos ([email protected])
#
# Funções úteis para coordenação.
from mwebcrawler import (Campus, Cursos, Departamento, Disciplina,
Habilitacoes, Nivel, Oferta)
def alunos_matriculados(disciplina, depto=Departamento.CIC,
nivel=Nivel.GRADUACAO, verbose=False):
'''Retorna o total de alunos matriculados em todas as turmas da disciplina
do código dado.
Argumentos:
disciplina -- o código da disciplina
nivel -- nível acadêmico da disciplina buscada
(default Nivel.GRADUACAO)
depto -- o código do departamento que oferece a disciplina
(default Departamento.CIC)
verbose -- indicação dos procedimentos sendo adotados
(default False)
'''
disciplinas = Oferta.turmas(disciplina, depto, nivel, verbose)
return sum([disciplinas[t]['Alunos Matriculados'] for t in disciplinas])
def demanda_nao_atendida(disciplina, nivel=Nivel.GRADUACAO, verbose=False):
'''Retorna o total de alunos inscritos na lista de espera da disciplina do
código dado. Considera todas as turmas.
Argumentos:
disciplina -- o código da disciplina
nivel -- nível acadêmico da disciplina buscada
(default Nivel.GRADUACAO)
verbose -- indicação dos procedimentos sendo adotados
(default False)
'''
lista = Oferta.lista_de_espera(disciplina, nivel=nivel, verbose=verbose)
return sum(lista.values())
def ocupacao(oferta, cursos, nivel=Nivel.GRADUACAO, verbose=False):
'''Retorna dois dicionários (obrigatórias e optativas) com o total de
alunos inscritos em cada turma de cada disciplina ofertada por cada curso.
Argumentos:
oferta -- dicionário com a lista de oferta
cursos -- lista com os cursos com disciplinas (da oferta) em seus
currículos
nivel -- nível acadêmico da disciplina buscada
(default Nivel.GRADUACAO)
verbose -- indicação dos procedimentos sendo adotados
(default False)
'''
obr, opt = set(), set()
for codigo in cursos:
disciplinas = Cursos.curriculo(codigo, nivel, verbose)
if 'obrigatórias' in disciplinas:
obr.update(disciplinas['obrigatórias'])
if 'optativas' in disciplinas:
opt.update(disciplinas['optativas'])
opt = opt.difference(obr)
obrigatorias, optativas = {}, {}
for cod in obr:
if cod in oferta:
turmas = Oferta.turmas(cod)
for t in turmas:
key = cod + ' ' + t
obrigatorias[key] = turmas[t]['Alunos Matriculados']
for cod in opt:
if cod in oferta:
turmas = Oferta.turmas(cod)
for t in turmas:
key = cod + ' ' + t
optativas[key] = turmas[t]['Alunos Matriculados']
return obrigatorias, optativas
def ocupacao_minima(oferta, cursos, quorum, nivel=Nivel.GRADUACAO,
verbose=False):
'''Retorna dois dicionários (obrigatórias e optativas) com o total de
alunos inscritos em cada turma de cada disciplina ofertada cuja quantidade
de alunos seja igual ou superior ao limite dado.
Argumentos:
oferta -- dicionário com a lista de oferta
cursos -- lista com os cursos com disciplinas (da oferta) em seus
currículos
quorum -- quantidade mínima de alunos em uma turma
nivel -- nível acadêmico das disciplinas buscadas
(default Nivel.GRADUACAO)
verbose -- indicação dos procedimentos sendo adotados
(default False)
'''
obr, opt = ocupacao(oferta, cursos, nivel, verbose)
obrigatorias = {k: v for k, v in obr.items() if v >= quorum}
optativas = {k: v for k, v in opt.items() if v >= quorum}
return obrigatorias, optativas
def lista_obrigatorias(habilitacoes, deptos, nivel=Nivel.GRADUACAO,
campus=Campus.DARCY_RIBEIRO, verbose=False):
'''Retorna, para cada curso dado, um dicionário contendo as disciplinas
consideradas obrigatórias: as listadas como tal no currículo e as listadas
como cadeias/ciclos).
Argumentos:
habilitacoes -- coleção de códigos de habilitações com disciplinas (da
oferta) em seus currículos
deptos -- coleção de siglas de departamentos da UnB para os quais se deseja
identificar as disciplinas obrigatórias
nivel -- nível acadêmico das disciplinas buscadas
(default Nivel.GRADUACAO)
campus -- o campus onde a habilitação é oferecida
(default Campus.DARCY_RIBEIRO)
verbose -- indicação dos procedimentos sendo adotados
(default False)
'''
lista = {}
for opcao in habilitacoes:
lista[opcao] = {}
curriculo = Cursos.curriculo(opcao, nivel, verbose)
obrigatorias = curriculo.get('obrigatórias')
for ciclo in curriculo.get('cadeias'):
for item in curriculo['cadeias'][ciclo]:
obrigatorias.update(item)
for disciplina in obrigatorias:
infos = Disciplina.informacoes(disciplina, nivel, verbose)
depto = infos.get('Sigla do Departamento')
if depto in deptos:
if depto not in lista[opcao]:
lista[opcao][depto] = {}
lista[opcao][depto][disciplina] = infos['Denominação']
return lista
def turmas_reservadas_no_fluxo(habilitacao, filtro_reserva=''):
'''Mostra a lista de turmas com reserva de vagas das disciplinas do fluxo
da habilitação dada.
Argumentos:
habilitacao -- código da habilitação com disciplinas da oferta
filtro_reserva -- filtro para reduzir o escopo da busca
(default '')
'''
fluxo = Cursos.fluxo(habilitacao)
for periodo in sorted(fluxo.keys()):
print('Período: %d' % periodo)
for disciplina in fluxo[periodo]['Disciplinas']:
turmas = Oferta.turmas(disciplina).items()
for turma, detalhes in turmas:
if 'Turma Reservada' in detalhes:
for reserva, vagas in detalhes['Turma Reservada'].items():
if filtro_reserva in reserva:
print('\t %s (%s) %s %s' % (disciplina, turma,
reserva, vagas))
if __name__ == '__main__':
nivel = Nivel.GRADUACAO
verbose = False
depto = str(Departamento.CIC)
# turmas_reservadas_no_fluxo(6912, 'Mecatrônica')
oferta = Oferta.disciplinas(depto, nivel, verbose)
print '\nAlunos matriculados no Departamento %s:' % depto
for codigo in sorted(oferta, key=oferta.get):
alunos = alunos_matriculados(codigo, depto, nivel, verbose)
if alunos > 0:
print '%s %s (%d alunos)' % (codigo, oferta[codigo], alunos)
print '\nDemanda não atendida:'
for codigo in sorted(oferta, key=oferta.get):
demanda = demanda_nao_atendida(codigo, nivel, verbose)
if demanda > 0:
print '%s %s (%d alunos)' % (codigo, oferta[codigo], demanda)
print '\nOcupação de turmas:'
habilitacoes = [Habilitacoes.BCC, Habilitacoes.LIC, Habilitacoes.ENC,
Habilitacoes.ENM]
obr, opt = ocupacao_minima(oferta, habilitacoes, 1, nivel, verbose)
print('\tObrigatórias')
for codigo in sorted(obr, key=obr.get, reverse=True):
cod, t = codigo.split(' ')
print('\t%s' % ','.join([cod, oferta[cod], t, str(obr[codigo])]))
print('\n116479\tOptativas')
for codigo in sorted(opt, key=opt.get, reverse=True):
cod, t = codigo.split(' ')
print('\t%s' % ','.join([cod, oferta[cod], t, str(opt[codigo])]))
print('Disciplinas obrigatórias de um curso')
deptos = ['CIC']
campus = Campus.DARCY_RIBEIRO
lista = lista_obrigatorias([Habilitacoes.ENM], deptos, nivel, campus,
verbose)
print lista