Adiciona suporte para contabilizar presença

Cada registro de presença está necessariamente atrelado a um usuário
cadastrado no site. As presenças vão ser contabilizadas ou pelo ID do
usuário ou pelo número USP. Se a pessoa não tem número USP cadastrado,
um usuário com email aleatório (e todos os outros campos vazios) é
criado para servir de base para a presença. No fim da semcomp esse
usuário vai ser mais facilmente pesquisado como fonte da frequência.
Exibe somente usuários reais na administração

Também altera um pouco o layout da parte de usuários para ficar mais
consistente com o resto da área de administração
Coloca link pra cadastrar presença e identifica usuários aleatórios
Implementa alterações de presença via ajax

Com javascript, alterações no formulário são armazenadas temporariamente
antes de ser enviadas, pra economizar requisições e (possivelmente)
diminuir a chance de que algo dê errado.

Os dados das presenças são armazenados ou em localStorage, ou cookies ou
em uma variável normal quando javascript está ativado, de modo a
persistir os dados entre o carregamento da página - é possível começar
uma transação, perder a requisição por algum motivo (por exemplo F5) e
em seguida continuar com os dados que não tinham sido inseridos. Isso
foi feito para reduzir o máximo possível a chance de algum dado de
presença ser perdido, sem diminuir a eficiência do processo.
Termina transações pendentes
Adiciona campo para escolher eventos de presença

O modelo website.Event agora tem um campo pra indicar se o evento deve
ser usado pra contar presença ou não.
Adiciona suporte a escrita de arquivos XLSX
Usa novo modelo de crachá e corrige bug

Faz com que o servidor retorne pro cliente exatamente a chave que ele
usou pra registrar a presença. Se usou um NUSP, retorna um NUSP. Se
usou um ID, retorna o ID. Desse jeito o cliente não vai guardar o crachá
usado porque o servidor retornou um ID quando usou o NUSP ou vice versa.
Trata usuários duplicados

Quando um usuário duplicado aparece (por exemplo porque fez duas
inscrições usando o número USP), registra no stats que isso aconteceu e
marca presença pro usuário de ID mais baixo, pra armazenar a presença de
forma consistente, ainda que não seja do usuário que a pessoa está
utilizando de verdade
Coloca novos inscritos na frente da lista de presença
Corrige largura colunas no arquivo excel
Faz relatório em pdf
Implementa relatório de presença por evento

Um parâmetro na URL permite diferenciar entre um relatório geral e um
relatório de evento. Se o ID do evento é usado, o queryset de usuários
muda pra incluir somente os usuários cadastrados no evento e a coluna
"presença" é removida, já que em um evento só a única coisa que
interessa é que as pessoas estavam lá: elas tem 100% de presença no
próprio evento.

As funções geradoras foram refatoradas: agora devem ter a assinatura
(output, headers, data). Caso seja necessário adicionar algum outro tipo
de saída, basta implementar o backend correspondente (e coisas do tipo
escolher o content-type)
Merge pull request #115 from fcoelho/presenca

Presenca