[![codecov](https://codecov.io/gh/fga-eps-mds/2019.2-Acacia/branch/develop/graph/badge.svg)](https://codecov.io/gh/fga-eps-mds/2019.2-Acacia)
+[![Maintainability](https://api.codeclimate.com/v1/badges/9ceab9b0533182362c16/maintainability)](https://codeclimate.com/github/fga-eps-mds/2019.2-Acacia/maintainability)
## Visão geral
@@ -62,10 +63,16 @@ Após esses passos a aplicação deverá estar acessível em:
-`localhost:8080`
+`localhost:8000`
#### Front-end:
-Para instalar a camada front-end da aplicação basta seguir os passos de instalação descritos [aqui](https://github.com/fga-eps-mds/2019.2-Acacia-Frontend)
\ No newline at end of file
+Para instalar a camada front-end da aplicação basta seguir os passos de instalação descritos [aqui](https://github.com/fga-eps-mds/2019.2-Acacia-Frontend)
+
+### Ambiente de Homologação:
+http://45.55.46.19:8080
+
+### Ambiente de Produção:
+http://45.55.46.19:8081
diff --git a/docs/architecture_document.md b/docs/architecture_document.md
new file mode 100644
index 0000000..a3cdb03
--- /dev/null
+++ b/docs/architecture_document.md
@@ -0,0 +1,469 @@
+# Documento de arquitetura
+
+## Histórico de revisão
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 10/09/2019 | 0.1 | Adição do tópico Objetivo | Durval Carvalho |
+| 10/09/2019 | 0.2 | Adição do tópico Escopo e Django REST Framework | Durval Carvalho |
+| 11/09/2019 | 0.3 | Adição do tópico Metas e Restrições arquiteturais | Durval Carvalho |
+| 12/09/2019 | 0.4 | Adição de tópico Casos de Uso | Renato Britto Araújo |
+| 12/09/2019 | 0.5 | Adição do tópico MTV | Durval Carvalho |
+| 12/09/2019 | 0.6 | Adição de diagrama de pacotes back-end e informações sobre base de dados | Renato Britto Araujo |
+| 12/09/2019 | 0.7 | Adição de diagrama de pacotes front-end e referências e comentário sobre MTV | Renato Britto Araujo |
+| 12/09/2019 | 0.8 | Adição do tópico Banco de Dados | Durval Carvalho |
+| 12/09/2019 | 0.9 | Adição do informação sobre o super usuário | Durval Carvalho |
+| 12/09/2019 | 0.10 | Adição do tópico Vue.js | João Pedro Silva de Carvalho |
+| 12/09/2019 | 0.11 | Adição do tópico Diagrama de classes e serviços | Flavio Vieira |
+| 12/09/2019 | 0.12 | Adição do link da imagem do diagrama e organização do tópico | Flavio Vieira |
+| 14/09/2019 | 1.0 | Adição do tópico | Durval Carvalho |
+| 17/09/2019 | 1.1 | Ajuste do diagrama de casa de uso | Flavio Vieira e Leonardo da Silva Gomes |
+| 19/09/2019 | 1.2 | Adição de nova versão do diagrama de pacotes | Durval Carvalho e João Pedro |
+| 19/09/2019 | 1.3 | Ajuste do diagrama de classes | Hugo Sobral e Renato Britto |
+| 20/09/2019 | 1.4 | Ajuste dos diagramas de banco | Flavio Vieira |
+| 01/10/2019 | 1.5 | Refatoração dos requisitos do projeto | Durval Carvalho |
+| 02/10/2019 | 1.6 | Revisão | Durval Carvalho e João Pedro Silva de Carvalho|
+| 06/10/2019 | 1.7 | Correção da numeração dos requisitos | Durval Carvalho |
+
+
+## 1. Introdução
+
+### 1.1 Objetivo
+Este documento oferece uma visão geral arquitetural do
+sistema que será implementado, permitindo assim que os
+envolvidos no projeto conheçam como a aplicação será
+subdivida e quais serão as funções de cada componente.
+
+Outro objetivo desse documento é elucidar quais foram as
+motivações que levaram a equipe a tomar decisões a respeito
+dessa arquitetura.
+
+### 1.2 Escopo
+
+Esse documento aplica-se ao projeto Acácia, um sistema que incentiva a
+agricultura urbana e a formação de comunidades de suporte.
+Esse projeto será desenvolvido pelos alunos das disciplinas Métodos de
+Desenvolvimento de Software e Engenharia de Produto de Software, da
+Universidade de Brasília - Campus Gama.
+
+### 1.3 Definições, Acrônimos e Abreviações
+
+| **Sigla/Termo/Acrônimo** | **Definição** |
+| ------------------------ | ------------- |
+| MDS | Métodos de Desenvolvimento de Software |
+| EPS | Engenharia de Produto de Software |
+| FGA | Faculdade do Gama |
+| UnB | Universidade de Brasília |
+| DRF | Django Rest Framework |
+| MTV | Model Template View |
+| MVC | Model View Controller |
+
+## 2. Representação arquitetural
+
+### 2.1 Django REST Framework
+
+O Django REST Framework é uma biblioteca para o Framework
+Django que disponibiliza funcionalidades para implementar
+APIs Rest de forma rápida e eficiente.
+
+REST é a abreviação do termo Representational State
+Transfer, isto é, um conjunto de princípios e boas
+práticas desenvolvido pelo pesquisador Roy Fielding, que
+quando aplicados permitem uma interface concisa que pode
+ser utilizada por diversas outras aplicações.
+
+Como explicado acima o DRF é um framework do framework
+Django. Então primeiro explicaremos o motivo de termos
+escolhido Django para o back-end desse projeto.
+
+#### 2.2.1 Django
+
+O Django é um framework web criado com a linguagem Python, que
+utiliza o padrão model-template-view. Esse modelo MTV é baseado
+no modelo Model-View-Controler, com a diferença que as
+responsabilidades do módulo de Controller está dispersa no
+próprio Framework.
+
+Outro motivo do uso do Django é sua robustez. O framework
+possui diversos módulos embutidos que aumenta a
+produtividade da equipe no decorrer do projeto. Os 2
+principais módulos que pode ser citado é o
+Mapeador objeto-relacional (OMR) que irá facilitar a vida
+dos desenvolvedores que não tiverem afinidade em SQL, e o
+painel administrativo que irá de forma visual criar,
+deletar, editar e visualizar objetos do banco de dados.
+
+#### 2.2.2 Modelo MTV
+
+A **Model** é a camada de acesso dos dados. Nessa camada contém
+as classes que abstraem os dados, as lógicas de validação, de
+filtro e de acesso.
+
+O **View** é a camada das regras de negócios. Nessa camada será
+implementada as restrições, o que um usuário pode ou não pode
+fazer, e quais páginas eles têm acesso. É através dessa camada
+que as requisições do usuário serão gerenciadas.
+
+Essa camada implementa algumas funções do Controller do padrão
+MVC, porém o MTV se diferencia de MVC por ser mais permissivo
+quanto a comunicação entre diferentes partes do software
+[[1]](##referências).
+
+O **Template** é a camada de apresentação. Os templates são
+arquivos de texto, que isola os dados do sistema da forma como
+esses dados serão apresentados. O formato mais comum é o HTML.
+
+#### 2.2.3 Django REST
+Assim contextualizado, podemos falar sobre o Django REST.
+O Django REST possui diversos módulos embutidos que
+facilitam a implementação dos princípios e boas práticas
+da arquitetura REST.
+
+Um exemplo de facilidade é o fato de que por padrão as rotas
+dos recursos selecionados serem codificadas para
+respeitar o padrão da arquitetura REST, assim não sendo
+necessário escrever todas as 7 rotas do REST (index, new,
+create, show, edit, update e destroy).
+
+### 2.2 Vue.js
+O Vue.js é um framework para a criação de interfaces para o
+usuário. O Vue.js, desde a sua concepção, busca ser simples e
+objetivo, o que o deixa com uma baixa curva de aprendizagem, ou
+seja, demora-se menos tempo para uma equipe aprender o Vue.js do
+que outros frameworks. Além disso, o Vue.js, diferentemente do
+Angular.js (mantido pela Google) e do React.js (mantido pelo
+Facebook), possui uma comunidade como sua mantenedora o que
+permite uma maior interação entre as pessoas que usam e as quem
+desenvolve esse framework que são beneficiados com mais feedbacks
+possibilitando melhores atualizações.
+
+Os componentes do Vue.js são uma ferramenta importante.
+O funcionamento dele se baseia no desenvolvedor poder separar a
+página em componentes que possuem, cada um, seu próprio código em
+JavaScript, HTML e CSS, permitindo assim a reutilização dessas
+estruturas em outras partes da aplicação.
+
+Uma das características mais distintas do Vue é seu sistema de
+reatividade não obstrutivo. Os modelos dados são simplesmente
+objetos JavaScript puros e quando os modificam, a camada
+visual se atualiza. Isto torna o gerenciamento de estado simples e
+intuitivo. Em comparação com o JavaScript puro ou até mesmo o
+jQuery, utilizar a reatividade do Vue é bem mais simples.
+
+
+## 3. Metas e Restrições arquiteturais
+
+3.1 **Suportabilidade**
+
+A aplicação poderá ser utilizada sem grandes problemas
+pelos principais navegadores modernos da atualidade, no
+entanto o enfoque será para o Google Chrome, tanto sua
+versão desktop quanto sua versão mobile, e o Safari,
+navegador padrão dos sistemas da Apple.
+
+3.2 **Usabilidade**
+
+O sistema deverá ser intuitivo e de simples uso, de forma
+que a curva de aprendizado para utilizar a aplicação não
+seja um impedimento para usar o sistema.
+
+3.3 **Ferramentas de Desenvolvimento**
+
+O projeto será desenvolvido em Python (versão 3.7),
+utilizando o framework Django (versão 2.2), em conjunto
+com o framework Vue, um framework JavaScript para criação
+de interfaces e aplicativos.
+
+Para facilitar a portabilidade do projeto, tanto para o
+ambiente de deploy quanto para os ambientes de
+desenvolvimento, será utilizado o Docker para
+realizar o empacotamento da aplicação.
+
+3.4 **Confiabilidade**
+
+O sistema terá uma cobertura mínima de testes de 90%,
+buscando garantir que suas funcionalidades foram
+suficientemente testadas.
+
+## 4. Visão de Casos de Uso
+
+Segue a lista de casos de uso:
+
+- Autenticar
+- Gerenciar perfil
+- Selecionar líder
+- Acessar chat
+- Voluntariar-se para colheita
+- Ver lista de voluntários
+- Selecionar voluntários
+- Aprovar colheita
+- Registrar colheita
+- Registrar árvore
+- Registrar propriedade
+- Ver listas de colheitas
+- Ver dados de colheitas
+- Registrar conta
+- Visualizar calendário
+- Registrar resultado da colheita
+
+### 4.1 Atores
+
+#### 4.1.1 Não logado
+
+Usuário do sistema que tem acesso as informações da plataforma e das colheitas, tendo acesso apenas as visualizações de cada página, não podendo usufruir das funcionalidades que a página disponibiliza, sendo assim, um usuário passivo no fluxo da aplicação.
+
+#### 4.1.2 Voluntário
+
+Usuário do sistema capaz participar de colheitas por meio da plataforma, que também disponibiliza um chat de conversa com seu grupo voluntário, onde o mesmo também pode gerenciar seu perfil.
+
+#### 4.1.3 Proprietário
+
+Usuário do sistema com poder de registrar propriedade, árvore e colheita, para os voluntários poderem participar. O mesmo é um grande pilar no fluxo de funcionamento do site, onde sem suas informações, não haveria colheita.
+
+#### 4.1.4 Líder
+
+Usuário do sistema capaz de liderar as colheitas e o acesso dos voluntários a esse processo, ele é o intermédio entre o proprietário e o voluntário.
+
+#### 4.1.5 Gerente de colheita
+
+Usuário do sistema capaz de gerir e supervisionar as atividades dos líderes nesse processo.
+
+### 4.2 Diagrama de caso de uso
+
+![](img/diagrama_de_caso_de_uso.png)
+
+### 4.3 Prioridade dos casos de uso
+
+Esse diagrama expõe os seguintes requisitos:
+
+- RF01: Permitir que o usuário crie, edite, faça login e apague sua conta
+- RF02: Permitir o cadastro, atualização e exclusão de árvores, propriedades e colheitas
+- RF03: Mostrar colheitas registradas, com ênfase às que acontecerão no futuro
+- RF04: Permitir que os usuários se candidatem a uma colheita
+- RF05: Permitir que líderes possam escolher voluntários cadastrados para uma colheita
+- RF06: Exibir notificações sobre atualizações nos eventos inscritos pelos usuários
+- RF07: Permitir que o usuário visualize o histórico de colheitas que participou
+- RF08: Mostrar calendários de colheitas
+- RF09: Habilitar comunicação entre envolvidos em colheita (voluntários, líderes e proprietários)
+- RF10: Mostrar dados à respeito do projeto realizadas de forma transparente
+- RNF11: Suportar para principais navegadores web atuais, com ênfase ao ambiente mobile
+- RNF12: Assegurar a segurança de dados dos usuários
+- RNF13: O ambiente de produção deve ser configurado de modo que sempre contenha uma versão testada e estável
+- RNF14: O ambiente de homologação deve ser configurado de modo que as versões mais recentes sejam testadas
+- RNF15: A aplicação deve possuir mecanismos que permitam a acessibilidade de diversos grupos de usuários
+- RNF16: A aplicação deve possuir mecanismos de internacionalização de modo que a linguagem do site possa ser configurada pelo usuário
+
+## 5. Visão Lógica
+
+### 5.1 Visão Geral
+
+O sistema será desenvolvido utilizando o framework web Django Rest
+em conjunto com o Vue.JS. Esses sistemas irão se comunicar através
+de uma API REST fornecida pelo backend da aplicação.
+
+
+
+
+
+As ações do usuário, tanto em um ambiente desktop quanto no mobile, será
+interpretada pelo Vue.Js como eventos, onde cada evento está associado com
+um Handler que irá disparar uma ação.
+
+Alguma dessas ações poderão ser tratadas no lado do cliente
+(client side), como ações de iteratividade que não precisam de
+comunicação externa.
+
+Já em outras ações será preciso consultar um banco de dados no lado do
+servidor (server side), assim sendo preciso enviar uma solicitação
+(request) para o servidor, utilizado o protocolo de comunicação HTTP e
+respeitando as regras de interface REST.
+
+Uma vez que o servidor receba a solicitação do cliente, será preciso
+interpretar o request com base na URL e no método HTTP utilizado. Essa
+computação é realizada no módulo URL Dispatcher, onde é mapeado
+para endpoint da aplicação com o módulo que possui as informações
+solicitadas.
+
+Quando o app do Django REST está integrado com o Django, essa etapa ocorre
+em duas etapas. Primeiramente o Django verificar se a url requisitada faz
+parte da API que o Django REST fornece, se fizer parte o Django passa o
+controle para o Django REST para que finalize de processar e mapear a
+requisição.
+
+Uma vez que a url já foi mapeada para o módulo que possui as informações
+requisitadas. Esse módulo, geralmente uma classe dos models.py, será
+responsável por utilizar o OMR (Mapeamento objeto-relacional) para mapear
+um modelo da aplicação com um modelo do banco de dados. Após o devido
+mapeamento, o banco de dados irá retornar um conjunto de informações que
+será tratada pelo Django REST.
+
+O Django REST já com os dados em mãos, poderá serializar as informações no
+formato padrão da API, geralmente no formato JSON. Essa serialização que é
+responsável por definir uma interface que vários sistemas poderão consumir.
+
+Uma vez que os dados já foram serializados, o Django REST passa o controle
+para o Django, que será responsável por retornar uma resposta
+(response) para o lado do cliente.
+
+Essa resposta será obtida pelo Vue.js. Agora com os dados requisitados em
+mãos, ele será responsável por criar e fornecer esses dados para que o
+usuário da aplicação. O Vue.js irá montar um template, de acordo com o
+ambiente do usuário (mobile ou desktop) e finalmente o usuário irá poder ver
+os dados requisitados. Tudo isso em questões de microssegundos.
+
+### 5.2 Diagrama de pacotes
+
+
+
+
+
+## 6. Visão de implementação
+
+### 6.1 Diagrama de classes e serviços
+
+O diagrama de classe é uma representação estática para descrever
+a arquitetura de um projeto. Tal documento tem como objetivo principal
+documentar, de formar visual, as fases de desenvolvimento do software.
+Ao analisar o diagrama abaixo é possível mapear, de forma clara e objetiva,
+a estrutura do projeto Acácia em nível macro e auxiliar no entendimento
+do escopo. Durante o processo de desenvolvimento do documento a Linguagem
+de Modelagem Unificada (UML) foi utilizada.
+
+![](img/diagrama_de_classes.svg)
+
+
+Vale ressaltar a existência de dois aspectos que influenciaram diretamente na
+concepção do diagrama de classes, estas são as **relações do framework Django Rest**,
+utilizadas para a serialização dos dados das classes, e o **padrão de design State**,
+usado para designar diferentes comportamentos para o usuário da aplicação.
+
+Sobre a classe de usuário da aplicação, o grupo de desenvolvimento do projeto
+observou na model **User**, já implementada dentro do Django Rest Framework, uma
+oportunidade de utilização de conteúdo pronto e adaptá-lo ao contexto do projeto.
+Portanto, os usuários do aplicativo Acácia herdam da classe User do Django.
+
+O padrão de design **State** surgiu como uma solução para o problema das diferentes
+permissões, baseadas em diferentes papeis, que um usuário pode assumir dentro da
+aplicação. Considerando que um mesmo usuário pode ser tanto um voluntário, quanto um
+líder e em outro momento ter o comportamento de proprietário, a equipe passou a
+enfrentar a problemática das permissões de um mesmo usuário. Desta forma, o State
+soluciona esta problemática.
+
+Os **serializers** presentes dentro do diagrama possuem a função de tratar as informações
+das models e serializá-las, ou desserializá-las.
+
+### 6.2 Banco de Dados
+
+Para o desenvolvimento do diagrama do banco de dados primeiro foi
+identificado quais seriam as entidades envolvidas no projeto. Após
+identificadas, foi analisado qual os atributos necessários para
+descrever uma instância de cada uma das entidades.
+
+Assim que todas as entidades foram descritas, foi analisado quais
+seriam as relações entre elas, e suas respectivas cardinalidades.
+
+O resultado desses passos são descritos abaixo.
+
+#### 6.2.1 Entidades
+
+* USER
+ * VOLUNTEER
+ * OWNER
+* PROPERTY
+* HARVERST
+* TREE
+
+Um ponto a comentar é a relação especificação da entidade usuário.
+O usuário representa qualquer perfil que tenha acesso as áreas do
+site que precisa de autenticação.
+
+A especificação foi utilizada para reduzir o número de auto
+relacionamentos, melhorando assim o entendimento do projeto.
+
+O perfil do administrador será o usuário responsável por
+administrar todos os dados do site. Esse será o superuser do
+Django. Ele poderá criar, editar e apagar qualquer dado que
+presente na aplicação.
+
+Uma função importante do administrador é aprovar os eventos
+colheitas que os proprietários irão criar. Ele será responsável
+por não permitir que eventos suspeitos apareçam para os
+voluntários.
+
+Como por exemplo, imagine que um proprietário cadastre uma
+plantação com 10000 árvores e esteja solicitando 10000 voluntários.
+Será função do administrador recusar esse evento.
+
+Outro exemplo, é um proprietário que cadastre 20 árvores e
+solicite somente 1 voluntário. Será função do administrador entrar
+em contato com o proprietário e verificar os detalhes dessa
+colheita.
+
+#### 6.2.2 Atributos
+
+Qualquer **USUARIO** da aplicação, e isso inclui os voluntários,
+proprietários e beneficiários, irão ter um **nome**, um **email**,
+**senhas** e poderão cadastrar telefones para contato.
+
+Um **VOLUNTARIO** deverá cadastrar sua **data de nascimento**,
+para que assim seja possível gerenciar voluntários menores de
+idade e seus responsáveis.
+
+Um **PROPRIETARIO** deverá cadastrar o seu **cpf**, para que seja
+possível verificar se a propriedade que está cadastro realmente é
+de sua posse.
+
+Uma **PROPRIEDADE** deve ter cadastrado o seu **endereço**,
+especificando o país, **estado**, **cidade**, **bairro**,
+**quadra**, **número** e **complemento**, quando aplicável.
+
+Também deverá especificar as **árvores** dessa propriedade,
+especificando o **fruto**, **mês da colheita**, **se precisa de
+escada para a colheita**, **se é necessário entrar na propriedade
+para ter acesso à árvore** (se existe muros, cercas, cachorros,
+unicórnios alados, ...) e também deverá conter **fotos**, tanto da
+propriedade quanto das árvores.
+
+Uma **COLHEITA** deve ter cadastrado a sua **data agendada**, a
+**quantidade de voluntários necessários**, a **quantidade de
+voluntários cadastrados para essa colheita**, a **quantidade
+arrecadada**, a **descrição** do evento, a **situação** (já
+finalizada, agendada, cancelada, ...) e se o **proprietário estará
+presente** no dia.
+
+#### 6.2.2 Relacionamentos
+
+Um **voluntário** pode trabalhar em várias **colheitas**, e em uma
+**colheita** pode trabalhar vários **voluntários**.
+**Cardinalidade: N:M**
+
+Um **voluntário** pode liderar vários **voluntários**, mas um
+**voluntário** só pode ter 1 líder.
+**Cardinalidade: 1:N**
+
+Um **voluntário** pode ser responsável por vários **voluntários**,
+mas um **voluntário** só pode ter 1 responsável.
+**Cardinalidade: 1:N**
+
+Um **colheita** ocorre em uma **propriedade** e em uma
+**propriedade** pode ocorre várias **colheitas**.
+**Cardinalidade: N:1**
+
+Um **proprietário** pode possuir várias **propriedades**, mas uma
+**propriedade** só pode ser de um **proprietário**.
+**Cardinalidade: 1:N**
+
+Um **colheita** pode ser doada para vários **beneficiários**, e um
+**beneficiário** pode receber várias **colheitas**.
+**Cardinalidade: N:M**
+
+#### 6.2.3 Diagrama Entidade-Relacionamento
+![](img/diagrama_entidade_relacionamento.png)
+
+#### 6.2.4 Diagrama Lógico de Dados
+![](img/diagrama_logico_de_dados.png)
+
+## Referências
+
+Departamento de Informática do SUS. Documento de Arquitetura de Software. Disponível em: . Acesso em: 10 de setembro de 2019.
+
+[1] - Andrew Pinkham. Livro. Disponível em: . Acesso em: 12 de setembro de 2019.
diff --git a/docs/architecture_techonologies.md b/docs/architecture_techonologies.md
new file mode 100644
index 0000000..24fe316
--- /dev/null
+++ b/docs/architecture_techonologies.md
@@ -0,0 +1,47 @@
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 06/09/2019 | 0.1 | Criação e desenvolvimento do documento | Shayane |
+
+## Introdução
+A arquitetura de software é uma abordagem usada no desevolvimento do software para auxiliar no direcionamento da equipe de trabalho de um projeto. Ela é uma abstração de um sistema que seleciona alguns detalhes e busca representá-los em um certo nível de abstração. A importância de adotar padrões arquiteturais pode vir a auxiliar em ganhos de eficiência na manutenção, evolução e agilidade.
+
+De acordo com [Bass, 2003](http://www.scielo.br/scielo.php?script=sci_arttext&pid=S1807-17752006000100003), a arquitetura de software de um programa ou de um sistema computacional é a estrutura ou as estruturas do sistema, que compreende elementos de software, as propriedades visíveis e externas desses elementos, e as relações entre eles.
+
+Complementar à este autor, [Krafzig, 2004](http://www.scielo.br/scielo.php?script=sci_arttext&pid=S1807-17752006000100003) define a arquitetura de software como um conjunto de declarações, que descreve os componentes de software e atribui funcionalidades de sistema para cada um deles. Ela descreve a estrutura técnica, limitações e características dos componentes, bem como as interfaces entre eles. Por este processo descrever as partes de um sistema, é possível esboçar o esqueleto do sistema e, por isso, tornar-se o plano de mais alto-nível da construção de cada novo sistema.
+
+## Metodologia
+
+O primeiro passo dado pela equipe do projeto foi avaliar as potenciais tecnologias a serem usadas no projeto de desenvolvimento do produto proposto. Para cumprir este objetivo, foram feitos estudos que buscaram averiguar a viabilidade em usar as tecnologias previamente selecionadas, por meio de artigos e pesquisas de mercado. As tecnologias selecionadas previamente para o back-end foi Django-Rest, já para o front-end foram os frameworks Vue.js e React.
+
+Após a prévia seleção a escolha consistiu na avaliação dos seguintes tópicos:
+- Qual é o nível da curva de aprendizado?
+- Qual é a familiaridade da equipe de desenvolvimento com as tecnologias?
+- Qual é a relação entre o deadline de entrega do produto com a curva de aprendizado?
+
+## Resultados obtidos
+
+Após análise dos tópicos de avaliação de tecnologias, foi possível então averiguar que para o front-end a opção de tecnologia mais viável é a Vue.js e para back-end Django-rest. A seguir apresenta-se suas análises.
+
+#### Resultados obtidos
+
+1. **Curva de aprendizado**: Pelas fontes pesquisadas sobre as tecnologias, Vue mostrou-se com uma curva de aprendizado menor, em relação à React [[1]](https://medium.com/fundbox-engineering/react-vs-vue-vs-angular-163f1ae7be56) e [[2]](https://deliciousbrains.com/react-vs-vue-2018/). Em relação ao back-end, Django tem uma curva de aprendizado mais alta em relação a Flask [[3]](https://imasters.com.br/back-end/flask-x-django-como-escolher-o-framework-correto-para-seu-aplicativo-web), por exemplo. Apesar disto, os membros têm noções básicas do framework e de python.
+2. **Familiaridade com as tecnologias**: De acordo com o quadro de conhecimentos atual, a equipe tem familiaridade com Python e pelos membros da equipe já terem conhecimento do padrão arquitetural MVC, possibilitando um back-end mais prático e produtivo. Já no front-end, não há conhecimentos consideráveis de Javascript. Apesar disto, será uma grande chance de aprendizado para todos do grupo de trabalhar com uma tecnologia em tendência no mercado de trabalho.
+3. **Curva de aprendizado x Tempo**: Devido a imprevistos e definição tardia do tema a ser desenvolvido, o deadline está corrido. Logo, é importante que as tecnologias usadas tenham uma curva de aprendizado menor, com o objetivo de trabalhar a produtividade da equipe.
+
+### Conclusão
+
+Após análise dos fatores descritos na seção anterior, o cenário de desenvolvimento usando estas tecnologias é positivo. Apesar de Vue.js não ser um framework que a equipe domina, é possível equilibrar com o uso do Django, que usa python, sendo mais acessível para os integrantes de acordo com o quadro de conhecimento.
+
+## Referências
+
+BASS, Len; CLEMENTS, Paul; KAZMAN, Rick. Software architecture in practice. Addison-Wesley Professional, 2003.
+
+KRAFZIG, Dirk et al. Service-Oriented Architecture Best Practices. Indiana: Prentice Hall PTR, 2004.
+
+[React vs Vue](https://medium.com/fundbox-engineering/react-vs-vue-vs-angular-163f1ae7be56)
+
+[React vs Vue updated](https://deliciousbrains.com/react-vs-vue-2018/)
+
+[The status of JavaScript libraries & frameworks](https://medium.com/hackernoon/the-status-of-javascript-libraries-frameworks-2018-beyond-3a5a7cae7513)
+
+[Django vs Flask](https://imasters.com.br/back-end/flask-x-django-como-escolher-o-framework-correto-para-seu-aplicativo-web)
diff --git a/docs/canvas.md b/docs/canvas.md
new file mode 100644
index 0000000..b4bb0d2
--- /dev/null
+++ b/docs/canvas.md
@@ -0,0 +1,10 @@
+# Histórico de Revisão
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 19/09/2019 | 1.0 | Criação do Canvas | Fabíola |
+| 25/10/2019 | 2.0 | Atualização do Fluxo de receita | Fabíola |
+
+## Modelo de Negócios
+
+
+
\ No newline at end of file
diff --git a/docs/diagrama_de_classes.xml b/docs/diagrama_de_classes.xml
new file mode 100644
index 0000000..f2153bd
--- /dev/null
+++ b/docs/diagrama_de_classes.xml
@@ -0,0 +1 @@
+7R3ZktpI8muImNkICN3HYx++dm1vr9v2zO4LIUCAZgTCkuhjvn6rSiqpjpQoQIKeNg6HjbIOlTKz8qxjYN6snt6lwWb5KZmF8cDQZk8D83ZgGIZmueg/DHkuILapFYBFGs0KkF4D7qO/whJIq22jWZhxFfMkifNowwOnyXodTnMOFqRp8shXmycx/9ZNsAglwP00iGXob9EsXxZQz3Br+PswWizpm3XHL0pWAa1cfkm2DGbJIwMy3wzMmzRJ8uLX6ukmjDHyKF6Kdm8bSquBpeE6V2nwdGd/+8+XYDvUs9ibfH78Ov04HppFLw9BvC0/eGA4MervOtsEazzq/LlEhfNji4d6PU/W+XAerKIYkfRqgN/qBKsNKhkYpmmh/5dh/BDm0TSQSkjtG6hNkEZB3Fw/C9bZMAvTaI5BpICMIyMMg0ehbZ7qMaJfi+J/W+RNG2EHQwniqyeKLZvgC0Fu8W/8dhujxEZY3VVXr+pSohzUjVF3U1ClKqkLCqJUBeF6doVZnUBmUbBK1rOvy2iNn69R4duIvMe81SmEzDMMMSwCWuYrvkaePv8uAv5LANrIrkG3TwWMgTyzkKco/114FnpBEL4TDGD7qL86nC2Yj25Bd1VUYfpdmKxCNDpS/ZHM47q2U5NHS8M4yKMH+D1BVoMXTI/cq+6SiIzF0J7q2o7rkw8uO3quS2zfgF+QJdt0Gla9ydwDvsjy/JHP/LGb3mrCb82DdBHmjW8ljxw6+YKSo1kgP89oB+KELGQOEl6F2KGz1+AkkJEm2/UsxPJMR8WPyygP7zfBFJc+oh4HJSMXxaVkC9M8fGoUmXoliNmv0mgDqoVK5WV6LiYjhjzWysD3vAK2ZBSB6ZVNg1IB1QxTy+hBhTNYZP/rf09pri3ffxn+9s8P3/Lt+PHTzdBwAJl9PKIkrAC4a0SUa/GI8mxNQpNLFSGLJst3e0KTbr08NA1Nk0eTK6PJsQE0mXYH3PTD/f7B2qzezLzNTfT72PiW3CM0GRKa7tJkgz4J9Y04zdQ1aCZmj9EqDtZhaQ/clyUYT0EcLdbo9xThKUwRAOMHGQPxVVmQJxiz02UUzz4Gz8kWf2OWB9M/6dP1Mkmjv1C3AcU9Kk7z0jhEo2Jr3OOWA6wtzOs0xPbAHSWRLoA+BU9cxY9BlpeAaRLHwSaLJtVnrJAkjNbXSZ4nq7JSFxPFEyaKL3OA4QAcoDu9cYBsAw7R43q7mmDyYdvqZhmkb6MQmc41SwwJQ6RhmLfXCWazKI+SdRCPo/U8SZFdjJ7a22wSRPB4PEUKoqh4l2QRVssfEEstQvg9iC55sCKkYZvcr4I4bmm3Kbl9vImm+TYtX/hhhQz7srrA+ojSxD7O0+TP8CaJE4Sk23VSzAVkaQkgOh3icJ43Tgak9abRevGR1Lm1asiXkgMwKEFt5zFxIZbRbBauMSMneZAHBdfiL9pgzU04xL5Gf7H1jE0t+xab0fa1Xj+jv7h6mt8ka/QtQUR4OkRT4jHMcpDb2wXI7jnwTPlbjeV9qy+OV1ANcUSoV1CZen76QSReIWLFYU3Tr5jkt0Ndorsp090EaBwHkzAu2BtPpNu0qCvQ/mzk1Q1Fkeb1RV4bIO91IYq+IoH1y6/FHH9Iosvs7oH8nhr5TaMv+ssG8vsgRV+APvxix3Rjxxiuw9kxvmFJVDc1HbBj3N7sGBe0Y2ZBXur0W/RLtgBujMGVlm5jHGTEtb4iAQDZCbMwm6bRpjZemioiGufbrN3AWQVP44ck3iLOQmy5n8GyxticJOk4mE7DrGx8nSRxGKyh+m9+bKMNtotGo9FF3O0Qd47yRGg2ZmC+13qzZryLNdMffXVTtmZAAlt9yTVD9s+wFXNRZV255K4/8mxXt4ziX59TbMiaBcxZKJTVm7tiyO4K0TObcBqFOxRNgPCAPNkxHSiu+zZOAlBzLUsrKWtzui8KpE3AVJP1KG8YYq/e4j8G5C5d9EdH5PUUyduXM2zIVrFE3Sp/yGcP69xhgWmaNyRZQy40XuT5iqwezfKVbYr8HvPwXPVGcoy4EZK8gyrHiHocaZ45qDOMTH2+9V2YRghLWKO1K4Mil6ZA1yL91WZAlJOF5CLbyM/QuwrdVslFdmwQxcvuyjQcVVS2bdLsE1VOusg3XNbQYBYDCH1VcWfak+Y4fE9cJlBgwuo7j+BL2WrVR6N/NOkXhtmIodAo5PFED7Z5UiwM4KwfFZ1TSiOrG9PCs02BXi7kLsjSwOhN2PsNaC8SsJO0zr3KkFdNGs2GIhgyacy+SGMpRKUVJLWuKKlNz2Fl9UjTaHmDvEYPosBlZLhrcyJ8h/g+XFLTgKQggHnRDS51sk4mqD3P4HjLE9cCqEppx+SltCs6mQ1CGvFI8MxUK+dhy4CFrKSptY7LtOy2+uhHMYJONYYtz4/vNIT2JfyxDS/h3c584sogagnvVpFczozty461ZS+F+LfTabjJ8RKOHVHQabKqc8ONMV4oVnxxeNsM4mpWHuPwgqxk9xVPsRUWUF0c3kPJ68nhMlhS9EVd2cKltuyGozFdK1xIUGYRcbm+uIAPyQzFZRZThoXAsKQ7LiuVCLD+uLSiKeAuTR6iNbJw6hWPE7Eygm1E2DLFY6er4+lr9OY3HvStBQdXHyv2TbJPwSqUQ44ve9zN3g0/ZEEGwLJamO2MVJ4TA7wwNEoXxyif35bL5W/fV0vju15bqBu2EBzQXAdYraqDS236cmroy07k1LDhpx3uTO26cJ5L7at07bk4luyotEqwc8SYdNPnuch3q6DTvt6L1Jfnu2JfPUeZHOOE7KcPWH/aVmQ/jvlqXuzecVYNcVI+PQv76a49soSlJViM6QfGOev0XSUVLf20LAiFdV6MPfK5XEyyTJLZxSa52CQ92yS+YaqaJDSG1r1J0k1GTNUkcTWP1QvtWgGIsR4u8W1YkCuESu3TCXzNFRjkQGPDNPiOXDFf3lGo1OdfQzc6NQ3LEEPBe9ann9FrZNWVZwTlsVeS7dHFiLWuadBWPigz31suzm3Kxb1yzNsWgPmTZkE9Xcb8K0O7YQqa17TPze9UtDFY114fv2s0j0sRb5knY3Z4I2zzGQ+SmY/tQtDYFQ5b0D3Ipt1meDF7m2Fb9K9gAU8aLeC/NXc4gno3fUNiDnCvTG/MAS3+E5iDLgsdrfCG/ez1U8kQbEkPWLVTHQ3AL/LviUzgKj6BTHQj609DJmRJ8Gu1PUcWtb3R6fbT4mrxNF+8G7//HL7TFo+T9ONQgUzimoX7EJ98g/CZKlGsWwddXE5IY2MsAj1LRqDt9IRAaC+LgEC6l++siDNdXVqLacmyHOS+Ls5yAJEHZT77C2yoL/VtxDcbwmibT2cKRQv0FaWGamhCWmkodtRPaAKNtz3WIC1O1bqNNYAUpd/+4pi0KSHYyVLGNlm3e825c75ZYEmzQPRTlGeBu6un7hIxMOfJTj+0PIPYUGfVLbomLMesRc/ZVAtwTJCEPLwr8YUhDmEEyjecFnWQ/925xKPSSx9pOr+gYeQjxdDXbprWmbZbspln1O+acGaZrJePSDL3pOJ13RSjqfoplPZJtyawKlt1GQVme5Nne7z65LRsbyiyvQEn5k7C9r7I9fqhmxMqe7G5q+40OpimVNnbuEiT7aZBkVSnBpfxjkEVhN3jiEjq9ZVIsKiZw0bZPUDf6F4HPnTzRhcOK98yrI8FzPzEeyN2HArawmzNfMDLZRPItUAHO+pmB+ugm3P4wn4JctbNZpmsw3F9vB8B3mHgZwJrOCJnEiVVbXj/RFktxR9cVmw5cifKxg/4POeo2LxBYI37N0hptgmDP7PxHBFqutyvTbhexFG2hHaJCLMC3N6BOtXIn8Fr3ONxyGxo2EzXcqYByP1dHIoDju+yxaM/6kJH4oDk7Uu0KQSJSSryTJmQHVqzKRfSg1Ly5SC1RDkfIFwXuWh4vAoh6r4tNk8wWy1HRgpssXVxBAuIFpUjvLo/+7yFQq2uyKmRI/MMtme/hIsIiz0sIq/uPnyPwseLiXukidtA+8rV4U1cQ1XJ96UH6NwHbNwwXUVZhlhjPI2DLCuOySps1+0G350hGYpV4LJoUdXnIppCox/bMH3OihOwCeDfkz+QcPoUrIMF4HFdbEslNtQb2HBP49Lty7Y0oETCxbjsiLw6dN7eKa1L4LzFBvPyAekcNPtblrydb23bKY3QdrXh8SYocJCEBlC3ixVv8I1XCgnovk1QSzh9y/IVTVCDLibtHC3Nu+YvF4H9bS4CK/m2albwLjQwloeB0UkD33GlFnsDlc9088zCmdcLV3ARXqdlJb/XhVbDXVXiFVzARVX8fVQNiGa6V0U0dcbqG9IYhwwDiUsG3KymRBwR+dU4YOS/KGRarcjEEgWjYUIeFsVDoUxrAzzjaqZsVbUSMt6JWAoSkmhcgE613q1voqPJ2aKtjTvFhrHN6OC6g0IP42e6F9cWdTEuxNoYlzD6GIOHVm/cwnTiWQ2X0unNU5WsnWjiLpMp64O5mNEKzIUjAvcIqd82rL/WQPQqLIBxXAcGDiYeGyTAcDZMQHirDhTU76iDBRiGnRpbDhjUzMcFDQQ+ZQIHYgMSPKiBbACh7oQLItSVe+Y+vYn7TEbuirLNbuE+3e+Z/ZxG9huif29wyZWGpRnZkI4Kr2owszPdLjoy9QLNTNtwFUSx0PANhu1suQmy7DFJZ4e8FdkC8yhdjVX6aBeibGSDltLoBplrlfOLS4n7y0834gIrScqPZc1bi4V+qTiiAFcxDwwqox5kclQ+cbt4vyYcdVPcVkqEPTZCbRIJ4eGlJhBcZtxZ5TQfPKeqaQLPKWbqsCy6z9RxGbXdx8xxG2dOI1ORCErNVL9VX6MfzUplRAXSuzrIYybMY2YjL/ExFgxPaasWM+LMzEP88EO4x+uXeZjuAebBWCklFSqN8BGOlST75ddBKcvIXYWIeANRDjZ1QUTxEe2pGjiiC1Eu79/VNA1RR2y7YiUQ0EoCaCB0P/lfTcuL4O997jKzZK+5y0jgoyYvAb7sy55b4oH7Jzz7C8WBW2TAADTnM//UMegmKtIYtLV7IQS4K6C3MDSwpBr2YQXyXFLaXfKFLvKFclK7ixMzYcZoXLhZeZY02wxf+kSKCk+SVmR9SLFm5fUp9Cp5ikAbWJxcct47kqLdLKjsLecN3KkqkfqS8z6UvGfPeQN3p+Irk8nchrwqkmijPkglJeQm1ItSrc94TapNAC9pR9PKKyL1Co+IqcX81LgnFcn2ai8C6IXrgZuiQa43emJ7U2ElT4dbMwfmPkf9HrIfrhi9dODjjt1srXbICzos0hK297qaYIQp36tj7eio541r1Mo85xqUYXXQVLVzDTAyoJsbDHGbX3enUe1GywFRgd1OgtGA5/aowGlxI7PM1QTL62l+2d3XfPPRsfSuNotzU0V1A0x/57bJaxQPcBKR3ZTlY/j0bKFqHKjWVPc8o2yM2GY+33F3E62LOJ2ojt2ViV34BxLezNZCvBPxa7Rq2Y3I9n/xZxsuCWoVTUfdeQxGWYwO/FlwyAoHGvwk7mz31NXt03mz4IihMy1L3w9ZdeP5No7Hal4mrp4hVZbvro9sMiySaJ2HJJpBPRLxSPzcxpoXB/RUfKrof7od+J+wvauQ6Zn9EawXyQgZ/IjrJqNgi1N7f7OjPTuywlzeCoMOxYJOVu7itE9448N+x+JM4gQbwo23qpObOTo7EGe/YMOgu8ABEDdoNmFPEjewjw0blA1tUxAEnZ3qxA/Q9k2BN4870wmefic506npgmhtBz/WJzga+54z2k30y5e5+My3StcHJtKAjXgbtGr4yxU6skU3tatrpYUjH+mAVa+VFur3NA8UMlsdzoPDYsD7XC132CyAz+dz5VkAVzxhENh0pLUctiCXVScC1Jd4JE1Hc0EMOeuaZrSOTW5QSuxeZ4OloBX2CsHuFSgZwAbhfuexCTIHOo/NLcNn/IqOvtZzWbI/qo1GIwR5eXefHIV78YhfH8C9BYVJ+zLQLVm2v7x7fo5CuSscP4jEii/z+0lxrnCWjYI+5V0jUZ92qOPoLXmKx3CfRMcNBY9FN90DTT3RtZB76sqHEba0+653Am0l71p/ZfPbEKwA35GDHied3raco9Veoy7TKW9RxIO31p1Um1Er97Wj3hNODPFcebH2aREvZ1tfmZgxbfGkQMc9t6CRPREd2tLwmsgg3v7qeOcmws/iuugaj3lfgy6q7kjqDMqNUowtVG+RMt/8Hw==
\ No newline at end of file
diff --git a/docs/home.css b/docs/home.css
new file mode 100644
index 0000000..5277302
--- /dev/null
+++ b/docs/home.css
@@ -0,0 +1,79 @@
+.container-img {
+ position: relative;
+ width: 50%;
+ padding-bottom: 20px;
+}
+
+.image {
+ opacity: 1;
+ display: block;
+ width: 80%;
+ height: auto;
+ transition: 0.5s ease;
+ backface-visibility: hidden;
+ border-radius: 50%;
+}
+
+.middle {
+ transition: 0.5s ease;
+ opacity: 0;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+ transform: translate(-50%, -50%);
+ -ms-transform: translate(-50%, -50%);
+ text-align: center;
+}
+
+.container-img:hover .middle {
+ opacity: 1;
+}
+.container-img:hover .image {
+ opacity: 0.1;
+}
+
+.text {
+ color: #376996;
+ font-size: 20px;
+ padding: 32px 32px;
+
+ background-position: 0 75%;
+ background-size: auto 5px;
+ background-repeat: repeat-x;
+ text-decoration: none;
+ font-family: "Raleway", sans-serif;
+}
+
+.title-home {
+ font-size: 30px !important;
+ font-family: "Raleway", sans-serif;
+ color: white !important;
+}
+
+.sub-title {
+ font-size: 3em !important;
+ margin-bottom: 1em !important;
+ font-family: "Raleway", sans-serif;
+}
+
+.sub-title2 {
+ font-size: 2em !important;
+ margin-bottom: 2em !important;
+ margin-top: 2em !important;
+ font-family: "Raleway", sans-serif;
+}
+
+.has-mask {
+ background-attachment: fixed !important;
+ background-position: center !important;
+ background-repeat: no-repeat !important;
+ background-size: cover !important;
+}
+
+.mask {
+ background-color: transparent !important;
+}
+
+body h1 {
+ font-size: 2.5em !important;
+}
diff --git a/docs/home.md b/docs/home.md
new file mode 100644
index 0000000..4c61809
--- /dev/null
+++ b/docs/home.md
@@ -0,0 +1,99 @@
+
Visão geral
+
+Acácia propõe-se a facilitar a criação de uma comunidade voluntária em torno da agricultura urbana, diminuindo o desperdício de comida e difundindo conhecimento em plantio e colheita nesse ambiente. Para tal, a ferramenta conecta pessoas que possuem plantas frutíferas em local urbano, voluntários de colheita e beneficiários que buscam doações de alimentos, para que possam trabalhar juntos, com colheita colaborativa.
+
+Esta página contém documentos relevantes relacionados ao produto, seu gerenciamento e desenvolvimento, assim como guias de contribuição e conduta.
+
+
Links
+
+- [Repositório do back-end](https://github.com/fga-eps-mds/2019.2-Acacia)
+- [Repositório do front-end](https://github.com/fga-eps-mds/2019.2-Acacia-Frontend)
+
+
Time
+
+
+
+
+
+
+
+ Durval Carvalho
+
+
+
+
+
+
+
+ Fabíola Malta
+
+
+
+
+
+
+
+ Flávio Vieira
+
+
+
+
+
+
+
+ Hugo Sobral
+
+
+
+
+
+
+
+ João Pedro
+
+
+
+
+
+
+
+
+
+ Leonardo Silva
+
+
+
+
+
+
+
+ Martha Dantas
+
+
+
+
+
+
+
+ Renato Brito
+
+
+
+
+
+
+
+ Shayane Alcântara
+
+
+
+
+
+
+
+ Vitor Cardoso
+
+
+
+
+
diff --git a/docs/img/EAP.png b/docs/img/EAP.png
new file mode 100644
index 0000000..ca5070a
Binary files /dev/null and b/docs/img/EAP.png differ
diff --git a/docs/img/archived.png b/docs/img/archived.png
new file mode 100644
index 0000000..ea22a35
Binary files /dev/null and b/docs/img/archived.png differ
diff --git a/docs/img/burndown-de-riscos-exemplo.png b/docs/img/burndown-de-riscos-exemplo.png
new file mode 100644
index 0000000..3bcde0e
Binary files /dev/null and b/docs/img/burndown-de-riscos-exemplo.png differ
diff --git a/docs/img/canvas.png b/docs/img/canvas.png
new file mode 100644
index 0000000..7efce9b
Binary files /dev/null and b/docs/img/canvas.png differ
diff --git a/docs/img/diagrama_arquitetura.png b/docs/img/diagrama_arquitetura.png
new file mode 100644
index 0000000..80abdb6
Binary files /dev/null and b/docs/img/diagrama_arquitetura.png differ
diff --git a/docs/img/diagrama_de_caso_de_uso.png b/docs/img/diagrama_de_caso_de_uso.png
new file mode 100644
index 0000000..97de0e5
Binary files /dev/null and b/docs/img/diagrama_de_caso_de_uso.png differ
diff --git a/docs/img/diagrama_de_classes.svg b/docs/img/diagrama_de_classes.svg
new file mode 100644
index 0000000..d1c7b54
--- /dev/null
+++ b/docs/img/diagrama_de_classes.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docs/img/diagrama_de_pacotes.svg b/docs/img/diagrama_de_pacotes.svg
new file mode 100644
index 0000000..73e85d7
--- /dev/null
+++ b/docs/img/diagrama_de_pacotes.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docs/img/diagrama_entidade_relacionamento.png b/docs/img/diagrama_entidade_relacionamento.png
new file mode 100644
index 0000000..83b2139
Binary files /dev/null and b/docs/img/diagrama_entidade_relacionamento.png differ
diff --git a/docs/img/diagrama_logico_de_dados.png b/docs/img/diagrama_logico_de_dados.png
new file mode 100644
index 0000000..91c64cc
Binary files /dev/null and b/docs/img/diagrama_logico_de_dados.png differ
diff --git a/docs/img/empatia.png b/docs/img/empatia.png
new file mode 100644
index 0000000..2b7f06a
Binary files /dev/null and b/docs/img/empatia.png differ
diff --git a/docs/img/gerenciamento/agil5.png b/docs/img/gerenciamento/agil5.png
new file mode 100644
index 0000000..f85436e
Binary files /dev/null and b/docs/img/gerenciamento/agil5.png differ
diff --git a/docs/img/gerenciamento/agil6.png b/docs/img/gerenciamento/agil6.png
new file mode 100644
index 0000000..2cd6ac9
Binary files /dev/null and b/docs/img/gerenciamento/agil6.png differ
diff --git a/docs/img/gerenciamento/agil7.png b/docs/img/gerenciamento/agil7.png
new file mode 100644
index 0000000..8361d4a
Binary files /dev/null and b/docs/img/gerenciamento/agil7.png differ
diff --git a/docs/img/gerenciamento/agil8.png b/docs/img/gerenciamento/agil8.png
new file mode 100644
index 0000000..4562f87
Binary files /dev/null and b/docs/img/gerenciamento/agil8.png differ
diff --git a/docs/img/gerenciamento/agil9.png b/docs/img/gerenciamento/agil9.png
new file mode 100644
index 0000000..72955a6
Binary files /dev/null and b/docs/img/gerenciamento/agil9.png differ
diff --git a/docs/img/gerenciamento/burn4.png b/docs/img/gerenciamento/burn4.png
new file mode 100644
index 0000000..75464ad
Binary files /dev/null and b/docs/img/gerenciamento/burn4.png differ
diff --git a/docs/img/gerenciamento/burn5.png b/docs/img/gerenciamento/burn5.png
new file mode 100644
index 0000000..b50d67e
Binary files /dev/null and b/docs/img/gerenciamento/burn5.png differ
diff --git a/docs/img/gerenciamento/burn6.png b/docs/img/gerenciamento/burn6.png
new file mode 100644
index 0000000..e671990
Binary files /dev/null and b/docs/img/gerenciamento/burn6.png differ
diff --git a/docs/img/gerenciamento/burn8.png b/docs/img/gerenciamento/burn8.png
new file mode 100644
index 0000000..35a118c
Binary files /dev/null and b/docs/img/gerenciamento/burn8.png differ
diff --git a/docs/img/gerenciamento/burn9.png b/docs/img/gerenciamento/burn9.png
new file mode 100644
index 0000000..588c01d
Binary files /dev/null and b/docs/img/gerenciamento/burn9.png differ
diff --git a/docs/img/gerenciamento/conhecimento5.png b/docs/img/gerenciamento/conhecimento5.png
new file mode 100644
index 0000000..6b48c53
Binary files /dev/null and b/docs/img/gerenciamento/conhecimento5.png differ
diff --git a/docs/img/gerenciamento/conhecimento6.png b/docs/img/gerenciamento/conhecimento6.png
new file mode 100644
index 0000000..78a5be1
Binary files /dev/null and b/docs/img/gerenciamento/conhecimento6.png differ
diff --git a/docs/img/gerenciamento/conhecimento7.png b/docs/img/gerenciamento/conhecimento7.png
new file mode 100644
index 0000000..3cb941a
Binary files /dev/null and b/docs/img/gerenciamento/conhecimento7.png differ
diff --git a/docs/img/gerenciamento/conhecimento8.jpg b/docs/img/gerenciamento/conhecimento8.jpg
new file mode 100644
index 0000000..4324425
Binary files /dev/null and b/docs/img/gerenciamento/conhecimento8.jpg differ
diff --git a/docs/img/gerenciamento/conhecimento9.png b/docs/img/gerenciamento/conhecimento9.png
new file mode 100644
index 0000000..8ff7c77
Binary files /dev/null and b/docs/img/gerenciamento/conhecimento9.png differ
diff --git a/docs/img/gerenciamento/health5.png b/docs/img/gerenciamento/health5.png
new file mode 100644
index 0000000..90b5513
Binary files /dev/null and b/docs/img/gerenciamento/health5.png differ
diff --git a/docs/img/gerenciamento/health6.png b/docs/img/gerenciamento/health6.png
new file mode 100644
index 0000000..2869c2c
Binary files /dev/null and b/docs/img/gerenciamento/health6.png differ
diff --git a/docs/img/gerenciamento/health7.png b/docs/img/gerenciamento/health7.png
new file mode 100644
index 0000000..bc2514a
Binary files /dev/null and b/docs/img/gerenciamento/health7.png differ
diff --git a/docs/img/gerenciamento/health8.png b/docs/img/gerenciamento/health8.png
new file mode 100644
index 0000000..7cb241d
Binary files /dev/null and b/docs/img/gerenciamento/health8.png differ
diff --git a/docs/img/gerenciamento/health9.png b/docs/img/gerenciamento/health9.png
new file mode 100644
index 0000000..d04ed6f
Binary files /dev/null and b/docs/img/gerenciamento/health9.png differ
diff --git a/docs/img/gerenciamento/quadro4.png b/docs/img/gerenciamento/quadro4.png
new file mode 100644
index 0000000..0883b9a
Binary files /dev/null and b/docs/img/gerenciamento/quadro4.png differ
diff --git a/docs/img/gerenciamento/retro5.png b/docs/img/gerenciamento/retro5.png
new file mode 100644
index 0000000..08a2203
Binary files /dev/null and b/docs/img/gerenciamento/retro5.png differ
diff --git a/docs/img/gerenciamento/retrospectiva8.png b/docs/img/gerenciamento/retrospectiva8.png
new file mode 100644
index 0000000..0b0fdf5
Binary files /dev/null and b/docs/img/gerenciamento/retrospectiva8.png differ
diff --git a/docs/img/gerenciamento/retrospectiva9.png b/docs/img/gerenciamento/retrospectiva9.png
new file mode 100644
index 0000000..0c8a478
Binary files /dev/null and b/docs/img/gerenciamento/retrospectiva9.png differ
diff --git a/docs/img/gerenciamento/retrospective6.png b/docs/img/gerenciamento/retrospective6.png
new file mode 100644
index 0000000..f6a2423
Binary files /dev/null and b/docs/img/gerenciamento/retrospective6.png differ
diff --git a/docs/img/gerenciamento/retrospective7.png b/docs/img/gerenciamento/retrospective7.png
new file mode 100644
index 0000000..6ad8199
Binary files /dev/null and b/docs/img/gerenciamento/retrospective7.png differ
diff --git a/docs/img/gerenciamento/review5.jpg b/docs/img/gerenciamento/review5.jpg
new file mode 100644
index 0000000..9841e9d
Binary files /dev/null and b/docs/img/gerenciamento/review5.jpg differ
diff --git a/docs/img/gerenciamento/review6.png b/docs/img/gerenciamento/review6.png
new file mode 100644
index 0000000..971026c
Binary files /dev/null and b/docs/img/gerenciamento/review6.png differ
diff --git a/docs/img/gerenciamento/review7.jpg b/docs/img/gerenciamento/review7.jpg
new file mode 100644
index 0000000..5deb78d
Binary files /dev/null and b/docs/img/gerenciamento/review7.jpg differ
diff --git a/docs/img/gerenciamento/review8.png b/docs/img/gerenciamento/review8.png
new file mode 100644
index 0000000..627d306
Binary files /dev/null and b/docs/img/gerenciamento/review8.png differ
diff --git a/docs/img/gerenciamento/review9.jpg b/docs/img/gerenciamento/review9.jpg
new file mode 100644
index 0000000..44c5a0a
Binary files /dev/null and b/docs/img/gerenciamento/review9.jpg differ
diff --git a/docs/img/gerenciamento/review_quality4.jpg b/docs/img/gerenciamento/review_quality4.jpg
new file mode 100644
index 0000000..6ff37fc
Binary files /dev/null and b/docs/img/gerenciamento/review_quality4.jpg differ
diff --git a/docs/img/gerenciamento/risk5.png b/docs/img/gerenciamento/risk5.png
new file mode 100644
index 0000000..8944373
Binary files /dev/null and b/docs/img/gerenciamento/risk5.png differ
diff --git a/docs/img/gerenciamento/risks3.png b/docs/img/gerenciamento/risks3.png
new file mode 100644
index 0000000..f88b4d9
Binary files /dev/null and b/docs/img/gerenciamento/risks3.png differ
diff --git a/docs/img/gerenciamento/risks4.png b/docs/img/gerenciamento/risks4.png
new file mode 100644
index 0000000..b87944f
Binary files /dev/null and b/docs/img/gerenciamento/risks4.png differ
diff --git a/docs/img/gerenciamento/risks6.png b/docs/img/gerenciamento/risks6.png
new file mode 100644
index 0000000..cf9586a
Binary files /dev/null and b/docs/img/gerenciamento/risks6.png differ
diff --git a/docs/img/gerenciamento/risks8.png b/docs/img/gerenciamento/risks8.png
new file mode 100644
index 0000000..0b36e66
Binary files /dev/null and b/docs/img/gerenciamento/risks8.png differ
diff --git a/docs/img/gerenciamento/risks9.png b/docs/img/gerenciamento/risks9.png
new file mode 100644
index 0000000..b4e2165
Binary files /dev/null and b/docs/img/gerenciamento/risks9.png differ
diff --git a/docs/img/gerenciamento/sprint1.jpg b/docs/img/gerenciamento/sprint1.jpg
new file mode 100644
index 0000000..a7e128b
Binary files /dev/null and b/docs/img/gerenciamento/sprint1.jpg differ
diff --git a/docs/img/gerenciamento/sprint2.jpg b/docs/img/gerenciamento/sprint2.jpg
new file mode 100644
index 0000000..f4d039e
Binary files /dev/null and b/docs/img/gerenciamento/sprint2.jpg differ
diff --git a/docs/img/gerenciamento/sprint3.jpg b/docs/img/gerenciamento/sprint3.jpg
new file mode 100644
index 0000000..605e62b
Binary files /dev/null and b/docs/img/gerenciamento/sprint3.jpg differ
diff --git a/docs/img/gerenciamento/velocity3.png b/docs/img/gerenciamento/velocity3.png
new file mode 100644
index 0000000..cccf120
Binary files /dev/null and b/docs/img/gerenciamento/velocity3.png differ
diff --git a/docs/img/gerenciamento/velocity4.png b/docs/img/gerenciamento/velocity4.png
new file mode 100644
index 0000000..3702342
Binary files /dev/null and b/docs/img/gerenciamento/velocity4.png differ
diff --git a/docs/img/gerenciamento/velocity5.png b/docs/img/gerenciamento/velocity5.png
new file mode 100644
index 0000000..ea6e6e5
Binary files /dev/null and b/docs/img/gerenciamento/velocity5.png differ
diff --git a/docs/img/gerenciamento/velocity6.png b/docs/img/gerenciamento/velocity6.png
new file mode 100644
index 0000000..0716ad4
Binary files /dev/null and b/docs/img/gerenciamento/velocity6.png differ
diff --git a/docs/img/gerenciamento/velocity7.png b/docs/img/gerenciamento/velocity7.png
new file mode 100644
index 0000000..89fcee1
Binary files /dev/null and b/docs/img/gerenciamento/velocity7.png differ
diff --git a/docs/img/gerenciamento/velocity8.png b/docs/img/gerenciamento/velocity8.png
new file mode 100644
index 0000000..19c871b
Binary files /dev/null and b/docs/img/gerenciamento/velocity8.png differ
diff --git a/docs/img/gerenciamento/velocity9.png b/docs/img/gerenciamento/velocity9.png
new file mode 100644
index 0000000..230ae81
Binary files /dev/null and b/docs/img/gerenciamento/velocity9.png differ
diff --git a/docs/img/healthCheck.png b/docs/img/healthCheck.png
new file mode 100644
index 0000000..58a6ab3
Binary files /dev/null and b/docs/img/healthCheck.png differ
diff --git a/docs/img/identidade/LowFidelityPrototype.png b/docs/img/identidade/LowFidelityPrototype.png
new file mode 100644
index 0000000..e2785d7
Binary files /dev/null and b/docs/img/identidade/LowFidelityPrototype.png differ
diff --git a/docs/img/identidade/LowFidelityPrototypeScreens_1.png b/docs/img/identidade/LowFidelityPrototypeScreens_1.png
new file mode 100644
index 0000000..708377b
Binary files /dev/null and b/docs/img/identidade/LowFidelityPrototypeScreens_1.png differ
diff --git a/docs/img/identidade/LowFidelityPrototypeScreens_2.png b/docs/img/identidade/LowFidelityPrototypeScreens_2.png
new file mode 100644
index 0000000..9578c46
Binary files /dev/null and b/docs/img/identidade/LowFidelityPrototypeScreens_2.png differ
diff --git a/docs/img/identidade/botoes.png b/docs/img/identidade/botoes.png
new file mode 100644
index 0000000..e5d5f99
Binary files /dev/null and b/docs/img/identidade/botoes.png differ
diff --git a/docs/img/identidade/campos.png b/docs/img/identidade/campos.png
new file mode 100644
index 0000000..4ef1fbc
Binary files /dev/null and b/docs/img/identidade/campos.png differ
diff --git a/docs/img/identidade/contraste1.png b/docs/img/identidade/contraste1.png
new file mode 100644
index 0000000..5212c68
Binary files /dev/null and b/docs/img/identidade/contraste1.png differ
diff --git a/docs/img/identidade/contraste2.png b/docs/img/identidade/contraste2.png
new file mode 100644
index 0000000..b304fcb
Binary files /dev/null and b/docs/img/identidade/contraste2.png differ
diff --git a/docs/img/identidade/contraste3.png b/docs/img/identidade/contraste3.png
new file mode 100644
index 0000000..e2d3761
Binary files /dev/null and b/docs/img/identidade/contraste3.png differ
diff --git a/docs/img/identidade/contraste4.png b/docs/img/identidade/contraste4.png
new file mode 100644
index 0000000..b218d0b
Binary files /dev/null and b/docs/img/identidade/contraste4.png differ
diff --git a/docs/img/identidade/contraste5.png b/docs/img/identidade/contraste5.png
new file mode 100644
index 0000000..8d0176f
Binary files /dev/null and b/docs/img/identidade/contraste5.png differ
diff --git a/docs/img/identidade/contraste6.png b/docs/img/identidade/contraste6.png
new file mode 100644
index 0000000..171dafe
Binary files /dev/null and b/docs/img/identidade/contraste6.png differ
diff --git a/docs/img/identidade/gitpages/gitpage_background.png b/docs/img/identidade/gitpages/gitpage_background.png
new file mode 100644
index 0000000..4064d92
Binary files /dev/null and b/docs/img/identidade/gitpages/gitpage_background.png differ
diff --git a/docs/img/identidade/gitpages/gitpage_gradient_background.png b/docs/img/identidade/gitpages/gitpage_gradient_background.png
new file mode 100644
index 0000000..1a45633
Binary files /dev/null and b/docs/img/identidade/gitpages/gitpage_gradient_background.png differ
diff --git a/docs/img/identidade/gitpages/gitpage_logo.png b/docs/img/identidade/gitpages/gitpage_logo.png
new file mode 100644
index 0000000..fe92dbd
Binary files /dev/null and b/docs/img/identidade/gitpages/gitpage_logo.png differ
diff --git a/docs/img/identidade/gitpages/gitpage_logo_corner.png b/docs/img/identidade/gitpages/gitpage_logo_corner.png
new file mode 100644
index 0000000..f2fcc58
Binary files /dev/null and b/docs/img/identidade/gitpages/gitpage_logo_corner.png differ
diff --git a/docs/img/identidade/gitpages/gitpage_logo_corner_2.png b/docs/img/identidade/gitpages/gitpage_logo_corner_2.png
new file mode 100644
index 0000000..b9ca092
Binary files /dev/null and b/docs/img/identidade/gitpages/gitpage_logo_corner_2.png differ
diff --git a/docs/img/identidade/gitpages/gitpage_logo_icon.png b/docs/img/identidade/gitpages/gitpage_logo_icon.png
new file mode 100644
index 0000000..6ca9a86
Binary files /dev/null and b/docs/img/identidade/gitpages/gitpage_logo_icon.png differ
diff --git a/docs/img/identidade/navcelular.png b/docs/img/identidade/navcelular.png
new file mode 100644
index 0000000..00c60c9
Binary files /dev/null and b/docs/img/identidade/navcelular.png differ
diff --git a/docs/img/identidade/navweb.png b/docs/img/identidade/navweb.png
new file mode 100644
index 0000000..b56464e
Binary files /dev/null and b/docs/img/identidade/navweb.png differ
diff --git a/docs/img/identidade/navweb1.png b/docs/img/identidade/navweb1.png
new file mode 100644
index 0000000..9731ce3
Binary files /dev/null and b/docs/img/identidade/navweb1.png differ
diff --git a/docs/img/identidade/navwebsite1.png b/docs/img/identidade/navwebsite1.png
new file mode 100644
index 0000000..19a9771
Binary files /dev/null and b/docs/img/identidade/navwebsite1.png differ
diff --git a/docs/img/identidade/navwebsite2.png b/docs/img/identidade/navwebsite2.png
new file mode 100644
index 0000000..bc51da7
Binary files /dev/null and b/docs/img/identidade/navwebsite2.png differ
diff --git a/docs/img/identidade/paleta.png b/docs/img/identidade/paleta.png
new file mode 100644
index 0000000..b2cf6f0
Binary files /dev/null and b/docs/img/identidade/paleta.png differ
diff --git a/docs/img/identidade/wordmark_1.svg b/docs/img/identidade/wordmark_1.svg
new file mode 100644
index 0000000..b8c86b5
--- /dev/null
+++ b/docs/img/identidade/wordmark_1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/img/interface.png b/docs/img/interface.png
new file mode 100644
index 0000000..6e7c253
Binary files /dev/null and b/docs/img/interface.png differ
diff --git a/docs/img/permissions.png b/docs/img/permissions.png
new file mode 100644
index 0000000..313a89d
Binary files /dev/null and b/docs/img/permissions.png differ
diff --git a/docs/img/roadmap.png b/docs/img/roadmap.png
new file mode 100644
index 0000000..d94384a
Binary files /dev/null and b/docs/img/roadmap.png differ
diff --git a/docs/img/roadmap2.png b/docs/img/roadmap2.png
new file mode 100644
index 0000000..60045ed
Binary files /dev/null and b/docs/img/roadmap2.png differ
diff --git a/docs/img/solutionVariabilities.png b/docs/img/solutionVariabilities.png
new file mode 100644
index 0000000..a769a9f
Binary files /dev/null and b/docs/img/solutionVariabilities.png differ
diff --git a/docs/img/team/durval.jpg b/docs/img/team/durval.jpg
new file mode 100644
index 0000000..e81773a
Binary files /dev/null and b/docs/img/team/durval.jpg differ
diff --git a/docs/img/team/fabiola.jpg b/docs/img/team/fabiola.jpg
new file mode 100644
index 0000000..2631241
Binary files /dev/null and b/docs/img/team/fabiola.jpg differ
diff --git a/docs/img/team/flavio.jpg b/docs/img/team/flavio.jpg
new file mode 100644
index 0000000..3e72170
Binary files /dev/null and b/docs/img/team/flavio.jpg differ
diff --git a/docs/img/team/hugo.jpg b/docs/img/team/hugo.jpg
new file mode 100644
index 0000000..358f6ef
Binary files /dev/null and b/docs/img/team/hugo.jpg differ
diff --git a/docs/img/team/joao.jpg b/docs/img/team/joao.jpg
new file mode 100644
index 0000000..4fbc7ea
Binary files /dev/null and b/docs/img/team/joao.jpg differ
diff --git a/docs/img/team/leonardo.jpg b/docs/img/team/leonardo.jpg
new file mode 100644
index 0000000..51f8463
Binary files /dev/null and b/docs/img/team/leonardo.jpg differ
diff --git a/docs/img/team/martha.jpg b/docs/img/team/martha.jpg
new file mode 100644
index 0000000..ff5fd5b
Binary files /dev/null and b/docs/img/team/martha.jpg differ
diff --git a/docs/img/team/renato.jpg b/docs/img/team/renato.jpg
new file mode 100644
index 0000000..a7869b6
Binary files /dev/null and b/docs/img/team/renato.jpg differ
diff --git a/docs/img/team/shayane.jpeg b/docs/img/team/shayane.jpeg
new file mode 100644
index 0000000..7bd7818
Binary files /dev/null and b/docs/img/team/shayane.jpeg differ
diff --git a/docs/img/team/vitor.jpeg b/docs/img/team/vitor.jpeg
new file mode 100644
index 0000000..46b9c70
Binary files /dev/null and b/docs/img/team/vitor.jpeg differ
diff --git a/docs/indicators_metrics.md b/docs/indicators_metrics.md
new file mode 100644
index 0000000..4d6015b
--- /dev/null
+++ b/docs/indicators_metrics.md
@@ -0,0 +1,62 @@
+# Metricas e Indicadores
+
+## Histórico de Revisão
+
+
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 11/09/2019 | 0.1 | Abertura do documento | Martha Dantas |
+| 14/09/2019 | 0.8 | Descrição das metricas e indicadores de gerenciamento | Martha Dantas |
+
+Este documento tem como objetivo detalhar as metricas e indicadores que serão usando durante a execução do projeto. Os principais objetivos são manter a cultura das práticas ágeis, mensurar a complexidade das atividades, verificar a "saúde" do projeto e a qualidade de código entregue.
+
+## Business Complexity Points
+
+Modelo criado por CI&T para mensurar e análisar complexidade. O modelo determina 10 itens de complexidades a serem observados, entretanto em virtude do contexto estudantil e se valendo da cultura de adaptação do Scrum, serão utilizados apenas 3, estes são:
+
+- Interface Elements - Elementos de UI/UX do projeto. Sua mensuração é feita da seguinte forma:
+
+ ![Metrica de UI/UX](img/interface.png)
+
+- Roles/Permissions - Número de diferentes permissões, ou seja, níveis de acesso à aplicação. Sua mensuração é feita da seguinte forma:
+
+ ![Metrica de Permissões](img/permissions.png)
+
+ - Solution Variabilities - Soluções que cumprem um mesmo objetuvo de negócio podendo variar por influência de um parâmetro. Sua mensuração é feita da seguinte forma:
+
+ ![Metricas de soluções variadas](img/solutionVariabilities.png)
+
+
+## Squad Health Check Model
+
+Modelo criado por Spotify para mensurar e análisar a saúde de um projeto. Ele elicita 11 itens a serem observados:
+
+![Health Check](img/healthCheck.png)
+
+## Práticas Ágeis
+
+Modelo para verificar a utilização das práticas ágeis durante o projeto. Serão elencados as práticas ageis a serem usadas durante as sprints, além de avaliar sob a diretriz da escalade likert quão bem foi aplicada essa prática
+
+## Quadro de Conhecimento
+
+Modelo que mensura o conhecimento da equipe em diversos aspectos. Tambem útil para avaliar a evolução e a gestão de conhecimento da equipe.
+
+Pode ser encontrado em : [Quadro de Conhecimento](https://docs.google.com/spreadsheets/d/1RKcA2VR6jS--O1DSd3KZ6vcl8PCMI4f9WJ8x_1HUqek/edit?usp=sharing)
+
+
+## Qualidade em Código
+
+As principais metricas que utilizaremos em código são:
+ - Teste unitário cobertura de 90%
+ - CC - complexidade ciclomática
+ - LOC - linhas de código por método
+ - Duplicidade de código
+ - Complexidade de código
+
+
+## Burndown de Risco
+
+Metrica utilizada para fazer gerenciamento de risco ao longo das sprints do projeto. Serão elencados riscos e dado um peso a estes, o ideal é que um risco nao persista ao longo de várias sprints.
+
+ - Exemplo de burndown de risco:
+ ![Burndown de Risco](img/burndown-de-riscos-exemplo.png)
diff --git a/docs/policies.md b/docs/policies.md
new file mode 100644
index 0000000..bc73036
--- /dev/null
+++ b/docs/policies.md
@@ -0,0 +1,149 @@
+# Políticas do Repositório
+## Histórico de versão
+
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 23/08/2019 | 1.0 | Criação da primeira versão do documento | Vítor Cardoso |
+| 03/09/2019 | 1.1 | Tradução do documento para português | Vítor Cardoso |
+| 01/11/2019 | 1.2 | Adição das políticas de migrações do django | Fabíola |
+
+## Introdução
+
+Este documento tem como objetivo explicar os procedimentos a serem feitos para que as políticas deste repositório sejam seguidas adequadamente.
+
+Aqui se encontram:
+
+- Política de Branch
+- Política de Commits
+
+## Políticas de Branch
+
+Branches devem seguir as seguintes regras explicadas neste tópico:
+
+Breve explicação sobre o fluxo de trabalho:
+
+- A branch **master** representa uma versão estável do produto, contendo código já testado e versionado, pronto para ser entregue ao usuário final ou cliente. Essa branch parte da branch **develop** através de pull requests aprovados no fim de cada release.
+
+ Regras:
+
+ 1. Existe apenas uma branch **master**.
+ 2. **Não** são permitidos commits feitos diretamente na **master**.
+
+
+- A branch **develop** contém a versão mais atualizada do código que está sendo desenvolvido. Essa branch está sempre sincronizada com a **master** e é base para as branches **feature**.
+
+ Regras:
+
+ 1. Existe apenas uma branch **develop**.
+ 2. Essa branch está sempre sincronizada com a branch **master**.
+
+
+- As branches **feature** representam as funcionalidades do sistema a serem desenvolvidas, elas devem ter a branch **develop** como sua origem e fim.
+
+ Regras:
+
+ 1. Essa branch sempre é criada a partir da branch **develop**.
+ 2. Essa branch sempre é mesclada à branch **develop**.
+
+ Regras de nomenclatura:
+
+ `feature/issueID-titulo-da-issue`
+
+
+- A branch **release** representa o conjunto de funcionalidades provenientes de um ponto específico da branch **develop**. Essa branch contém funcionalidades prontas que, provavelmente, estarão presentes na próxima versão estável do produto. Apenas **bug fixes** são permitidos nessa branch.
+
+ Regras:
+
+ 1. Essa branch sempre é criada a partir da branch **develop**.
+ 2. Essa branch sempre é mesclada às branches **develop** e **master**.
+ 3. Essa branch aceita apenas mesclagens de branches do tipo **bugfix**.
+
+ Regras de nomenclatura:
+
+ `release/vNúmero-da-versão`
+
+
+
+
+- As branches do tipo **bugfix** são utilizadas para implementar soluções para bugs, encontrados através de testes realizados em releases específicas, na branch **release**. Isso significa que a branch **bugfix** deve ter a branch **release** como sua origem e fim.
+
+ Regras:
+
+ 1. Essa branch sempre é criada a partir da branch **release**.
+ 2. Essa branch sempre é mesclada na branch **release**.
+
+ Regras de nomenclatura:
+
+ `bugfix/issueID-titulo-da-issue`
+
+
+
+ A branch **hotfix** é utilizada para implementar soluções para problemas urgentes encontrados no ambiente de produção. Isso significa que essa branch deve ter a branch **master** como sua orgigem e fim.
+
+
+- Regras:
+
+ 1. Essa branch sempre é criada a partir da branch **master**.
+2. Essa branch sempre é mesclada à branch **master**.
+
+ Regras de nomenclatura:
+
+ `hotfix/issueID-titulo-da-issue`
+
+
+
+
+Observações: O título da issue utilizado no nome das branches deve ser mantido em português.
+
+
+ Imagens para ajudar a visualizar o fluxo de trabalho descrito:
+
+ ![](https://fpy.cz/pub/slides/git-workshop/images/gitflow.png)
+
+ ![](https://miro.medium.com/max/640/0*FTwKYpFGADX-5Y0O)
+
+## Políticas de Commits
+Commits devem ser escritos de forma clara e breve, em Inglês, descrevendo as alterações feitas.
+
+Regras para escrita das mensagens nos commits:
+
+```
+#issueID Mensagem breve descrevendo alterações
+
+Mensagem mais detalhada sobre o que foi feito neste commit. (Opcional)
+```
+
+É possível fechar uma issue automaticamente adicionando a palavra chave "Fix" antes do id da issue:
+
+`Fix #issueID Concise Message`
+
+O caractere "#", por padrão, representa uma linha de comentário no arquivo de mensagem do commit. Para evitar problemas, é necessário alterar o caractere com o seguinte comando:
+
+`git config --local core.commentChar auto`
+
+Caso deseje utilizar um outro caractere específico para definir uma linha de comentário, basta substituir a palavra "auto" pelo caractere desejado.
+
+A mensagem principal do commit deve ser escrita no modo imperativo. Aqui estão alguns exemplos:
+
+Maus exemplos:
+
+`Renamed the iVars and removed the common prefix.`
+
+`Creating branch policies document `
+
+Bons exemplos:
+
+`Rename the iVars to remove the common prefix. `
+
+`Create branch policies document`
+
+
+# Política de migrações
+
+As migrações criadas automaticamente pelo Django devem ser adicionadas nos commits dos desenvolvedores, exceto quando possuirem "_auto_" ou "_merge_" em seu nome.
+
+## Referências
+
+[Git-flow Applied to a Real Project](https://medium.com/empathyco/git-flow-applied-to-a-real-project-c08037e28f88)
+
+[Writing git commit message](https://365git.tumblr.com/post/3308646748/writing-git-commit-messages)
diff --git a/docs/postmortem.md b/docs/postmortem.md
new file mode 100644
index 0000000..0a2e618
--- /dev/null
+++ b/docs/postmortem.md
@@ -0,0 +1,34 @@
+# Post Mortem
+
+## Histórico de revisão
+
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 08/11/2019 | 0.1 | Criação da estrutura do documento | Fabíola |
+
+
+# Introdução
+
+Este documento é uma reflexão do time, realizada na fase de finalização do projeto, para concretizar as lições aprendidas e permitir que em projetos futuros similares possam ser facilitados.
+
+# Metologia e Processo
+
+
+# Tecnologias utilizadas
+
+# Arquitetura
+
+# Capacitação do Time
+
+
+# Entrega da R1
+
+# Escopo do projeto
+
+
+
+
+# Sentimentos da Equipe
+
+
+# Conclusão
\ No newline at end of file
diff --git a/docs/product_roadmap.md b/docs/product_roadmap.md
new file mode 100644
index 0000000..8e41b09
--- /dev/null
+++ b/docs/product_roadmap.md
@@ -0,0 +1,26 @@
+# Histórico de Revisão
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 01/10/2019 | 1.0 | Criação do roadmap | Fabíola |
+| 08/11/2019 | 2.0 | Atualização do roadmap e adição das histórias retiradas | Fabíola |
+
+
+## Roadmap do Produto 08/11
+
+Atualização do Roadmap, como ele consta durante a realização da Sprint 10.
+
+
+
+## Roadmap do Produto 01/10
+
+https://github.com/fga-eps-mds/2019.2-Acacia/projects/3
+
+
+
+
+
+## Histórias retiradas
+
+As histórias na imagem abaixo, embora consideradas pelo time como interessantes para que o produto completo, não entraram para o escopo durante o tempo da disciplina, que permite apenas a entregade de um Produto viável mínimo(MVP, sigla em inglês).
+
+
diff --git a/docs/project_charter.md b/docs/project_charter.md
new file mode 100644
index 0000000..44c92df
--- /dev/null
+++ b/docs/project_charter.md
@@ -0,0 +1,105 @@
+# Termo de abertura
+
+# Histórico de Revisão
+
+
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 04/09/2019 | 0.1 | Criação da versão inicial do documento | Fabíola |
+| 04/09/2019 | 0.2 | Atualização de custos e oportunidade de negócio | Fabíola |
+
+# 1. Introdução
+
+Este documento inicia formalmente o projeto do Sistema de Colheita Colaborativa. Nas próximas sessões são detalhados: o que este projeto visa realizar, a oportunidade de negócio identificada, o escopo de atuação, os envolvidos (*stakeholders*), características de riscos, restrições e de custos, entregáveis, prazos e as ferramentas utilizadas no processo de desenvolvimento. Tais descrições visam elucidar a viabilidade do projeto.
+
+# 2. Descrição do Projeto
+
+O projeto visa auxiliar no processo de Colheita Colaborativa em áreas urbanas, facilitando a relação entre proprietários de árvores frutíferas, voluntários para colheita e locais que possam receber doações destas frutas, visando então a diminuição do desperdício de comida. Ele é baseado em um sistema já existente, o [Saskatoon](https://github.com/tiagovaz/saskatoon) utilizado pelo coletivo [LES FRUITS DÉFENDUS](https://santropolroulant.org/en/what-is-the-roulant/collectives/fruits-defendus/) em Montreal.
+
+
+# 3. Propósito do Projeto
+
+Este projeto possui como objetivos:
+
+- Auxiliar na diminuição do desperdício de comida
+- Aumentar o acesso a comida local
+- Facilitar a disseminação de conhecimento de colheita e plantio de árvores frutíferas urbanas
+- Facilitar o conhecimento de feiras e troca de conhecimento entre produtores de agricultura familiar e urbana
+
+
+# 4. Oportunidade de Negócios
+
+No texto dos Objetivos de Desenvolvimento Sustentável (ODS) da [ONU](https://nacoesunidas.org/pos2015/agenda2030/) coloca-se a importância da erradicação da pobreza é um grande e importante desafio global para o desenvolvimento sustentável.
+
+Observa-se ainda, no [ODS 2](https://nacoesunidas.org/pos2015/ods2/) - Fome zero e Agricultura Sustentável a necessidade de: "*Acabar com a fome, alcançar a segurança alimentar e melhoria da nutrição e promover a agricultura sustentável* ". E, no [ODS 11] - Cidades e Comunidades sustentáveis(https://nacoesunidas.org/pos2015/ods11/), "Tornar as cidades e os assentamentos humanos inclusivos, seguros, resilientes e sustentáveis".
+
+Desta forma, uma das possíveis soluções é o fomento da agricultura urbana. A agricultura urbana permite a valorização de espaços limitados permitindo a construção de laços de vida comunitário por meio da produção de alimentos voltados para o autoconsumo, assim também diversificando a dieta de famílias. Desta forma, diminui-se os riscos de insegurança alimentar e nutricional e permite a comunidade desenvolver-se de forma sustentável e autogerida [1][2].
+
+
+O projeto [Saskatoon](https://github.com/tiagovaz/saskatoon) está inserido neste contexto da agricultura urbana, em Montreal. Embora a agricultura urbana seja também desenvolvida no Brasil, principalmente em áreas com populações socialmente marginalizadas [2], ainda não foi identificado pela equipe um produto que auxilie na gerência de colheita colaborativa ou distribuição de produtos agrícolas destes grupos ou para divulgação de feiras de produção familiar e troca de conhecimentos sobre plantio e colheita.
+
+# 5. Escopo do Projeto
+
+A plataforma que será desenvolvida será uma aplicação web responsiva, permitindo o uso assim em computadores e celulares que facilitará as colheitas, por meio de calendários com cadastro de plantios e datas de realização de colheita, bem como o registro de voluntários e seu gerenciamento, por meio de um responsável da colheita. Deve ainda permitir visualizações que sejam adequadas ao uso de coletivos e também facilitar a troca de conhecimento sobre agricultura urbana e a construção de comunidade em relação a tal atividade.
+
+# 6. Equipe e Papéis
+
+## 6.1. Envolvidos
+
+A equipe é compostas por alunos da disciplina de Métodos de Desenvolvimento de Software (MDS) e Engenharia de Produto de Software (EPS) responsáveis por diferentes papéis, sendo os membros de MDS alocados em papéis de desenvolvimento e os estudantes de EPS em papéis de gerência descritos a seguir em tabela.
+
+| Papel | Responsabilidade | Estudante |
+| :---: | :--------------: | :-----------: |
+| Desenvolvedor | O desenvolvedor tem como papel desenvolver, testar, garantir a qualidade e entrega do produto |Hugo Sobral de Lima Salomão, Durval Carvalho de Souza, João Pedro Silva de Carvalho, Leonardo da Silva Gomes, Renato Britto Araújo|
+| DevOps | Responsável pela configuração dos diferentes ambiente necessários do projetos tais como de desenvolvimento, de homologação e de produção, assim como automatização de testes, integração e deploy e entrega contínua. | Vitor Cardoso Xoteslem |
+| Arquiteto de Software | No contexto da disciplina, atuará de maneira a analisar se a arquitetura de microserviços é viável para o projeto e dará suporte para as atividades do DevOps. |Shayane Marques Alcântara|
+| Scrum Master | É um facilitador da equipe, responsável por retirar possíveis impedimentos que possam comprometer o andamento do projeto. |Martha Dantas Silva |
+| Product Owner | Responsável por passar a visão do produto para a equipe, assim como priorizar a ordem de desenvolvimento do sistema de acordo com as necessidades elicitadas. |Fabíola Malta Fleury |
+
+Além destes, existem outros envolvidos:
+
+ - Consultor de visão de produto: O mantenedor do projeto [Saskatoon](https://github.com/tiagovaz/saskatoon), Tiago Vaz, está familiarizado com o seu contexto e seus funcionários e está disponível para auxiliar no desenvolvimento do projeto, embora não possa participar presencialmente
+ - Professora: Possui como objetivo auxiliar o desenvolvimento do projeto para que os estudantes conheçam e pratiquem definições necessárias para o cumprimento do plano de ensino das disciplinas.
+
+## 6.2. Usuários
+
+| Nome| Descrição |
+| :---: | :-----------------------: |
+| Agricultores urbanos| Donos de plantações que disponibilizarão seu plantio para que seja realizada a colheita. |
+| Voluntários de colheita| Pessoas que disponibilizam ao menos duas horas para realizar a colheita.|
+|Líderes de colheita|Pessoas que já possuem experiência na colheita, são responsáveis pela escolha dos voluntários e trabalham em conjunto com eles.|
+|Beneficiários| Entidades que recebem a parcela da comida como doação|
+
+# 7. Metodologia de Desenvolvimento
+
+O processo do desenvolvimento deste projeto é baseado nas metodologias ágeis do Lean, Scrum e XP (eXtreme Programming). São utilizadas conforme o contexto da disciplina, com espaço para adaptações à necessidades da equipe.
+
+
+# 8. Prazo e Custo
+
+O projeto terá uma duração de um total de 16 sprints. A primeira sprint teve inicio no dia 13 de Agosto de 2019, de maneira que a última sprint será iniciada no dia 25 de novembro de 2019, totalizando 4 meses de duração de projeto. Durante esse período, haverão duas datas de entregas importantes, sendo elas denominadas releases. Uma ocorrerá na Sprint 7, que inicia-se dia 30 de setembro, enquanto outra ocorrerá na Sprint 16, a partir do dia 25 de novembro.
+
+
+O custo do projeto foi calculado utilizando os seguintes valores, em reais:
+
+| Nome | Custo | Quantidade | Custo Mensal | Custo Total |
+| :--: | :---: | :--------: | :----------: | :---------: |
+| Desenvolvedores Júnior | 3500 | 6 | 21.000 | 84.000|
+| Engenheiros de Produto | 6500 | 4 | 26.000 | 104.000 |
+| ΔRisco | 5.000 | - | 5.000 | 20.000 |
+| |||| 174.000|
+
+Os valores para os salários foram obtidos a partir de salários de pessoas que exercem cargos semelhantes em Brasília. O custo do risco é equivalente ao salário médio da equipe. Leva-se consideração ainda, além do custo, uma margem de lucro de 10%, totalizando então em **R$191.400,00** o custo do projeto.
+
+# 9. Estratégia de Comunicação
+
+Para comunicação interna da equipe são utilizados: o aplicativo Telegram, discord, aulas e reuniões presenciais.
+
+Para comunicação com outros envolvidos são utilizados e-mails, o github e telegram.
+
+
+# Referências
+
+[1] ALMEIDA, Daniela. Agricultura urbana e segurança alimentar em Belo Horizonte: cultivando uma cidade sustentável. **Revista Agriculturas: experiencias em agroecologia.**, v. 1, p. 25-28, 2004.
+
+[2] AQUINO, Adriana María de; ASSIS, Renato Linhares de. Agricultura orgânica em áreas urbanas e periurbanas com base na agroecologia. **Ambiente & sociedade**, v. 10, n. 1, p. 137-150, 2007.
diff --git a/docs/project_methodology.md b/docs/project_methodology.md
new file mode 100644
index 0000000..8e69baf
--- /dev/null
+++ b/docs/project_methodology.md
@@ -0,0 +1,126 @@
+# Plano de Metodologia e Processos
+
+## Histórico de Versão
+
+| Data | Versão | Descrição | Autor(es) |
+| :--: | :----: | :-------: | :-------: |
+| 03/09/2019 | 0.1 | Abertura do Documento | Martha Dantas |
+| 03/09/2019 | 0.1.1 | Descrição do conteúdo e estrutura do documento | Martha Dantas |
+| 05/09/2019 | 0.2 | Definição dos processos e metodologias| Martha Dantas |
+| 05/09/2019 | 0.3 | Esplanação de como equipe utilizará metodologias e processos | Martha Dantas |
+| 06/09/2019 | 0.4 | Inclusão do plano de gamificação e do BCP | Martha Dantas |
+| 07/09/2019 | 0.5 | inclusão do plano de comunicação e revisão dos tópicos ja existentes | Martha Dantas |
+| 07/09/2019 | 0.6 | Descrição de extreme programming e das tecnicas de gamificação e interação entre a equipe | Martha Dantas |
+| 07/09/2019 | 1.0 | inclusão do plano de Estimativa das issues do projeto | Martha Dantas |
+| 25/09/2019 | 1.2 | Corrigindo erros | Martha Dantas |
+| 05/10/2019 | 1.3 | Adicionando modificaçoes na forma de trabalho | Martha Dantas |
+
+## 1. Introdução
+
+Esse documento é responsável por elicitar e descrever todas as metodologias e processos que serão utilizadas ao longo da execução do projeto.
+
+## 2. Metodologias
+
+A combinação das metodologias aqui presentes, tem como objetivo construir um processo de desenvolvimento de software consistente e ágil. Estando atentos ao manifesto Ágil - "Indivíduos e interações mais que processos e ferramentas" [Manifesto Ágil](https://www.manifestoagil.com.br) - o nosso plano não busca seguir metodologias à risca e sim se valer de adaptações que melhor de adequam a equipe.
+
+### 2.1 Scrum
+> "É um framework no qual as pessoas podem lidar com problemas complexos e, ao mesmo tempo, fornecer produtos de maneira mais criativa e produtiva."[ScrumGuides, 2019](https://scrumguides.org/scrum-guide.html)
+
+#### 2.1.1 Product Backlog
+Artefato que contém as funcionalidade desejadas, sendo este passível de modificação a qualquer etapa do processo.
+
+#### 2.1.2 Pápeis
+
+- Developers: Development Team ou time de desenvolvimento, em português, são os profissionais responsáveis por desenvolver e testar as funcionalidades do produto de software.
+- Product Owner: É o responsável por manter em foco o valor agregado do produto de software sob o olhar dos stakeholders. Decide prioridades de implementação com base nos interessados(stakeholders).
+- Scrum Master: É o responsável por líderar a equipe durante o processo de desenvolvimento do produto de software. Cuida para que toda equipe siga os, pré definidos ,processos e metodologias e que esses estejam adaptados as necessidades da equipe.
+
+ Nossa equipe utilizara os papéis do Scrum acrescentando mais dois papéis. São estes:
+ - DevOps: Responsável por manter o projeto nas diretrizes da cultura devops e tomar decisoes que garatem que o ambiente desevolvimento esteja também sob essas diretrizes.
+ - Architect: Responsável por desenhar a arquitetura do projeto e definir as tecnologias que melhor se amplicam ao nosso contexto.
+
+#### 2.1.3 Sprints
+
+- Sprint: No Scrum "sprint" é como chamamos uma iteração no processo de desenvolvimento. Geralmente tem duração de uma semana ou no máximo um mês, podendo ser adaptável as necessidades da equipe.
+- Sprint Backlog: Artefato gerado sempre no início de uma nova iteração. Contém as tarefas que serão realizadas durante esta nova iteração.
+- Sprint Planning: Reunião onde é feito o planejamento estrátegico e a definição dos objetivos de uma nova sprint, ou seja, de uma nova iteração, nela é criado o artefato sprint backlog citado à cima.
+- Sprint Review: Realizada no final de cada sprint para mostrar o que foi alcançado e avaliar a relação entre o que está sendo desenvolvido e os objetivos da sprint.
+- Sprint Retrospective:Ocorre ao final de cada sprint, assim como a sprint review. Tem objetivo de cumprir manter o pilar de inspeção do scrum, nela são avaliados os pontos positivos e negativos da sprint que se finalizou. As informações coletadas norteiam a equipe para um melhoramento de seu processo de desenvolvimento.
+
+#### 2.1.4 Time-Box
+
+> "É um conceito que diz que a quantidade de tempo (horas ou dias, o que depende das unidades sendo utilizadas para um determinado projeto) é imutável, ou seja, a quantidade de horas não poderá aumentar caso algum problema ou novo requisito seja identificado." [PortalEducação, 2019](https://www.portaleducacao.com.br/conteudo/artigos/informatica/timebox-projeto-scrum/40658)
+
+Está descrito a baixo o time-box definido pela equipe desenvolvimento deste projeto:
+- Daily - 15 minutos
+- Sprint - 1 semana.
+ - Inicio: Segunda
+ - Fim: Sábado
+- Sprint Planning - 2hrs, considerando a proporção de tempo recomendado para equipes com sprints de 4 semana que é de 8hrs.
+- Sprint Review e Sprint Retrospective: 30 minutos cada uma.
+
+Obs.: O time-box pode ser modificado a qualquer momento para atender as necessidades da equipe.
+
+### 2.2 Kanban
+"Em administração da produção, kanban é um cartão de sinalização que controla os fluxos de produção ou transportes em uma indústria."[Wikipédia, 2019](https://pt.wikipedia.org/wiki/Kanban#Scrum_e_Kanban)
+
+Para nos o kanban será um cartão de sinalização que possuirá os seguintes quadros:
+- Project Backlog: Lista de todas as funcionalidades do projeto
+- Sprint Backlog: Lista das funcionalidade que serão implemntadas na sprint atual
+- To Do: Lista de funcionalidades que devem ser feitas
+- In Progress: Lista de funcionalidade que estão sendo desenvolvidas
+- Review: Lista de funcionalidades que devem ser revisadas
+- In Test: Lista de funcionalidades que devem ser testadas
+- Done: Lista de funcionalidades já desenvolvidas
+
+### 2.3 eXtreme Programming
+> "Extreme Programming (XP) é uma estrutura de desenvolvimento de software ágil que visa produzir software de maior qualidade e maior qualidade de vida para a equipe de desenvolvimento."[Agile Aliance]( https://www.agilealliance.org)
+
+Serão utilizados pela equipe as seguintes práticas:
+- Small Realeases - Pequenas entregas
+- Testing - Cobertura de código testado de 90%
+- Refactoing - Existência de uma sprint de refatoração a cada 3 sprints
+- Pair Programing - Programação em pares com rotatividades para gestão do conhecimento
+- Coding Standard: Padronização do código com folha de estilo.
+
+## 3. Plano de Comunicação
+ o Plano de Comunicação vem para assegurar que as exista uma comunicação transparente entre a equipe, bem como documentar e organizar o conjunto de informações que a equipe gera durante todo o processo. Para que isto seja possível utilizaremos algumas ferramentar, tais como:
+ - Discord - dailys remotas
+ - Telegram - diálogo diaŕio e decisoes de baixo impacto
+ - Drive - informações da equipe e insumos para viabilizar o projeto
+ - Github- armazenamento de código fonte, transparência na realização de tarefas,documentação de iterações
+
+## 4. Gamificação e a Interação entre Membros
+> "Gamificação é a utilização de técnicas de design de jogos para incentivar produtividade e/ou mudanças de comportamento."
+
+Visando manter a produtividade, o Colaborativismo e a melhoria continua da relação entre membros a equipe utilizará de tecnicas de gamificação, tais como:
+
+- Sharing Knowledge: Incentivar compartilhamento de conhecimento.
+- Certificates: Reconhecimento atráves de certificados, medalhas e etc.
+
+Vale lembrar que algumas dessas tecnicas serão intrisicamente aplicadas pela equipe gestora.
+
+Obs.: As tecnicas foram escolhidas com base no perfil que foi traçado da equipe. Essa informação pode ser encontrada [aqui](https://docs.google.com/spreadsheets/d/1temwG93TrqvCTuy1u52Qbi-JIHFtpjNwILdbRSehMHg/edit?usp=sharing).
+
+## 5. Referências
+
+Manifesto Ágil. Disponível em: https://www.manifestoagil.com.br/
+
+Metodologia Scrum. Disponível em: https://www.desenvolvimentoagil.com.br
+
+Scrum Guides. Disponível em: https://scrumguides.org/scrum-guide.html
+
+Bartle, R. a. (1999). Players Who Suit MUDs. Retrieved March 22, 2015, from http://mud.co.uk/richard/hcds.htm
+
+Ryan, R. M., & Deci, E. L. (2000). Self-determination theory and the facilitation of intrinsic motivation, social development, and well-being. The American Psychologist, 55, 68–78. http://doi.org/10.1037/0003-066X.55.1.68
+
+Pink, D. H. (2009). Drive: The surprising truth about what motivates us. Distribution (p. 256). Canongate. Most of the icons are available at game-icons.net. For more information, check the icons accreditation info here.
+
+Sigmund, K., & Hauert, C. (2002). Altruism. Current Biology. https://doi.org/10.1016/S0960-9822(02)00797-2
+
+Extreme Programing Glossary. Disponível em: https://www.agilealliance.org
+
+When should Extreme Programming be Used?. Disponível em: http://www.extremeprogramming.org
+
+What is Extreme Programming?. Disponível em: https://ronjeffries.com/xprog/what-is-extreme-programming/
+
diff --git a/docs/prototype.md b/docs/prototype.md
new file mode 100644
index 0000000..8479148
--- /dev/null
+++ b/docs/prototype.md
@@ -0,0 +1,65 @@
+# Histórico de Revisão
+
+
+|Data|Versão|Modificação|Autor|
+|:--:|:--:|:--:|:--:|
+|06/09/2019|0.1|Criação da estrutura do documento|Leonardo da Silva Gomes|
+|07/09/2019|0.2|Adição dos tópicos Introdução e Protótipo de Baixa Fidelidade|Leonardo da Silva Gomes|
+|07/09/2019|0.3|Adição do fluxo de usuário|João Pedro Silva de Carvalho|
+|07/09/2019|0.4|Revisão da estrutura|Leonardo da Silva Gomes e João Pedro Silva de Carvalho|
+|07/09/2019|0.5|Adição do tópico tela|Leonardo da Silva Gomes|
+|07/09/2019|0.6|Revisão do tópico Tela|João Pedro Silva de Carvalho|
+|12/09/2019|0.7|Adição da nova versão das telas para o Protótipo de Baixa Fidelidade|Hugo Sobral de Lima Salomão|
+|10/09/2019|0.8|Atualização do fluxo de usuário| João Pedro Silva de Carvalho|
+|12/09/2019|0.8.1|Revisão|Leonardo da Silva Gomes|
+
+
+## 1.Introdução
+
+Este documento contemplará as informações acerca dos protótipos de baixa e alta fidelidade, criados para a construção da aplicação para colheita colaborativa.
+
+## 2.Protótipo de Baixa Fidelidade
+
+O protótipo de baixa fidelidade tem um viés de desenvolver estratégias e sintetizar ideias do grupo, para definir a interação do usuário com o projeto e a base da futura visualização da aplicação.
+
+Os protótipos a seguir foram desenvolvidos a partir de vários outros criados pelo grupo, com o intuito de deliberar ideias entre os membros. Com isso, foram geradas 3 versões preliminares do protótipo de baixa fidelidade:
+
+- [Versão 1](https://github.com/fga-eps-mds/2019.2-TimeBolinho/issues/18#issuecomment-527721682)
+- [Versão 2.1](https://github.com/fga-eps-mds/2019.2-TimeBolinho/issues/18#issuecomment-528601858)
+- [Versão 2.2](https://github.com/fga-eps-mds/2019.2-TimeBolinho/issues/18#issuecomment-528914791)
+- [Versão 3](https://github.com/fga-eps-mds/2019.2-TimeBolinho/issues/18#issuecomment-530608104)
+
+### 2.1 Fluxo de usuário
+![Fluxo de usuário](img/identidade/LowFidelityPrototype.png)
+
+### 2.2 Telas
+
+#### 2.2.1 Dashbord
+
+Essa tela será responsável por conter uma lista de colheitas cadastradas. Os usuários já autenticados poderão ver um calendário semanal, que mostrará as colheitas que irão ocorrer na semana e uma lista das quais ainda pode ingressar.
+
+#### 2.2.2 Harvest screen
+
+Ao clicar em uma colheita para saber mais detalhes, essa página será aberta e nela conterá as informações: imagem, data, proprietário e líder. Para pessoas que já se cadastraram na colheita, haverá um chat para voluntários e organizadores e aparecerá as regras e as respectivas necessidades (guidelines).
+
+#### 2.2.3 Harvest data
+
+Nesta página ficará disponível informações gerais sobre as colheitas: dados, scoreboard entre proprietários e líderes, relatos, e um overview do projeto.
+
+#### 2.2.4 Calendário
+
+Esta é a tela responsável por mostrar ao usuário, as colheitas que foram cadastradas para determinado período de tempo, por meio de marcações em datas.
+
+#### 2.2.5 Desenhos
+
+Os resultados das reuniões e discussões acerca das telas da aplicação estão contidos nos próximos desenhos, feitos em papel.
+
+![LowFidelityScreen1](img/identidade/LowFidelityPrototypeScreens_1.png)
+
+![LowFidelityScreen2](img/identidade/LowFidelityPrototypeScreens_2.png)
+
+
+
+## 3.Protótipo de Alta Fidelidade
+
+
diff --git a/docs/sprints/sprint_0.md b/docs/sprints/sprint_0.md
new file mode 100644
index 0000000..2e48e32
--- /dev/null
+++ b/docs/sprints/sprint_0.md
@@ -0,0 +1,22 @@
+# Planning da Sprint 0
+
+- Período : 12/08 a 31/08
+
+- Objetivo: Essa sprint teve um tempo de duração atipico pois tinha como objetivo várias questões cruciais para o desenvolvimento do projeto. Tais como:
+ - Escolha do Tema;
+ - Capacitação dos membros;
+ - Estratégia de negócio.
+
+## Issues
+ID | Descrição
+---|----------
+#1 | Treinamento de Git/Github e Metodologia Ágil
+#2 | Treinamento em Docker
+#10| Treinamento em HTML e CSS
+#21| Decidir estratégias de negócio
+
+Obs.: Em virtude dessa ser a sprint 0 não foram feitos alguns rituais ágeis. Tais como pontuação das issues, review e restrospectiva.
+
+
+
+
diff --git a/docs/sprints/sprint_1.md b/docs/sprints/sprint_1.md
new file mode 100644
index 0000000..a298d8d
--- /dev/null
+++ b/docs/sprints/sprint_1.md
@@ -0,0 +1,62 @@
+# Planning da Sprint 1
+
+- Período : 02/09 a 07/09
+
+- Objetivo: Entender o dominio do projeto e amadurecer o entendimento do seu escopo. Também tivemos como objetivo familiarizar os membros com a metodologia Scrum e nossa integração como time.
+
+## Issues
+ID | Descrição | Estimativa | Label
+---|-----------|------------|-------
+#4 | Criar o Termo de Abertura do Projeto (TAP) | 2 | EPS
+#9 | Definir processo do projeto | 5 | EPS
+#15| Criar documento de visão | 13 | MDS
+#18| Criar protótipo de baixa fidelidade | 5 | MDS
+#19| Criar a Estrutura Analítica do Projeto | 8 | EPS
+#20| Definir as Tecnologias da Arquitetura | 8 | EPS
+
+ - Total de pontos: 41pts.
+ - Total de pontos entregues: 31pts.
+
+# Review
+
+- Objetivo Alcançado? Sim. Os feedbacks da equipe demonstrou que estavamos alinhados a respeito do objetivo dessa sprint e que conseguimos cumprí - lo.
+
+- Estimativa correta? A estimativa das issues não foram condigentes com seu real esforço. Em suma estimamos menos esforço do que foi necessário.
+
+- Tarefas bem distribuidas? Não. As tarefas não foram bem distribuidas em MDS o que gerou um sobrecargo em alguns membros.
+
+## Qualidade do Trabalho Entregue
+
+Segundo a equipe a qualidade entregue foi de 3,67 considerando a escala de likert com os valores de 1 a 5.
+
+# Retrospectiva
+
+## Pontos Positivos
+- Comunuicação por issues
+- Bom entendimento da solução a ser desenvolvida
+- Gitflow posto em prática
+- Bom uso do kanban
+
+## Pontos Negativos
+- Pouca proatividade(MDS)
+- Membro sobrecarregado(Durval- MDS
+- Desevolvedor Thiago não poderá ajudar a equipe
+- Atraso paras as dailys
+
+
+## Pontos de Melhoria
+- Manter foco durante a daily
+- Melhorar a comunicação entre MDS e Product Owner
+- Melhorar as descrições das issues
+- melhorar a organização de tarefas em grupo
+- Não utilizar papel na Review e Retrospectiva
+
+
+# Quadro de Conhecimento
+![](../img/gerenciamento/sprint1.jpg)
+
+
+## Análise da Scrum Master
+
+A equipe ainda está se adaptando ao ritmo de trabalho então apesar de termos alcançado nosso objetivo os meios para tal foram em si bastante trabalhosos. A equipe se mostra animada mas pouco proátiva. Acredito que a falta de proátividade se dá pelo fator de toda metodologia de trabalho ser algo novo.
+
diff --git a/docs/sprints/sprint_2.md b/docs/sprints/sprint_2.md
new file mode 100644
index 0000000..6b44c36
--- /dev/null
+++ b/docs/sprints/sprint_2.md
@@ -0,0 +1,60 @@
+# Planning da Sprint 2
+
+- Período : 09/09 a 14/09
+
+- Objetivo: Construir o esboço da solução em software do projeto e preparar o caminho para a implementação dessa solução.
+
+## Issues
+ID | Descrição | Estimativa | Label
+---|-----------|------------|-------
+#18| Criar protótipo de baixa fidelidade | 5 | MDS
+#22| Configurar ambiente de desenvolvimento | 13 | EPS
+#24| Definir Indicadores e Métricas | 8 | EPS
+#35| Criar Guia de Estilo | 8 | MDS
+#37| Elaborar documento de arquitetura | 8 | MDS
+
+ - Total de pontos: 42pts.
+ - Total de pontos entregues: 34pts.
+
+# Review
+
+- Objetivo Alcançado? Não. A equipe demonstrou dificuldade em entender como se daria a solução em diversos niveis de abstração.
+
+- Estimativa correta? A estimativa das issues não foram condigentes com seu real esforço. Em suma estimamos menos esforço do que foi necessário.
+
+- Tarefas bem distribuidas? Não. Apesar de termos feito uma divisão de trabalho ela se mostrou menos eficiente do que o esperado.
+
+## Qualidade do Trabalho Entregue
+
+Segundo a equipe a qualidade entregue foi de 4,7 considerando a escala de likert com os valores de 1 a 5. Apesar de não termos alcançado nosso objetivo a equipe considerou que o esforço gerou insumos com qualidade para conseguirmos cumprí -lo posteriormente.
+
+# Retrospectiva
+
+## Pontos Positivos
+ - Boa comunicação entre a equipe
+ - Aprendizado da equipe
+ - Atrasados lembraram de trazer chocolate
+
+## Pontos Negativos
+ - Auto confiança excessiva de EPS
+ - MDS não leram a descrição das issues
+ - Durval sobrecarregado
+ - Divisão ineficiente de tarefas
+ - Atrasos nas dailys (Membros chegando atrasados)
+ - Dificuldade em manter um debate saudável (MDS)
+
+## pontos de Melhoria
+- Diminuir o tempo gasto com reunioes
+- Dividir melhoras as tarefas
+
+# Quadro de Conhecimento
+![](../img/gerenciamento/sprint2.jpg)
+
+## Análise da Scrum Master
+
+Essa foi até então a sprint mais pesada para os membros de mds. Eles tiveram que aprofundar seus conhecimentos nas diversas areas que compõem um desenvolvimento, o que causou estranheza e confusão. Entretanto ao fechamento da sprint, apesar de não termos alcançado nosso objetivo, eles se mostram mais orientados quanto a que norte seguir e mais entendidos dos diversos niveis de abstração de um produto de software.
+
+
+
+
+
diff --git a/docs/sprints/sprint_3.md b/docs/sprints/sprint_3.md
new file mode 100644
index 0000000..0be4ee7
--- /dev/null
+++ b/docs/sprints/sprint_3.md
@@ -0,0 +1,66 @@
+# Planning da Sprint 3
+
+- Período : 16/09 a 21/09
+
+- Objetivo: Concretização da visão de produto.
+
+## Issues
+|ID | Descrição | Estimativa | Label
+|---|-----------|------------|-------
+| #17 | Criar o perfil de comunidade Open Source do projeto | 5 | EPS |
+| #23 | Definir ferramentas de testes | 8 | EPS|
+| #36 | Treinamento em Vue | 1 | EPS |
+| #39 | Elaborar o quadro de modelo de negócios (Canvas)| 5 |EPS|
+| #45| Documentação da Sprint 1| 5 | EPS|
+| #46 | Documentação da Sprint 2| 5 | EPS|
+| #50 |Criar protótipo de alta fidelidade versão mobile| 13 |MDS|
+
+ - Total de pontos: 42pts.
+ - Total de pontos entregues: x pts.
+
+### Dívidas técnicas alocadas
+
+Dívidas técnicas repontuadas
+
+|ID | Descrição | Estimativa | Label|
+|---|-----------|------------|-------|
+| #30 |Gerenciar risco da entrada de um novo membro | 1| EPS|
+| #37 |Elaborar documento de arquitetura| 8 | MDS |
+
+# Possíveis riscos mapeados para a sprint
+
+
+
+# Review
+Houve perca de resgistros.
+
+
+## Qualidade do Trabalho Entregue
+Houve perca de resgistros.
+
+
+## Velocity
+
+
+
+
+# Retrospectiva
+
+## Pontos Positivos
+Houve perca de resgistros.
+
+## Pontos Negativos
+Houve perca de resgistros.
+
+## Pontos de Melhoria
+Houve perca de resgistros.
+
+# Quadro de Conhecimento
+
+
+
+
+
+
+
+
diff --git a/docs/sprints/sprint_4.md b/docs/sprints/sprint_4.md
new file mode 100644
index 0000000..269a3b3
--- /dev/null
+++ b/docs/sprints/sprint_4.md
@@ -0,0 +1,108 @@
+# Sprint 4
+
+## Histórico de revisão
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 02/10/2019 | 0.1 | Adição do planejamento | Fabíola |
+| 02/10/2019 | 0.2 | Adição da Retrospectiva e Revisão | Shayane |
+| 05/10/2019 | 1.0 | Finalizando documento e arrumando imagens | Martha Dantas |
+
+# Planning da Sprint 4
+
+- Período : 23/09 a 28/09
+
+- Objetivo: Fechamento da Viabilidade técnica e início do desenvolvimento do produto.
+
+## Issues
+ID | Descrição | Estimativa | Label
+---|-----------|------------|-------
+#58 | Preparar apresentação da Release 1 | 5 | EPS
+#56 | Criar histórias de usuário | 8 | EPS
+#47 | Configurar integração contínua | 20 | EPS
+#43 | Cadastro de Usuário | 40| MDS
+#44 | Autenticação de Usuário | 20 | MDS
+
+
+# Dívida alocada
+ID | Descrição | Estimativa | Label
+---|-----------|------------|-------
+#9 | Definir processo do projeto| 2 | EPS
+
+ - Total de pontos: 93pts.
+ - Total de pontos entregues: 35pts.
+
+ # Possíveis riscos mapeados para a sprint
+
+
+
+
+
+# Review
+
+- Objetivo Alcançado? Não. A equipe demonstrou dificuldade em entender como se daria a solução em diversos niveis de abstração.
+
+- Estimativa correta? A estimativa das issues de codificação nesta sprint foi baseada na complexidade (BCP). Em geral, ela mostrou-se condizente com seu real esforço.
+
+- Tarefas bem distribuidas? Sim. Houve uma tentativa de modificação do processo de pareamento, com o objetivo de inclusão de todos os membros.
+
+## Qualidade do Trabalho Entregue
+
+Segundo a equipe a qualidade entregue foi de 3.9 considerando a escala de likert com os valores de 1 a 5.
+
+![review e qualidade](../img/gerenciamento/review_quality4.jpg)
+
+## Velocity
+
+![eap](../img/gerenciamento/velocity4.png)
+
+# Retrospectiva
+
+## Pontos Positivos
+ - Semana universitária pode proporcionar aprendizado e entendimento em relação às tecnologias.
+ - Comunicação nas issues.
+ - Pareamento/Reuniões mais eficientes.
+ - Compromisso do grupo.
+ - Aprendizado sobre Django.
+ - Colaboração entre os membros/Trabalho em equipe.
+ - Animação de MDS.
+ - A equipe soube transpor as dificuldades.
+ - Pareamento devops e arquiteta.
+
+## Pontos Negativos
+ - Níveis de conhecimento variáveis entre os membros da equipe.
+ - Pareamento não funcionou/não ocorreu entre MDS.
+ - Organização entre o grupo como um todo/Scrum Master desorganizada.
+ - Falta de conhecimento sobre Vue.
+ - Comunicação não tão constante.
+ - Muitos pontos, não entregando todas as issues.
+ - Impaciência de MDS.
+ - Ausência nas dailies.
+ - Desconhecimento das dependências das issues.
+
+## Pontos de Melhoria
+ - Comunicação.
+ - Dojos de Django Rest.
+ - Processo de revisão de PR não muito claro.
+ - Conhecimento da equipe em BCP (Business Complexity Points).
+ - Praticar mais o pareamento e organização dos membros para tal prática.
+ - Planejamento da sprint.
+ - Planejamento para o pareamento de MDS.
+
+# Quadro de Conhecimento
+
+![quadro](../img/gerenciamento/quadro4.png)
+
+# Squad Health Check
+
+Não foi realizado em detrimento de falta de tempo.
+
+# Análise da Scrum Master
+
+Em suma a sprint 4 aponto diversos equivocos em gereciamento de projeto que estamos cometendo, a comunicação entre a equipe de desenvolvimento e a equipe de gerenciamento se mostrou nebulosa. A analisarmos a sprint ficou perceptível que superestimamos o conhecimento do time de desenvolvimento quanto as metodologias de trabalho que estamos usando.
+
+
+
+
+
+
+
diff --git a/docs/sprints/sprint_5.md b/docs/sprints/sprint_5.md
new file mode 100644
index 0000000..eb35109
--- /dev/null
+++ b/docs/sprints/sprint_5.md
@@ -0,0 +1,102 @@
+# Sprint 5
+
+## Histórico de revisão
+
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 05/10/2019 | 0.1 | Criação do documento | Fabíola |
+| 18/10/2019 | 0.2 | Correções e adição da análise | Fabíola |
+| 18/10/2019 | 0.3 | Adição da análise do scrum master | Shayane |
+
+# Planning da Sprint 5
+
+- Período : 30/09 a 05/10
+
+- Objetivo: Melhorias de artefatos e preparação para Release 1.
+
+## Issues
+
+ID | Descrição | Estimativa | Label
+---|-----------|------------|-------
+#90 | Criar release | 3 | EPS
+#89 | Refatorar Documentação de Metricas e Indicadores | 2 | EPS
+#88 | Melhoria do documento de metodologia | 1 | EPS
+#86 | Documentação da Sprint 4 | 5| EPS
+#87 | Documentação da Sprint 3 | 5 | EPS
+#92 | Refatorar documentação das sprints passadas| 3| EPS
+#91 | Melhoria do github pages | 8 | EPS |
+#64 | Treinar apresentação para R1 | 5 | EPS e MDS|
+#93 | Refatorar requisitos no documento de visão | 5 | MDS|
+#85 | Melhoria do diagrama de classes| 5 | MDS|
+
+
+# Dívida alocada
+
+ID | Descrição | Estimativa | Label
+---|-----------|------------|-------
+#43 | Cadastro de Usuário| 23 | MDS
+#44 | Autenticação de Usuário| 20| MDS |
+
+ - Total de pontos planejados: 42pts (mais 43 pts de dívida).
+ - Total de pontos entregues: 75pts.
+
+
+# Gerência de Riscos
+
+![riscos das sprints](../img/gerenciamento/risk5.png)
+
+![burndown de riscos](../img/gerenciamento/burn5.png)
+
+Alguns riscos se concretizaram, a equipe não realizou ações para tentar evitá-los:
+ - O conhecimento continuou concetrado;
+ - Houveram problemas na configuração do ambiente, porém foram corrigidos durante a sprint;
+ - A equipe ainda não tem uma visão alinhada sobre o produto;
+
+Alguns membros tinham provas, mas mesmo assim não comprometeu o trabalho da equipe.
+
+# Review
+
+- Objetivo Alcançado? Sim, equipe teve uma visão alinhada do objetivo da sprint e a maioria das histórias foram entregues.
+
+- Estimativa correta? Sim, embora a maioria dos pontos tenham sido entregues ao final da sprint, o que pode indicar tanta a falta de trabalho constante da equipe quanto histórias muito complexas, que não estão sendo divididas em tarefas menores.
+
+- Tarefas bem distribuidas? Alguns membros relataram que terminaram suas tarefas muito rapidamente e não tiveram mais no que trabalhar. A maioria conseguiu trabalhar em suas tarefas sem grandes problemas.
+
+## Qualidade do Trabalho Entregue
+
+Segundo a equipe a qualidade entregue foi de 3.85 considerando a escala de likert com os valores de 1 a 5.
+
+![review e qualidade](../img/gerenciamento/review5.jpg)
+
+## Velocity
+
+![velocity](../img/gerenciamento/velocity5.png)
+
+# Retrospectiva
+
+
+![agil](../img/gerenciamento/retro5.png)
+
+# Práticas ágeis
+
+![agil](../img/gerenciamento/agil5.png)
+
+
+# Quadro de Conhecimento
+
+![quadro](../img/gerenciamento/conhecimento5.png)
+
+# Squad Health Check
+
+![health](../img/gerenciamento/health5.png)
+
+# Análise da Scrum Master
+
+Esta sprint foi prioritariamente de refatoração para preparação para a Release 1. Alguns riscos se concretizaram, como dependência entre atividades, envio de PR em cima da hora e concentração do conhecimento, porém sem ação suficiente para tratá-los. Sobre a qualidade de entrega das issues, notou-se um aumento do índice. Sobre a produtividade, alguns membros se sentiram ociosos durante a semana. Pode-se aliar essa afirmação ao fato de ser uma sprint de refatoração, então o esforço não pareceu ser considerado tão alto para a equipe. Em relação a um ponto crucial que afeta a equipe, está na concentração de conhecimento e más práticas no pareamento que mostrou ser um fator de grande estresse entre os membros do grupo e ações corretivas estão sendo pensadas para contornar isso.
+
+
+
+
+
+
+
diff --git a/docs/sprints/sprint_6.md b/docs/sprints/sprint_6.md
new file mode 100644
index 0000000..15142bf
--- /dev/null
+++ b/docs/sprints/sprint_6.md
@@ -0,0 +1,91 @@
+# Sprint 6
+
+## Histórico de revisão
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 12/10/2019 | 0.1 | Adição do planejamento | Fabíola |
+| 15/10/2019 | 0.2 | Adição da Qualidade do Trabalho, práticas ágeis, quadro de conhecimento, health check, review e velocity | Shayane |
+| 18/10/2019 | 0.2 | Pequenas correções, adição da análise e da retrospectiva | Fabíola |
+
+# Planning da Sprint 6
+
+- Período : 07/10 a 12/10
+
+- Objetivo: Desenvolvimento do produto e automatização de processos de desenvolvimento.
+
+## Issues
+
+| ID | Descrição | Estimativa | Label |
+| ---|-----------|------------|-------|
+| #79 | Configurar ambiente de homologação | 20 | EPS |
+| #105 | Documentação da Sprint 5 | 5 | EPS |
+| #40 | Internacionalização do produto | 8 | MDS |
+| #73 | Atualizar perfil do Usuário | 38 | MDS |
+| #66 | Cadastrar propriedade| 56 | MDS |
+| #93 | Refatorar requisitos no documento de visão | 1 | MDS |
+
+# Dívida alocada
+
+ID | Descrição | Estimativa | Label|
+---|-----------|------------|-------|
+| #79 | Configurar ambiente de homologação | 20 | EPS |
+| #105 | Documentação da Sprint 5 | 5 | EPS |
+| #40 | Internacionalização do produto | 8 | MDS |
+| #73 | Atualizar perfil do Usuário | 38 | MDS |
+| #66 | Cadastrar propriedade| 56 | MDS |
+
+ - Total de pontos planejados: 127pts (mais 1 pts de dívida).
+ - Total de pontos entregues: 1pts.
+
+ # Possíveis riscos mapeados para a sprint
+
+![risk](../img/gerenciamento/risks6.png)
+![burn](../img/gerenciamento/burn6.png")
+
+# Review
+
+- Objetivo Alcançado? Não. Apesar da equipe ter entendido como se daria a solução, por diversos motivos como falta de tempo, não houve a conclusão da maioria das issues desta sprint.
+
+- Estimativa correta? A estimativa das issues de codificação foi baseada na complexidade (BCP). A estimativa BCP pareceu não ser suficiente para o atual estado da equipe de desenvolvimento, por se tratar de complexidade. As issues técnicas com estimativa de pontuação por Fibonacci refletiram no esforço já previsto.
+
+- Tarefas bem distribuidas? Não. Houve a tentativa de modificação do processo de pareamento, com o objetivo de inclusão de todos os membros, em relação aos membros de EPS. Logo, foi segregada uma dupla para a realização dos testes no backend, mas esta ação gerou dependência e ociosidade durante a semana. Em relação às escolhas de pareamentos, o foco deu-se no nível de conhecimento entre os membros.
+
+
+## Qualidade do Trabalho Entregue
+
+Segundo a equipe a qualidade entregue foi de **3.05** considerando a escala de likert com os valores de 1 a 5.
+
+![review e qualidade](../img/gerenciamento/review6.png)
+
+## Velocity
+
+![velocity](../img/gerenciamento/velocity6.png)
+
+# Retrospectiva
+
+Segue imagem com todos as questões levantadas durante a retrospectiva.
+
+![retrospectiva](../img/gerenciamento/retrospective6.png)
+
+
+Como um ponto que foi discutido e trazido diversas vezes, a "Motivação para o projeto indefinida" a equipe questionou a falta de entendimento do contexto dos usuários e o distanciamento em relação a ele. Para amenizar o problema e ter uma discussão mais direcionada, foi construído um mapa de empatia em equipe, traçando o perfil de um proprietário de uma colheita, tendo como resultado a imagem a seguir.
+
+![empatia](../img/gerenciamento/empatia.png)
+
+
+# Práticas ágeis
+
+![prática-agil](../img/gerenciamento/agil6.png)
+
+# Quadro de Conhecimento
+
+![quadro](../img/gerenciamento/conhecimento6.png)
+
+# Squad Health Check
+
+![health](../img/gerenciamento/health6.png)>
+
+# Análise da Scrum Master
+
+Repetiu-se nessa sprint o não mapeamento de tarefas que estavam realizadas. Com a release 1 marcada para o meio da sprint, os membros de MDS utilizaram de tempo para realização de ensaios, o que não ficou registrado. Durante a sprint a Scrum Master teve que se afastar por problemas de saúde. Algumas tarefas, como a "Configuração do ambiente de homologação" eram tarefas muito grandes, que poderiam ter sido divididas em tarefas menores e melhor alocadas. A equipe de MDS avançou seu conhecimento sobre as tecnologias usadas no desenvolvimento.
+
diff --git a/docs/sprints/sprint_7.md b/docs/sprints/sprint_7.md
new file mode 100644
index 0000000..dacb635
--- /dev/null
+++ b/docs/sprints/sprint_7.md
@@ -0,0 +1,82 @@
+# Sprint 7
+
+## Histórico de revisão
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 19/10/2019 | 0.1 | Adição do planejamento e imagens da revisão e retrospectiva | Fabíola |
+
+# Planning da Sprint 6
+
+- Período : 14/10 a 19/10
+
+- Objetivo: Desenvolvimento do produto e automatização de processos de desenvolvimento.
+
+## Issues
+
+| ID | Descrição | Estimativa | Label |
+| ---|-----------|------------|-------|
+| #112 | Automatização das Folhas de Estilo | 3 | EPS |
+| #114 | Correção da autenticação do usuário | 2 | MDS |
+
+# Dívidas alocadas
+
+|ID | Descrição | Estimativa | Label|
+---|-----------|------------|-------|
+| #79 | Configurar ambiente de homologação | 20 | EPS |
+| #105 | Documentação da Sprint 5 | 5 | EPS |
+| #105 | Documentação da Sprint 6 | 5 | EPS |
+| #40 | Internacionalização do produto | 8 | MDS |
+| #73 | Atualizar perfil do Usuário | 38 | MDS |
+| #66 | Cadastrar propriedade| 56 | MDS |
+
+ - Total de pontos planejados: xpts (mais pts de dívida).
+ - Total de pontos entregues: ypts.
+
+ # Possíveis riscos mapeados para a sprint
+
+ Não mapeado!
+
+
+# Review
+
+- Objetivo Alcançado? Não. A equipe não tinha claro o objetivo da sprint e a maioria das histórias não foram entregues
+
+- Estimativa correta? Não.
+
+- Tarefas bem distribuidas? Não
+
+
+## Qualidade do Trabalho Entregue
+
+Segundo a equipe a qualidade entregue foi de **3.35** considerando a escala de likert com os valores de 1 a 5.
+
+![review e qualidade](../img/gerenciamento/review7.jpg)
+
+## Velocity
+![velocity](../img/gerenciamento/velocity7.png)
+
+
+# Retrospectiva
+
+Segue imagem com todos as questões levantadas durante a retrospectiva.
+
+![retrospectiva](../img/gerenciamento/retrospective7.png)
+
+
+# Práticas ágeis
+
+![prática-agil](../img/gerenciamento/agil7.png)
+
+# Quadro de Conhecimento
+
+![quadro](../img/gerenciamento/conhecimento7.png)
+
+# Squad Health Check
+
+
+
+# Análise da Scrum Master
+
+
+Issues não foram de fato finalizadas, mas para não virarem divida pela 2ª vez, foram fechadas e as tarefas restante mapeadas para outras issues.
+
diff --git a/docs/sprints/sprint_8.md b/docs/sprints/sprint_8.md
new file mode 100644
index 0000000..9507b81
--- /dev/null
+++ b/docs/sprints/sprint_8.md
@@ -0,0 +1,85 @@
+# Sprint 8
+
+## Histórico de revisão
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 28/10/2019 | 0.1 | Adição do planejamento, review, retrospectiva, health, práticas ágeis e quadro de conhecimento | Shayane |
+| 28/10/2019 | 0.2 | Ajuste da pontuação e adição do velocity | Shayane |
+| 29/10/2019 | 0.3 | Adição do burndown de riscos e análise do SM | Shayane |
+
+# Planning da Sprint 8
+
+- Período : 21/10 a 26/10
+
+- Objetivo: Implementação de novas funcionalidades core do produto.
+
+## Issues
+
+| ID | Descrição | Estimativa | Label |
+| ---|-----------|------------|-------|
+| #126 | Atualizar o canvas do projeto | 3 | EPS |
+| #124 | Configuração do github actions para preparação para o deploy contínuo no frontend | 13 | EPS |
+| #123 | Comunicação backend e frontend em ambiente de homologação | 5 | EPS |
+| #121 | Configuração de variáveis de ambiente | 5 | EPS |
+| #119 | Correção de erros de análise estática | 5 | MDS |
+| #116 | Visualização do dashboard do usuário | 13 | MDS |
+| #67 | Cadastro de árvore | 8 | MDS |
+| #68 | Cadastro de colheita | 8 | MDS |
+| #105 | Documentação da Sprint 7 | 3 | EPS |
+
+# Dívida alocada
+
+ID | Descrição | Estimativa | Label|
+---|-----------|------------|-------|
+| #66 | Cadastrar propriedade | 56 | MDS |
+| #119 | Atualizar Perfil do Usuário | 38 | MDS |
+
+ - Total de pontos planejados: 119pts (mais 38 de issue não planejada).
+ - Total de pontos entregues: 31pts.
+
+ # Possíveis riscos mapeados para a sprint
+
+![risk](../img/gerenciamento/risks8.png)
+![burn](../img/gerenciamento/burn8.png)
+
+# Review
+
+- Objetivo Alcançado? Não. Apesar da equipe ter entendido como se daria a solução, algumas issues core não puderam ser finalizadas no time-box.
+
+- Estimativa correta? A estimativa das issues foi realizada baseando-se na métrica adaptada de alguns tópicos. A estimativa pareceu refletir o nível de esforço entre os membros do grupo, pois eles mostraram-se mais concientes dela nas discussões.
+
+- Tarefas bem distribuidas? Parcialmente. Em relação às escolhas de pareamentos, o foco deu-se no nível de conhecimento entre os membros. Houve a tentativa de modificação do processo de pareamento, em relação a melhorar a autonomia de um membro da equipe, logo, foi dada a chance dele trabalhar sozinho em uma issue. Dois membros ficaram ociosos na sprint e por isso, alocaram issues de bugs conhecidos. Apesar disso, houve o rotacionamento de papéis entre MDS e EPS nos cargos de time de desenvolvimento e devops, incrementando no aprendizado mútuo.
+
+
+## Qualidade do Trabalho Entregue
+
+Segundo a equipe a qualidade entregue foi de **3.72** considerando a escala de likert com os valores de 1 a 5.
+
+![review e qualidade](../img/gerenciamento/review8.png)
+
+## Velocity
+
+![velocity](../img/gerenciamento/velocity8.png)
+
+# Retrospectiva
+
+Segue imagem com todos as questões levantadas durante a retrospectiva.
+
+![retrospectiva](../img/gerenciamento/retrospectiva8.png)
+
+# Práticas ágeis
+
+![prática-agil](../img/gerenciamento/agil8.png)
+
+# Quadro de Conhecimento
+
+![quadro](../img/gerenciamento/conhecimento8.jpg)
+
+# Squad Health Check
+
+![health](../img/gerenciamento/health8.png)
+
+# Análise da Scrum Master
+
+Um ponto forte da sprint foi a melhora na qualidade do código e a atualização dos critérios para um Pull request ser aceito. Além disso, a implementação de testes no frontend, com jest, começará a ser um critério para o merge. Notou-se também que, apesar de haver histórias de usuário parecidas com outras passadas, ainda há uma dificuldade de administração de conhecimento e horários durante a semana. O pareamento pareceu funcionar entre todos os membros, melhorando o compartilhamento de conhecimento. Em relação ao planejamento, houve a tentativa de aumento de autonomia de um membro, de forma voluntária, ficando com uma issue. Durante a sprint, 2 membros finalizaram sua issue e ficaram um pouco ociosos, o que influenciou a eles pegarem uma issue que não havia sido alocada sem comunicação com o PO. Ficou evidente na retrospectiva que há uma desigualdade na participação dos membros no repositório, visto que alguns têm medo de trabalhar fora de seus forks. Isso está prejudicando a dinâmica da matéria, por isso, a partir dessa sprint, está avisado fortemente a não usar os forks.
+
diff --git a/docs/sprints/sprint_9.md b/docs/sprints/sprint_9.md
new file mode 100644
index 0000000..82cc17e
--- /dev/null
+++ b/docs/sprints/sprint_9.md
@@ -0,0 +1,93 @@
+# Sprint 8
+
+## Histórico de revisão
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 08/11/2019 | 0.1 | Adição da retrospectiva, health, práticas ágeis e quadro de conhecimento | Shayane |
+| 08/11/2019 | 0.2 | Adição do planejamento, velocity e burndown de riscos | Shayane |
+| 09/11/2019 | 1.0 | Adição da review, analise da scrum master e correção de imagens quebradas | Martha Dantas |
+
+# Planning da Sprint 9
+
+- Período : 04/11 a 09/11
+
+- Objetivo: ---
+
+## Issues
+
+| ID | Descrição | Estimativa | Label |
+| ---|-----------|------------|-------|
+| #145 | Ajustar deploy no backend em homologação | 13 | EPS |
+| #154 | Visualização da barra lateral do usuário | 8 | MDS |
+| #74 | Visualizações do Calendário | 13 | MDS |
+| #142 | Criar política de migrations | 3 | EPS |
+| #149 | Configurar deploy contínuo do ambiente de homologação | 3 | EPS |
+| #141 | Configuração do github actions para preparação para o deploy contínuo no backend | 5 | EPS |
+| #137 | Adicionar build na integração contínua | 3 | EPS |
+| #144 | Documentação da Sprint 8 | 5 | EPS |
+| #143 | Realizar testes no frontend | 8 | EPS |
+
+
+# Dívida alocada
+
+ID | Descrição | Estimativa | Label|
+---|-----------|------------|-------|
+| #68 | Cadastro de Colheita | 5 | MDS |
+| #66 | Cadastrar propriedade | 5 | MDS |
+| #144 | Documentação da Sprint 7 | 2 | EPS |
+
+ - Total de pontos planejados: 61pts (mais 12pts de dívidas).
+ - Total de pontos entregues: 73pts.
+
+ # Possíveis riscos mapeados para a sprint
+
+![risk](../img/gerenciamento/risks9.png)
+![burn](../img/gerenciamento/burn9.png)
+
+# Review
+
+- Objetivo Alcançado?
+
+Não foi estabelecido um objetivo no inicio da sprint, send assim, a pergunta não se aplica.
+
+- Estimativa correta?
+
+ A equipe não demonstrou grandes queixas a respeito da estimátivas, mas foi colocado como ponto de atenção a tendência da equipe como um todo em subestimar a quantidade de trabalho das issues em conjunto com as outras atividades da faculdade.
+
+- Tarefas bem distribuidas?
+
+ Sim.
+
+
+## Qualidade do Trabalho Entregue
+
+Segundo a equipe a qualidade entregue foi de **2,8** considerando a escala de likert com os valores de 1 a 5.
+
+![review e qualidade](../img/gerenciamento/review9.jpg)
+
+## Velocity
+
+![velocity](../img/gerenciamento/velocity9.png)
+
+# Retrospectiva
+
+Segue imagem com todos as questões levantadas durante a retrospectiva.
+
+![retrospectiva](../img/gerenciamento/retrospectiva9.png)
+
+# Práticas ágeis
+
+![prática-agil](../img/gerenciamento/agil9.png)
+
+# Quadro de Conhecimento
+
+![quadro](../img/gerenciamento/conhecimento9.png)
+
+# Squad Health Check
+
+![health](../img/gerenciamento/health9.png)
+
+# Análise da Scrum Master
+
+A equipe parece um pouco cansada em virtude do fim do semestre e todos estão preocupados com o resultado que será entregue na R2. Em contra partida boa parte da equipe julga que está entregando um trabalho bom e agregando valor para nosso projeto. Ao olhar para o planejamento e para as metricas coletadas concluo que é perceptível a evolução do grupo como equipe dentro das metodologias propostas. Entretando não posso deixar de citar nossa dificuldade em conseguir mensurar entregas que "caibam" em nossa capacidade, bem como nossa difculdade em gerenciar riscos.
+
diff --git a/docs/style_guide.md b/docs/style_guide.md
new file mode 100644
index 0000000..8f223c8
--- /dev/null
+++ b/docs/style_guide.md
@@ -0,0 +1,115 @@
+# Guia de Estilo e Identidade Visual
+
+# Histórico de Revisão
+
+
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 12/09/2019 | 0.1 | Criação da versão inicial do documento | Fabíola |
+| 12/09/2019 | 0.1.1 | Adição da justificativa do nome da aplicação | Hugo Sobral de Lima Salomão |
+| 13/09/2019 | 0.2 | Adição de componentes e contraste da paleta de cores | Fabíola |
+| 13/09/2019 | 0.3 | Ajuste do slide da apresentação da identidade visual | Leonardo da Silva Gomes |
+| 13/09/2019 | 0.4 | Ajuste de texto dos componentes e cores | Fabíola |
+
+# 1. Introdução
+
+
+# 2. Apresentação da Identidade Visual
+
+
+# 3. Detalhamento e Justificativas
+
+## 3.1. Nome da aplicação
+
+Sobre a escolha do nome da aplicação, teve-se a ideia de utilizar **Acacia**, em português **Acácia**
+
+O nome foi escolhido por conta da história por trás da planta acácia: A acácia é uma árvore que participa de uma relação **__interespecífica__**, **__harmônica__** e **__facultativa__**, com formigas, chamada de **__Protocooperação__**. Isto é, nem a árvore e nem as formigas, espécies diferentes, tem a necessidade de participar deste processo, mas ambas se beneficiam caso optem por cooperar.
+
+Tal conceito se relaciona com o propósito do nosso projeto de colaboração voluntária e estimulação do senso de comunidade.
+
+## 3.2. Fontes
+
+As fontes utilizadas na aplicação serão:
+
+ - **Raleway**(SIL OPEN FONT LICENSE Version 1.1), para títulos e
+ - **Roboto**(Apache License), para textos.
+
+Estas fontes são sans-serif, facilitando a leitura para pessoas com dislexia já que são "sem serif", isto é, não possui traços e hastes rebuscadas.
+
+Além disso, estas fontes possuem boa adaptação para aplicações responsivas, como o deste projeto, adaptando-se para visualização web e mobile e também possuem licença que permite uso gratuito.
+
+### Uso das fontes
+
+#### Incluindo no HTML
+
+Coloca-se no o seguinte trecho de código:
+
+
+
+#### Incluindo no CSS
+
+Coloca-se no css, para a utilização das fontes:
+
+ font-family: 'Raleway', sans-serif;
+ font-family: 'Roboto', sans-serif;
+
+
+# 3.2.Paleta de cores
+
+![paleta de cores](img/identidade/paleta.png)
+
+As cores foram selecionadas observando características do produto e sua finalidade, bem como a acessibilidade, testando-se o contraste. A ferramenta utilizada para construi-la foi [coolors](https://coolors.co/376996-56a3a6-364259-ef476f-edc841).
+
+A cor primária é a cor #376996, e a cor secundária #56a3a6. A cor #ef476f é acento.
+
+Ainda, em relação ao contraste, foram feitos testes e é recomendado ter estes números em mente para utilização das cores.
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 4. Componentes
+
+## 4.1. Botões
+
+Existem botões utilizando as diferentes cores da paleta, a depender do uso. O botão comum de confirmação é da cor primária. Os botões são arredondados (raio de 12 px) com texto escrito utilizando a fonte Raleway tamanho 14pt, semibold, todas letras maiúsculas. Observa-se ainda a cor da palavra escrita, a depender da cor do botão, para cumprir o contraste.
+
+![botoes](img/identidade/botoes.png)
+
+## 4.2. Campos de formulários
+
+O texto acima do formulário, de label, é na fonte Raleway, tamanho 12 pt, regular, na cor primária,com uma margem de 20px a esquerda, em relação ao campo.
+O campo possui raio de 12px arredondado, e bordas na cor primária.
+
+![campos](img/identidade/campos.png)
+
+## 4.3. Navbar
+
+Apresenta-se a seguir algumas opções para serem analizadas e decididas, para navbar.
+
+### Para celular
+
+![contraste](img/identidade/navcelular.png)
+
+
+### Para website
+
+![contraste](img/identidade/navwebsite1.png)
+
+![contraste](img/identidade/navwebsite2.png)
+
+![contraste](img/identidade/navweb.png)
+
+![contraste](img/identidade/navweb1.png)
+
+
+
+
diff --git a/docs/tools_testing.md b/docs/tools_testing.md
new file mode 100644
index 0000000..71c9fb0
--- /dev/null
+++ b/docs/tools_testing.md
@@ -0,0 +1,59 @@
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 20/09/2019 | 0.1 | Criação da versão inicial do documento | [Shayane Alcântara](https://github.com/shayanealcantara)|
+| 20/09/2019 | 0.2 | Adição do estudo em backend | [Shayane Alcântara](https://github.com/shayanealcantara)|
+| 21/09/2019 | 1.0 | Adição do estudo em frontend e planos futuros | [Vítor Cardoso](https://github.com/vitorcx)|
+
+
+## Introdução
+Teste de software é o processo de execução de um produto para determinar se ele atingiu suas especificações e funcionou corretamente no ambiente para o qual foi projetado. O seu objetivo é revelar falhas em um produto, para que as causas dessas falhas sejam identificadas e possam ser corrigidas pela equipe de desenvolvimento antes da entrega final [[1]](#referencias).
+
+## Metodologia
+
+O primeiro passo dado pela equipe do projeto foi avaliar as potenciais ferramentas a serem usadas no projeto de desenvolvimento de testes. Para cumprir este objetivo, foram feitos estudos que buscaram averiguar a viabilidade em usar as ferramentas previamente selecionadas, por meio de experiências dos membros e pesquisas de mercado. As ferramentas são específicas para cada tecnologia definida: Vue.js (javascript) e Django Rest Framework (python).
+
+Após a prévia seleção a escolha consistiu na avaliação dos seguintes tópicos:
+- A ferramenta possui alto volume de documentação?
+- Qual é a familiaridade da equipe de desenvolvimento com as ferramentas?
+- Qual é a relação entre o deadline de entrega do produto com o nível de complexidade da ferramenta?
+
+### Front-end
+
+O código a ser testado no front-end estará em Javascript, logo as ferramentas devem ser compatíveis com a linguagem. Para tal foram abordados alguns frameworks interessantes como o [Jest](https://jestjs.io), [Mocha](https://mochajs.org) e [Jasmine](https://jasmine.github.io).
+
+O Jasmine se destaca por ser um framework de testes unitários orientado à comportamento, ou seja, tenta se aproximar ao máximo do comportamento do usuário. Enquanto isso o Mocha se mostra um framework bastante flexível em suas configurações. Já o Jest é uma ferramenta marcada pela facilidade na configuração inicial.
+
+Para testes realização de *end-to-end*, quando necessário, foram abordadas ferramentas como o [Nightwatch.js](https://nightwatchjs.org) e [Cypress](https://www.cypress.io).
+
+#### Guia de estilo
+
+Como já mencionado, a camada front-end da aplicação será feita usando o framework Vue.js, que tem seu próprio [Guia de estilo](https://vuejs.org/v2/style-guide/). Esse guia deverá ser seguido com objetivo de evitar erros, perda de tempo e adoção de anti-padrões.
+
+### Back-end
+
+O código a ser testado no back-end estará em Python, logo as ferramentas devem ser compatíveis com a linguagem. Pela tecnologia ser Django Rest, ela auxilia de certa forma a implementação de testes, visto que descreve em sua documentação oficial uma série de [classes e recursos](https://www.django-rest-framework.org/api-guide/testing/#testing) com este fim, como a APIClient e APITestCase.
+
+Além deste recurso anterior, foi abordada a biblioteca [Unnitest](https://docs.python.org/3/library/unittest.html#module-unittest) e o [Pytest](https://docs.pytest.org/en/latest/), ambas nativas do Python. Com elas é possível executar testes unitários em massa ou individuais de forma simples, sem a necessidade de instalação de módulos extras. A saída de execução é prática e concisa, podendo gerar relatórios mais detalhados.
+
+Outra ferramenta abordada foi a [Doctest](https://wiki.python.org.br/DocTest) é uma biblioteca padrão do Python que procura e interpreta docstrings na aplicação. A sintaxe nesses trechos de docstrings é diferenciada, simulando um interpretador interativo do Python [[2]](https://klauslaube.com.br/2011/07/18/ferramentas-de-testes-em-django-parte-1.html).
+
+#### Guia de estilo
+
+O propósito de um guia de estilo é manter a consistência em relação a padrões de escrita do código. Para cumprir este objetivo, será necessário a adoção do [Guia de estilo](https://wiki.python.org.br/GuiaDeEstilo) definido pela comunidade Python, com diretrizes padronizadas.
+
+## Resultados
+
+No Back-end, a opção mais viável para desenvolver os teste é a biblioteca **Unnitest**, em que os testes são escritos através de classes e que utiliza-se os esquemas de assertions para garantir o comportamento do código testado, garantindo certa facilidade e praticidade pela familiaridade com a linguagem e a experiência de alguns membros. Além disso, há um grande volume de [documentação](https://django-portuguese.readthedocs.io/en/1.0/topics/testing.html), o que pode auxiliar no desenvolvimento decorrente do projeto e consequentemente diminuir a complexidade de execução.
+
+No Front-end, a opção mais interessante, levando em conta o prazo e escopo do projeto, é realizar testes unitários utilizando o **Jest**, pois é uma ferramenta de testes completa e ao mesmo tempo de rápida configuração inicial.
+No caso dos testes *end-to-end* a melhor opção é o **Cypress** por conta de sua boa performance e facilidade de configuração.
+
+## Planos futuros
+
+Caso seja avaliado um possível retorno positivo da realização de testes *end-to-end*, tanto para o produto quanto para a equipe, este será realizado ao fim de cada release, afim de garantir o bom funcionamento geral da interface de usuário.
+
+## Referências
+
+[1] NETO, Arilo. Introdução a Teste de Software. Disponível em: . Acesso em: 20/09/2019.
+
+[2] LAUBE, Klaus. Ferramentas de testes em django. Disponível em: . Acesso em: 20/09/19.
\ No newline at end of file
diff --git a/docs/vision_document.md b/docs/vision_document.md
new file mode 100644
index 0000000..9d86913
--- /dev/null
+++ b/docs/vision_document.md
@@ -0,0 +1,351 @@
+# Histórico de Revisão
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 30/08/2019 | 0.1 | Criação da estrutura do documento | Durval Carvalho |
+| 31/08/2019 | 0.2 | Adição dos tópico Introdução, Propósito, Escopo, Definições, acrônimos e abreviações e Visão Geral | Durval Carvalho |
+| 01/09/2019 | 0.3 | Adição dos tópico Posicionamento, Oportunidade de negócios, Descrição do problema | Durval Carvalho
+| 02/09/2019 | 0.4 | Adição dos Envolvidos e dos Usuários, atualização do layout da Descrição do Problema | Renato Britto Araujo |
+| 02/09/2019 | 0.5 | Adição dos tópicos Recursos do Produto, Restrições | Durval Carvalho |
+| 02/09/2019 | 0.6 | Adição da Visão geral do Produto, Perspectiva do Produto, Resumo das capacidades, Funções do Produto, Suposições e dependências | Leonardo da Silva Gomes |
+| 03/09/2019 | 0.7 | Adição dos tópicos Faixas de Qualidade, Requisitos e Descrição do posição do produto | Durval Carvalho |
+| 03/09/2019 | 0.7.1 | Revisão dos tópicos Propósito, Visão Geral, Descrição do posição do produto, Principais Necessidades dos Usuários e dos Envolvidos, Alternativas e Concorrências, Resumo das capacidades | Durval Carvalho |
+| 03/09/2019 | 0.7.2 | Revisão gramatical e estrutural de todo o documento | Renato Britto Araujo, Leonardo da Silva Gomes |
+| 04/09/2019 | 0.8 | Adição do escopo do projeto | João Pedro Silva de Carvalho |
+| 05/09/2019 | 0.8.1 | União dos tópicos Introdução e Propósito; Adição das Referências no final do documento; Remoção do termo aplicativo para o termo aplicação web responsiva | Durval Carvalho e Flavio Vieira |
+| 05/09/2019 | 0.8.2 | Revisão de duplicações e mudanças estruturais | Renato Britto Araujo |
+| 05/09/2019 | 0.8.3 | Revisão do escopo | Durval Carvalho |
+| 06/09/2019 | 0.8.4 | Revisão de perspectiva de produto e requisitos | Renato Britto Araujo |
+| 06/09/2019 | 0.8.5 | Revisão de restrições | Leonardo da Silva Gomes |
+| 01/10/2019 | 1.0 | Refatoração dos requisitos do projeto | Durval Carvalho |
+| 02/10/2019 | 1.1 | Revisão | Durval Carvalho |
+| 06/10/2019 | 1.2 | Correção da numeração dos requisitos | Durval Carvalho |
+
+## **1. Introdução**
+
+Este documento estará repleto de dados que sustentarão o propósito,
+o contexto e a visão geral do produto, permitindo assim o entendimento do
+escopo do projeto.
+
+Assim, será explicado o problema evidenciado, a oportunidade encontrada, a
+descrição dos principais envolvidos, uma possível solução, suas principais
+funcionalidades e seus requisitos, para assim obter uma melhor compreensão
+do escopo e diminuir os riscos envolvidos.
+
+### 1.1 Escopo
+
+Esse projeto tem como objetivo desenvolver uma aplicação _web_ responsiva com a
+finalidade de conectar proprietários de árvores frutíferas em ambiente urbano e
+coletores voluntários, visando a disponibilização de parte do resultado das
+colheitas à instituições e projetos carentes de recursos e fomentar a união
+comunitária.
+
+Desse modo, aumentando o consumo de alimentos orgânicos produzidos
+localmente e contribuindo na diminuição do desperdício de alimentos e fortalecimento da
+comunidade local.
+
+### 1.2 Definições, acrônimos e abreviações
+Estarão listadas neste tópico as definições, acrônimos e abreviações dos
+termos usados neste documento, para assim facilitar o compreendimento do
+público interessado no projeto
+
+| **Sigla/Termo/Acrônimo** | **Definição** |
+| ------------------------ | ------------- |
+| Saskatoon | Sistema de gerenciamento de colheita desenvolvido pelo _Les Fruits Défendus_ |
+| Santropol Roulant | Centro comunitário de alimentos situado em Montreal|
+| _Les Fruits Défendus_ | Projeto de colheita urbana voluntária organizada pela Santropol Roulant |
+| ODS | Objetivos de Desenvolvimento Sustentável |
+| MDS | Métodos de Desenvolvimento de Software |
+| EPS | Engenharia de Produto de Software |
+| FGA | Faculdade do Gama |
+| UnB | Universidade de Brasília |
+
+## **2. Posicionamento**
+
+A organização [Santropol Roulant](https://santropolroulant.org/en/history/)
+foi criada com a missão de diminuir o isolamento social e econômico entre
+jovens e idosos por meio da produção, preparo e distribuição de alimentos.
+
+A partir dessa visão, diversos programas são desenvolvidos e apoiados com o
+objetivo de produzir, adquirir, preparar e distribuir alimentos,
+principalmente orgânicos.
+
+Um dos programas é o _Les Fruits Défendus_, que tem como objetivo
+conectar proprietários de árvores frutíferas locais com coletores
+voluntários para garantir que esses alimentos não sejam desperdiçados.
+
+### 2.1 Oportunidade de negócios
+
+Com base na visão do programa _Les Fruits Défendus_ e na visão da
+organização mãe Santropol Roulant, foi identificado a oportunidade
+de aumentar o engajamento dos proprietários de plantações
+frutíferas urbanas e dos voluntários por meio de uma aplicação _web_
+responsiva, onde usuários podem acessar pode meio de computadores e
+smartphones.
+
+Essa plataforma digital se propõe a aumentar a transparência das
+atividades que serão realizadas, a facilitar a difusão das ideias por trás
+do projeto e facilitar o primeiro contato com o projeto.
+
+### 2.2 Descrição do problema
+
+| O problema é | que afeta | cujo impacto é | uma boa solução seria |
+| ------------ | --------- | -------------- | --------------------- |
+| O desperdício de alimentos produzido por árvores frutíferas locais | as pessoas e organizações que não tem acesso à comida orgânica | o consumo de alimentos não nutritivos danosos a saúde | convencer proprietários de árvores frutíferas locais à permitir a colheita e distribuição da produção excedente de frutos entre os voluntários que o ajudam e instituições beneficiárias de doações. |
+
+
+### 2.3 Descrição da posição do produto
+
+O produto uma vez desenvolvido, poderá se posicionar no mercado
+como uma plataforma online de fácil utilização capaz de engajar
+voluntários para realizar diversas tarefas que beneficiam a
+comunidade local. Podendo assim chamar atenção de pessoas e
+empresas que buscam se associar com a imagem sustentável no
+produto criado.
+
+## **3. Descrição dos Envolvidos e dos Usuários**
+
+### 3.1 Resumo dos Envolvidos
+
+| Nome | Descrição | Responsabilidade |
+| :- | :- | :- |
+| Avaliadores | Professores das disciplinas de MDS e EPS | Avaliar a qualidade do projeto desenvolvido pelos alunos de MDS e EPS |
+| Desenvolvedores | Estudantes da Disciplina MDS da UnB FGA | Criar e manter documentos; Desenvolver e testar o software |
+| Equipe de Engenharia de Produto | Estudantes da Disciplina EPS da UnB FGA | Criar e manter documentos; Gerenciar os desenvolvedores; Tomada de decisões a respeito do produto |
+
+### 3.2 Descrição dos Usuários
+
+| Nome | Descrição |
+| :--- | :-------- |
+| Beneficiários | Instituições e pessoas recebedoras de doações da colheita |
+| Líderes de colheita | Escolhe e gerencia voluntários, recolhe equipamento necessário para colheita e entrega-o junto à doação para Les Fruits Défendus |
+| Proprietários de árvores | Cadastram sua(s) propriedade(s) e suas respectivas árvores, candidatam terreno para colheita voluntária com a condição de doar parte dos frutos para a Les Fruits Défendus |
+| Voluntários de colheita | Se candidatam a participar de colheitas |
+
+### 3.3 Principais Necessidades dos Usuários e dos Envolvidos
+
+| Usuário | Necessidade | Solução Atual | Solução Proposta |
+| :------ | :---------- | :------------ | :--------------- |
+| Beneficiário | Doações de alimentos | Doações de pessoas e de ONGs | Website para se candidatar a receber doação |
+| Líder de colheita | Interesse em fortalecer comunidade local e/ou trabalho voluntário | Participação de coletivos, de ONGs e ações de iniciativa individual | Aplicação web responsiva para se candidatar à colheitas requisitadas pela comunidade local. |
+| Proprietário de árvores | Receber ajuda em colheita e/ou interesse em fortalecer comunidade local | Ações coletivas organizada pela Les Fruits Défendus | Aplicação web responsiva para cadastrar plantações que podem ser colheitas e doadas para outras organizações |
+| Voluntário de colheita | Interesse em fortalecer comunidade local e/ou trabalho voluntário | Participação de coletivos, de OGNs e ações de iniciativa individual | Aplicação web responsiva para se candidatar à trabalho voluntário e receber informações a respeito de suas colheitas |
+
+### 3.4 Ambiente dos Usuários
+
+Os usuários poderão utilizar a aplicação por meio de navegadores desktop e
+mobile.
+
+### 3.5 Perfis dos Envolvidos
+
+#### 3.5.1 Equipe de Desenvolvimento de Software
+
+| Representantes | Tipo | Responsabilidade | Critério de sucesso | Envolvimento |
+| -------------- | ---- | ---------------- | ------------------- | ------------ |
+| Durval Carvalho de Souza, Flávio Vieira, Hugo Sobral de Lima Salomão, João Pedro Silva de Carvalho, Leonardo da Silva Gomes, Renato Britto Araújo | Estudantes de MDS na UnB FGA | Criar e manter documentos; Desenvolver e testar o software | Completar o projeto proposto dentro do período estipulado e atendendo à todos os requisitos | Alto |
+
+#### 3.5.2 Equipe de Engenharia de Produto de Software
+
+| Representantes | Tipo | Responsabilidade | Critério de sucesso | Envolvimento |
+| -------------- | ---- | ---------------- | ------------------- | ------------ |
+| Fabíola Malta Fleury, Martha Dantas Silva, Shayane Marques Alcântara, Vítor Cardoso Xoteslem | Estudantes de EPS na UnB FGA | Criar e manter documentos; Gerenciar os desenvolvedores; Tomada de decisões a respeito do stack de tecnologias | Completar o projeto proposto dentro do período estipulado e atendendo a todos os requisitos | Alto |
+
+#### 3.5.3 Avaliadores
+
+| Representantes | Tipo | Responsabilidade | Critério de sucesso | Envolvimento |
+| -------------- | ---- | ---------------- | ------------------- | ------------ |
+| Carla Rocha, Joenio Marques da Costa | Professores de EPS e MDS na UnB FGA | Avaliar qualidade do projeto criado | Transmitir conhecimento sobre projetos de software em grupo | Baixo |
+
+### 3.6 Perfis dos Usuários
+
+#### 3.6.1 Beneficiários
+
+| Representantes | Tipo | Responsabilidade | Critério de sucesso | Envolvimento |
+| -------------- | ---- | ---------------- | ------------------- | ------------ |
+| Instituições | Instituições de auxílio a idosos/orfanatos | Se candidatar a receber doação, checar informações sobre colheitas | Conseguir doações de forma a suprir sua demanda de comida | Baixo |
+
+#### 3.6.2 Líderes de colheita
+
+| Representantes | Tipo | Responsabilidade | Critério de sucesso | Envolvimento |
+| -------------- | ---- | ---------------- | ------------------- | ------------ |
+| Entusiastas/interessados em trabalho voluntário | Líderes de colheita | Escolhe e gerência voluntários, recolhe equipamento necessário para colheita e entrega-o junto à doação para Les Fruits Défendus | Completar colheitas com sucesso | Alto |
+
+#### 3.6.3 Proprietários de árvores
+
+| Representantes | Tipo | Responsabilidade | Critério de sucesso | Envolvimento |
+| -------------- | ---- | ---------------- | ------------------- | ------------ |
+| Donos de propriedade urbana com árvores frutíferas | Proprietários de árvores dispostos a ajudar a comunidade e/ou incapacitados para realizar colheita | Disponibilizar sua propriedade para colheita e parte de seus frutos para a Les Fruits Défendus | Conseguir ajuda na colheita de suas árvores | Alto |
+
+#### 3.6.4 Voluntário de colheita
+
+| Representantes | Tipo | Responsabilidade | Critério de sucesso | Envolvimento |
+| -------------- | ---- | ---------------- | ------------------- | ------------ |
+| Entusiastas/interessados em trabalho voluntário | Estudantes, estrangeiros de passagem, comunidade local | Se candidatar a participar de colheita, comparecer ao evento e seguir ordens do líder de colheita | Participar em colheita | Médio |
+
+### 3.8 Alternativas e Concorrências
+
+#### 3.8.1 Saskatoon
+
+O Saskatoon ([Repositório](https://github.com/tiagovaz/saskatoon),
+[Website](https://saskatoon.lesfruitsdefendus.org/)) é um projeto
+desenvolvido pelo coletivo Les Fruits Défendus com o objetivo de
+fomentar o senso de comunidade e facilitar o processo de fazer
+colheita coletiva para todos os usuários. Porém este projeto
+possui baixo engajamento da comunidade que o desenvolve e baixa
+aderência de novos colaboradores. Devido principalmente
+à sua falta de documentação e a utilização de tecnologias que
+serão descontinuadas, como o Python 2.7.
+
+## **4. Visão geral do Produto**
+
+### 4.1 Perspectiva do Produto
+
+O projeto visa ser um facilitador no processo de Colheita Colaborativa em áreas urbanas, fomentando a agricultura urbana e a agroecologia que interfere fortemente em vários aspectos sociais e econômicos. Assim, utilizamos da relação entre proprietários de árvores frutíferas em ambiente urbano, voluntários para colheita e locais que possam receber doações destas frutas, para a diminuição de desperdício de comida, aumento do acesso a comida saudável e colaboração comunitária (socialização) acarretando na diminuição de transtornos mentais e fortalecimento de culturas locais. O produto é baseado em um sistema já existente, o [Saskatoon](https://github.com/tiagovaz/saskatoon) utilizado pelo coletivo [LES FRUITS DÉFENDUS](https://santropolroulant.org/en/what-is-the-roulant/collectives/fruits-defendus/) em Montreal, uma iniciativa da organização [Santropol Roulant](https://santropolroulant.org/en/history/).
+
+### 4.2 Resumo das capacidades
+
+| Benefício para o Usuário | Recursos de suporte |
+|:------------------------:|:-------------------:|
+| Facilidade em se voluntariar | A aplicação disponibiliza uma interface de fácil entendimento onde os voluntários poderão visualizar todos os futuros eventos e se inscrever de acordo com sua aptidão. |
+| Facilidade para visualizar o impacto de ações voluntárias na comunidade local | A partir das informações coletadas durante e após as ações coletivas, qualquer pessoa interessada no projeto poderá visualizar o impacto gerado pelo projeto, como quantidade de alimentos arrecadados e organizações beneficiadas |
+| Facilidade em cadastrar um novo evento colaborativo | A aplicação irá estimular que proprietários de plantações locais criem novos eventos colaborativos em suas propriedades uma vez que visualizarem o impacto positivo gerado por ações anteriores.
+
+### 4.3 Funções do Produto
+
+O projeto está encarregado de ser o conectivo entre os proprietários de árvores e os voluntários, facilitando o processo de colaboração. A plataforma agrega diversas funcionalidades como cadastro, gerenciamento, inscrição no projeto, etc.
+
+### 4.4 Suposições e dependências
+
+- O usuário deverá possuir um celular ou um computador com acesso à internet para acessar a aplicação.
+
+- A aplicação web responsiva será utilizada por pessoas que desejam se voluntariar e pessoas que querem ajudar na colheita de seus frutos.
+
+- A aplicação web responsiva irá facilitar a comunicação entre proprietário da árvore frutífera e o voluntário.
+
+## **5. Recursos do Produto**
+
+### 5.1 Recursos de suporte ao voluntário
+
+Os voluntários interessados no projeto podem se cadastrar na
+plataforma. Quando logados terão acesso aos seguintes recursos:
+
+* Vincular-se a uma colheita cadastrada.
+* Acessar o histórico de colheitas que participaram.
+* Visualizar as organizações ou pessoas que foram beneficiadas com os
+alimentos coletados na colheita em que o voluntário estava presente.
+
+Quando um voluntário é escolhido para participar como líder em colheita, terá oportunidade de:
+
+* Comunicar-se de forma eficiente com líderes, proprietários e outros voluntários participantes da mesma colheita.
+* Candidatar-se a líder em colheitas que ainda não possuem um.
+
+### 5.2 Recursos de suporte ao líder
+
+O voluntário que se candidatam à posição de líder e é aceito pelo proprietário podem:
+
+* Escolher voluntários dentre a lista de candidatos para participar da colheita.
+* Coordenar de forma eficiente e concisa os voluntários por meios de chats gerais e sistema de avisos e regras gerais.
+
+### 5.3 Recursos de suporte ao proprietário
+
+Os proprietários de árvores frutíferas locais que tiverem interesse no
+projeto podem se cadastrar na plataforma. Quando logados terão acesso ao:
+
+* Cadastro de plantações disponível para colheita.
+* Histórico de colheitas realizadas em suas propriedades.
+* Organizações ou pessoas que foram beneficiadas com os alimentos coletados em sua propriedade.
+* Escolha do líder de colheita dentre os voluntários (incluindo escolher a si).
+
+### 5.4 Disponibilizar os resultados das últimas colheitas
+
+Qualquer pessoa interessada no projeto terá acesso aos painéis de
+informação. Nessa parte da aplicação não será necessário autenticação do
+usuário e qualquer pessoa terá acesso aos dados das últimas colheitas, o
+destino dos frutos colhidos e informações sobre o projeto.
+
+### 5.5 Enviar notificações para grupos cadastrados
+
+A aplicação poderá enviar notificações para os usuários de acordo com as
+atividades que estão se aproximando. Essas notificações serão enviadas
+automaticamente de acordo com o contexto do usuário. As notificações são:
+
+5.4.1 Para os proprietários
+* Sua plantação atingiu o número de voluntários necessários
+* Sua plantação não atingiu o número de voluntários necessários
+* A data de colheita está próxima
+* Sua colheita foi bem-sucedida
+
+5.4.2 Para os voluntários
+* Você foi aceito para essa colheita
+* A colheita que você está escrito atingiu o número de voluntários necessários
+* A colheita que você está escrito não atingiu o número de voluntários necessários
+* A colheita que você está escrito está próxima
+* Sua colheita foi bem-sucedida
+
+## **6. Restrições**
+
+Listagem de restrições externas e outras dependências:
+
+* Ter um aparelho celular ou um computador.
+* Conexão com a internet.
+
+### 6.1 Restrições de Implementação
+O sistema será implementado utilizando 2 principais frameworks, sendo eles
+o Django Rest para o back-end e o Vue JS para o front-end.
+
+### 6.2 Restrições externas
+Dentre as restrições externas as que mais irão influenciar são a
+inexperiência com o framework Django, além de possíveis
+transtornos entre a equipe de desenvolvimento e de gerência.
+
+### 6.3 Restrições de Design
+Toda a interação com o software deve ocorrer de forma natural, de modo que o
+usuário não fique com dúvidas sobre como realizar determinada tarefa. Os
+recursos cujos usuários tem acesso devem ser de fácil entendimento, de modo
+que o usuário não desista durante alguma ação. Com a finalidade de alcançar um
+público maior, a aplicação será desenvolvida tanto para usuários web quanto
+mobile.
+
+### 6.4 Restrições de Confiabilidade
+Visando uma maior manutenibilidade do projeto pela comunidade, os
+desenvolvedores tem o comprometimento de manter uma cobertura de testes mínima
+de 90%.
+
+## **7. Requisitos do Produto**
+
+Lista de categorias de prioridades para requisitos
+
+| Tipo | Descrição |
+| :- | :- |
+| Alta | Requisitos indispensáveis para o funcionamento do sistema |
+| Intermediária | Requisitos importantes para o sistema, mas caso não sejam implementados não resultará em um mal funcionamento do sistema |
+| Útil | Requisitos que não são usados com tanta frequência e não são tão significativos na satisfação que o usuário tem sobre o sistema |
+
+Lista de requisitos
+
+| Identificador | Requisito | Depende de | Prioridade |
+| :- | :- | :- | :- |
+| RF01 | Permitir que o usuário crie, edite, faça login e apague sua conta | --- | Alta |
+| RF02 | Permitir o cadastro, atualização e exclusão de árvores, propriedades e colheitas | RF01 | Alta |
+| RF03 | Mostrar colheitas registradas, com ênfase às que acontecerão no futuro | RF02 | Alta |
+| RF04 | Permitir que os usuários se candidatem a uma colheita | RF01, RF02 | Alta |
+| RF05 | Permitir que líderes possam escolher voluntários cadastrados para uma colheita | RF01, RF04 | Baixa |
+| RF06 | Exibir notificações sobre atualizações nos eventos inscritos pelos usuários | RF01, RF04, RF05 | Baixa |
+| RF07 | Permitir que o usuário visualize o histórico de colheitas que participou | RF01, RF04 | Baixa |
+| RF08 | Mostrar calendários de colheitas | RF02 | Alta |
+| RF09 | Habilitar comunicação entre envolvidos em colheita (voluntários, líderes e proprietários) | RF01 | Intermediária |
+| RF10 | Mostrar dados à respeito do projeto realizadas de forma transparente | RF03 | Baixa |
+| RNF11 | Suportar para principais navegadores web atuais, com ênfase ao ambiente mobile | --- | Intermediária |
+| RNF12 | Assegurar a segurança de dados dos usuários | --- | Alta |
+| RNF13 | O ambiente de produção deve ser configurado de modo que sempre contenha uma versão testada e estável | --- | Alta |
+| RNF14 | O ambiente de homologação deve ser configurado de modo que as versões mais recentes sejam testadas | --- | Alta |
+| RNF15 | A aplicação deve possuir mecanismos que permitam a acessibilidade de diversos grupos de usuários | --- | Intermediária |
+| RNF16 | A aplicação deve possuir mecanismos de internacionalização de modo que a linguagem do site possa ser configurada pelo usuário | --- | Intermediária |
+
+## Referências
+- Texto descritivo sobre a estrutura e objetivo dos tópicos do documento de visão. https://www.ibm.com/support/knowledgecenter/pt-br/SSWMEQ_4.0.6/com.ibm.rational.rrm.help.doc/topics/r_vision_doc.html. Acesso em 02 de setembro de 2019
+
+- História da Santropol Roulant. Disponível em https://santropolroulant.org/en/history/. Acesso em 01 de setembro de 2019.
+
+- Programas desenvolvidos pela Santropol Roulant. Disponível em https://santropolroulant.org/en/what-is-the-roulant/#block_cross. Acesso em 01 de setembro de 2019
+
+- Projeto Les Fruits Défendus. Disponível em https://santropolroulant.org/en/what-is-the-roulant/collectives/fruits-defendus/. Acesso em 01 de setembro de 2019
\ No newline at end of file
diff --git a/docs/wbs.md b/docs/wbs.md
new file mode 100644
index 0000000..6b56674
--- /dev/null
+++ b/docs/wbs.md
@@ -0,0 +1,18 @@
+# Estrutura Analítica do Projeto
+
+
+# Histórico de Revisão
+
+| Data | Versão | Modificação | Autor |
+| :- | :- | :- | :- |
+| 04/09/2019 | 0.1 | Criação da versão inicial do documento | Fabíola |
+| 06/09/2019 | 0.2 | Atualização da introdução do documento | Fabíola |
+
+# 1. Introdução
+
+Este documento permite a visualização do projeto em blocos de atividades que se relacionam para o cumprimento do projeto. Nela, constam as atividades necessárias para entrega do produto mínimo viável, tanto de implementação quanto de gerência.
+
+# 2. Diagrama
+
+![eap](img/EAP.png)
+
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..2d1fdc0
--- /dev/null
+++ b/index.html
@@ -0,0 +1,37 @@
+
+
+
+
+
+ Acácia
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index b4aeb67..c6327f2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,12 +1,12 @@
+Pillow
+whitenoise
+flake8==3.7.8
Django==2.2.4
-djangorestframework==3.10
-django-phonenumber-field==3.0
-phonenumbers==8.10
psycopg2==2.8.3
-django-cors-headers==3.1.0
-flake8==3.7.8
-djangorestframework-simplejwt==4.3.0
coverage==4.5.4
+phonenumbers==8.10
django-localflavor==2.2
-pillow
-whitenoise
+djangorestframework==3.10
+django-cors-headers==3.1.0
+django-phonenumber-field==3.0
+djangorestframework-simplejwt==4.3.0
diff --git a/src/acacia/settings.py b/src/acacia/settings.py
index f24011f..e0d5082 100644
--- a/src/acacia/settings.py
+++ b/src/acacia/settings.py
@@ -28,7 +28,7 @@
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
-ALLOWED_HOSTS = ['0.0.0.0', 'localhost', 'acacia-backend-staging.herokuapp.com']
+ALLOWED_HOSTS = ['*']
AUTH_USER_MODEL = 'users.User'
@@ -97,11 +97,11 @@
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
- 'NAME': os.environ.get('DATABASE_NAME'),
- 'USER': os.environ.get('DATABASE_USER'),
- 'PASSWORD': os.environ.get('DATABASE_PASSWORD'),
- 'HOST': os.environ.get('DATABASE_HOST'),
- 'PORT': os.environ.get('DATABASE_PORT'),
+ 'NAME': os.environ.get('POSTGRES_DB'),
+ 'USER': os.environ.get('POSTGRES_USER'),
+ 'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
+ 'HOST': os.environ.get('POSTGRES_HOST'),
+ 'PORT': '5432',
},
'sqlite': {
@@ -119,6 +119,8 @@
('fr-CA', _('French Canadian')),
)
+MEDIA_URL = '/media/'
+MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
@@ -173,10 +175,11 @@
# CORS headers to responses
CORS_ORIGIN_WHITELIST = [
- "http://localhost:8080",
+ "http://localhost:8080",
"http://0.0.0.0:8080",
- "http://localhost:8080",
- "https://acacia-staging.herokuapp.com",
+ "http://localhost:8080",
+ "http://45.55.46.19:8080",
+ "http://45.55.46.19:8081",
]
SIMPLE_JWT = {
diff --git a/src/acacia/urls.py b/src/acacia/urls.py
index 08a3819..71764d8 100644
--- a/src/acacia/urls.py
+++ b/src/acacia/urls.py
@@ -1,14 +1,27 @@
from django.contrib import admin
from django.urls import path, include
from .helpers import list_all_endpoints
+from harvest.viewsets import WeekHarvests, MonthlyHarvests
urlpatterns = [
path('admin/', admin.site.urls),
path('users/', include('users.urls')),
path('harvests/', include('harvest.urls')),
+ path('harvests', include('harvest.urls')),
path('properties/', include('property.urls')),
-]
+ path('properties', include('property.urls')),
+ path(
+ 'weekly_harvests/',
+ WeekHarvests.as_view({'get': 'list'}),
+ name='weekly_harvests'
+ ),
+ path(
+ 'monthly_harvest///',
+ MonthlyHarvests.as_view({'get': 'list'}),
+ name='monthly_harvest'
+ ),
+]
urlpatterns = list_all_endpoints(urlpatterns)
diff --git a/src/harvest/admin.py b/src/harvest/admin.py
index 505e85d..676e4f5 100644
--- a/src/harvest/admin.py
+++ b/src/harvest/admin.py
@@ -1,5 +1,5 @@
from django.contrib import admin
-from .models import Harvest, RulesHarvest
+from .models import Harvest, HarvestRules
class HarvestAdmin(admin.ModelAdmin):
@@ -12,4 +12,4 @@ class HarvestAdmin(admin.ModelAdmin):
admin.site.register(Harvest)
-admin.site.register(RulesHarvest)
+admin.site.register(HarvestRules)
diff --git a/src/harvest/migrations/0001_initial.py b/src/harvest/migrations/0001_initial.py
index 95f6a1a..5d00cde 100644
--- a/src/harvest/migrations/0001_initial.py
+++ b/src/harvest/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 2.2.4 on 2019-11-11 10:58
+# Generated by Django 2.2.4 on 2019-11-19 23:47
from django.db import migrations, models
import django.db.models.deletion
@@ -9,6 +9,7 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
+ ('property', '0001_initial'),
]
operations = [
@@ -17,19 +18,23 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateField()),
- ('description', models.TextField(blank=True, default='', null=True)),
+ ('description', models.TextField(default='')),
('status', models.CharField(choices=[('Done', 'Done'), ('Cancelled', 'Cancelled'), ('Open', 'Open'), ('Enough', 'Enough')], max_length=9)),
('max_volunteers', models.PositiveSmallIntegerField()),
('min_volunteers', models.PositiveSmallIntegerField()),
- ('equipment', models.CharField(blank=True, max_length=2000, null=True)),
+ ('property', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='harvests', to='property.Property', verbose_name='Property harvests')),
],
),
migrations.CreateModel(
- name='RulesHarvest',
+ name='HarvestRules',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('description', models.CharField(max_length=280)),
- ('harvest', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='harvest.Harvest')),
+ ('harvest', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rules', to='harvest.Harvest')),
],
+ options={
+ 'verbose_name_plural': 'Harvest Rules',
+ 'unique_together': {('harvest', 'description')},
+ },
),
]
diff --git a/src/harvest/models.py b/src/harvest/models.py
index 0ad34a9..2e98d5a 100644
--- a/src/harvest/models.py
+++ b/src/harvest/models.py
@@ -1,28 +1,28 @@
from django.db import models
+from property.models import Property
+from django.utils.translation import ugettext as _
class Harvest(models.Model):
- # TODO A Harvest belongs to a property
-
- def __str__(self):
- return str(self.date)
-
- objects = models.Manager()
+ property = models.ForeignKey(
+ Property,
+ on_delete=models.CASCADE,
+ verbose_name=_('Property harvests'),
+ related_name=_('harvests'),
+ )
date = models.DateField()
description = models.TextField(
- blank=True,
- null=True,
default=""
)
HARVEST_STATUS = (
- ('Done', 'Done'),
- ('Cancelled', 'Cancelled'),
- ('Open', 'Open'),
- ('Enough', 'Enough'),
+ ('Done', 'Done'),
+ ('Cancelled', 'Cancelled'),
+ ('Open', 'Open'),
+ ('Enough', 'Enough'),
)
status = models.CharField(
@@ -33,30 +33,32 @@ def __str__(self):
max_volunteers = models.PositiveSmallIntegerField()
min_volunteers = models.PositiveSmallIntegerField()
- # probabily this field will become a new model
- equipment = models.CharField(
- blank=True,
- null=True,
- max_length=2000
- )
+ def __str__(self):
+ return str(self.date)
- # ACCESS_TYPES = (
- # ('Restrict Access', 'Restrict Access'),
- # ('Free Access', 'Free Access'),
- # )
- # access = models.CharField(
- # choices=ACCESS_TYPES,
- # max_length=15
- # )
+ @staticmethod
+ def valid_status():
+ """
+ This class method returns a list of valid status
+ """
+ return [k for k, v in Harvest.HARVEST_STATUS]
-class RulesHarvest(models.Model):
+class HarvestRules(models.Model):
- def __str__(self):
- return self.description
+ class Meta:
+ verbose_name_plural = _('Harvest Rules')
+ unique_together = ('harvest', 'description')
- harvest = models.ForeignKey(Harvest, models.CASCADE)
+ harvest = models.ForeignKey(
+ Harvest,
+ models.CASCADE,
+ related_name=_('rules'),
+ )
description = models.CharField(
- max_length=280
+ max_length=280,
)
+
+ def __str__(self):
+ return self.description
diff --git a/src/harvest/serializers.py b/src/harvest/serializers.py
index 4a9f26a..af5bc0e 100644
--- a/src/harvest/serializers.py
+++ b/src/harvest/serializers.py
@@ -1,44 +1,104 @@
# Models
-from .models import Harvest, RulesHarvest
+from django.utils.translation import ugettext as _
+from . import models
+from rest_framework import serializers
-# Django Rest Framework
-from rest_framework.serializers import ModelSerializer
-
-class RulesHarvestSerializer(ModelSerializer):
+class RulesHarvestSerializer(serializers.ModelSerializer):
class Meta:
- model = RulesHarvest
+ model = models.HarvestRules
fields = (
+ 'pk',
'description',
)
+ def validate_description(self, description):
+ """
+ Validates if this harvest already has
+ this rule description
+ """
+
+ pk_harvest = self.context['view'].kwargs['harvest_pk']
-class HarvestSerializer(ModelSerializer):
+ rule_queryset = models.HarvestRules.objects.filter(
+ harvest=pk_harvest,
+ description=description
+ )
+
+ if rule_queryset:
+ raise serializers.ValidationError(
+ 'This harvest already has this rule description registered'
+ )
+
+ return description
+
+
+class HarvestSerializer(serializers.ModelSerializer):
rules = RulesHarvestSerializer(
many=True,
- write_only=True
+ read_only=True
)
class Meta:
- model = Harvest
+ model = models.Harvest
fields = (
+ 'pk',
'date',
'status',
- 'equipment',
'description',
'max_volunteers',
'min_volunteers',
'rules',
+ 'property_id'
)
- def create(self, validated_data):
- rules = validated_data.pop('rules')
- harvest = Harvest.objects.create(**validated_data)
+ extra_kwargs = {
+ "status": {
+ "error_messages": {
+ "required": _("Choose one of the "
+ "following status: ") + str(
+ models.Harvest.valid_status()),
+
+ "invalid_choice": _("Invalid status. "
+ "Choose one of the following "
+ "types: ") + str(
+ models.Harvest.valid_status()),
+ }
+ },
+ }
- for rule in rules:
- RulesHarvest.objects.create(
- harvest=harvest,
- **rule
+ def validate(self, data):
+ """
+ This validation occurs on both update and create
+ requests, so you need to verify that the crop in
+ question already exists before purchasing the number
+ of volunteers.
+ """
+
+ min_volunteers = data.get('min_volunteers', None)
+ max_volunteers = data.get('max_volunteers', None)
+
+ # patch request that doesn't update this field
+ if min_volunteers is None and max_volunteers is None:
+ return data
+
+ harvest_pk = self.context['view'].kwargs.get('pk', None)
+
+ # patch or put request
+ if harvest_pk:
+ harvest = models.Harvest.objects.get(pk=harvest_pk)
+
+ if not min_volunteers:
+ min_volunteers = harvest.min_volunteers
+
+ if not max_volunteers:
+ max_volunteers = harvest.max_volunteers
+
+ if max_volunteers < min_volunteers:
+ raise serializers.ValidationError(
+ ("Minimum number of volunteers must be " +
+ "less than maximum number of volunteers")
)
- return harvest
+
+ return data
diff --git a/src/harvest/tests/__init__.py b/src/harvest/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/harvest/tests/test_models.py b/src/harvest/tests/test_models.py
new file mode 100644
index 0000000..d0759dc
--- /dev/null
+++ b/src/harvest/tests/test_models.py
@@ -0,0 +1,27 @@
+from django.test import TestCase
+from harvest.models import Harvest, HarvestRules
+
+
+class HarvestModelTest(TestCase):
+
+ def test_valid_tree_types(self):
+ expected = [
+ 'Done',
+ 'Cancelled',
+ 'Open',
+ 'Enough',
+ ]
+
+ self.assertEquals(
+ expected,
+ Harvest.valid_status()
+ )
+
+
+class HarvestRulesModelTest(TestCase):
+
+ def test_unique_together(self):
+ self.assertEqual(
+ HarvestRules._meta.unique_together,
+ (('harvest', 'description'),)
+ )
diff --git a/src/harvest/tests/test_tree_views.py b/src/harvest/tests/test_tree_views.py
new file mode 100644
index 0000000..b7e1ead
--- /dev/null
+++ b/src/harvest/tests/test_tree_views.py
@@ -0,0 +1,545 @@
+from rest_framework.test import APITestCase
+from django.urls import reverse
+from datetime import datetime, timedelta
+
+from property.models import Property
+from users.models import User
+from harvest.models import Harvest
+
+
+class HarvestViewSetTestCase(APITestCase):
+
+ def create_authentication_tokens(self, user_credentials):
+ url_token = reverse('users:token_obtain_pair')
+
+ response = self.client.post(
+ url_token,
+ user_credentials,
+ format='json'
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 200,
+ msg='Failed to create user tokens credentials'
+ )
+
+ self.credentials = {
+ 'HTTP_AUTHORIZATION': 'Bearer ' + response.data['access']
+ }
+
+ def create_user(self):
+ user_data = {
+ "username": 'vitas',
+ 'email': 'vitas@vitas.com',
+ 'password': 'vitasIsNice',
+ 'confirm_password': 'vitasIsNice'
+ }
+
+ url_user_signup = reverse('users:register')
+
+ response = self.client.post(
+ url_user_signup,
+ user_data,
+ format='json'
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 201,
+ msg='Failed during user creation'
+ )
+
+ user_data.pop('username')
+ user_data.pop('confirm_password')
+
+ self.create_authentication_tokens(user_data)
+
+ def create_property(self):
+ property_data = {
+ 'type_of_address': 'House',
+ 'BRZipCode': '73021498',
+ 'state': 'DF',
+ 'city': 'Gama',
+ 'district': 'Leste',
+ 'address': "Quadra 4",
+ }
+
+ url_property_creation = reverse(
+ 'property:property-list',
+ )
+
+ response = self.client.post(
+ path=url_property_creation,
+ data=property_data,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 201,
+ msg='Failed to create property'
+ )
+
+ self.property = Property.objects.get(pk=1)
+
+ def setUp(self):
+ self.create_user()
+ self.create_property()
+
+ self.harvest_data = {
+ 'date': '2019-11-18',
+ 'description': 'Apple Harvest',
+ 'status': 'Open',
+ 'max_volunteers': 10,
+ 'min_volunteers': 5,
+ }
+
+ self.url_list = reverse(
+ 'property:harvest:harvest-list',
+ kwargs={'property_pk': self.property.pk}
+ )
+
+ self.url_detail = reverse(
+ 'property:harvest:harvest-detail',
+ kwargs={
+ 'property_pk': self.property.pk,
+ 'pk': '1'
+ }
+ )
+
+ def tearDown(self):
+ Property.objects.all().delete()
+ User.objects.all().delete()
+ Harvest.objects.all().delete()
+
+ def test_create_harvest(self):
+
+ response = self.client.post(
+ path=self.url_list,
+ data=self.harvest_data,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 201,
+ msg='Failed to create a harvest'
+ )
+
+ self.assertDictContainsSubset(
+ self.harvest_data,
+ response.data,
+ )
+
+ self.assertEqual(
+ response.data['rules'],
+ []
+ )
+
+ self.harvest = Harvest.objects.get(pk=1)
+
+ def test_create_harvest_with_inconsistent_qnt_volunteers(self):
+
+ self.harvest_data['min_volunteers'] = 10
+ self.harvest_data['max_volunteers'] = 5
+
+ response = self.client.post(
+ path=self.url_list,
+ data=self.harvest_data,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 400,
+ )
+
+ def test_create_harvest_rule(self):
+
+ self.test_create_harvest()
+
+ rule_url_list = reverse(
+ 'property:harvest:harvest_rules-list',
+ kwargs={
+ 'property_pk': self.property.pk,
+ 'harvest_pk': self.harvest.pk
+ }
+ )
+
+ response = self.client.post(
+ path=rule_url_list,
+ data={'description': 'To participate you need to like Vitas'},
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 201,
+ msg='Failed to create a harvest rule'
+ )
+
+ self.assertEqual(
+ 'To participate you need to like Vitas',
+ response.data['description'],
+ )
+
+ def test_create_two_identical_harvest_rule(self):
+
+ self.test_create_harvest_rule()
+
+ with self.assertRaises(AssertionError):
+ self.test_create_harvest_rule()
+
+ def test_get_harvests_of_the_week(self):
+
+ today = datetime.date(datetime.now())
+
+ # create harvests in the next 14 days
+ for i in range(14):
+ date = today + timedelta(days=i)
+
+ self.harvest_data['date'] = date
+
+ response = self.client.post(
+ path=self.url_list,
+ data=self.harvest_data,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 201,
+ msg='Failed to create a harvest'
+ )
+
+ weekly_harvests_url = reverse(
+ 'weekly_harvests',
+ )
+
+ response = self.client.get(
+ path=weekly_harvests_url,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ len(response.data),
+ 8,
+ msg='Failed return only the next 7 days harvests'
+ )
+
+ def test_list_all_harvest(self):
+
+ self.test_create_harvest()
+
+ response = self.client.get(
+ path=self.url_list,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ len(response.data),
+ 1,
+ msg='More than one harvest was created'
+ )
+
+ response_data = dict(response.data[0])
+
+ self.assertDictContainsSubset(
+ self.harvest_data,
+ response_data,
+ )
+
+ def test_patch_update_harvest(self):
+
+ self.test_create_harvest()
+
+ harvest_update = {
+ 'status': 'Done',
+ }
+
+ response = self.client.patch(
+ path=self.url_detail,
+ data=harvest_update,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 200,
+ msg='Failed to patch update the harvest'
+ )
+
+ self.assertEqual(
+ response.data['status'],
+ harvest_update['status'],
+ )
+
+ def test_patch_update_harvest_with_inconsistent_qnt_volunteers(self):
+
+ self.test_create_harvest()
+
+ harvest_update = {
+ 'max_volunteers': 1,
+ }
+
+ response = self.client.patch(
+ path=self.url_detail,
+ data=harvest_update,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 400,
+ )
+
+ def test_patch_update_harvest_with_valid_qnt_volunteers(self):
+
+ self.test_create_harvest()
+
+ harvest_update = {
+ 'max_volunteers': 20,
+ 'min_volunteers': 10,
+ }
+
+ response = self.client.patch(
+ path=self.url_detail,
+ data=harvest_update,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 200,
+ msg='Failed to patch update the harvest'
+ )
+
+ def test_put_update_harvest(self):
+
+ self.test_create_harvest()
+
+ self.harvest_data['status'] = 'Done'
+
+ response = self.client.put(
+ path=self.url_detail,
+ data=self.harvest_data,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 200,
+ msg='Failed to update the harvest'
+ )
+
+ self.assertDictContainsSubset(
+ self.harvest_data,
+ response.data,
+ )
+
+ def test_get_harvest(self):
+
+ self.test_create_harvest()
+
+ response = self.client.get(
+ path=self.url_detail,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 200,
+ msg='Failed to get the harvest'
+ )
+
+ self.assertDictContainsSubset(
+ self.harvest_data,
+ response.data,
+ )
+
+ def test_delete_harvest(self):
+
+ self.test_create_harvest()
+
+ response = self.client.delete(
+ path=self.url_detail,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 204,
+ msg='Failed to delete the harvest'
+ )
+
+ harvests = Harvest.objects.all()
+ qnt_harvest = len(harvests)
+
+ self.assertEqual(
+ qnt_harvest,
+ 0,
+ msg='Failed to delete the harvest'
+ )
+
+
+class MonthlyHarvestsTestCase(APITestCase):
+
+ def create_authentication_tokens(self, user_credentials):
+ url_token = reverse('users:token_obtain_pair')
+
+ response = self.client.post(
+ url_token,
+ user_credentials,
+ format='json'
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 200,
+ msg='Failed to create user tokens credentials'
+ )
+
+ self.credentials = {
+ 'HTTP_AUTHORIZATION': 'Bearer ' + response.data['access']
+ }
+
+ def create_user(self):
+ user_data = {
+ "username": 'vitas',
+ 'email': 'vitas@vitas.com',
+ 'password': 'vitasIsNice',
+ 'confirm_password': 'vitasIsNice'
+ }
+
+ url_user_signup = reverse('users:register')
+
+ response = self.client.post(
+ url_user_signup,
+ user_data,
+ format='json'
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 201,
+ msg='Failed during user creation'
+ )
+
+ user_data.pop('username')
+ user_data.pop('confirm_password')
+
+ self.create_authentication_tokens(user_data)
+
+ def create_property(self):
+ property_data = {
+ 'type_of_address': 'House',
+ 'BRZipCode': '73021498',
+ 'state': 'DF',
+ 'city': 'Gama',
+ 'district': 'Leste',
+ 'address': "Quadra 4",
+ }
+
+ url_property_creation = reverse(
+ 'property:property-list',
+ )
+
+ response = self.client.post(
+ path=url_property_creation,
+ data=property_data,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 201,
+ msg='Failed to create property'
+ )
+
+ self.property = Property.objects.get(pk=1)
+
+ def setUp(self):
+ self.create_user()
+ self.create_property()
+
+ self.harvest_data = {
+ 'date': '2019-11-21',
+ 'description': 'Apple Harvest',
+ 'status': 'Open',
+ 'max_volunteers': 10,
+ 'min_volunteers': 5,
+ }
+
+ self.url_list = reverse(
+ 'property:harvest:harvest-list',
+ kwargs={'property_pk': self.property.pk}
+ )
+
+ self.url_detail = reverse(
+ 'property:harvest:harvest-detail',
+ kwargs={
+ 'property_pk': self.property.pk,
+ 'pk': '1'
+ }
+ )
+
+ def tearDown(self):
+ Property.objects.all().delete()
+ User.objects.all().delete()
+ Harvest.objects.all().delete()
+
+ def test_get_harvests_of_the_week(self):
+
+ today = datetime.date(datetime(2020, 1, 1))
+
+ for i in range(0, 12):
+ date = today + timedelta(days=i*31)
+
+ self.harvest_data['date'] = date
+
+ response = self.client.post(
+ path=self.url_list,
+ data=self.harvest_data,
+ format='json',
+ **self.credentials,
+ )
+
+ self.assertEqual(
+ response.status_code,
+ 201,
+ msg='Failed to create a harvest'
+ )
+
+ for month in range(1, 13):
+ weekly_harvests_url = reverse(
+ 'monthly_harvest',
+ kwargs={
+ 'year': date.year,
+ 'month': month
+ }
+ )
+
+ response = self.client.get(
+ path=weekly_harvests_url,
+ )
+
+ self.assertEqual(
+ len(response.data),
+ 1,
+ msg='Failed return only 1 harvest'
+ )
diff --git a/src/harvest/urls.py b/src/harvest/urls.py
index 1f26eac..b0c6d39 100644
--- a/src/harvest/urls.py
+++ b/src/harvest/urls.py
@@ -1,15 +1,32 @@
-# Viewsets
-from .viewsets import HarvestViewSet
+from django.urls import path, include
+from rest_framework import routers
+from . import viewsets
-# Django rest framework
-from rest_framework.routers import DefaultRouter
+app_name = 'harvest'
-router = DefaultRouter()
-router.register(r'', HarvestViewSet, base_name='harvest')
+router = routers.SimpleRouter()
+router.register(
+ r'',
+ viewsets.HarvestViewSet,
+ base_name='harvest'
+)
-app_name = 'harvest'
+slashless_router = routers.DefaultRouter(trailing_slash=False)
+slashless_router.registry = router.registry[:]
+
+harvest_rules_router = routers.SimpleRouter()
+harvest_rules_router.register(
+ r'',
+ viewsets.HarvestRulesViewSet,
+ basename='harvest_rules'
+)
urlpatterns = [
+ path(
+ '/rules/',
+ include(harvest_rules_router.urls),
+ ),
]
urlpatterns += router.urls
+urlpatterns += slashless_router.urls
diff --git a/src/harvest/viewsets.py b/src/harvest/viewsets.py
index 3ef133c..1635872 100644
--- a/src/harvest/viewsets.py
+++ b/src/harvest/viewsets.py
@@ -1,28 +1,100 @@
-
-# Django Rest Framework
+from rest_framework.mixins import ListModelMixin
from rest_framework import permissions
-from rest_framework.response import Response
-from rest_framework.viewsets import ModelViewSet
+from rest_framework import viewsets
-# Models
-from .models import Harvest
+from .models import Harvest, HarvestRules
+from property.models import Property
+from . import serializers
-# Serializers
-from .serializers import HarvestSerializer
+import datetime
+import calendar
-class HarvestViewSet(ModelViewSet):
+class HarvestViewSet(viewsets.ModelViewSet):
+ queryset = Harvest.objects.all()
+ serializer_class = serializers.HarvestSerializer
- # TODO A Harvest belongs to a property
+ permission_classes = (
+ permissions.IsAuthenticated,
+ )
- serializer_class = HarvestSerializer
- queryset = Harvest.objects.all()
+ pk_url_kwarg = 'haverst_pk'
+
+ def perform_create(self, serializer):
+
+ property = Property.objects.get(
+ id=self.kwargs['property_pk']
+ )
+
+ serializer.save(property=property)
+
+ def get_queryset(self):
+ return Harvest.objects.filter(
+ property=self.kwargs['property_pk']
+ )
+
+
+class HarvestRulesViewSet(viewsets.ModelViewSet):
+
+ queryset = HarvestRules.objects.all()
+
+ serializer_class = serializers.RulesHarvestSerializer
permission_classes = (
- permissions.AllowAny,
+ permissions.IsAuthenticated,
)
- def retrieve(self, request, *args, **kwargs):
- instance = self.get_object()
- serializer = self.get_serializer(instance)
- return Response(serializer.data)
+ def perform_create(self, serializer):
+
+ harvest = Harvest.objects.get(
+ pk=self.kwargs['harvest_pk']
+ )
+
+ serializer.save(harvest=harvest)
+
+ def get_queryset(self):
+ return HarvestRules.objects.filter(
+ harvest=self.kwargs['harvest_pk']
+ )
+
+
+class WeekHarvests(ListModelMixin, viewsets.GenericViewSet):
+
+ queryset = Harvest.objects.all()
+ serializer_class = serializers.HarvestSerializer
+
+ permission_classes = (permissions.AllowAny,)
+
+ def get_queryset(self):
+
+ start_date = datetime.datetime.now()
+ end_date = start_date + datetime.timedelta(weeks=1)
+
+ queryset = Harvest.objects.filter(
+ date__range=(start_date, end_date)
+ )
+
+ return queryset
+
+
+class MonthlyHarvests(ListModelMixin, viewsets.GenericViewSet):
+
+ queryset = Harvest.objects.all()
+ serializer_class = serializers.HarvestSerializer
+ permission_classes = (permissions.AllowAny,)
+
+ def get_queryset(self):
+
+ month = self.kwargs['month']
+ year = self.kwargs['year']
+
+ _, last_day = calendar.monthrange(year, month)
+
+ start_date = datetime.datetime(year, month, 1)
+ end_date = datetime.datetime(year, month, last_day)
+
+ queryset = Harvest.objects.filter(
+ date__range=(start_date, end_date)
+ )
+
+ return queryset
diff --git a/src/property/migrations/0001_initial.py b/src/property/migrations/0001_initial.py
index 91cab3f..43d46ae 100644
--- a/src/property/migrations/0001_initial.py
+++ b/src/property/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 2.2.4 on 2019-11-11 10:58
+# Generated by Django 2.2.4 on 2019-11-19 23:47
from django.conf import settings
from django.db import migrations, models
@@ -24,8 +24,8 @@ class Migration(migrations.Migration):
('city', models.CharField(max_length=100, verbose_name='City')),
('district', models.CharField(max_length=100, verbose_name='District')),
('address', models.CharField(max_length=100, verbose_name='Address')),
- ('complement', models.CharField(blank=True, max_length=100, null=True, verbose_name='Address complement')),
- ('reference_point', models.CharField(blank=True, max_length=100, null=True, verbose_name='Reference point')),
+ ('complement', models.CharField(default='', max_length=100, verbose_name='Address complement')),
+ ('reference_point', models.CharField(default='', max_length=100, verbose_name='Reference point')),
('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='properties', to=settings.AUTH_USER_MODEL, verbose_name='Property owner')),
],
options={
diff --git a/src/property/models.py b/src/property/models.py
index 772896d..12ecda4 100644
--- a/src/property/models.py
+++ b/src/property/models.py
@@ -21,57 +21,43 @@ class Meta:
choices=TYPE_OF_ADDRESS,
max_length=9,
verbose_name=_('Type of address'),
- null=False,
- blank=False,
)
BRZipCode = models.CharField(
max_length=8,
verbose_name=_('Brazilian ZIP code'),
- null=False,
- blank=False,
)
state = models.CharField(
max_length=2,
choices=STATE_CHOICES,
- null=False,
- blank=False
)
city = models.CharField(
max_length=100,
verbose_name=_('City'),
- null=False,
- blank=False,
)
district = models.CharField(
max_length=100,
verbose_name=_('District'),
- null=False,
- blank=False,
)
address = models.CharField(
max_length=100,
verbose_name=_('Address'),
- null=False,
- blank=False,
)
complement = models.CharField(
max_length=100,
verbose_name=_('Address complement'),
- null=True,
- blank=True,
+ default=""
)
reference_point = models.CharField(
max_length=100,
verbose_name=_('Reference point'),
- null=True,
- blank=True,
+ default=""
)
owner = models.ForeignKey(
@@ -79,8 +65,6 @@ class Meta:
on_delete=models.CASCADE,
verbose_name=_('Property owner'),
related_name=_('properties'),
- null=False,
- blank=False,
)
def __str__(self):
diff --git a/src/property/permissions.py b/src/property/permissions.py
index 6faadbc..ec32ade 100644
--- a/src/property/permissions.py
+++ b/src/property/permissions.py
@@ -7,8 +7,10 @@ class UserIsPropertyOwner(permissions.BasePermission):
Assumes the model instance has an `user` attribute.
"""
- def has_object_permition(self, request, view, property):
- if request.method in permissions.SAFE_METHODS:
- return True
-
- return request.user.id == property.owner.id
+ def has_object_permission(self, request, view, property):
+ return bool(
+ request.method in permissions.SAFE_METHODS or
+ request.user and
+ request.user.is_authenticated and
+ request.user.id == property.owner.id
+ )
diff --git a/src/property/serializers.py b/src/property/serializers.py
index 8565f36..ec774c0 100644
--- a/src/property/serializers.py
+++ b/src/property/serializers.py
@@ -4,6 +4,7 @@
from .models import Property
from tree.serializers import TreeSerializer
+from harvest.serializers import HarvestSerializer
class PropertySerializer(ModelSerializer):
@@ -13,6 +14,11 @@ class PropertySerializer(ModelSerializer):
read_only=True
)
+ harvests = HarvestSerializer(
+ many=True,
+ read_only=True
+ )
+
class Meta:
model = Property
fields = (
@@ -26,6 +32,7 @@ class Meta:
'complement',
'reference_point',
'trees',
+ 'harvests',
)
# Customizing error messages
diff --git a/src/property/tests/test_models.py b/src/property/tests/test_models.py
index 72896b0..7dbed25 100644
--- a/src/property/tests/test_models.py
+++ b/src/property/tests/test_models.py
@@ -30,6 +30,13 @@ def test_verbose_name_plural(self):
_('Properties')
)
+ def test_unique_together(self):
+ self.assertEqual(
+ Property._meta.unique_together,
+ (('BRZipCode', 'type_of_address', 'address'),),
+ msg='Property unique key is not being set properly'
+ )
+
def test_property_creation(self):
self.assertEqual(
Property.objects.last(),
diff --git a/src/property/tests/test_views.py b/src/property/tests/test_views.py
index fa892a7..ab997c6 100644
--- a/src/property/tests/test_views.py
+++ b/src/property/tests/test_views.py
@@ -6,6 +6,7 @@
from property import viewsets
from property.models import Property
+from property.permissions import UserIsPropertyOwner
from users.models import User
@@ -64,6 +65,13 @@ def test_create_property(self):
response = self.view_list(request)
self.assertEqual(201, response.status_code)
+ def test_create_property_with_same_unique_key(self):
+ # changing zip code to create a unique property
+ request = self.factory.post(self.url_list, self.data)
+ force_authenticate(request, user=self.user)
+ response = self.view_list(request)
+ self.assertEqual(400, response.status_code)
+
def test_list_property(self):
request = self.factory.get(self.url_list)
force_authenticate(request, user=self.user)
@@ -80,6 +88,14 @@ def test_delete_property(self):
)
self.assertEqual(204, response.status_code)
+ def test_delete_property_without_authentication(self):
+ request = self.factory.delete(self.url_detail)
+ response = self.view_detail(
+ request,
+ pk=self.property.pk
+ )
+ self.assertEqual(401, response.status_code)
+
def test_retrieve_property(self):
request = self.factory.get(self.url_detail)
force_authenticate(request, user=self.user)
@@ -90,14 +106,65 @@ def test_retrieve_property(self):
self.assertEqual(200, response.status_code)
self.assertDictContainsSubset(self.data, response.data)
- def test_update_property(self):
+ def test_patch_update_property(self):
+ request = self.factory.patch(
+ self.url_detail,
+ {'state': 'GO'}
+ )
+ force_authenticate(request, user=self.user)
+ response = self.view_detail(
+ request,
+ pk=self.property.pk
+ )
+ self.assertEqual(200, response.status_code)
+
+ self.data['state'] = 'GO'
+
+ self.assertEqual(
+ response.data['state'],
+ self.data['state']
+ )
+
+ self.assertDictContainsSubset(self.data, response.data)
+
+ def test_put_update_property(self):
self.data['state'] = 'GO'
- request = self.factory.patch(self.url_detail, self.data)
+ self.data['city'] = 'Damianópolis'
+ request = self.factory.put(self.url_detail, self.data)
force_authenticate(request, user=self.user)
+
response = self.view_detail(
request,
pk=self.property.pk
)
+
self.assertEqual(200, response.status_code)
- self.assertEqual(response.data['state'], self.data['state'])
+
+ self.assertEqual(
+ response.data['state'],
+ self.data['state']
+ )
+
self.assertDictContainsSubset(self.data, response.data)
+
+ def test_read_only_permission(self):
+
+ another_user = User.objects.create(
+ username='MrRobot',
+ email='robot@mr.com',
+ password='hackerman'
+ )
+
+ request = self.factory.get(self.url_detail)
+ force_authenticate(request, user=another_user)
+
+ permission = UserIsPropertyOwner()
+ ans = permission.has_object_permission(
+ request,
+ self.view_detail,
+ self.property
+ )
+
+ self.assertTrue(
+ ans
+ )
diff --git a/src/property/urls.py b/src/property/urls.py
index c8242d0..3a2523c 100644
--- a/src/property/urls.py
+++ b/src/property/urls.py
@@ -8,6 +8,22 @@
router = routers.SimpleRouter()
router.register(r'', PropertyViewSet, basename='property')
+slashless_router = routers.DefaultRouter(trailing_slash=False)
+slashless_router.registry = router.registry[:]
+
urlpatterns = [
path('/trees/', include('tree.urls')),
-] + router.urls
+ path('/trees', include('tree.urls')),
+
+
+ path(
+ '/trees/',
+ include('tree.urls')
+ ),
+
+ path(
+ '/harvests/',
+ include('harvest.urls')
+ ),
+
+] + router.urls + slashless_router.urls
diff --git a/src/scripts/clean_migrations.sh b/src/scripts/clean_migrations.sh
new file mode 100755
index 0000000..de4aa95
--- /dev/null
+++ b/src/scripts/clean_migrations.sh
@@ -0,0 +1 @@
+find . -path "*/migrations/0*" -exec rm -f {} \;
\ No newline at end of file
diff --git a/src/scripts/clean_pycache.sh b/src/scripts/clean_pycache.sh
new file mode 100755
index 0000000..dac02c4
--- /dev/null
+++ b/src/scripts/clean_pycache.sh
@@ -0,0 +1 @@
+sudo find . -path "*/__pycache__" -type d -exec rm -r {} ';'
\ No newline at end of file
diff --git a/src/static/.keep b/src/static/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/src/staticfiles/.keep b/src/staticfiles/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/src/staticfiles/admin/css/autocomplete.781713f30664.css b/src/staticfiles/admin/css/autocomplete.781713f30664.css
new file mode 100644
index 0000000..3ef95d1
--- /dev/null
+++ b/src/staticfiles/admin/css/autocomplete.781713f30664.css
@@ -0,0 +1,260 @@
+select.admin-autocomplete {
+ width: 20em;
+}
+
+.select2-container--admin-autocomplete.select2-container {
+ min-height: 30px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single,
+.select2-container--admin-autocomplete .select2-selection--multiple {
+ min-height: 30px;
+ padding: 0;
+}
+
+.select2-container--admin-autocomplete.select2-container--focus .select2-selection,
+.select2-container--admin-autocomplete.select2-container--open .select2-selection {
+ border-color: #999;
+ min-height: 30px;
+}
+
+.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single,
+.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single {
+ padding: 0;
+}
+
+.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple,
+.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple {
+ padding: 0;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single {
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered {
+ color: #444;
+ line-height: 30px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder {
+ color: #999;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow {
+ height: 26px;
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ width: 20px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b {
+ border-color: #888 transparent transparent transparent;
+ border-style: solid;
+ border-width: 5px 4px 0 4px;
+ height: 0;
+ left: 50%;
+ margin-left: -4px;
+ margin-top: -2px;
+ position: absolute;
+ top: 50%;
+ width: 0;
+}
+
+.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear {
+ float: left;
+}
+
+.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow {
+ left: 1px;
+ right: auto;
+}
+
+.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single {
+ background-color: #eee;
+ cursor: default;
+}
+
+.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear {
+ display: none;
+}
+
+.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b {
+ border-color: transparent transparent #888 transparent;
+ border-width: 0 4px 5px 4px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple {
+ background-color: white;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ cursor: text;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered {
+ box-sizing: border-box;
+ list-style: none;
+ margin: 0;
+ padding: 0 5px;
+ width: 100%;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li {
+ list-style: none;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder {
+ color: #999;
+ margin-top: 5px;
+ float: left;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold;
+ margin: 5px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice {
+ background-color: #e4e4e4;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ cursor: default;
+ float: left;
+ margin-right: 5px;
+ margin-top: 5px;
+ padding: 0 5px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove {
+ color: #999;
+ cursor: pointer;
+ display: inline-block;
+ font-weight: bold;
+ margin-right: 2px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover {
+ color: #333;
+}
+
+.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline {
+ float: right;
+}
+
+.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
+ margin-left: 5px;
+ margin-right: auto;
+}
+
+.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
+ margin-left: 2px;
+ margin-right: auto;
+}
+
+.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple {
+ border: solid #999 1px;
+ outline: 0;
+}
+
+.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple {
+ background-color: #eee;
+ cursor: default;
+}
+
+.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove {
+ display: none;
+}
+
+.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field {
+ border: 1px solid #ccc;
+}
+
+.select2-container--admin-autocomplete .select2-search--inline .select2-search__field {
+ background: transparent;
+ border: none;
+ outline: 0;
+ box-shadow: none;
+ -webkit-appearance: textfield;
+}
+
+.select2-container--admin-autocomplete .select2-results > .select2-results__options {
+ max-height: 200px;
+ overflow-y: auto;
+}
+
+.select2-container--admin-autocomplete .select2-results__option[role=group] {
+ padding: 0;
+}
+
+.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] {
+ color: #999;
+}
+
+.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] {
+ background-color: #ddd;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option {
+ padding-left: 1em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group {
+ padding-left: 0;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -1em;
+ padding-left: 2em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -2em;
+ padding-left: 3em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -3em;
+ padding-left: 4em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -4em;
+ padding-left: 5em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -5em;
+ padding-left: 6em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] {
+ background-color: #79aec8;
+ color: white;
+}
+
+.select2-container--admin-autocomplete .select2-results__group {
+ cursor: default;
+ display: block;
+ padding: 6px;
+}
diff --git a/src/staticfiles/admin/css/autocomplete.781713f30664.css.gz b/src/staticfiles/admin/css/autocomplete.781713f30664.css.gz
new file mode 100644
index 0000000..7df4c80
Binary files /dev/null and b/src/staticfiles/admin/css/autocomplete.781713f30664.css.gz differ
diff --git a/src/staticfiles/admin/css/autocomplete.css b/src/staticfiles/admin/css/autocomplete.css
new file mode 100644
index 0000000..3ef95d1
--- /dev/null
+++ b/src/staticfiles/admin/css/autocomplete.css
@@ -0,0 +1,260 @@
+select.admin-autocomplete {
+ width: 20em;
+}
+
+.select2-container--admin-autocomplete.select2-container {
+ min-height: 30px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single,
+.select2-container--admin-autocomplete .select2-selection--multiple {
+ min-height: 30px;
+ padding: 0;
+}
+
+.select2-container--admin-autocomplete.select2-container--focus .select2-selection,
+.select2-container--admin-autocomplete.select2-container--open .select2-selection {
+ border-color: #999;
+ min-height: 30px;
+}
+
+.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single,
+.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single {
+ padding: 0;
+}
+
+.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple,
+.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple {
+ padding: 0;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single {
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered {
+ color: #444;
+ line-height: 30px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder {
+ color: #999;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow {
+ height: 26px;
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ width: 20px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b {
+ border-color: #888 transparent transparent transparent;
+ border-style: solid;
+ border-width: 5px 4px 0 4px;
+ height: 0;
+ left: 50%;
+ margin-left: -4px;
+ margin-top: -2px;
+ position: absolute;
+ top: 50%;
+ width: 0;
+}
+
+.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear {
+ float: left;
+}
+
+.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow {
+ left: 1px;
+ right: auto;
+}
+
+.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single {
+ background-color: #eee;
+ cursor: default;
+}
+
+.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear {
+ display: none;
+}
+
+.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b {
+ border-color: transparent transparent #888 transparent;
+ border-width: 0 4px 5px 4px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple {
+ background-color: white;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ cursor: text;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered {
+ box-sizing: border-box;
+ list-style: none;
+ margin: 0;
+ padding: 0 5px;
+ width: 100%;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li {
+ list-style: none;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder {
+ color: #999;
+ margin-top: 5px;
+ float: left;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold;
+ margin: 5px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice {
+ background-color: #e4e4e4;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ cursor: default;
+ float: left;
+ margin-right: 5px;
+ margin-top: 5px;
+ padding: 0 5px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove {
+ color: #999;
+ cursor: pointer;
+ display: inline-block;
+ font-weight: bold;
+ margin-right: 2px;
+}
+
+.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover {
+ color: #333;
+}
+
+.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline {
+ float: right;
+}
+
+.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
+ margin-left: 5px;
+ margin-right: auto;
+}
+
+.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
+ margin-left: 2px;
+ margin-right: auto;
+}
+
+.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple {
+ border: solid #999 1px;
+ outline: 0;
+}
+
+.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple {
+ background-color: #eee;
+ cursor: default;
+}
+
+.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove {
+ display: none;
+}
+
+.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field {
+ border: 1px solid #ccc;
+}
+
+.select2-container--admin-autocomplete .select2-search--inline .select2-search__field {
+ background: transparent;
+ border: none;
+ outline: 0;
+ box-shadow: none;
+ -webkit-appearance: textfield;
+}
+
+.select2-container--admin-autocomplete .select2-results > .select2-results__options {
+ max-height: 200px;
+ overflow-y: auto;
+}
+
+.select2-container--admin-autocomplete .select2-results__option[role=group] {
+ padding: 0;
+}
+
+.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] {
+ color: #999;
+}
+
+.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] {
+ background-color: #ddd;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option {
+ padding-left: 1em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group {
+ padding-left: 0;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -1em;
+ padding-left: 2em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -2em;
+ padding-left: 3em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -3em;
+ padding-left: 4em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -4em;
+ padding-left: 5em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -5em;
+ padding-left: 6em;
+}
+
+.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] {
+ background-color: #79aec8;
+ color: white;
+}
+
+.select2-container--admin-autocomplete .select2-results__group {
+ cursor: default;
+ display: block;
+ padding: 6px;
+}
diff --git a/src/staticfiles/admin/css/autocomplete.css.gz b/src/staticfiles/admin/css/autocomplete.css.gz
new file mode 100644
index 0000000..7df4c80
Binary files /dev/null and b/src/staticfiles/admin/css/autocomplete.css.gz differ
diff --git a/src/staticfiles/admin/css/base.94893682937c.css b/src/staticfiles/admin/css/base.94893682937c.css
new file mode 100644
index 0000000..579a691
--- /dev/null
+++ b/src/staticfiles/admin/css/base.94893682937c.css
@@ -0,0 +1,987 @@
+/*
+ DJANGO Admin styles
+*/
+
+@import url("fonts.168bab448fee.css");
+
+body {
+ margin: 0;
+ padding: 0;
+ font-size: 14px;
+ font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif;
+ color: #333;
+ background: #fff;
+}
+
+/* LINKS */
+
+a:link, a:visited {
+ color: #447e9b;
+ text-decoration: none;
+}
+
+a:focus, a:hover {
+ color: #036;
+}
+
+a:focus {
+ text-decoration: underline;
+}
+
+a img {
+ border: none;
+}
+
+a.section:link, a.section:visited {
+ color: #fff;
+ text-decoration: none;
+}
+
+a.section:focus, a.section:hover {
+ text-decoration: underline;
+}
+
+/* GLOBAL DEFAULTS */
+
+p, ol, ul, dl {
+ margin: .2em 0 .8em 0;
+}
+
+p {
+ padding: 0;
+ line-height: 140%;
+}
+
+h1,h2,h3,h4,h5 {
+ font-weight: bold;
+}
+
+h1 {
+ margin: 0 0 20px;
+ font-weight: 300;
+ font-size: 20px;
+ color: #666;
+}
+
+h2 {
+ font-size: 16px;
+ margin: 1em 0 .5em 0;
+}
+
+h2.subhead {
+ font-weight: normal;
+ margin-top: 0;
+}
+
+h3 {
+ font-size: 14px;
+ margin: .8em 0 .3em 0;
+ color: #666;
+ font-weight: bold;
+}
+
+h4 {
+ font-size: 12px;
+ margin: 1em 0 .8em 0;
+ padding-bottom: 3px;
+}
+
+h5 {
+ font-size: 10px;
+ margin: 1.5em 0 .5em 0;
+ color: #666;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+ul li {
+ list-style-type: square;
+ padding: 1px 0;
+}
+
+li ul {
+ margin-bottom: 0;
+}
+
+li, dt, dd {
+ font-size: 13px;
+ line-height: 20px;
+}
+
+dt {
+ font-weight: bold;
+ margin-top: 4px;
+}
+
+dd {
+ margin-left: 0;
+}
+
+form {
+ margin: 0;
+ padding: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+ border: none;
+ border-top: 1px solid #eee;
+}
+
+blockquote {
+ font-size: 11px;
+ color: #777;
+ margin-left: 2px;
+ padding-left: 10px;
+ border-left: 5px solid #ddd;
+}
+
+code, pre {
+ font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+ color: #666;
+ font-size: 12px;
+}
+
+pre.literal-block {
+ margin: 10px;
+ background: #eee;
+ padding: 6px 8px;
+}
+
+code strong {
+ color: #930;
+}
+
+hr {
+ clear: both;
+ color: #eee;
+ background-color: #eee;
+ height: 1px;
+ border: none;
+ margin: 0;
+ padding: 0;
+ font-size: 1px;
+ line-height: 1px;
+}
+
+/* TEXT STYLES & MODIFIERS */
+
+.small {
+ font-size: 11px;
+}
+
+.tiny {
+ font-size: 10px;
+}
+
+p.tiny {
+ margin-top: -2px;
+}
+
+.mini {
+ font-size: 10px;
+}
+
+p.mini {
+ margin-top: -3px;
+}
+
+.help, p.help, form p.help, div.help, form div.help, div.help li {
+ font-size: 11px;
+ color: #999;
+}
+
+div.help ul {
+ margin-bottom: 0;
+}
+
+.help-tooltip {
+ cursor: help;
+}
+
+p img, h1 img, h2 img, h3 img, h4 img, td img {
+ vertical-align: middle;
+}
+
+.quiet, a.quiet:link, a.quiet:visited {
+ color: #999;
+ font-weight: normal;
+}
+
+.float-right {
+ float: right;
+}
+
+.float-left {
+ float: left;
+}
+
+.clear {
+ clear: both;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-right {
+ text-align: right;
+}
+
+.example {
+ margin: 10px 0;
+ padding: 5px 10px;
+ background: #efefef;
+}
+
+.nowrap {
+ white-space: nowrap;
+}
+
+/* TABLES */
+
+table {
+ border-collapse: collapse;
+ border-color: #ccc;
+}
+
+td, th {
+ font-size: 13px;
+ line-height: 16px;
+ border-bottom: 1px solid #eee;
+ vertical-align: top;
+ padding: 8px;
+ font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
+}
+
+th {
+ font-weight: 600;
+ text-align: left;
+}
+
+thead th,
+tfoot td {
+ color: #666;
+ padding: 5px 10px;
+ font-size: 11px;
+ background: #fff;
+ border: none;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+}
+
+tfoot td {
+ border-bottom: none;
+ border-top: 1px solid #eee;
+}
+
+thead th.required {
+ color: #000;
+}
+
+tr.alt {
+ background: #f6f6f6;
+}
+
+.row1 {
+ background: #fff;
+}
+
+.row2 {
+ background: #f9f9f9;
+}
+
+/* SORTABLE TABLES */
+
+thead th {
+ padding: 5px 10px;
+ line-height: normal;
+ text-transform: uppercase;
+ background: #f6f6f6;
+}
+
+thead th a:link, thead th a:visited {
+ color: #666;
+}
+
+thead th.sorted {
+ background: #eee;
+}
+
+thead th.sorted .text {
+ padding-right: 42px;
+}
+
+table thead th .text span {
+ padding: 8px 10px;
+ display: block;
+}
+
+table thead th .text a {
+ display: block;
+ cursor: pointer;
+ padding: 8px 10px;
+}
+
+table thead th .text a:focus, table thead th .text a:hover {
+ background: #eee;
+}
+
+thead th.sorted a.sortremove {
+ visibility: hidden;
+}
+
+table thead th.sorted:hover a.sortremove {
+ visibility: visible;
+}
+
+table thead th.sorted .sortoptions {
+ display: block;
+ padding: 9px 5px 0 5px;
+ float: right;
+ text-align: right;
+}
+
+table thead th.sorted .sortpriority {
+ font-size: .8em;
+ min-width: 12px;
+ text-align: center;
+ vertical-align: 3px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+table thead th.sorted .sortoptions a {
+ position: relative;
+ width: 14px;
+ height: 14px;
+ display: inline-block;
+ background: url("../img/sorting-icons.3a097b59f104.svg") 0 0 no-repeat;
+ background-size: 14px auto;
+}
+
+table thead th.sorted .sortoptions a.sortremove {
+ background-position: 0 0;
+}
+
+table thead th.sorted .sortoptions a.sortremove:after {
+ content: '\\';
+ position: absolute;
+ top: -6px;
+ left: 3px;
+ font-weight: 200;
+ font-size: 18px;
+ color: #999;
+}
+
+table thead th.sorted .sortoptions a.sortremove:focus:after,
+table thead th.sorted .sortoptions a.sortremove:hover:after {
+ color: #447e9b;
+}
+
+table thead th.sorted .sortoptions a.sortremove:focus,
+table thead th.sorted .sortoptions a.sortremove:hover {
+ background-position: 0 -14px;
+}
+
+table thead th.sorted .sortoptions a.ascending {
+ background-position: 0 -28px;
+}
+
+table thead th.sorted .sortoptions a.ascending:focus,
+table thead th.sorted .sortoptions a.ascending:hover {
+ background-position: 0 -42px;
+}
+
+table thead th.sorted .sortoptions a.descending {
+ top: 1px;
+ background-position: 0 -56px;
+}
+
+table thead th.sorted .sortoptions a.descending:focus,
+table thead th.sorted .sortoptions a.descending:hover {
+ background-position: 0 -70px;
+}
+
+/* FORM DEFAULTS */
+
+input, textarea, select, .form-row p, form .button {
+ margin: 2px 0;
+ padding: 2px 3px;
+ vertical-align: middle;
+ font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
+ font-weight: normal;
+ font-size: 13px;
+}
+.form-row div.help {
+ padding: 2px 3px;
+}
+
+textarea {
+ vertical-align: top;
+}
+
+input[type=text], input[type=password], input[type=email], input[type=url],
+input[type=number], input[type=tel], textarea, select, .vTextField {
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ padding: 5px 6px;
+ margin-top: 0;
+}
+
+input[type=text]:focus, input[type=password]:focus, input[type=email]:focus,
+input[type=url]:focus, input[type=number]:focus, input[type=tel]:focus,
+textarea:focus, select:focus, .vTextField:focus {
+ border-color: #999;
+}
+
+select {
+ height: 30px;
+}
+
+select[multiple] {
+ /* Allow HTML size attribute to override the height in the rule above. */
+ height: auto;
+ min-height: 150px;
+}
+
+/* FORM BUTTONS */
+
+.button, input[type=submit], input[type=button], .submit-row input, a.button {
+ background: #79aec8;
+ padding: 10px 15px;
+ border: none;
+ border-radius: 4px;
+ color: #fff;
+ cursor: pointer;
+}
+
+a.button {
+ padding: 4px 5px;
+}
+
+.button:active, input[type=submit]:active, input[type=button]:active,
+.button:focus, input[type=submit]:focus, input[type=button]:focus,
+.button:hover, input[type=submit]:hover, input[type=button]:hover {
+ background: #609ab6;
+}
+
+.button[disabled], input[type=submit][disabled], input[type=button][disabled] {
+ opacity: 0.4;
+}
+
+.button.default, input[type=submit].default, .submit-row input.default {
+ float: right;
+ border: none;
+ font-weight: 400;
+ background: #417690;
+}
+
+.button.default:active, input[type=submit].default:active,
+.button.default:focus, input[type=submit].default:focus,
+.button.default:hover, input[type=submit].default:hover {
+ background: #205067;
+}
+
+.button[disabled].default,
+input[type=submit][disabled].default,
+input[type=button][disabled].default {
+ opacity: 0.4;
+}
+
+
+/* MODULES */
+
+.module {
+ border: none;
+ margin-bottom: 30px;
+ background: #fff;
+}
+
+.module p, .module ul, .module h3, .module h4, .module dl, .module pre {
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+.module blockquote {
+ margin-left: 12px;
+}
+
+.module ul, .module ol {
+ margin-left: 1.5em;
+}
+
+.module h3 {
+ margin-top: .6em;
+}
+
+.module h2, .module caption, .inline-group h2 {
+ margin: 0;
+ padding: 8px;
+ font-weight: 400;
+ font-size: 13px;
+ text-align: left;
+ background: #79aec8;
+ color: #fff;
+}
+
+.module caption,
+.inline-group h2 {
+ font-size: 12px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+}
+
+.module table {
+ border-collapse: collapse;
+}
+
+/* MESSAGES & ERRORS */
+
+ul.messagelist {
+ padding: 0;
+ margin: 0;
+}
+
+ul.messagelist li {
+ display: block;
+ font-weight: 400;
+ font-size: 13px;
+ padding: 10px 10px 10px 65px;
+ margin: 0 0 10px 0;
+ background: #dfd url("../img/icon-yes.d2f9f035226a.svg") 40px 12px no-repeat;
+ background-size: 16px auto;
+ color: #333;
+}
+
+ul.messagelist li.warning {
+ background: #ffc url("../img/icon-alert.034cc7d8a67f.svg") 40px 14px no-repeat;
+ background-size: 14px auto;
+}
+
+ul.messagelist li.error {
+ background: #ffefef url("../img/icon-no.439e821418cd.svg") 40px 12px no-repeat;
+ background-size: 16px auto;
+}
+
+.errornote {
+ font-size: 14px;
+ font-weight: 700;
+ display: block;
+ padding: 10px 12px;
+ margin: 0 0 10px 0;
+ color: #ba2121;
+ border: 1px solid #ba2121;
+ border-radius: 4px;
+ background-color: #fff;
+ background-position: 5px 12px;
+}
+
+ul.errorlist {
+ margin: 0 0 4px;
+ padding: 0;
+ color: #ba2121;
+ background: #fff;
+}
+
+ul.errorlist li {
+ font-size: 13px;
+ display: block;
+ margin-bottom: 4px;
+}
+
+ul.errorlist li:first-child {
+ margin-top: 0;
+}
+
+ul.errorlist li a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+td ul.errorlist {
+ margin: 0;
+ padding: 0;
+}
+
+td ul.errorlist li {
+ margin: 0;
+}
+
+.form-row.errors {
+ margin: 0;
+ border: none;
+ border-bottom: 1px solid #eee;
+ background: none;
+}
+
+.form-row.errors ul.errorlist li {
+ padding-left: 0;
+}
+
+.errors input, .errors select, .errors textarea {
+ border: 1px solid #ba2121;
+}
+
+div.system-message {
+ background: #ffc;
+ margin: 10px;
+ padding: 6px 8px;
+ font-size: .8em;
+}
+
+div.system-message p.system-message-title {
+ padding: 4px 5px 4px 25px;
+ margin: 0;
+ color: #c11;
+ background: #ffefef url("../img/icon-no.439e821418cd.svg") 5px 5px no-repeat;
+}
+
+.description {
+ font-size: 12px;
+ padding: 5px 0 0 12px;
+}
+
+/* BREADCRUMBS */
+
+div.breadcrumbs {
+ background: #79aec8;
+ padding: 10px 40px;
+ border: none;
+ font-size: 14px;
+ color: #c4dce8;
+ text-align: left;
+}
+
+div.breadcrumbs a {
+ color: #fff;
+}
+
+div.breadcrumbs a:focus, div.breadcrumbs a:hover {
+ color: #c4dce8;
+}
+
+/* ACTION ICONS */
+
+.viewlink, .inlineviewlink {
+ padding-left: 16px;
+ background: url("../img/icon-viewlink.41eb31f7826e.svg") 0 1px no-repeat;
+}
+
+.addlink {
+ padding-left: 16px;
+ background: url("../img/icon-addlink.d519b3bab011.svg") 0 1px no-repeat;
+}
+
+.changelink, .inlinechangelink {
+ padding-left: 16px;
+ background: url("../img/icon-changelink.18d2fd706348.svg") 0 1px no-repeat;
+}
+
+.deletelink {
+ padding-left: 16px;
+ background: url("../img/icon-deletelink.564ef9dc3854.svg") 0 1px no-repeat;
+}
+
+a.deletelink:link, a.deletelink:visited {
+ color: #CC3434;
+}
+
+a.deletelink:focus, a.deletelink:hover {
+ color: #993333;
+ text-decoration: none;
+}
+
+/* OBJECT TOOLS */
+
+.object-tools {
+ font-size: 10px;
+ font-weight: bold;
+ padding-left: 0;
+ float: right;
+ position: relative;
+ margin-top: -48px;
+}
+
+.form-row .object-tools {
+ margin-top: 5px;
+ margin-bottom: 5px;
+ float: none;
+ height: 2em;
+ padding-left: 3.5em;
+}
+
+.object-tools li {
+ display: block;
+ float: left;
+ margin-left: 5px;
+ height: 16px;
+}
+
+.object-tools a {
+ border-radius: 15px;
+}
+
+.object-tools a:link, .object-tools a:visited {
+ display: block;
+ float: left;
+ padding: 3px 12px;
+ background: #999;
+ font-weight: 400;
+ font-size: 11px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ color: #fff;
+}
+
+.object-tools a:focus, .object-tools a:hover {
+ background-color: #417690;
+}
+
+.object-tools a:focus{
+ text-decoration: none;
+}
+
+.object-tools a.viewsitelink, .object-tools a.golink,.object-tools a.addlink {
+ background-repeat: no-repeat;
+ background-position: right 7px center;
+ padding-right: 26px;
+}
+
+.object-tools a.viewsitelink, .object-tools a.golink {
+ background-image: url("../img/tooltag-arrowright.bbfb788a849e.svg");
+}
+
+.object-tools a.addlink {
+ background-image: url("../img/tooltag-add.e59d620a9742.svg");
+}
+
+/* OBJECT HISTORY */
+
+table#change-history {
+ width: 100%;
+}
+
+table#change-history tbody th {
+ width: 16em;
+}
+
+/* PAGE STRUCTURE */
+
+#container {
+ position: relative;
+ width: 100%;
+ min-width: 980px;
+ padding: 0;
+}
+
+#content {
+ padding: 20px 40px;
+}
+
+.dashboard #content {
+ width: 600px;
+}
+
+#content-main {
+ float: left;
+ width: 100%;
+}
+
+#content-related {
+ float: right;
+ width: 260px;
+ position: relative;
+ margin-right: -300px;
+}
+
+#footer {
+ clear: both;
+ padding: 10px;
+}
+
+/* COLUMN TYPES */
+
+.colMS {
+ margin-right: 300px;
+}
+
+.colSM {
+ margin-left: 300px;
+}
+
+.colSM #content-related {
+ float: left;
+ margin-right: 0;
+ margin-left: -300px;
+}
+
+.colSM #content-main {
+ float: right;
+}
+
+.popup .colM {
+ width: auto;
+}
+
+/* HEADER */
+
+#header {
+ width: auto;
+ height: auto;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 10px 40px;
+ background: #417690;
+ color: #ffc;
+ overflow: hidden;
+}
+
+#header a:link, #header a:visited {
+ color: #fff;
+}
+
+#header a:focus , #header a:hover {
+ text-decoration: underline;
+}
+
+#branding {
+ float: left;
+}
+
+#branding h1 {
+ padding: 0;
+ margin: 0 20px 0 0;
+ font-weight: 300;
+ font-size: 24px;
+ color: #f5dd5d;
+}
+
+#branding h1, #branding h1 a:link, #branding h1 a:visited {
+ color: #f5dd5d;
+}
+
+#branding h2 {
+ padding: 0 10px;
+ font-size: 14px;
+ margin: -8px 0 8px 0;
+ font-weight: normal;
+ color: #ffc;
+}
+
+#branding a:hover {
+ text-decoration: none;
+}
+
+#user-tools {
+ float: right;
+ padding: 0;
+ margin: 0 0 0 20px;
+ font-weight: 300;
+ font-size: 11px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+ text-align: right;
+}
+
+#user-tools a {
+ border-bottom: 1px solid rgba(255, 255, 255, 0.25);
+}
+
+#user-tools a:focus, #user-tools a:hover {
+ text-decoration: none;
+ border-bottom-color: #79aec8;
+ color: #79aec8;
+}
+
+/* SIDEBAR */
+
+#content-related {
+ background: #f8f8f8;
+}
+
+#content-related .module {
+ background: none;
+}
+
+#content-related h3 {
+ font-size: 14px;
+ color: #666;
+ padding: 0 16px;
+ margin: 0 0 16px;
+}
+
+#content-related h4 {
+ font-size: 13px;
+}
+
+#content-related p {
+ padding-left: 16px;
+ padding-right: 16px;
+}
+
+#content-related .actionlist {
+ padding: 0;
+ margin: 16px;
+}
+
+#content-related .actionlist li {
+ line-height: 1.2;
+ margin-bottom: 10px;
+ padding-left: 18px;
+}
+
+#content-related .module h2 {
+ background: none;
+ padding: 16px;
+ margin-bottom: 16px;
+ border-bottom: 1px solid #eaeaea;
+ font-size: 18px;
+ color: #333;
+}
+
+.delete-confirmation form input[type="submit"] {
+ background: #ba2121;
+ border-radius: 4px;
+ padding: 10px 15px;
+ color: #fff;
+}
+
+.delete-confirmation form input[type="submit"]:active,
+.delete-confirmation form input[type="submit"]:focus,
+.delete-confirmation form input[type="submit"]:hover {
+ background: #a41515;
+}
+
+.delete-confirmation form .cancel-link {
+ display: inline-block;
+ vertical-align: middle;
+ height: 15px;
+ line-height: 15px;
+ background: #ddd;
+ border-radius: 4px;
+ padding: 10px 15px;
+ color: #333;
+ margin: 0 0 0 10px;
+}
+
+.delete-confirmation form .cancel-link:active,
+.delete-confirmation form .cancel-link:focus,
+.delete-confirmation form .cancel-link:hover {
+ background: #ccc;
+}
+
+/* POPUP */
+.popup #content {
+ padding: 20px;
+}
+
+.popup #container {
+ min-width: 0;
+}
+
+.popup #header {
+ padding: 10px 20px;
+}
diff --git a/src/staticfiles/admin/css/base.ae33e6383baa.css b/src/staticfiles/admin/css/base.ae33e6383baa.css
new file mode 100644
index 0000000..579a691
--- /dev/null
+++ b/src/staticfiles/admin/css/base.ae33e6383baa.css
@@ -0,0 +1,987 @@
+/*
+ DJANGO Admin styles
+*/
+
+@import url("fonts.168bab448fee.css");
+
+body {
+ margin: 0;
+ padding: 0;
+ font-size: 14px;
+ font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif;
+ color: #333;
+ background: #fff;
+}
+
+/* LINKS */
+
+a:link, a:visited {
+ color: #447e9b;
+ text-decoration: none;
+}
+
+a:focus, a:hover {
+ color: #036;
+}
+
+a:focus {
+ text-decoration: underline;
+}
+
+a img {
+ border: none;
+}
+
+a.section:link, a.section:visited {
+ color: #fff;
+ text-decoration: none;
+}
+
+a.section:focus, a.section:hover {
+ text-decoration: underline;
+}
+
+/* GLOBAL DEFAULTS */
+
+p, ol, ul, dl {
+ margin: .2em 0 .8em 0;
+}
+
+p {
+ padding: 0;
+ line-height: 140%;
+}
+
+h1,h2,h3,h4,h5 {
+ font-weight: bold;
+}
+
+h1 {
+ margin: 0 0 20px;
+ font-weight: 300;
+ font-size: 20px;
+ color: #666;
+}
+
+h2 {
+ font-size: 16px;
+ margin: 1em 0 .5em 0;
+}
+
+h2.subhead {
+ font-weight: normal;
+ margin-top: 0;
+}
+
+h3 {
+ font-size: 14px;
+ margin: .8em 0 .3em 0;
+ color: #666;
+ font-weight: bold;
+}
+
+h4 {
+ font-size: 12px;
+ margin: 1em 0 .8em 0;
+ padding-bottom: 3px;
+}
+
+h5 {
+ font-size: 10px;
+ margin: 1.5em 0 .5em 0;
+ color: #666;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+ul li {
+ list-style-type: square;
+ padding: 1px 0;
+}
+
+li ul {
+ margin-bottom: 0;
+}
+
+li, dt, dd {
+ font-size: 13px;
+ line-height: 20px;
+}
+
+dt {
+ font-weight: bold;
+ margin-top: 4px;
+}
+
+dd {
+ margin-left: 0;
+}
+
+form {
+ margin: 0;
+ padding: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+ border: none;
+ border-top: 1px solid #eee;
+}
+
+blockquote {
+ font-size: 11px;
+ color: #777;
+ margin-left: 2px;
+ padding-left: 10px;
+ border-left: 5px solid #ddd;
+}
+
+code, pre {
+ font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+ color: #666;
+ font-size: 12px;
+}
+
+pre.literal-block {
+ margin: 10px;
+ background: #eee;
+ padding: 6px 8px;
+}
+
+code strong {
+ color: #930;
+}
+
+hr {
+ clear: both;
+ color: #eee;
+ background-color: #eee;
+ height: 1px;
+ border: none;
+ margin: 0;
+ padding: 0;
+ font-size: 1px;
+ line-height: 1px;
+}
+
+/* TEXT STYLES & MODIFIERS */
+
+.small {
+ font-size: 11px;
+}
+
+.tiny {
+ font-size: 10px;
+}
+
+p.tiny {
+ margin-top: -2px;
+}
+
+.mini {
+ font-size: 10px;
+}
+
+p.mini {
+ margin-top: -3px;
+}
+
+.help, p.help, form p.help, div.help, form div.help, div.help li {
+ font-size: 11px;
+ color: #999;
+}
+
+div.help ul {
+ margin-bottom: 0;
+}
+
+.help-tooltip {
+ cursor: help;
+}
+
+p img, h1 img, h2 img, h3 img, h4 img, td img {
+ vertical-align: middle;
+}
+
+.quiet, a.quiet:link, a.quiet:visited {
+ color: #999;
+ font-weight: normal;
+}
+
+.float-right {
+ float: right;
+}
+
+.float-left {
+ float: left;
+}
+
+.clear {
+ clear: both;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-right {
+ text-align: right;
+}
+
+.example {
+ margin: 10px 0;
+ padding: 5px 10px;
+ background: #efefef;
+}
+
+.nowrap {
+ white-space: nowrap;
+}
+
+/* TABLES */
+
+table {
+ border-collapse: collapse;
+ border-color: #ccc;
+}
+
+td, th {
+ font-size: 13px;
+ line-height: 16px;
+ border-bottom: 1px solid #eee;
+ vertical-align: top;
+ padding: 8px;
+ font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
+}
+
+th {
+ font-weight: 600;
+ text-align: left;
+}
+
+thead th,
+tfoot td {
+ color: #666;
+ padding: 5px 10px;
+ font-size: 11px;
+ background: #fff;
+ border: none;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+}
+
+tfoot td {
+ border-bottom: none;
+ border-top: 1px solid #eee;
+}
+
+thead th.required {
+ color: #000;
+}
+
+tr.alt {
+ background: #f6f6f6;
+}
+
+.row1 {
+ background: #fff;
+}
+
+.row2 {
+ background: #f9f9f9;
+}
+
+/* SORTABLE TABLES */
+
+thead th {
+ padding: 5px 10px;
+ line-height: normal;
+ text-transform: uppercase;
+ background: #f6f6f6;
+}
+
+thead th a:link, thead th a:visited {
+ color: #666;
+}
+
+thead th.sorted {
+ background: #eee;
+}
+
+thead th.sorted .text {
+ padding-right: 42px;
+}
+
+table thead th .text span {
+ padding: 8px 10px;
+ display: block;
+}
+
+table thead th .text a {
+ display: block;
+ cursor: pointer;
+ padding: 8px 10px;
+}
+
+table thead th .text a:focus, table thead th .text a:hover {
+ background: #eee;
+}
+
+thead th.sorted a.sortremove {
+ visibility: hidden;
+}
+
+table thead th.sorted:hover a.sortremove {
+ visibility: visible;
+}
+
+table thead th.sorted .sortoptions {
+ display: block;
+ padding: 9px 5px 0 5px;
+ float: right;
+ text-align: right;
+}
+
+table thead th.sorted .sortpriority {
+ font-size: .8em;
+ min-width: 12px;
+ text-align: center;
+ vertical-align: 3px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+table thead th.sorted .sortoptions a {
+ position: relative;
+ width: 14px;
+ height: 14px;
+ display: inline-block;
+ background: url("../img/sorting-icons.3a097b59f104.svg") 0 0 no-repeat;
+ background-size: 14px auto;
+}
+
+table thead th.sorted .sortoptions a.sortremove {
+ background-position: 0 0;
+}
+
+table thead th.sorted .sortoptions a.sortremove:after {
+ content: '\\';
+ position: absolute;
+ top: -6px;
+ left: 3px;
+ font-weight: 200;
+ font-size: 18px;
+ color: #999;
+}
+
+table thead th.sorted .sortoptions a.sortremove:focus:after,
+table thead th.sorted .sortoptions a.sortremove:hover:after {
+ color: #447e9b;
+}
+
+table thead th.sorted .sortoptions a.sortremove:focus,
+table thead th.sorted .sortoptions a.sortremove:hover {
+ background-position: 0 -14px;
+}
+
+table thead th.sorted .sortoptions a.ascending {
+ background-position: 0 -28px;
+}
+
+table thead th.sorted .sortoptions a.ascending:focus,
+table thead th.sorted .sortoptions a.ascending:hover {
+ background-position: 0 -42px;
+}
+
+table thead th.sorted .sortoptions a.descending {
+ top: 1px;
+ background-position: 0 -56px;
+}
+
+table thead th.sorted .sortoptions a.descending:focus,
+table thead th.sorted .sortoptions a.descending:hover {
+ background-position: 0 -70px;
+}
+
+/* FORM DEFAULTS */
+
+input, textarea, select, .form-row p, form .button {
+ margin: 2px 0;
+ padding: 2px 3px;
+ vertical-align: middle;
+ font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
+ font-weight: normal;
+ font-size: 13px;
+}
+.form-row div.help {
+ padding: 2px 3px;
+}
+
+textarea {
+ vertical-align: top;
+}
+
+input[type=text], input[type=password], input[type=email], input[type=url],
+input[type=number], input[type=tel], textarea, select, .vTextField {
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ padding: 5px 6px;
+ margin-top: 0;
+}
+
+input[type=text]:focus, input[type=password]:focus, input[type=email]:focus,
+input[type=url]:focus, input[type=number]:focus, input[type=tel]:focus,
+textarea:focus, select:focus, .vTextField:focus {
+ border-color: #999;
+}
+
+select {
+ height: 30px;
+}
+
+select[multiple] {
+ /* Allow HTML size attribute to override the height in the rule above. */
+ height: auto;
+ min-height: 150px;
+}
+
+/* FORM BUTTONS */
+
+.button, input[type=submit], input[type=button], .submit-row input, a.button {
+ background: #79aec8;
+ padding: 10px 15px;
+ border: none;
+ border-radius: 4px;
+ color: #fff;
+ cursor: pointer;
+}
+
+a.button {
+ padding: 4px 5px;
+}
+
+.button:active, input[type=submit]:active, input[type=button]:active,
+.button:focus, input[type=submit]:focus, input[type=button]:focus,
+.button:hover, input[type=submit]:hover, input[type=button]:hover {
+ background: #609ab6;
+}
+
+.button[disabled], input[type=submit][disabled], input[type=button][disabled] {
+ opacity: 0.4;
+}
+
+.button.default, input[type=submit].default, .submit-row input.default {
+ float: right;
+ border: none;
+ font-weight: 400;
+ background: #417690;
+}
+
+.button.default:active, input[type=submit].default:active,
+.button.default:focus, input[type=submit].default:focus,
+.button.default:hover, input[type=submit].default:hover {
+ background: #205067;
+}
+
+.button[disabled].default,
+input[type=submit][disabled].default,
+input[type=button][disabled].default {
+ opacity: 0.4;
+}
+
+
+/* MODULES */
+
+.module {
+ border: none;
+ margin-bottom: 30px;
+ background: #fff;
+}
+
+.module p, .module ul, .module h3, .module h4, .module dl, .module pre {
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+.module blockquote {
+ margin-left: 12px;
+}
+
+.module ul, .module ol {
+ margin-left: 1.5em;
+}
+
+.module h3 {
+ margin-top: .6em;
+}
+
+.module h2, .module caption, .inline-group h2 {
+ margin: 0;
+ padding: 8px;
+ font-weight: 400;
+ font-size: 13px;
+ text-align: left;
+ background: #79aec8;
+ color: #fff;
+}
+
+.module caption,
+.inline-group h2 {
+ font-size: 12px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+}
+
+.module table {
+ border-collapse: collapse;
+}
+
+/* MESSAGES & ERRORS */
+
+ul.messagelist {
+ padding: 0;
+ margin: 0;
+}
+
+ul.messagelist li {
+ display: block;
+ font-weight: 400;
+ font-size: 13px;
+ padding: 10px 10px 10px 65px;
+ margin: 0 0 10px 0;
+ background: #dfd url("../img/icon-yes.d2f9f035226a.svg") 40px 12px no-repeat;
+ background-size: 16px auto;
+ color: #333;
+}
+
+ul.messagelist li.warning {
+ background: #ffc url("../img/icon-alert.034cc7d8a67f.svg") 40px 14px no-repeat;
+ background-size: 14px auto;
+}
+
+ul.messagelist li.error {
+ background: #ffefef url("../img/icon-no.439e821418cd.svg") 40px 12px no-repeat;
+ background-size: 16px auto;
+}
+
+.errornote {
+ font-size: 14px;
+ font-weight: 700;
+ display: block;
+ padding: 10px 12px;
+ margin: 0 0 10px 0;
+ color: #ba2121;
+ border: 1px solid #ba2121;
+ border-radius: 4px;
+ background-color: #fff;
+ background-position: 5px 12px;
+}
+
+ul.errorlist {
+ margin: 0 0 4px;
+ padding: 0;
+ color: #ba2121;
+ background: #fff;
+}
+
+ul.errorlist li {
+ font-size: 13px;
+ display: block;
+ margin-bottom: 4px;
+}
+
+ul.errorlist li:first-child {
+ margin-top: 0;
+}
+
+ul.errorlist li a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+td ul.errorlist {
+ margin: 0;
+ padding: 0;
+}
+
+td ul.errorlist li {
+ margin: 0;
+}
+
+.form-row.errors {
+ margin: 0;
+ border: none;
+ border-bottom: 1px solid #eee;
+ background: none;
+}
+
+.form-row.errors ul.errorlist li {
+ padding-left: 0;
+}
+
+.errors input, .errors select, .errors textarea {
+ border: 1px solid #ba2121;
+}
+
+div.system-message {
+ background: #ffc;
+ margin: 10px;
+ padding: 6px 8px;
+ font-size: .8em;
+}
+
+div.system-message p.system-message-title {
+ padding: 4px 5px 4px 25px;
+ margin: 0;
+ color: #c11;
+ background: #ffefef url("../img/icon-no.439e821418cd.svg") 5px 5px no-repeat;
+}
+
+.description {
+ font-size: 12px;
+ padding: 5px 0 0 12px;
+}
+
+/* BREADCRUMBS */
+
+div.breadcrumbs {
+ background: #79aec8;
+ padding: 10px 40px;
+ border: none;
+ font-size: 14px;
+ color: #c4dce8;
+ text-align: left;
+}
+
+div.breadcrumbs a {
+ color: #fff;
+}
+
+div.breadcrumbs a:focus, div.breadcrumbs a:hover {
+ color: #c4dce8;
+}
+
+/* ACTION ICONS */
+
+.viewlink, .inlineviewlink {
+ padding-left: 16px;
+ background: url("../img/icon-viewlink.41eb31f7826e.svg") 0 1px no-repeat;
+}
+
+.addlink {
+ padding-left: 16px;
+ background: url("../img/icon-addlink.d519b3bab011.svg") 0 1px no-repeat;
+}
+
+.changelink, .inlinechangelink {
+ padding-left: 16px;
+ background: url("../img/icon-changelink.18d2fd706348.svg") 0 1px no-repeat;
+}
+
+.deletelink {
+ padding-left: 16px;
+ background: url("../img/icon-deletelink.564ef9dc3854.svg") 0 1px no-repeat;
+}
+
+a.deletelink:link, a.deletelink:visited {
+ color: #CC3434;
+}
+
+a.deletelink:focus, a.deletelink:hover {
+ color: #993333;
+ text-decoration: none;
+}
+
+/* OBJECT TOOLS */
+
+.object-tools {
+ font-size: 10px;
+ font-weight: bold;
+ padding-left: 0;
+ float: right;
+ position: relative;
+ margin-top: -48px;
+}
+
+.form-row .object-tools {
+ margin-top: 5px;
+ margin-bottom: 5px;
+ float: none;
+ height: 2em;
+ padding-left: 3.5em;
+}
+
+.object-tools li {
+ display: block;
+ float: left;
+ margin-left: 5px;
+ height: 16px;
+}
+
+.object-tools a {
+ border-radius: 15px;
+}
+
+.object-tools a:link, .object-tools a:visited {
+ display: block;
+ float: left;
+ padding: 3px 12px;
+ background: #999;
+ font-weight: 400;
+ font-size: 11px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ color: #fff;
+}
+
+.object-tools a:focus, .object-tools a:hover {
+ background-color: #417690;
+}
+
+.object-tools a:focus{
+ text-decoration: none;
+}
+
+.object-tools a.viewsitelink, .object-tools a.golink,.object-tools a.addlink {
+ background-repeat: no-repeat;
+ background-position: right 7px center;
+ padding-right: 26px;
+}
+
+.object-tools a.viewsitelink, .object-tools a.golink {
+ background-image: url("../img/tooltag-arrowright.bbfb788a849e.svg");
+}
+
+.object-tools a.addlink {
+ background-image: url("../img/tooltag-add.e59d620a9742.svg");
+}
+
+/* OBJECT HISTORY */
+
+table#change-history {
+ width: 100%;
+}
+
+table#change-history tbody th {
+ width: 16em;
+}
+
+/* PAGE STRUCTURE */
+
+#container {
+ position: relative;
+ width: 100%;
+ min-width: 980px;
+ padding: 0;
+}
+
+#content {
+ padding: 20px 40px;
+}
+
+.dashboard #content {
+ width: 600px;
+}
+
+#content-main {
+ float: left;
+ width: 100%;
+}
+
+#content-related {
+ float: right;
+ width: 260px;
+ position: relative;
+ margin-right: -300px;
+}
+
+#footer {
+ clear: both;
+ padding: 10px;
+}
+
+/* COLUMN TYPES */
+
+.colMS {
+ margin-right: 300px;
+}
+
+.colSM {
+ margin-left: 300px;
+}
+
+.colSM #content-related {
+ float: left;
+ margin-right: 0;
+ margin-left: -300px;
+}
+
+.colSM #content-main {
+ float: right;
+}
+
+.popup .colM {
+ width: auto;
+}
+
+/* HEADER */
+
+#header {
+ width: auto;
+ height: auto;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 10px 40px;
+ background: #417690;
+ color: #ffc;
+ overflow: hidden;
+}
+
+#header a:link, #header a:visited {
+ color: #fff;
+}
+
+#header a:focus , #header a:hover {
+ text-decoration: underline;
+}
+
+#branding {
+ float: left;
+}
+
+#branding h1 {
+ padding: 0;
+ margin: 0 20px 0 0;
+ font-weight: 300;
+ font-size: 24px;
+ color: #f5dd5d;
+}
+
+#branding h1, #branding h1 a:link, #branding h1 a:visited {
+ color: #f5dd5d;
+}
+
+#branding h2 {
+ padding: 0 10px;
+ font-size: 14px;
+ margin: -8px 0 8px 0;
+ font-weight: normal;
+ color: #ffc;
+}
+
+#branding a:hover {
+ text-decoration: none;
+}
+
+#user-tools {
+ float: right;
+ padding: 0;
+ margin: 0 0 0 20px;
+ font-weight: 300;
+ font-size: 11px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+ text-align: right;
+}
+
+#user-tools a {
+ border-bottom: 1px solid rgba(255, 255, 255, 0.25);
+}
+
+#user-tools a:focus, #user-tools a:hover {
+ text-decoration: none;
+ border-bottom-color: #79aec8;
+ color: #79aec8;
+}
+
+/* SIDEBAR */
+
+#content-related {
+ background: #f8f8f8;
+}
+
+#content-related .module {
+ background: none;
+}
+
+#content-related h3 {
+ font-size: 14px;
+ color: #666;
+ padding: 0 16px;
+ margin: 0 0 16px;
+}
+
+#content-related h4 {
+ font-size: 13px;
+}
+
+#content-related p {
+ padding-left: 16px;
+ padding-right: 16px;
+}
+
+#content-related .actionlist {
+ padding: 0;
+ margin: 16px;
+}
+
+#content-related .actionlist li {
+ line-height: 1.2;
+ margin-bottom: 10px;
+ padding-left: 18px;
+}
+
+#content-related .module h2 {
+ background: none;
+ padding: 16px;
+ margin-bottom: 16px;
+ border-bottom: 1px solid #eaeaea;
+ font-size: 18px;
+ color: #333;
+}
+
+.delete-confirmation form input[type="submit"] {
+ background: #ba2121;
+ border-radius: 4px;
+ padding: 10px 15px;
+ color: #fff;
+}
+
+.delete-confirmation form input[type="submit"]:active,
+.delete-confirmation form input[type="submit"]:focus,
+.delete-confirmation form input[type="submit"]:hover {
+ background: #a41515;
+}
+
+.delete-confirmation form .cancel-link {
+ display: inline-block;
+ vertical-align: middle;
+ height: 15px;
+ line-height: 15px;
+ background: #ddd;
+ border-radius: 4px;
+ padding: 10px 15px;
+ color: #333;
+ margin: 0 0 0 10px;
+}
+
+.delete-confirmation form .cancel-link:active,
+.delete-confirmation form .cancel-link:focus,
+.delete-confirmation form .cancel-link:hover {
+ background: #ccc;
+}
+
+/* POPUP */
+.popup #content {
+ padding: 20px;
+}
+
+.popup #container {
+ min-width: 0;
+}
+
+.popup #header {
+ padding: 10px 20px;
+}
diff --git a/src/staticfiles/admin/css/base.ae33e6383baa.css.gz b/src/staticfiles/admin/css/base.ae33e6383baa.css.gz
new file mode 100644
index 0000000..cbb88e8
Binary files /dev/null and b/src/staticfiles/admin/css/base.ae33e6383baa.css.gz differ
diff --git a/src/staticfiles/admin/css/base.css b/src/staticfiles/admin/css/base.css
new file mode 100644
index 0000000..fd011a3
--- /dev/null
+++ b/src/staticfiles/admin/css/base.css
@@ -0,0 +1,987 @@
+/*
+ DJANGO Admin styles
+*/
+
+@import url(fonts.css);
+
+body {
+ margin: 0;
+ padding: 0;
+ font-size: 14px;
+ font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif;
+ color: #333;
+ background: #fff;
+}
+
+/* LINKS */
+
+a:link, a:visited {
+ color: #447e9b;
+ text-decoration: none;
+}
+
+a:focus, a:hover {
+ color: #036;
+}
+
+a:focus {
+ text-decoration: underline;
+}
+
+a img {
+ border: none;
+}
+
+a.section:link, a.section:visited {
+ color: #fff;
+ text-decoration: none;
+}
+
+a.section:focus, a.section:hover {
+ text-decoration: underline;
+}
+
+/* GLOBAL DEFAULTS */
+
+p, ol, ul, dl {
+ margin: .2em 0 .8em 0;
+}
+
+p {
+ padding: 0;
+ line-height: 140%;
+}
+
+h1,h2,h3,h4,h5 {
+ font-weight: bold;
+}
+
+h1 {
+ margin: 0 0 20px;
+ font-weight: 300;
+ font-size: 20px;
+ color: #666;
+}
+
+h2 {
+ font-size: 16px;
+ margin: 1em 0 .5em 0;
+}
+
+h2.subhead {
+ font-weight: normal;
+ margin-top: 0;
+}
+
+h3 {
+ font-size: 14px;
+ margin: .8em 0 .3em 0;
+ color: #666;
+ font-weight: bold;
+}
+
+h4 {
+ font-size: 12px;
+ margin: 1em 0 .8em 0;
+ padding-bottom: 3px;
+}
+
+h5 {
+ font-size: 10px;
+ margin: 1.5em 0 .5em 0;
+ color: #666;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+ul li {
+ list-style-type: square;
+ padding: 1px 0;
+}
+
+li ul {
+ margin-bottom: 0;
+}
+
+li, dt, dd {
+ font-size: 13px;
+ line-height: 20px;
+}
+
+dt {
+ font-weight: bold;
+ margin-top: 4px;
+}
+
+dd {
+ margin-left: 0;
+}
+
+form {
+ margin: 0;
+ padding: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+ border: none;
+ border-top: 1px solid #eee;
+}
+
+blockquote {
+ font-size: 11px;
+ color: #777;
+ margin-left: 2px;
+ padding-left: 10px;
+ border-left: 5px solid #ddd;
+}
+
+code, pre {
+ font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+ color: #666;
+ font-size: 12px;
+}
+
+pre.literal-block {
+ margin: 10px;
+ background: #eee;
+ padding: 6px 8px;
+}
+
+code strong {
+ color: #930;
+}
+
+hr {
+ clear: both;
+ color: #eee;
+ background-color: #eee;
+ height: 1px;
+ border: none;
+ margin: 0;
+ padding: 0;
+ font-size: 1px;
+ line-height: 1px;
+}
+
+/* TEXT STYLES & MODIFIERS */
+
+.small {
+ font-size: 11px;
+}
+
+.tiny {
+ font-size: 10px;
+}
+
+p.tiny {
+ margin-top: -2px;
+}
+
+.mini {
+ font-size: 10px;
+}
+
+p.mini {
+ margin-top: -3px;
+}
+
+.help, p.help, form p.help, div.help, form div.help, div.help li {
+ font-size: 11px;
+ color: #999;
+}
+
+div.help ul {
+ margin-bottom: 0;
+}
+
+.help-tooltip {
+ cursor: help;
+}
+
+p img, h1 img, h2 img, h3 img, h4 img, td img {
+ vertical-align: middle;
+}
+
+.quiet, a.quiet:link, a.quiet:visited {
+ color: #999;
+ font-weight: normal;
+}
+
+.float-right {
+ float: right;
+}
+
+.float-left {
+ float: left;
+}
+
+.clear {
+ clear: both;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-right {
+ text-align: right;
+}
+
+.example {
+ margin: 10px 0;
+ padding: 5px 10px;
+ background: #efefef;
+}
+
+.nowrap {
+ white-space: nowrap;
+}
+
+/* TABLES */
+
+table {
+ border-collapse: collapse;
+ border-color: #ccc;
+}
+
+td, th {
+ font-size: 13px;
+ line-height: 16px;
+ border-bottom: 1px solid #eee;
+ vertical-align: top;
+ padding: 8px;
+ font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
+}
+
+th {
+ font-weight: 600;
+ text-align: left;
+}
+
+thead th,
+tfoot td {
+ color: #666;
+ padding: 5px 10px;
+ font-size: 11px;
+ background: #fff;
+ border: none;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+}
+
+tfoot td {
+ border-bottom: none;
+ border-top: 1px solid #eee;
+}
+
+thead th.required {
+ color: #000;
+}
+
+tr.alt {
+ background: #f6f6f6;
+}
+
+.row1 {
+ background: #fff;
+}
+
+.row2 {
+ background: #f9f9f9;
+}
+
+/* SORTABLE TABLES */
+
+thead th {
+ padding: 5px 10px;
+ line-height: normal;
+ text-transform: uppercase;
+ background: #f6f6f6;
+}
+
+thead th a:link, thead th a:visited {
+ color: #666;
+}
+
+thead th.sorted {
+ background: #eee;
+}
+
+thead th.sorted .text {
+ padding-right: 42px;
+}
+
+table thead th .text span {
+ padding: 8px 10px;
+ display: block;
+}
+
+table thead th .text a {
+ display: block;
+ cursor: pointer;
+ padding: 8px 10px;
+}
+
+table thead th .text a:focus, table thead th .text a:hover {
+ background: #eee;
+}
+
+thead th.sorted a.sortremove {
+ visibility: hidden;
+}
+
+table thead th.sorted:hover a.sortremove {
+ visibility: visible;
+}
+
+table thead th.sorted .sortoptions {
+ display: block;
+ padding: 9px 5px 0 5px;
+ float: right;
+ text-align: right;
+}
+
+table thead th.sorted .sortpriority {
+ font-size: .8em;
+ min-width: 12px;
+ text-align: center;
+ vertical-align: 3px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+table thead th.sorted .sortoptions a {
+ position: relative;
+ width: 14px;
+ height: 14px;
+ display: inline-block;
+ background: url(../img/sorting-icons.svg) 0 0 no-repeat;
+ background-size: 14px auto;
+}
+
+table thead th.sorted .sortoptions a.sortremove {
+ background-position: 0 0;
+}
+
+table thead th.sorted .sortoptions a.sortremove:after {
+ content: '\\';
+ position: absolute;
+ top: -6px;
+ left: 3px;
+ font-weight: 200;
+ font-size: 18px;
+ color: #999;
+}
+
+table thead th.sorted .sortoptions a.sortremove:focus:after,
+table thead th.sorted .sortoptions a.sortremove:hover:after {
+ color: #447e9b;
+}
+
+table thead th.sorted .sortoptions a.sortremove:focus,
+table thead th.sorted .sortoptions a.sortremove:hover {
+ background-position: 0 -14px;
+}
+
+table thead th.sorted .sortoptions a.ascending {
+ background-position: 0 -28px;
+}
+
+table thead th.sorted .sortoptions a.ascending:focus,
+table thead th.sorted .sortoptions a.ascending:hover {
+ background-position: 0 -42px;
+}
+
+table thead th.sorted .sortoptions a.descending {
+ top: 1px;
+ background-position: 0 -56px;
+}
+
+table thead th.sorted .sortoptions a.descending:focus,
+table thead th.sorted .sortoptions a.descending:hover {
+ background-position: 0 -70px;
+}
+
+/* FORM DEFAULTS */
+
+input, textarea, select, .form-row p, form .button {
+ margin: 2px 0;
+ padding: 2px 3px;
+ vertical-align: middle;
+ font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
+ font-weight: normal;
+ font-size: 13px;
+}
+.form-row div.help {
+ padding: 2px 3px;
+}
+
+textarea {
+ vertical-align: top;
+}
+
+input[type=text], input[type=password], input[type=email], input[type=url],
+input[type=number], input[type=tel], textarea, select, .vTextField {
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ padding: 5px 6px;
+ margin-top: 0;
+}
+
+input[type=text]:focus, input[type=password]:focus, input[type=email]:focus,
+input[type=url]:focus, input[type=number]:focus, input[type=tel]:focus,
+textarea:focus, select:focus, .vTextField:focus {
+ border-color: #999;
+}
+
+select {
+ height: 30px;
+}
+
+select[multiple] {
+ /* Allow HTML size attribute to override the height in the rule above. */
+ height: auto;
+ min-height: 150px;
+}
+
+/* FORM BUTTONS */
+
+.button, input[type=submit], input[type=button], .submit-row input, a.button {
+ background: #79aec8;
+ padding: 10px 15px;
+ border: none;
+ border-radius: 4px;
+ color: #fff;
+ cursor: pointer;
+}
+
+a.button {
+ padding: 4px 5px;
+}
+
+.button:active, input[type=submit]:active, input[type=button]:active,
+.button:focus, input[type=submit]:focus, input[type=button]:focus,
+.button:hover, input[type=submit]:hover, input[type=button]:hover {
+ background: #609ab6;
+}
+
+.button[disabled], input[type=submit][disabled], input[type=button][disabled] {
+ opacity: 0.4;
+}
+
+.button.default, input[type=submit].default, .submit-row input.default {
+ float: right;
+ border: none;
+ font-weight: 400;
+ background: #417690;
+}
+
+.button.default:active, input[type=submit].default:active,
+.button.default:focus, input[type=submit].default:focus,
+.button.default:hover, input[type=submit].default:hover {
+ background: #205067;
+}
+
+.button[disabled].default,
+input[type=submit][disabled].default,
+input[type=button][disabled].default {
+ opacity: 0.4;
+}
+
+
+/* MODULES */
+
+.module {
+ border: none;
+ margin-bottom: 30px;
+ background: #fff;
+}
+
+.module p, .module ul, .module h3, .module h4, .module dl, .module pre {
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+.module blockquote {
+ margin-left: 12px;
+}
+
+.module ul, .module ol {
+ margin-left: 1.5em;
+}
+
+.module h3 {
+ margin-top: .6em;
+}
+
+.module h2, .module caption, .inline-group h2 {
+ margin: 0;
+ padding: 8px;
+ font-weight: 400;
+ font-size: 13px;
+ text-align: left;
+ background: #79aec8;
+ color: #fff;
+}
+
+.module caption,
+.inline-group h2 {
+ font-size: 12px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+}
+
+.module table {
+ border-collapse: collapse;
+}
+
+/* MESSAGES & ERRORS */
+
+ul.messagelist {
+ padding: 0;
+ margin: 0;
+}
+
+ul.messagelist li {
+ display: block;
+ font-weight: 400;
+ font-size: 13px;
+ padding: 10px 10px 10px 65px;
+ margin: 0 0 10px 0;
+ background: #dfd url(../img/icon-yes.svg) 40px 12px no-repeat;
+ background-size: 16px auto;
+ color: #333;
+}
+
+ul.messagelist li.warning {
+ background: #ffc url(../img/icon-alert.svg) 40px 14px no-repeat;
+ background-size: 14px auto;
+}
+
+ul.messagelist li.error {
+ background: #ffefef url(../img/icon-no.svg) 40px 12px no-repeat;
+ background-size: 16px auto;
+}
+
+.errornote {
+ font-size: 14px;
+ font-weight: 700;
+ display: block;
+ padding: 10px 12px;
+ margin: 0 0 10px 0;
+ color: #ba2121;
+ border: 1px solid #ba2121;
+ border-radius: 4px;
+ background-color: #fff;
+ background-position: 5px 12px;
+}
+
+ul.errorlist {
+ margin: 0 0 4px;
+ padding: 0;
+ color: #ba2121;
+ background: #fff;
+}
+
+ul.errorlist li {
+ font-size: 13px;
+ display: block;
+ margin-bottom: 4px;
+}
+
+ul.errorlist li:first-child {
+ margin-top: 0;
+}
+
+ul.errorlist li a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+td ul.errorlist {
+ margin: 0;
+ padding: 0;
+}
+
+td ul.errorlist li {
+ margin: 0;
+}
+
+.form-row.errors {
+ margin: 0;
+ border: none;
+ border-bottom: 1px solid #eee;
+ background: none;
+}
+
+.form-row.errors ul.errorlist li {
+ padding-left: 0;
+}
+
+.errors input, .errors select, .errors textarea {
+ border: 1px solid #ba2121;
+}
+
+div.system-message {
+ background: #ffc;
+ margin: 10px;
+ padding: 6px 8px;
+ font-size: .8em;
+}
+
+div.system-message p.system-message-title {
+ padding: 4px 5px 4px 25px;
+ margin: 0;
+ color: #c11;
+ background: #ffefef url(../img/icon-no.svg) 5px 5px no-repeat;
+}
+
+.description {
+ font-size: 12px;
+ padding: 5px 0 0 12px;
+}
+
+/* BREADCRUMBS */
+
+div.breadcrumbs {
+ background: #79aec8;
+ padding: 10px 40px;
+ border: none;
+ font-size: 14px;
+ color: #c4dce8;
+ text-align: left;
+}
+
+div.breadcrumbs a {
+ color: #fff;
+}
+
+div.breadcrumbs a:focus, div.breadcrumbs a:hover {
+ color: #c4dce8;
+}
+
+/* ACTION ICONS */
+
+.viewlink, .inlineviewlink {
+ padding-left: 16px;
+ background: url(../img/icon-viewlink.svg) 0 1px no-repeat;
+}
+
+.addlink {
+ padding-left: 16px;
+ background: url(../img/icon-addlink.svg) 0 1px no-repeat;
+}
+
+.changelink, .inlinechangelink {
+ padding-left: 16px;
+ background: url(../img/icon-changelink.svg) 0 1px no-repeat;
+}
+
+.deletelink {
+ padding-left: 16px;
+ background: url(../img/icon-deletelink.svg) 0 1px no-repeat;
+}
+
+a.deletelink:link, a.deletelink:visited {
+ color: #CC3434;
+}
+
+a.deletelink:focus, a.deletelink:hover {
+ color: #993333;
+ text-decoration: none;
+}
+
+/* OBJECT TOOLS */
+
+.object-tools {
+ font-size: 10px;
+ font-weight: bold;
+ padding-left: 0;
+ float: right;
+ position: relative;
+ margin-top: -48px;
+}
+
+.form-row .object-tools {
+ margin-top: 5px;
+ margin-bottom: 5px;
+ float: none;
+ height: 2em;
+ padding-left: 3.5em;
+}
+
+.object-tools li {
+ display: block;
+ float: left;
+ margin-left: 5px;
+ height: 16px;
+}
+
+.object-tools a {
+ border-radius: 15px;
+}
+
+.object-tools a:link, .object-tools a:visited {
+ display: block;
+ float: left;
+ padding: 3px 12px;
+ background: #999;
+ font-weight: 400;
+ font-size: 11px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ color: #fff;
+}
+
+.object-tools a:focus, .object-tools a:hover {
+ background-color: #417690;
+}
+
+.object-tools a:focus{
+ text-decoration: none;
+}
+
+.object-tools a.viewsitelink, .object-tools a.golink,.object-tools a.addlink {
+ background-repeat: no-repeat;
+ background-position: right 7px center;
+ padding-right: 26px;
+}
+
+.object-tools a.viewsitelink, .object-tools a.golink {
+ background-image: url(../img/tooltag-arrowright.svg);
+}
+
+.object-tools a.addlink {
+ background-image: url(../img/tooltag-add.svg);
+}
+
+/* OBJECT HISTORY */
+
+table#change-history {
+ width: 100%;
+}
+
+table#change-history tbody th {
+ width: 16em;
+}
+
+/* PAGE STRUCTURE */
+
+#container {
+ position: relative;
+ width: 100%;
+ min-width: 980px;
+ padding: 0;
+}
+
+#content {
+ padding: 20px 40px;
+}
+
+.dashboard #content {
+ width: 600px;
+}
+
+#content-main {
+ float: left;
+ width: 100%;
+}
+
+#content-related {
+ float: right;
+ width: 260px;
+ position: relative;
+ margin-right: -300px;
+}
+
+#footer {
+ clear: both;
+ padding: 10px;
+}
+
+/* COLUMN TYPES */
+
+.colMS {
+ margin-right: 300px;
+}
+
+.colSM {
+ margin-left: 300px;
+}
+
+.colSM #content-related {
+ float: left;
+ margin-right: 0;
+ margin-left: -300px;
+}
+
+.colSM #content-main {
+ float: right;
+}
+
+.popup .colM {
+ width: auto;
+}
+
+/* HEADER */
+
+#header {
+ width: auto;
+ height: auto;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 10px 40px;
+ background: #417690;
+ color: #ffc;
+ overflow: hidden;
+}
+
+#header a:link, #header a:visited {
+ color: #fff;
+}
+
+#header a:focus , #header a:hover {
+ text-decoration: underline;
+}
+
+#branding {
+ float: left;
+}
+
+#branding h1 {
+ padding: 0;
+ margin: 0 20px 0 0;
+ font-weight: 300;
+ font-size: 24px;
+ color: #f5dd5d;
+}
+
+#branding h1, #branding h1 a:link, #branding h1 a:visited {
+ color: #f5dd5d;
+}
+
+#branding h2 {
+ padding: 0 10px;
+ font-size: 14px;
+ margin: -8px 0 8px 0;
+ font-weight: normal;
+ color: #ffc;
+}
+
+#branding a:hover {
+ text-decoration: none;
+}
+
+#user-tools {
+ float: right;
+ padding: 0;
+ margin: 0 0 0 20px;
+ font-weight: 300;
+ font-size: 11px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+ text-align: right;
+}
+
+#user-tools a {
+ border-bottom: 1px solid rgba(255, 255, 255, 0.25);
+}
+
+#user-tools a:focus, #user-tools a:hover {
+ text-decoration: none;
+ border-bottom-color: #79aec8;
+ color: #79aec8;
+}
+
+/* SIDEBAR */
+
+#content-related {
+ background: #f8f8f8;
+}
+
+#content-related .module {
+ background: none;
+}
+
+#content-related h3 {
+ font-size: 14px;
+ color: #666;
+ padding: 0 16px;
+ margin: 0 0 16px;
+}
+
+#content-related h4 {
+ font-size: 13px;
+}
+
+#content-related p {
+ padding-left: 16px;
+ padding-right: 16px;
+}
+
+#content-related .actionlist {
+ padding: 0;
+ margin: 16px;
+}
+
+#content-related .actionlist li {
+ line-height: 1.2;
+ margin-bottom: 10px;
+ padding-left: 18px;
+}
+
+#content-related .module h2 {
+ background: none;
+ padding: 16px;
+ margin-bottom: 16px;
+ border-bottom: 1px solid #eaeaea;
+ font-size: 18px;
+ color: #333;
+}
+
+.delete-confirmation form input[type="submit"] {
+ background: #ba2121;
+ border-radius: 4px;
+ padding: 10px 15px;
+ color: #fff;
+}
+
+.delete-confirmation form input[type="submit"]:active,
+.delete-confirmation form input[type="submit"]:focus,
+.delete-confirmation form input[type="submit"]:hover {
+ background: #a41515;
+}
+
+.delete-confirmation form .cancel-link {
+ display: inline-block;
+ vertical-align: middle;
+ height: 15px;
+ line-height: 15px;
+ background: #ddd;
+ border-radius: 4px;
+ padding: 10px 15px;
+ color: #333;
+ margin: 0 0 0 10px;
+}
+
+.delete-confirmation form .cancel-link:active,
+.delete-confirmation form .cancel-link:focus,
+.delete-confirmation form .cancel-link:hover {
+ background: #ccc;
+}
+
+/* POPUP */
+.popup #content {
+ padding: 20px;
+}
+
+.popup #container {
+ min-width: 0;
+}
+
+.popup #header {
+ padding: 10px 20px;
+}
diff --git a/src/staticfiles/admin/css/base.css.gz b/src/staticfiles/admin/css/base.css.gz
new file mode 100644
index 0000000..84ac3aa
Binary files /dev/null and b/src/staticfiles/admin/css/base.css.gz differ
diff --git a/src/staticfiles/admin/css/changelists.css b/src/staticfiles/admin/css/changelists.css
new file mode 100644
index 0000000..17690a3
--- /dev/null
+++ b/src/staticfiles/admin/css/changelists.css
@@ -0,0 +1,344 @@
+/* CHANGELISTS */
+
+#changelist {
+ position: relative;
+ width: 100%;
+}
+
+#changelist table {
+ width: 100%;
+}
+
+.change-list .hiddenfields { display:none; }
+
+.change-list .filtered table {
+ border-right: none;
+}
+
+.change-list .filtered {
+ min-height: 400px;
+}
+
+.change-list .filtered .results, .change-list .filtered .paginator,
+.filtered #toolbar, .filtered div.xfull {
+ margin-right: 280px;
+ width: auto;
+}
+
+.change-list .filtered table tbody th {
+ padding-right: 1em;
+}
+
+#changelist-form .results {
+ overflow-x: auto;
+}
+
+#changelist .toplinks {
+ border-bottom: 1px solid #ddd;
+}
+
+#changelist .paginator {
+ color: #666;
+ border-bottom: 1px solid #eee;
+ background: #fff;
+ overflow: hidden;
+}
+
+/* CHANGELIST TABLES */
+
+#changelist table thead th {
+ padding: 0;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+#changelist table thead th.action-checkbox-column {
+ width: 1.5em;
+ text-align: center;
+}
+
+#changelist table tbody td.action-checkbox {
+ text-align: center;
+}
+
+#changelist table tfoot {
+ color: #666;
+}
+
+/* TOOLBAR */
+
+#changelist #toolbar {
+ padding: 8px 10px;
+ margin-bottom: 15px;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+ background: #f8f8f8;
+ color: #666;
+}
+
+#changelist #toolbar form input {
+ border-radius: 4px;
+ font-size: 14px;
+ padding: 5px;
+ color: #333;
+}
+
+#changelist #toolbar form #searchbar {
+ height: 19px;
+ border: 1px solid #ccc;
+ padding: 2px 5px;
+ margin: 0;
+ vertical-align: top;
+ font-size: 13px;
+}
+
+#changelist #toolbar form #searchbar:focus {
+ border-color: #999;
+}
+
+#changelist #toolbar form input[type="submit"] {
+ border: 1px solid #ccc;
+ padding: 2px 10px;
+ margin: 0;
+ vertical-align: middle;
+ background: #fff;
+ box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
+ cursor: pointer;
+ color: #333;
+}
+
+#changelist #toolbar form input[type="submit"]:focus,
+#changelist #toolbar form input[type="submit"]:hover {
+ border-color: #999;
+}
+
+#changelist #changelist-search img {
+ vertical-align: middle;
+ margin-right: 4px;
+}
+
+/* FILTER COLUMN */
+
+#changelist-filter {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 1000;
+ width: 240px;
+ background: #f8f8f8;
+ border-left: none;
+ margin: 0;
+}
+
+#changelist-filter h2 {
+ font-size: 14px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ padding: 5px 15px;
+ margin-bottom: 12px;
+ border-bottom: none;
+}
+
+#changelist-filter h3 {
+ font-weight: 400;
+ font-size: 14px;
+ padding: 0 15px;
+ margin-bottom: 10px;
+}
+
+#changelist-filter ul {
+ margin: 5px 0;
+ padding: 0 15px 15px;
+ border-bottom: 1px solid #eaeaea;
+}
+
+#changelist-filter ul:last-child {
+ border-bottom: none;
+ padding-bottom: none;
+}
+
+#changelist-filter li {
+ list-style-type: none;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+#changelist-filter a {
+ display: block;
+ color: #999;
+ text-overflow: ellipsis;
+ overflow-x: hidden;
+}
+
+#changelist-filter li.selected {
+ border-left: 5px solid #eaeaea;
+ padding-left: 10px;
+ margin-left: -15px;
+}
+
+#changelist-filter li.selected a {
+ color: #5b80b2;
+}
+
+#changelist-filter a:focus, #changelist-filter a:hover,
+#changelist-filter li.selected a:focus,
+#changelist-filter li.selected a:hover {
+ color: #036;
+}
+
+/* DATE DRILLDOWN */
+
+.change-list ul.toplinks {
+ display: block;
+ float: left;
+ padding: 0;
+ margin: 0;
+ width: 100%;
+}
+
+.change-list ul.toplinks li {
+ padding: 3px 6px;
+ font-weight: bold;
+ list-style-type: none;
+ display: inline-block;
+}
+
+.change-list ul.toplinks .date-back a {
+ color: #999;
+}
+
+.change-list ul.toplinks .date-back a:focus,
+.change-list ul.toplinks .date-back a:hover {
+ color: #036;
+}
+
+/* PAGINATOR */
+
+.paginator {
+ font-size: 13px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ line-height: 22px;
+ margin: 0;
+ border-top: 1px solid #ddd;
+}
+
+.paginator a:link, .paginator a:visited {
+ padding: 2px 6px;
+ background: #79aec8;
+ text-decoration: none;
+ color: #fff;
+}
+
+.paginator a.showall {
+ padding: 0;
+ border: none;
+ background: none;
+ color: #5b80b2;
+}
+
+.paginator a.showall:focus, .paginator a.showall:hover {
+ background: none;
+ color: #036;
+}
+
+.paginator .end {
+ margin-right: 6px;
+}
+
+.paginator .this-page {
+ padding: 2px 6px;
+ font-weight: bold;
+ font-size: 13px;
+ vertical-align: top;
+}
+
+.paginator a:focus, .paginator a:hover {
+ color: white;
+ background: #036;
+}
+
+/* ACTIONS */
+
+.filtered .actions {
+ margin-right: 280px;
+ border-right: none;
+}
+
+#changelist table input {
+ margin: 0;
+ vertical-align: baseline;
+}
+
+#changelist table tbody tr.selected {
+ background-color: #FFFFCC;
+}
+
+#changelist .actions {
+ padding: 10px;
+ background: #fff;
+ border-top: none;
+ border-bottom: none;
+ line-height: 24px;
+ color: #999;
+}
+
+#changelist .actions.selected {
+ background: #fffccf;
+ border-top: 1px solid #fffee8;
+ border-bottom: 1px solid #edecd6;
+}
+
+#changelist .actions span.all,
+#changelist .actions span.action-counter,
+#changelist .actions span.clear,
+#changelist .actions span.question {
+ font-size: 13px;
+ margin: 0 0.5em;
+ display: none;
+}
+
+#changelist .actions:last-child {
+ border-bottom: none;
+}
+
+#changelist .actions select {
+ vertical-align: top;
+ height: 24px;
+ background: none;
+ color: #000;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ font-size: 14px;
+ padding: 0 0 0 4px;
+ margin: 0;
+ margin-left: 10px;
+}
+
+#changelist .actions select:focus {
+ border-color: #999;
+}
+
+#changelist .actions label {
+ display: inline-block;
+ vertical-align: middle;
+ font-size: 13px;
+}
+
+#changelist .actions .button {
+ font-size: 13px;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ background: #fff;
+ box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
+ cursor: pointer;
+ height: 24px;
+ line-height: 1;
+ padding: 4px 8px;
+ margin: 0;
+ color: #333;
+}
+
+#changelist .actions .button:focus, #changelist .actions .button:hover {
+ border-color: #999;
+}
diff --git a/src/staticfiles/admin/css/changelists.css.gz b/src/staticfiles/admin/css/changelists.css.gz
new file mode 100644
index 0000000..0360893
Binary files /dev/null and b/src/staticfiles/admin/css/changelists.css.gz differ
diff --git a/src/staticfiles/admin/css/changelists.f6dc691f8d62.css b/src/staticfiles/admin/css/changelists.f6dc691f8d62.css
new file mode 100644
index 0000000..17690a3
--- /dev/null
+++ b/src/staticfiles/admin/css/changelists.f6dc691f8d62.css
@@ -0,0 +1,344 @@
+/* CHANGELISTS */
+
+#changelist {
+ position: relative;
+ width: 100%;
+}
+
+#changelist table {
+ width: 100%;
+}
+
+.change-list .hiddenfields { display:none; }
+
+.change-list .filtered table {
+ border-right: none;
+}
+
+.change-list .filtered {
+ min-height: 400px;
+}
+
+.change-list .filtered .results, .change-list .filtered .paginator,
+.filtered #toolbar, .filtered div.xfull {
+ margin-right: 280px;
+ width: auto;
+}
+
+.change-list .filtered table tbody th {
+ padding-right: 1em;
+}
+
+#changelist-form .results {
+ overflow-x: auto;
+}
+
+#changelist .toplinks {
+ border-bottom: 1px solid #ddd;
+}
+
+#changelist .paginator {
+ color: #666;
+ border-bottom: 1px solid #eee;
+ background: #fff;
+ overflow: hidden;
+}
+
+/* CHANGELIST TABLES */
+
+#changelist table thead th {
+ padding: 0;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+#changelist table thead th.action-checkbox-column {
+ width: 1.5em;
+ text-align: center;
+}
+
+#changelist table tbody td.action-checkbox {
+ text-align: center;
+}
+
+#changelist table tfoot {
+ color: #666;
+}
+
+/* TOOLBAR */
+
+#changelist #toolbar {
+ padding: 8px 10px;
+ margin-bottom: 15px;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+ background: #f8f8f8;
+ color: #666;
+}
+
+#changelist #toolbar form input {
+ border-radius: 4px;
+ font-size: 14px;
+ padding: 5px;
+ color: #333;
+}
+
+#changelist #toolbar form #searchbar {
+ height: 19px;
+ border: 1px solid #ccc;
+ padding: 2px 5px;
+ margin: 0;
+ vertical-align: top;
+ font-size: 13px;
+}
+
+#changelist #toolbar form #searchbar:focus {
+ border-color: #999;
+}
+
+#changelist #toolbar form input[type="submit"] {
+ border: 1px solid #ccc;
+ padding: 2px 10px;
+ margin: 0;
+ vertical-align: middle;
+ background: #fff;
+ box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
+ cursor: pointer;
+ color: #333;
+}
+
+#changelist #toolbar form input[type="submit"]:focus,
+#changelist #toolbar form input[type="submit"]:hover {
+ border-color: #999;
+}
+
+#changelist #changelist-search img {
+ vertical-align: middle;
+ margin-right: 4px;
+}
+
+/* FILTER COLUMN */
+
+#changelist-filter {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 1000;
+ width: 240px;
+ background: #f8f8f8;
+ border-left: none;
+ margin: 0;
+}
+
+#changelist-filter h2 {
+ font-size: 14px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ padding: 5px 15px;
+ margin-bottom: 12px;
+ border-bottom: none;
+}
+
+#changelist-filter h3 {
+ font-weight: 400;
+ font-size: 14px;
+ padding: 0 15px;
+ margin-bottom: 10px;
+}
+
+#changelist-filter ul {
+ margin: 5px 0;
+ padding: 0 15px 15px;
+ border-bottom: 1px solid #eaeaea;
+}
+
+#changelist-filter ul:last-child {
+ border-bottom: none;
+ padding-bottom: none;
+}
+
+#changelist-filter li {
+ list-style-type: none;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+#changelist-filter a {
+ display: block;
+ color: #999;
+ text-overflow: ellipsis;
+ overflow-x: hidden;
+}
+
+#changelist-filter li.selected {
+ border-left: 5px solid #eaeaea;
+ padding-left: 10px;
+ margin-left: -15px;
+}
+
+#changelist-filter li.selected a {
+ color: #5b80b2;
+}
+
+#changelist-filter a:focus, #changelist-filter a:hover,
+#changelist-filter li.selected a:focus,
+#changelist-filter li.selected a:hover {
+ color: #036;
+}
+
+/* DATE DRILLDOWN */
+
+.change-list ul.toplinks {
+ display: block;
+ float: left;
+ padding: 0;
+ margin: 0;
+ width: 100%;
+}
+
+.change-list ul.toplinks li {
+ padding: 3px 6px;
+ font-weight: bold;
+ list-style-type: none;
+ display: inline-block;
+}
+
+.change-list ul.toplinks .date-back a {
+ color: #999;
+}
+
+.change-list ul.toplinks .date-back a:focus,
+.change-list ul.toplinks .date-back a:hover {
+ color: #036;
+}
+
+/* PAGINATOR */
+
+.paginator {
+ font-size: 13px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ line-height: 22px;
+ margin: 0;
+ border-top: 1px solid #ddd;
+}
+
+.paginator a:link, .paginator a:visited {
+ padding: 2px 6px;
+ background: #79aec8;
+ text-decoration: none;
+ color: #fff;
+}
+
+.paginator a.showall {
+ padding: 0;
+ border: none;
+ background: none;
+ color: #5b80b2;
+}
+
+.paginator a.showall:focus, .paginator a.showall:hover {
+ background: none;
+ color: #036;
+}
+
+.paginator .end {
+ margin-right: 6px;
+}
+
+.paginator .this-page {
+ padding: 2px 6px;
+ font-weight: bold;
+ font-size: 13px;
+ vertical-align: top;
+}
+
+.paginator a:focus, .paginator a:hover {
+ color: white;
+ background: #036;
+}
+
+/* ACTIONS */
+
+.filtered .actions {
+ margin-right: 280px;
+ border-right: none;
+}
+
+#changelist table input {
+ margin: 0;
+ vertical-align: baseline;
+}
+
+#changelist table tbody tr.selected {
+ background-color: #FFFFCC;
+}
+
+#changelist .actions {
+ padding: 10px;
+ background: #fff;
+ border-top: none;
+ border-bottom: none;
+ line-height: 24px;
+ color: #999;
+}
+
+#changelist .actions.selected {
+ background: #fffccf;
+ border-top: 1px solid #fffee8;
+ border-bottom: 1px solid #edecd6;
+}
+
+#changelist .actions span.all,
+#changelist .actions span.action-counter,
+#changelist .actions span.clear,
+#changelist .actions span.question {
+ font-size: 13px;
+ margin: 0 0.5em;
+ display: none;
+}
+
+#changelist .actions:last-child {
+ border-bottom: none;
+}
+
+#changelist .actions select {
+ vertical-align: top;
+ height: 24px;
+ background: none;
+ color: #000;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ font-size: 14px;
+ padding: 0 0 0 4px;
+ margin: 0;
+ margin-left: 10px;
+}
+
+#changelist .actions select:focus {
+ border-color: #999;
+}
+
+#changelist .actions label {
+ display: inline-block;
+ vertical-align: middle;
+ font-size: 13px;
+}
+
+#changelist .actions .button {
+ font-size: 13px;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ background: #fff;
+ box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
+ cursor: pointer;
+ height: 24px;
+ line-height: 1;
+ padding: 4px 8px;
+ margin: 0;
+ color: #333;
+}
+
+#changelist .actions .button:focus, #changelist .actions .button:hover {
+ border-color: #999;
+}
diff --git a/src/staticfiles/admin/css/changelists.f6dc691f8d62.css.gz b/src/staticfiles/admin/css/changelists.f6dc691f8d62.css.gz
new file mode 100644
index 0000000..0360893
Binary files /dev/null and b/src/staticfiles/admin/css/changelists.f6dc691f8d62.css.gz differ
diff --git a/src/staticfiles/admin/css/dashboard.7ac78187c567.css b/src/staticfiles/admin/css/dashboard.7ac78187c567.css
new file mode 100644
index 0000000..1560c7b
--- /dev/null
+++ b/src/staticfiles/admin/css/dashboard.7ac78187c567.css
@@ -0,0 +1,27 @@
+/* DASHBOARD */
+
+.dashboard .module table th {
+ width: 100%;
+}
+
+.dashboard .module table td {
+ white-space: nowrap;
+}
+
+.dashboard .module table td a {
+ display: block;
+ padding-right: .6em;
+}
+
+/* RECENT ACTIONS MODULE */
+
+.module ul.actionlist {
+ margin-left: 0;
+}
+
+ul.actionlist li {
+ list-style-type: none;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ -o-text-overflow: ellipsis;
+}
diff --git a/src/staticfiles/admin/css/dashboard.7ac78187c567.css.gz b/src/staticfiles/admin/css/dashboard.7ac78187c567.css.gz
new file mode 100644
index 0000000..4e65549
Binary files /dev/null and b/src/staticfiles/admin/css/dashboard.7ac78187c567.css.gz differ
diff --git a/src/staticfiles/admin/css/dashboard.css b/src/staticfiles/admin/css/dashboard.css
new file mode 100644
index 0000000..1560c7b
--- /dev/null
+++ b/src/staticfiles/admin/css/dashboard.css
@@ -0,0 +1,27 @@
+/* DASHBOARD */
+
+.dashboard .module table th {
+ width: 100%;
+}
+
+.dashboard .module table td {
+ white-space: nowrap;
+}
+
+.dashboard .module table td a {
+ display: block;
+ padding-right: .6em;
+}
+
+/* RECENT ACTIONS MODULE */
+
+.module ul.actionlist {
+ margin-left: 0;
+}
+
+ul.actionlist li {
+ list-style-type: none;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ -o-text-overflow: ellipsis;
+}
diff --git a/src/staticfiles/admin/css/dashboard.css.gz b/src/staticfiles/admin/css/dashboard.css.gz
new file mode 100644
index 0000000..4e65549
Binary files /dev/null and b/src/staticfiles/admin/css/dashboard.css.gz differ
diff --git a/src/staticfiles/admin/css/fonts.168bab448fee.css b/src/staticfiles/admin/css/fonts.168bab448fee.css
new file mode 100644
index 0000000..8355135
--- /dev/null
+++ b/src/staticfiles/admin/css/fonts.168bab448fee.css
@@ -0,0 +1,20 @@
+@font-face {
+ font-family: 'Roboto';
+ src: url("../fonts/Roboto-Bold-webfont.50d75e48e0a3.woff");
+ font-weight: 700;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url("../fonts/Roboto-Regular-webfont.35b07eb2f871.woff");
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url("../fonts/Roboto-Light-webfont.c73eb1ceba33.woff");
+ font-weight: 300;
+ font-style: normal;
+}
diff --git a/src/staticfiles/admin/css/fonts.168bab448fee.css.gz b/src/staticfiles/admin/css/fonts.168bab448fee.css.gz
new file mode 100644
index 0000000..1cb6be8
Binary files /dev/null and b/src/staticfiles/admin/css/fonts.168bab448fee.css.gz differ
diff --git a/src/staticfiles/admin/css/fonts.cc6140298ba7.css b/src/staticfiles/admin/css/fonts.cc6140298ba7.css
new file mode 100644
index 0000000..8355135
--- /dev/null
+++ b/src/staticfiles/admin/css/fonts.cc6140298ba7.css
@@ -0,0 +1,20 @@
+@font-face {
+ font-family: 'Roboto';
+ src: url("../fonts/Roboto-Bold-webfont.50d75e48e0a3.woff");
+ font-weight: 700;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url("../fonts/Roboto-Regular-webfont.35b07eb2f871.woff");
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url("../fonts/Roboto-Light-webfont.c73eb1ceba33.woff");
+ font-weight: 300;
+ font-style: normal;
+}
diff --git a/src/staticfiles/admin/css/fonts.css b/src/staticfiles/admin/css/fonts.css
new file mode 100644
index 0000000..c837e01
--- /dev/null
+++ b/src/staticfiles/admin/css/fonts.css
@@ -0,0 +1,20 @@
+@font-face {
+ font-family: 'Roboto';
+ src: url('../fonts/Roboto-Bold-webfont.woff');
+ font-weight: 700;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url('../fonts/Roboto-Regular-webfont.woff');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url('../fonts/Roboto-Light-webfont.woff');
+ font-weight: 300;
+ font-style: normal;
+}
diff --git a/src/staticfiles/admin/css/fonts.css.gz b/src/staticfiles/admin/css/fonts.css.gz
new file mode 100644
index 0000000..834a458
Binary files /dev/null and b/src/staticfiles/admin/css/fonts.css.gz differ
diff --git a/src/staticfiles/admin/css/forms.31b2f650d92e.css b/src/staticfiles/admin/css/forms.31b2f650d92e.css
new file mode 100644
index 0000000..b10cd77
--- /dev/null
+++ b/src/staticfiles/admin/css/forms.31b2f650d92e.css
@@ -0,0 +1,532 @@
+@import url("widgets.5e372b41c483.css");
+
+/* FORM ROWS */
+
+.form-row {
+ overflow: hidden;
+ padding: 10px;
+ font-size: 13px;
+ border-bottom: 1px solid #eee;
+}
+
+.form-row img, .form-row input {
+ vertical-align: middle;
+}
+
+.form-row label input[type="checkbox"] {
+ margin-top: 0;
+ vertical-align: 0;
+}
+
+form .form-row p {
+ padding-left: 0;
+}
+
+.hidden {
+ display: none;
+}
+
+/* FORM LABELS */
+
+label {
+ font-weight: normal;
+ color: #666;
+ font-size: 13px;
+}
+
+.required label, label.required {
+ font-weight: bold;
+ color: #333;
+}
+
+/* RADIO BUTTONS */
+
+form ul.radiolist li {
+ list-style-type: none;
+}
+
+form ul.radiolist label {
+ float: none;
+ display: inline;
+}
+
+form ul.radiolist input[type="radio"] {
+ margin: -2px 4px 0 0;
+ padding: 0;
+}
+
+form ul.inline {
+ margin-left: 0;
+ padding: 0;
+}
+
+form ul.inline li {
+ float: left;
+ padding-right: 7px;
+}
+
+/* ALIGNED FIELDSETS */
+
+.aligned label {
+ display: block;
+ padding: 4px 10px 0 0;
+ float: left;
+ width: 160px;
+ word-wrap: break-word;
+ line-height: 1;
+}
+
+.aligned label:not(.vCheckboxLabel):after {
+ content: '';
+ display: inline-block;
+ vertical-align: middle;
+ height: 26px;
+}
+
+.aligned label + p, .aligned label + div.help, .aligned label + div.readonly {
+ padding: 6px 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 170px;
+}
+
+.aligned ul label {
+ display: inline;
+ float: none;
+ width: auto;
+}
+
+.aligned .form-row input {
+ margin-bottom: 0;
+}
+
+.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField {
+ width: 350px;
+}
+
+form .aligned ul {
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned ul.radiolist {
+ display: inline-block;
+ margin: 0;
+ padding: 0;
+}
+
+form .aligned p.help,
+form .aligned div.help {
+ clear: left;
+ margin-top: 0;
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned label + p.help,
+form .aligned label + div.help {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+form .aligned p.help:last-child,
+form .aligned div.help:last-child {
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+
+form .aligned input + p.help,
+form .aligned textarea + p.help,
+form .aligned select + p.help,
+form .aligned input + div.help,
+form .aligned textarea + div.help,
+form .aligned select + div.help {
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned ul li {
+ list-style: none;
+}
+
+form .aligned table p {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.aligned .vCheckboxLabel {
+ float: none;
+ width: auto;
+ display: inline-block;
+ vertical-align: -3px;
+ padding: 0 0 5px 5px;
+}
+
+.aligned .vCheckboxLabel + p.help,
+.aligned .vCheckboxLabel + div.help {
+ margin-top: -4px;
+}
+
+.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField {
+ width: 610px;
+}
+
+.checkbox-row p.help,
+.checkbox-row div.help {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+fieldset .fieldBox {
+ float: left;
+ margin-right: 20px;
+}
+
+/* WIDE FIELDSETS */
+
+.wide label {
+ width: 200px;
+}
+
+form .wide p,
+form .wide input + p.help,
+form .wide input + div.help {
+ margin-left: 200px;
+}
+
+form .wide p.help,
+form .wide div.help {
+ padding-left: 38px;
+}
+
+form div.help ul {
+ padding-left: 0;
+ margin-left: 0;
+}
+
+.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField {
+ width: 450px;
+}
+
+/* COLLAPSED FIELDSETS */
+
+fieldset.collapsed * {
+ display: none;
+}
+
+fieldset.collapsed h2, fieldset.collapsed {
+ display: block;
+}
+
+fieldset.collapsed {
+ border: 1px solid #eee;
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+fieldset.collapsed h2 {
+ background: #f8f8f8;
+ color: #666;
+}
+
+fieldset .collapse-toggle {
+ color: #fff;
+}
+
+fieldset.collapsed .collapse-toggle {
+ background: transparent;
+ display: inline;
+ color: #447e9b;
+}
+
+/* MONOSPACE TEXTAREAS */
+
+fieldset.monospace textarea {
+ font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+}
+
+/* SUBMIT ROW */
+
+.submit-row {
+ padding: 12px 14px;
+ margin: 0 0 20px;
+ background: #f8f8f8;
+ border: 1px solid #eee;
+ border-radius: 4px;
+ text-align: right;
+ overflow: hidden;
+}
+
+body.popup .submit-row {
+ overflow: auto;
+}
+
+.submit-row input {
+ height: 35px;
+ line-height: 15px;
+ margin: 0 0 0 5px;
+}
+
+.submit-row input.default {
+ margin: 0 0 0 8px;
+ text-transform: uppercase;
+}
+
+.submit-row p {
+ margin: 0.3em;
+}
+
+.submit-row p.deletelink-box {
+ float: left;
+ margin: 0;
+}
+
+.submit-row a.deletelink {
+ display: block;
+ background: #ba2121;
+ border-radius: 4px;
+ padding: 10px 15px;
+ height: 15px;
+ line-height: 15px;
+ color: #fff;
+}
+
+.submit-row a.closelink {
+ display: inline-block;
+ background: #bbbbbb;
+ border-radius: 4px;
+ padding: 10px 15px;
+ height: 15px;
+ line-height: 15px;
+ margin: 0 0 0 5px;
+ color: #fff;
+}
+
+.submit-row a.deletelink:focus,
+.submit-row a.deletelink:hover,
+.submit-row a.deletelink:active {
+ background: #a41515;
+}
+
+.submit-row a.closelink:focus,
+.submit-row a.closelink:hover,
+.submit-row a.closelink:active {
+ background: #aaaaaa;
+}
+
+/* CUSTOM FORM FIELDS */
+
+.vSelectMultipleField {
+ vertical-align: top;
+}
+
+.vCheckboxField {
+ border: none;
+}
+
+.vDateField, .vTimeField {
+ margin-right: 2px;
+ margin-bottom: 4px;
+}
+
+.vDateField {
+ min-width: 6.85em;
+}
+
+.vTimeField {
+ min-width: 4.7em;
+}
+
+.vURLField {
+ width: 30em;
+}
+
+.vLargeTextField, .vXMLLargeTextField {
+ width: 48em;
+}
+
+.flatpages-flatpage #id_content {
+ height: 40.2em;
+}
+
+.module table .vPositiveSmallIntegerField {
+ width: 2.2em;
+}
+
+.vTextField, .vUUIDField {
+ width: 20em;
+}
+
+.vIntegerField {
+ width: 5em;
+}
+
+.vBigIntegerField {
+ width: 10em;
+}
+
+.vForeignKeyRawIdAdminField {
+ width: 5em;
+}
+
+/* INLINES */
+
+.inline-group {
+ padding: 0;
+ margin: 0 0 30px;
+}
+
+.inline-group thead th {
+ padding: 8px 10px;
+}
+
+.inline-group .aligned label {
+ width: 160px;
+}
+
+.inline-related {
+ position: relative;
+}
+
+.inline-related h3 {
+ margin: 0;
+ color: #666;
+ padding: 5px;
+ font-size: 13px;
+ background: #f8f8f8;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-related h3 span.delete {
+ float: right;
+}
+
+.inline-related h3 span.delete label {
+ margin-left: 2px;
+ font-size: 11px;
+}
+
+.inline-related fieldset {
+ margin: 0;
+ background: #fff;
+ border: none;
+ width: 100%;
+}
+
+.inline-related fieldset.module h3 {
+ margin: 0;
+ padding: 2px 5px 3px 5px;
+ font-size: 11px;
+ text-align: left;
+ font-weight: bold;
+ background: #bcd;
+ color: #fff;
+}
+
+.inline-group .tabular fieldset.module {
+ border: none;
+}
+
+.inline-related.tabular fieldset.module table {
+ width: 100%;
+}
+
+.last-related fieldset {
+ border: none;
+}
+
+.inline-group .tabular tr.has_original td {
+ padding-top: 2em;
+}
+
+.inline-group .tabular tr td.original {
+ padding: 2px 0 0 0;
+ width: 0;
+ _position: relative;
+}
+
+.inline-group .tabular th.original {
+ width: 0px;
+ padding: 0;
+}
+
+.inline-group .tabular td.original p {
+ position: absolute;
+ left: 0;
+ height: 1.1em;
+ padding: 2px 9px;
+ overflow: hidden;
+ font-size: 9px;
+ font-weight: bold;
+ color: #666;
+ _width: 700px;
+}
+
+.inline-group ul.tools {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+.inline-group ul.tools li {
+ display: inline;
+ padding: 0 5px;
+}
+
+.inline-group div.add-row,
+.inline-group .tabular tr.add-row td {
+ color: #666;
+ background: #f8f8f8;
+ padding: 8px 10px;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-group .tabular tr.add-row td {
+ padding: 8px 10px;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-group ul.tools a.add,
+.inline-group div.add-row a,
+.inline-group .tabular tr.add-row td a {
+ background: url("../img/icon-addlink.d519b3bab011.svg") 0 1px no-repeat;
+ padding-left: 16px;
+ font-size: 12px;
+}
+
+.empty-form {
+ display: none;
+}
+
+/* RELATED FIELD ADD ONE / LOOKUP */
+
+.add-another, .related-lookup {
+ margin-left: 5px;
+ display: inline-block;
+ vertical-align: middle;
+ background-repeat: no-repeat;
+ background-size: 14px;
+}
+
+.add-another {
+ width: 16px;
+ height: 16px;
+ background-image: url("../img/icon-addlink.d519b3bab011.svg");
+}
+
+.related-lookup {
+ width: 16px;
+ height: 16px;
+ background-image: url("../img/search.7cf54ff789c6.svg");
+}
+
+form .related-widget-wrapper ul {
+ display: inline-block;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.clearable-file-input input {
+ margin-top: 0;
+}
diff --git a/src/staticfiles/admin/css/forms.31b2f650d92e.css.gz b/src/staticfiles/admin/css/forms.31b2f650d92e.css.gz
new file mode 100644
index 0000000..91bb036
Binary files /dev/null and b/src/staticfiles/admin/css/forms.31b2f650d92e.css.gz differ
diff --git a/src/staticfiles/admin/css/forms.8e9f67423063.css b/src/staticfiles/admin/css/forms.8e9f67423063.css
new file mode 100644
index 0000000..b10cd77
--- /dev/null
+++ b/src/staticfiles/admin/css/forms.8e9f67423063.css
@@ -0,0 +1,532 @@
+@import url("widgets.5e372b41c483.css");
+
+/* FORM ROWS */
+
+.form-row {
+ overflow: hidden;
+ padding: 10px;
+ font-size: 13px;
+ border-bottom: 1px solid #eee;
+}
+
+.form-row img, .form-row input {
+ vertical-align: middle;
+}
+
+.form-row label input[type="checkbox"] {
+ margin-top: 0;
+ vertical-align: 0;
+}
+
+form .form-row p {
+ padding-left: 0;
+}
+
+.hidden {
+ display: none;
+}
+
+/* FORM LABELS */
+
+label {
+ font-weight: normal;
+ color: #666;
+ font-size: 13px;
+}
+
+.required label, label.required {
+ font-weight: bold;
+ color: #333;
+}
+
+/* RADIO BUTTONS */
+
+form ul.radiolist li {
+ list-style-type: none;
+}
+
+form ul.radiolist label {
+ float: none;
+ display: inline;
+}
+
+form ul.radiolist input[type="radio"] {
+ margin: -2px 4px 0 0;
+ padding: 0;
+}
+
+form ul.inline {
+ margin-left: 0;
+ padding: 0;
+}
+
+form ul.inline li {
+ float: left;
+ padding-right: 7px;
+}
+
+/* ALIGNED FIELDSETS */
+
+.aligned label {
+ display: block;
+ padding: 4px 10px 0 0;
+ float: left;
+ width: 160px;
+ word-wrap: break-word;
+ line-height: 1;
+}
+
+.aligned label:not(.vCheckboxLabel):after {
+ content: '';
+ display: inline-block;
+ vertical-align: middle;
+ height: 26px;
+}
+
+.aligned label + p, .aligned label + div.help, .aligned label + div.readonly {
+ padding: 6px 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 170px;
+}
+
+.aligned ul label {
+ display: inline;
+ float: none;
+ width: auto;
+}
+
+.aligned .form-row input {
+ margin-bottom: 0;
+}
+
+.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField {
+ width: 350px;
+}
+
+form .aligned ul {
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned ul.radiolist {
+ display: inline-block;
+ margin: 0;
+ padding: 0;
+}
+
+form .aligned p.help,
+form .aligned div.help {
+ clear: left;
+ margin-top: 0;
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned label + p.help,
+form .aligned label + div.help {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+form .aligned p.help:last-child,
+form .aligned div.help:last-child {
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+
+form .aligned input + p.help,
+form .aligned textarea + p.help,
+form .aligned select + p.help,
+form .aligned input + div.help,
+form .aligned textarea + div.help,
+form .aligned select + div.help {
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned ul li {
+ list-style: none;
+}
+
+form .aligned table p {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.aligned .vCheckboxLabel {
+ float: none;
+ width: auto;
+ display: inline-block;
+ vertical-align: -3px;
+ padding: 0 0 5px 5px;
+}
+
+.aligned .vCheckboxLabel + p.help,
+.aligned .vCheckboxLabel + div.help {
+ margin-top: -4px;
+}
+
+.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField {
+ width: 610px;
+}
+
+.checkbox-row p.help,
+.checkbox-row div.help {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+fieldset .fieldBox {
+ float: left;
+ margin-right: 20px;
+}
+
+/* WIDE FIELDSETS */
+
+.wide label {
+ width: 200px;
+}
+
+form .wide p,
+form .wide input + p.help,
+form .wide input + div.help {
+ margin-left: 200px;
+}
+
+form .wide p.help,
+form .wide div.help {
+ padding-left: 38px;
+}
+
+form div.help ul {
+ padding-left: 0;
+ margin-left: 0;
+}
+
+.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField {
+ width: 450px;
+}
+
+/* COLLAPSED FIELDSETS */
+
+fieldset.collapsed * {
+ display: none;
+}
+
+fieldset.collapsed h2, fieldset.collapsed {
+ display: block;
+}
+
+fieldset.collapsed {
+ border: 1px solid #eee;
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+fieldset.collapsed h2 {
+ background: #f8f8f8;
+ color: #666;
+}
+
+fieldset .collapse-toggle {
+ color: #fff;
+}
+
+fieldset.collapsed .collapse-toggle {
+ background: transparent;
+ display: inline;
+ color: #447e9b;
+}
+
+/* MONOSPACE TEXTAREAS */
+
+fieldset.monospace textarea {
+ font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+}
+
+/* SUBMIT ROW */
+
+.submit-row {
+ padding: 12px 14px;
+ margin: 0 0 20px;
+ background: #f8f8f8;
+ border: 1px solid #eee;
+ border-radius: 4px;
+ text-align: right;
+ overflow: hidden;
+}
+
+body.popup .submit-row {
+ overflow: auto;
+}
+
+.submit-row input {
+ height: 35px;
+ line-height: 15px;
+ margin: 0 0 0 5px;
+}
+
+.submit-row input.default {
+ margin: 0 0 0 8px;
+ text-transform: uppercase;
+}
+
+.submit-row p {
+ margin: 0.3em;
+}
+
+.submit-row p.deletelink-box {
+ float: left;
+ margin: 0;
+}
+
+.submit-row a.deletelink {
+ display: block;
+ background: #ba2121;
+ border-radius: 4px;
+ padding: 10px 15px;
+ height: 15px;
+ line-height: 15px;
+ color: #fff;
+}
+
+.submit-row a.closelink {
+ display: inline-block;
+ background: #bbbbbb;
+ border-radius: 4px;
+ padding: 10px 15px;
+ height: 15px;
+ line-height: 15px;
+ margin: 0 0 0 5px;
+ color: #fff;
+}
+
+.submit-row a.deletelink:focus,
+.submit-row a.deletelink:hover,
+.submit-row a.deletelink:active {
+ background: #a41515;
+}
+
+.submit-row a.closelink:focus,
+.submit-row a.closelink:hover,
+.submit-row a.closelink:active {
+ background: #aaaaaa;
+}
+
+/* CUSTOM FORM FIELDS */
+
+.vSelectMultipleField {
+ vertical-align: top;
+}
+
+.vCheckboxField {
+ border: none;
+}
+
+.vDateField, .vTimeField {
+ margin-right: 2px;
+ margin-bottom: 4px;
+}
+
+.vDateField {
+ min-width: 6.85em;
+}
+
+.vTimeField {
+ min-width: 4.7em;
+}
+
+.vURLField {
+ width: 30em;
+}
+
+.vLargeTextField, .vXMLLargeTextField {
+ width: 48em;
+}
+
+.flatpages-flatpage #id_content {
+ height: 40.2em;
+}
+
+.module table .vPositiveSmallIntegerField {
+ width: 2.2em;
+}
+
+.vTextField, .vUUIDField {
+ width: 20em;
+}
+
+.vIntegerField {
+ width: 5em;
+}
+
+.vBigIntegerField {
+ width: 10em;
+}
+
+.vForeignKeyRawIdAdminField {
+ width: 5em;
+}
+
+/* INLINES */
+
+.inline-group {
+ padding: 0;
+ margin: 0 0 30px;
+}
+
+.inline-group thead th {
+ padding: 8px 10px;
+}
+
+.inline-group .aligned label {
+ width: 160px;
+}
+
+.inline-related {
+ position: relative;
+}
+
+.inline-related h3 {
+ margin: 0;
+ color: #666;
+ padding: 5px;
+ font-size: 13px;
+ background: #f8f8f8;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-related h3 span.delete {
+ float: right;
+}
+
+.inline-related h3 span.delete label {
+ margin-left: 2px;
+ font-size: 11px;
+}
+
+.inline-related fieldset {
+ margin: 0;
+ background: #fff;
+ border: none;
+ width: 100%;
+}
+
+.inline-related fieldset.module h3 {
+ margin: 0;
+ padding: 2px 5px 3px 5px;
+ font-size: 11px;
+ text-align: left;
+ font-weight: bold;
+ background: #bcd;
+ color: #fff;
+}
+
+.inline-group .tabular fieldset.module {
+ border: none;
+}
+
+.inline-related.tabular fieldset.module table {
+ width: 100%;
+}
+
+.last-related fieldset {
+ border: none;
+}
+
+.inline-group .tabular tr.has_original td {
+ padding-top: 2em;
+}
+
+.inline-group .tabular tr td.original {
+ padding: 2px 0 0 0;
+ width: 0;
+ _position: relative;
+}
+
+.inline-group .tabular th.original {
+ width: 0px;
+ padding: 0;
+}
+
+.inline-group .tabular td.original p {
+ position: absolute;
+ left: 0;
+ height: 1.1em;
+ padding: 2px 9px;
+ overflow: hidden;
+ font-size: 9px;
+ font-weight: bold;
+ color: #666;
+ _width: 700px;
+}
+
+.inline-group ul.tools {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+.inline-group ul.tools li {
+ display: inline;
+ padding: 0 5px;
+}
+
+.inline-group div.add-row,
+.inline-group .tabular tr.add-row td {
+ color: #666;
+ background: #f8f8f8;
+ padding: 8px 10px;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-group .tabular tr.add-row td {
+ padding: 8px 10px;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-group ul.tools a.add,
+.inline-group div.add-row a,
+.inline-group .tabular tr.add-row td a {
+ background: url("../img/icon-addlink.d519b3bab011.svg") 0 1px no-repeat;
+ padding-left: 16px;
+ font-size: 12px;
+}
+
+.empty-form {
+ display: none;
+}
+
+/* RELATED FIELD ADD ONE / LOOKUP */
+
+.add-another, .related-lookup {
+ margin-left: 5px;
+ display: inline-block;
+ vertical-align: middle;
+ background-repeat: no-repeat;
+ background-size: 14px;
+}
+
+.add-another {
+ width: 16px;
+ height: 16px;
+ background-image: url("../img/icon-addlink.d519b3bab011.svg");
+}
+
+.related-lookup {
+ width: 16px;
+ height: 16px;
+ background-image: url("../img/search.7cf54ff789c6.svg");
+}
+
+form .related-widget-wrapper ul {
+ display: inline-block;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.clearable-file-input input {
+ margin-top: 0;
+}
diff --git a/src/staticfiles/admin/css/forms.css b/src/staticfiles/admin/css/forms.css
new file mode 100644
index 0000000..62a093f
--- /dev/null
+++ b/src/staticfiles/admin/css/forms.css
@@ -0,0 +1,532 @@
+@import url('widgets.css');
+
+/* FORM ROWS */
+
+.form-row {
+ overflow: hidden;
+ padding: 10px;
+ font-size: 13px;
+ border-bottom: 1px solid #eee;
+}
+
+.form-row img, .form-row input {
+ vertical-align: middle;
+}
+
+.form-row label input[type="checkbox"] {
+ margin-top: 0;
+ vertical-align: 0;
+}
+
+form .form-row p {
+ padding-left: 0;
+}
+
+.hidden {
+ display: none;
+}
+
+/* FORM LABELS */
+
+label {
+ font-weight: normal;
+ color: #666;
+ font-size: 13px;
+}
+
+.required label, label.required {
+ font-weight: bold;
+ color: #333;
+}
+
+/* RADIO BUTTONS */
+
+form ul.radiolist li {
+ list-style-type: none;
+}
+
+form ul.radiolist label {
+ float: none;
+ display: inline;
+}
+
+form ul.radiolist input[type="radio"] {
+ margin: -2px 4px 0 0;
+ padding: 0;
+}
+
+form ul.inline {
+ margin-left: 0;
+ padding: 0;
+}
+
+form ul.inline li {
+ float: left;
+ padding-right: 7px;
+}
+
+/* ALIGNED FIELDSETS */
+
+.aligned label {
+ display: block;
+ padding: 4px 10px 0 0;
+ float: left;
+ width: 160px;
+ word-wrap: break-word;
+ line-height: 1;
+}
+
+.aligned label:not(.vCheckboxLabel):after {
+ content: '';
+ display: inline-block;
+ vertical-align: middle;
+ height: 26px;
+}
+
+.aligned label + p, .aligned label + div.help, .aligned label + div.readonly {
+ padding: 6px 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 170px;
+}
+
+.aligned ul label {
+ display: inline;
+ float: none;
+ width: auto;
+}
+
+.aligned .form-row input {
+ margin-bottom: 0;
+}
+
+.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField {
+ width: 350px;
+}
+
+form .aligned ul {
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned ul.radiolist {
+ display: inline-block;
+ margin: 0;
+ padding: 0;
+}
+
+form .aligned p.help,
+form .aligned div.help {
+ clear: left;
+ margin-top: 0;
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned label + p.help,
+form .aligned label + div.help {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+form .aligned p.help:last-child,
+form .aligned div.help:last-child {
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+
+form .aligned input + p.help,
+form .aligned textarea + p.help,
+form .aligned select + p.help,
+form .aligned input + div.help,
+form .aligned textarea + div.help,
+form .aligned select + div.help {
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned ul li {
+ list-style: none;
+}
+
+form .aligned table p {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.aligned .vCheckboxLabel {
+ float: none;
+ width: auto;
+ display: inline-block;
+ vertical-align: -3px;
+ padding: 0 0 5px 5px;
+}
+
+.aligned .vCheckboxLabel + p.help,
+.aligned .vCheckboxLabel + div.help {
+ margin-top: -4px;
+}
+
+.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField {
+ width: 610px;
+}
+
+.checkbox-row p.help,
+.checkbox-row div.help {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+fieldset .fieldBox {
+ float: left;
+ margin-right: 20px;
+}
+
+/* WIDE FIELDSETS */
+
+.wide label {
+ width: 200px;
+}
+
+form .wide p,
+form .wide input + p.help,
+form .wide input + div.help {
+ margin-left: 200px;
+}
+
+form .wide p.help,
+form .wide div.help {
+ padding-left: 38px;
+}
+
+form div.help ul {
+ padding-left: 0;
+ margin-left: 0;
+}
+
+.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField {
+ width: 450px;
+}
+
+/* COLLAPSED FIELDSETS */
+
+fieldset.collapsed * {
+ display: none;
+}
+
+fieldset.collapsed h2, fieldset.collapsed {
+ display: block;
+}
+
+fieldset.collapsed {
+ border: 1px solid #eee;
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+fieldset.collapsed h2 {
+ background: #f8f8f8;
+ color: #666;
+}
+
+fieldset .collapse-toggle {
+ color: #fff;
+}
+
+fieldset.collapsed .collapse-toggle {
+ background: transparent;
+ display: inline;
+ color: #447e9b;
+}
+
+/* MONOSPACE TEXTAREAS */
+
+fieldset.monospace textarea {
+ font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+}
+
+/* SUBMIT ROW */
+
+.submit-row {
+ padding: 12px 14px;
+ margin: 0 0 20px;
+ background: #f8f8f8;
+ border: 1px solid #eee;
+ border-radius: 4px;
+ text-align: right;
+ overflow: hidden;
+}
+
+body.popup .submit-row {
+ overflow: auto;
+}
+
+.submit-row input {
+ height: 35px;
+ line-height: 15px;
+ margin: 0 0 0 5px;
+}
+
+.submit-row input.default {
+ margin: 0 0 0 8px;
+ text-transform: uppercase;
+}
+
+.submit-row p {
+ margin: 0.3em;
+}
+
+.submit-row p.deletelink-box {
+ float: left;
+ margin: 0;
+}
+
+.submit-row a.deletelink {
+ display: block;
+ background: #ba2121;
+ border-radius: 4px;
+ padding: 10px 15px;
+ height: 15px;
+ line-height: 15px;
+ color: #fff;
+}
+
+.submit-row a.closelink {
+ display: inline-block;
+ background: #bbbbbb;
+ border-radius: 4px;
+ padding: 10px 15px;
+ height: 15px;
+ line-height: 15px;
+ margin: 0 0 0 5px;
+ color: #fff;
+}
+
+.submit-row a.deletelink:focus,
+.submit-row a.deletelink:hover,
+.submit-row a.deletelink:active {
+ background: #a41515;
+}
+
+.submit-row a.closelink:focus,
+.submit-row a.closelink:hover,
+.submit-row a.closelink:active {
+ background: #aaaaaa;
+}
+
+/* CUSTOM FORM FIELDS */
+
+.vSelectMultipleField {
+ vertical-align: top;
+}
+
+.vCheckboxField {
+ border: none;
+}
+
+.vDateField, .vTimeField {
+ margin-right: 2px;
+ margin-bottom: 4px;
+}
+
+.vDateField {
+ min-width: 6.85em;
+}
+
+.vTimeField {
+ min-width: 4.7em;
+}
+
+.vURLField {
+ width: 30em;
+}
+
+.vLargeTextField, .vXMLLargeTextField {
+ width: 48em;
+}
+
+.flatpages-flatpage #id_content {
+ height: 40.2em;
+}
+
+.module table .vPositiveSmallIntegerField {
+ width: 2.2em;
+}
+
+.vTextField, .vUUIDField {
+ width: 20em;
+}
+
+.vIntegerField {
+ width: 5em;
+}
+
+.vBigIntegerField {
+ width: 10em;
+}
+
+.vForeignKeyRawIdAdminField {
+ width: 5em;
+}
+
+/* INLINES */
+
+.inline-group {
+ padding: 0;
+ margin: 0 0 30px;
+}
+
+.inline-group thead th {
+ padding: 8px 10px;
+}
+
+.inline-group .aligned label {
+ width: 160px;
+}
+
+.inline-related {
+ position: relative;
+}
+
+.inline-related h3 {
+ margin: 0;
+ color: #666;
+ padding: 5px;
+ font-size: 13px;
+ background: #f8f8f8;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-related h3 span.delete {
+ float: right;
+}
+
+.inline-related h3 span.delete label {
+ margin-left: 2px;
+ font-size: 11px;
+}
+
+.inline-related fieldset {
+ margin: 0;
+ background: #fff;
+ border: none;
+ width: 100%;
+}
+
+.inline-related fieldset.module h3 {
+ margin: 0;
+ padding: 2px 5px 3px 5px;
+ font-size: 11px;
+ text-align: left;
+ font-weight: bold;
+ background: #bcd;
+ color: #fff;
+}
+
+.inline-group .tabular fieldset.module {
+ border: none;
+}
+
+.inline-related.tabular fieldset.module table {
+ width: 100%;
+}
+
+.last-related fieldset {
+ border: none;
+}
+
+.inline-group .tabular tr.has_original td {
+ padding-top: 2em;
+}
+
+.inline-group .tabular tr td.original {
+ padding: 2px 0 0 0;
+ width: 0;
+ _position: relative;
+}
+
+.inline-group .tabular th.original {
+ width: 0px;
+ padding: 0;
+}
+
+.inline-group .tabular td.original p {
+ position: absolute;
+ left: 0;
+ height: 1.1em;
+ padding: 2px 9px;
+ overflow: hidden;
+ font-size: 9px;
+ font-weight: bold;
+ color: #666;
+ _width: 700px;
+}
+
+.inline-group ul.tools {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+.inline-group ul.tools li {
+ display: inline;
+ padding: 0 5px;
+}
+
+.inline-group div.add-row,
+.inline-group .tabular tr.add-row td {
+ color: #666;
+ background: #f8f8f8;
+ padding: 8px 10px;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-group .tabular tr.add-row td {
+ padding: 8px 10px;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-group ul.tools a.add,
+.inline-group div.add-row a,
+.inline-group .tabular tr.add-row td a {
+ background: url(../img/icon-addlink.svg) 0 1px no-repeat;
+ padding-left: 16px;
+ font-size: 12px;
+}
+
+.empty-form {
+ display: none;
+}
+
+/* RELATED FIELD ADD ONE / LOOKUP */
+
+.add-another, .related-lookup {
+ margin-left: 5px;
+ display: inline-block;
+ vertical-align: middle;
+ background-repeat: no-repeat;
+ background-size: 14px;
+}
+
+.add-another {
+ width: 16px;
+ height: 16px;
+ background-image: url(../img/icon-addlink.svg);
+}
+
+.related-lookup {
+ width: 16px;
+ height: 16px;
+ background-image: url(../img/search.svg);
+}
+
+form .related-widget-wrapper ul {
+ display: inline-block;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.clearable-file-input input {
+ margin-top: 0;
+}
diff --git a/src/staticfiles/admin/css/forms.css.gz b/src/staticfiles/admin/css/forms.css.gz
new file mode 100644
index 0000000..2ebe71d
Binary files /dev/null and b/src/staticfiles/admin/css/forms.css.gz differ
diff --git a/src/staticfiles/admin/css/login.252ffabd6548.css b/src/staticfiles/admin/css/login.252ffabd6548.css
new file mode 100644
index 0000000..2ec241c
--- /dev/null
+++ b/src/staticfiles/admin/css/login.252ffabd6548.css
@@ -0,0 +1,79 @@
+/* LOGIN FORM */
+
+body.login {
+ background: #f8f8f8;
+}
+
+.login #header {
+ height: auto;
+ padding: 15px 16px;
+ justify-content: center;
+}
+
+.login #header h1 {
+ font-size: 18px;
+}
+
+.login #header h1 a {
+ color: #fff;
+}
+
+.login #content {
+ padding: 20px 20px 0;
+}
+
+.login #container {
+ background: #fff;
+ border: 1px solid #eaeaea;
+ border-radius: 4px;
+ overflow: hidden;
+ width: 28em;
+ min-width: 300px;
+ margin: 100px auto;
+}
+
+.login #content-main {
+ width: 100%;
+}
+
+.login .form-row {
+ padding: 4px 0;
+ float: left;
+ width: 100%;
+ border-bottom: none;
+}
+
+.login .form-row label {
+ padding-right: 0.5em;
+ line-height: 2em;
+ font-size: 1em;
+ clear: both;
+ color: #333;
+}
+
+.login .form-row #id_username, .login .form-row #id_password {
+ clear: both;
+ padding: 8px;
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.login span.help {
+ font-size: 10px;
+ display: block;
+}
+
+.login .submit-row {
+ clear: both;
+ padding: 1em 0 0 9.4em;
+ margin: 0;
+ border: none;
+ background: none;
+ text-align: left;
+}
+
+.login .password-reset-link {
+ text-align: center;
+}
diff --git a/src/staticfiles/admin/css/login.252ffabd6548.css.gz b/src/staticfiles/admin/css/login.252ffabd6548.css.gz
new file mode 100644
index 0000000..0ce63ae
Binary files /dev/null and b/src/staticfiles/admin/css/login.252ffabd6548.css.gz differ
diff --git a/src/staticfiles/admin/css/login.css b/src/staticfiles/admin/css/login.css
new file mode 100644
index 0000000..2ec241c
--- /dev/null
+++ b/src/staticfiles/admin/css/login.css
@@ -0,0 +1,79 @@
+/* LOGIN FORM */
+
+body.login {
+ background: #f8f8f8;
+}
+
+.login #header {
+ height: auto;
+ padding: 15px 16px;
+ justify-content: center;
+}
+
+.login #header h1 {
+ font-size: 18px;
+}
+
+.login #header h1 a {
+ color: #fff;
+}
+
+.login #content {
+ padding: 20px 20px 0;
+}
+
+.login #container {
+ background: #fff;
+ border: 1px solid #eaeaea;
+ border-radius: 4px;
+ overflow: hidden;
+ width: 28em;
+ min-width: 300px;
+ margin: 100px auto;
+}
+
+.login #content-main {
+ width: 100%;
+}
+
+.login .form-row {
+ padding: 4px 0;
+ float: left;
+ width: 100%;
+ border-bottom: none;
+}
+
+.login .form-row label {
+ padding-right: 0.5em;
+ line-height: 2em;
+ font-size: 1em;
+ clear: both;
+ color: #333;
+}
+
+.login .form-row #id_username, .login .form-row #id_password {
+ clear: both;
+ padding: 8px;
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.login span.help {
+ font-size: 10px;
+ display: block;
+}
+
+.login .submit-row {
+ clear: both;
+ padding: 1em 0 0 9.4em;
+ margin: 0;
+ border: none;
+ background: none;
+ text-align: left;
+}
+
+.login .password-reset-link {
+ text-align: center;
+}
diff --git a/src/staticfiles/admin/css/login.css.gz b/src/staticfiles/admin/css/login.css.gz
new file mode 100644
index 0000000..0ce63ae
Binary files /dev/null and b/src/staticfiles/admin/css/login.css.gz differ
diff --git a/src/staticfiles/admin/css/responsive.3a465780d49f.css b/src/staticfiles/admin/css/responsive.3a465780d49f.css
new file mode 100644
index 0000000..5b0d1ec
--- /dev/null
+++ b/src/staticfiles/admin/css/responsive.3a465780d49f.css
@@ -0,0 +1,992 @@
+/* Tablets */
+
+input[type="submit"], button {
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+@media (max-width: 1024px) {
+ /* Basic */
+
+ html {
+ -webkit-text-size-adjust: 100%;
+ }
+
+ td, th {
+ padding: 10px;
+ font-size: 14px;
+ }
+
+ .small {
+ font-size: 12px;
+ }
+
+ /* Layout */
+
+ #container {
+ min-width: 0;
+ }
+
+ #content {
+ padding: 20px 30px 30px;
+ }
+
+ div.breadcrumbs {
+ padding: 10px 30px;
+ }
+
+ /* Header */
+
+ #header {
+ flex-direction: column;
+ padding: 15px 30px;
+ justify-content: flex-start;
+ }
+
+ #branding h1 {
+ margin: 0 0 8px;
+ font-size: 20px;
+ line-height: 1.2;
+ }
+
+ #user-tools {
+ margin: 0;
+ font-weight: 400;
+ line-height: 1.85;
+ text-align: left;
+ }
+
+ #user-tools a {
+ display: inline-block;
+ line-height: 1.4;
+ }
+
+ /* Dashboard */
+
+ .dashboard #content {
+ width: auto;
+ }
+
+ #content-related {
+ margin-right: -290px;
+ }
+
+ .colSM #content-related {
+ margin-left: -290px;
+ }
+
+ .colMS {
+ margin-right: 290px;
+ }
+
+ .colSM {
+ margin-left: 290px;
+ }
+
+ .dashboard .module table td a {
+ padding-right: 0;
+ }
+
+ td .changelink, td .addlink {
+ font-size: 13px;
+ }
+
+ /* Changelist */
+
+ #changelist #toolbar {
+ border: none;
+ padding: 15px;
+ }
+
+ #changelist-search > div {
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ flex-wrap: wrap;
+ max-width: 480px;
+ }
+
+ #changelist-search label {
+ line-height: 22px;
+ }
+
+ #changelist #toolbar form #searchbar {
+ -webkit-flex: 1 0 auto;
+ flex: 1 0 auto;
+ width: 0;
+ height: 22px;
+ margin: 0 10px 0 6px;
+ }
+
+ #changelist-search .quiet {
+ width: 100%;
+ margin: 5px 0 0 25px;
+ }
+
+ #changelist .actions {
+ display: flex;
+ flex-wrap: wrap;
+ padding: 15px 0;
+ }
+
+ #changelist .actions.selected {
+ border: none;
+ }
+
+ #changelist .actions label {
+ display: flex;
+ }
+
+ #changelist .actions select {
+ background: #fff;
+ }
+
+ #changelist .actions .button {
+ min-width: 48px;
+ margin: 0 10px;
+ }
+
+ #changelist .actions span.all,
+ #changelist .actions span.clear,
+ #changelist .actions span.question,
+ #changelist .actions span.action-counter {
+ font-size: 11px;
+ margin: 0 10px 0 0;
+ }
+
+ #changelist-filter {
+ width: 200px;
+ }
+
+ .change-list .filtered .results,
+ .change-list .filtered .paginator,
+ .filtered #toolbar,
+ .filtered .actions,
+ .filtered div.xfull {
+ margin-right: 230px;
+ }
+
+ #changelist .paginator {
+ border-top-color: #eee;
+ }
+
+ #changelist .results + .paginator {
+ border-top: none;
+ }
+
+ /* Forms */
+
+ label {
+ font-size: 14px;
+ }
+
+ .form-row input[type=text],
+ .form-row input[type=password],
+ .form-row input[type=email],
+ .form-row input[type=url],
+ .form-row input[type=tel],
+ .form-row input[type=number],
+ .form-row textarea,
+ .form-row select,
+ .form-row .vTextField {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 6px 8px;
+ min-height: 36px;
+ font-size: 14px;
+ }
+
+ .form-row select {
+ height: 36px;
+ }
+
+ .form-row select[multiple] {
+ height: auto;
+ min-height: 0;
+ }
+
+ fieldset .fieldBox {
+ float: none;
+ margin: 0 -10px;
+ padding: 0 10px;
+ }
+
+ fieldset .fieldBox + .fieldBox {
+ margin-top: 10px;
+ padding-top: 10px;
+ border-top: 1px solid #eee;
+ }
+
+ textarea {
+ max-width: 518px;
+ max-height: 120px;
+ }
+
+ .aligned label {
+ padding-top: 6px;
+ }
+
+ .aligned .add-another,
+ .aligned .related-lookup,
+ .aligned .datetimeshortcuts,
+ .aligned .related-lookup + strong {
+ align-self: center;
+ margin-left: 15px;
+ }
+
+ form .aligned ul.radiolist {
+ margin-left: 2px;
+ }
+
+ /* Related widget */
+
+ .related-widget-wrapper {
+ float: none;
+ }
+
+ .related-widget-wrapper-link + .selector {
+ max-width: calc(100% - 30px);
+ margin-right: 15px;
+ }
+
+ select + .related-widget-wrapper-link,
+ .related-widget-wrapper-link + .related-widget-wrapper-link {
+ margin-left: 10px;
+ }
+
+ /* Selector */
+
+ .selector {
+ display: flex;
+ width: 100%;
+ }
+
+ .selector .selector-filter {
+ display: flex;
+ align-items: center;
+ }
+
+ .selector .selector-filter label {
+ margin: 0 8px 0 0;
+ }
+
+ .selector .selector-filter input {
+ width: auto;
+ min-height: 0;
+ flex: 1 1;
+ }
+
+ .selector-available, .selector-chosen {
+ width: auto;
+ flex: 1 1;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .selector select {
+ width: 100%;
+ flex: 1 0 auto;
+ margin-bottom: 5px;
+ }
+
+ .selector ul.selector-chooser {
+ width: 26px;
+ height: 52px;
+ padding: 2px 0;
+ margin: auto 15px;
+ border-radius: 20px;
+ transform: translateY(-10px);
+ }
+
+ .selector-add, .selector-remove {
+ width: 20px;
+ height: 20px;
+ background-size: 20px auto;
+ }
+
+ .selector-add {
+ background-position: 0 -120px;
+ }
+
+ .selector-remove {
+ background-position: 0 -80px;
+ }
+
+ a.selector-chooseall, a.selector-clearall {
+ align-self: center;
+ }
+
+ .stacked {
+ flex-direction: column;
+ max-width: 480px;
+ }
+
+ .stacked > * {
+ flex: 0 1 auto;
+ }
+
+ .stacked select {
+ margin-bottom: 0;
+ }
+
+ .stacked .selector-available, .stacked .selector-chosen {
+ width: auto;
+ }
+
+ .stacked ul.selector-chooser {
+ width: 52px;
+ height: 26px;
+ padding: 0 2px;
+ margin: 15px auto;
+ transform: none;
+ }
+
+ .stacked .selector-chooser li {
+ padding: 3px;
+ }
+
+ .stacked .selector-add, .stacked .selector-remove {
+ background-size: 20px auto;
+ }
+
+ .stacked .selector-add {
+ background-position: 0 -40px;
+ }
+
+ .stacked .active.selector-add {
+ background-position: 0 -60px;
+ }
+
+ .stacked .selector-remove {
+ background-position: 0 0;
+ }
+
+ .stacked .active.selector-remove {
+ background-position: 0 -20px;
+ }
+
+ .help-tooltip, .selector .help-icon {
+ display: none;
+ }
+
+ form .form-row p.datetime {
+ width: 100%;
+ }
+
+ .datetime input {
+ width: 50%;
+ max-width: 120px;
+ }
+
+ .datetime span {
+ font-size: 13px;
+ }
+
+ .datetime .timezonewarning {
+ display: block;
+ font-size: 11px;
+ color: #999;
+ }
+
+ .datetimeshortcuts {
+ color: #ccc;
+ }
+
+ .inline-group {
+ overflow: auto;
+ }
+
+ /* Messages */
+
+ ul.messagelist li {
+ padding-left: 55px;
+ background-position: 30px 12px;
+ }
+
+ ul.messagelist li.error {
+ background-position: 30px 12px;
+ }
+
+ ul.messagelist li.warning {
+ background-position: 30px 14px;
+ }
+
+ /* Login */
+
+ .login #header {
+ padding: 15px 20px;
+ }
+
+ .login #branding h1 {
+ margin: 0;
+ }
+
+ /* GIS */
+
+ div.olMap {
+ max-width: calc(100vw - 30px);
+ max-height: 300px;
+ }
+
+ .olMap + .clear_features {
+ display: block;
+ margin-top: 10px;
+ }
+
+ /* Docs */
+
+ .module table.xfull {
+ width: 100%;
+ }
+
+ pre.literal-block {
+ overflow: auto;
+ }
+}
+
+/* Mobile */
+
+@media (max-width: 767px) {
+ /* Layout */
+
+ #header, #content, #footer {
+ padding: 15px;
+ }
+
+ #footer:empty {
+ padding: 0;
+ }
+
+ div.breadcrumbs {
+ padding: 10px 15px;
+ }
+
+ /* Dashboard */
+
+ .colMS, .colSM {
+ margin: 0;
+ }
+
+ #content-related, .colSM #content-related {
+ width: 100%;
+ margin: 0;
+ }
+
+ #content-related .module {
+ margin-bottom: 0;
+ }
+
+ #content-related .module h2 {
+ padding: 10px 15px;
+ font-size: 16px;
+ }
+
+ /* Changelist */
+
+ #changelist {
+ display: flex;
+ flex-direction: column;
+ }
+
+ #changelist #toolbar {
+ order: 1;
+ padding: 10px;
+ }
+
+ #changelist .xfull {
+ order: 2;
+ }
+
+ #changelist-form {
+ order: 3;
+ }
+
+ #changelist-filter {
+ order: 4;
+ }
+
+ #changelist .actions label {
+ flex: 1 1;
+ }
+
+ #changelist .actions select {
+ flex: 1 0;
+ width: 100%;
+ }
+
+ #changelist .actions span {
+ flex: 1 0 100%;
+ }
+
+ .change-list .filtered .results, .change-list .filtered .paginator,
+ .filtered #toolbar, .filtered .actions, .filtered div.xfull {
+ margin-right: 0;
+ }
+
+ #changelist-filter {
+ position: static;
+ width: auto;
+ margin-top: 30px;
+ }
+
+ .object-tools {
+ float: none;
+ margin: 0 0 15px;
+ padding: 0;
+ overflow: hidden;
+ }
+
+ .object-tools li {
+ height: auto;
+ margin-left: 0;
+ }
+
+ .object-tools li + li {
+ margin-left: 15px;
+ }
+
+ /* Forms */
+
+ .form-row {
+ padding: 15px 0;
+ }
+
+ .aligned .form-row,
+ .aligned .form-row > div {
+ display: flex;
+ flex-wrap: wrap;
+ max-width: 100vw;
+ }
+
+ .aligned .form-row > div {
+ width: calc(100vw - 30px);
+ }
+
+ textarea {
+ max-width: none;
+ }
+
+ .vURLField {
+ width: auto;
+ }
+
+ fieldset .fieldBox + .fieldBox {
+ margin-top: 15px;
+ padding-top: 15px;
+ }
+
+ fieldset.collapsed .form-row {
+ display: none;
+ }
+
+ .aligned label {
+ width: 100%;
+ padding: 0 0 10px;
+ }
+
+ .aligned label:after {
+ max-height: 0;
+ }
+
+ .aligned .form-row input,
+ .aligned .form-row select,
+ .aligned .form-row textarea {
+ flex: 1 1 auto;
+ max-width: 100%;
+ }
+
+ .aligned .checkbox-row {
+ align-items: center;
+ }
+
+ .aligned .checkbox-row input {
+ flex: 0 1 auto;
+ margin: 0;
+ }
+
+ .aligned .vCheckboxLabel {
+ flex: 1 0;
+ padding: 1px 0 0 5px;
+ }
+
+ .aligned label + p,
+ .aligned label + div.help,
+ .aligned label + div.readonly {
+ padding: 0;
+ margin-left: 0;
+ }
+
+ .aligned p.file-upload {
+ margin-left: 0;
+ font-size: 13px;
+ }
+
+ span.clearable-file-input {
+ margin-left: 15px;
+ }
+
+ span.clearable-file-input label {
+ font-size: 13px;
+ padding-bottom: 0;
+ }
+
+ .aligned .timezonewarning {
+ flex: 1 0 100%;
+ margin-top: 5px;
+ }
+
+ form .aligned .form-row div.help {
+ width: 100%;
+ margin: 5px 0 0;
+ padding: 0;
+ }
+
+ form .aligned ul {
+ margin-left: 0;
+ padding-left: 0;
+ }
+
+ form .aligned ul.radiolist {
+ margin-right: 15px;
+ margin-bottom: -3px;
+ }
+
+ form .aligned ul.radiolist li + li {
+ margin-top: 5px;
+ }
+
+ /* Related widget */
+
+ .related-widget-wrapper {
+ width: 100%;
+ display: flex;
+ align-items: flex-start;
+ }
+
+ .related-widget-wrapper .selector {
+ order: 1;
+ }
+
+ .related-widget-wrapper > a {
+ order: 2;
+ }
+
+ .related-widget-wrapper .radiolist ~ a {
+ align-self: flex-end;
+ }
+
+ .related-widget-wrapper > select ~ a {
+ align-self: center;
+ }
+
+ select + .related-widget-wrapper-link,
+ .related-widget-wrapper-link + .related-widget-wrapper-link {
+ margin-left: 15px;
+ }
+
+ /* Selector */
+
+ .selector {
+ flex-direction: column;
+ }
+
+ .selector > * {
+ float: none;
+ }
+
+ .selector-available, .selector-chosen {
+ margin-bottom: 0;
+ flex: 1 1 auto;
+ }
+
+ .selector select {
+ max-height: 96px;
+ }
+
+ .selector ul.selector-chooser {
+ display: block;
+ float: none;
+ width: 52px;
+ height: 26px;
+ padding: 0 2px;
+ margin: 15px auto 20px;
+ transform: none;
+ }
+
+ .selector ul.selector-chooser li {
+ float: left;
+ }
+
+ .selector-remove {
+ background-position: 0 0;
+ }
+
+ .selector-add {
+ background-position: 0 -40px;
+ }
+
+ /* Inlines */
+
+ .inline-group[data-inline-type="stacked"] .inline-related {
+ border: 2px solid #eee;
+ border-radius: 4px;
+ margin-top: 15px;
+ overflow: auto;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related > * {
+ box-sizing: border-box;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related + .inline-related {
+ margin-top: 30px;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related .module {
+ padding: 0 10px;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:last-child {
+ border-bottom: none;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related h3 {
+ padding: 10px;
+ border-top-width: 0;
+ border-bottom-width: 2px;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label {
+ margin-right: auto;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related h3 span.delete {
+ float: none;
+ flex: 1 1 100%;
+ margin-top: 5px;
+ }
+
+ .inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) {
+ width: 100%;
+ }
+
+ .inline-group[data-inline-type="stacked"] .aligned label {
+ width: 100%;
+ }
+
+ .inline-group[data-inline-type="stacked"] div.add-row {
+ margin-top: 15px;
+ border: 1px solid #eee;
+ border-radius: 4px;
+ }
+
+ .inline-group div.add-row,
+ .inline-group .tabular tr.add-row td {
+ padding: 0;
+ }
+
+ .inline-group div.add-row a,
+ .inline-group .tabular tr.add-row td a {
+ display: block;
+ padding: 8px 10px 8px 26px;
+ background-position: 8px 9px;
+ }
+
+ /* Submit row */
+
+ .submit-row {
+ padding: 10px 10px 0;
+ margin: 0 0 15px;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .submit-row > * {
+ width: 100%;
+ }
+
+ .submit-row input, .submit-row input.default, .submit-row a, .submit-row a.closelink {
+ float: none;
+ margin: 0 0 10px;
+ text-align: center;
+ }
+
+ .submit-row a.closelink {
+ padding: 10px 0;
+ }
+
+ .submit-row p.deletelink-box {
+ order: 4;
+ }
+
+ /* Messages */
+
+ ul.messagelist li {
+ padding-left: 40px;
+ background-position: 15px 12px;
+ }
+
+ ul.messagelist li.error {
+ background-position: 15px 12px;
+ }
+
+ ul.messagelist li.warning {
+ background-position: 15px 14px;
+ }
+
+ /* Paginator */
+
+ .paginator .this-page, .paginator a:link, .paginator a:visited {
+ padding: 4px 10px;
+ }
+
+ /* Login */
+
+ body.login {
+ padding: 0 15px;
+ }
+
+ .login #container {
+ width: auto;
+ max-width: 480px;
+ margin: 50px auto;
+ }
+
+ .login #header,
+ .login #content {
+ padding: 15px;
+ }
+
+ .login #content-main {
+ float: none;
+ }
+
+ .login .form-row {
+ padding: 0;
+ }
+
+ .login .form-row + .form-row {
+ margin-top: 15px;
+ }
+
+ .login .form-row label {
+ display: block;
+ margin: 0 0 5px;
+ padding: 0;
+ line-height: 1.2;
+ }
+
+ .login .submit-row {
+ padding: 15px 0 0;
+ }
+
+ .login br, .login .submit-row label {
+ display: none;
+ }
+
+ .login .submit-row input {
+ margin: 0;
+ text-transform: uppercase;
+ }
+
+ .errornote {
+ margin: 0 0 20px;
+ padding: 8px 12px;
+ font-size: 13px;
+ }
+
+ /* Calendar and clock */
+
+ .calendarbox, .clockbox {
+ position: fixed !important;
+ top: 50% !important;
+ left: 50% !important;
+ transform: translate(-50%, -50%);
+ margin: 0;
+ border: none;
+ overflow: visible;
+ }
+
+ .calendarbox:before, .clockbox:before {
+ content: '';
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ width: 100vw;
+ height: 100vh;
+ background: rgba(0, 0, 0, 0.75);
+ transform: translate(-50%, -50%);
+ }
+
+ .calendarbox > *, .clockbox > * {
+ position: relative;
+ z-index: 1;
+ }
+
+ .calendarbox > div:first-child {
+ z-index: 2;
+ }
+
+ .calendarbox .calendar, .clockbox h2 {
+ border-radius: 4px 4px 0 0;
+ overflow: hidden;
+ }
+
+ .calendarbox .calendar-cancel, .clockbox .calendar-cancel {
+ border-radius: 0 0 4px 4px;
+ overflow: hidden;
+ }
+
+ .calendar-shortcuts {
+ padding: 10px 0;
+ font-size: 12px;
+ line-height: 12px;
+ }
+
+ .calendar-shortcuts a {
+ margin: 0 4px;
+ }
+
+ .timelist a {
+ background: #fff;
+ padding: 4px;
+ }
+
+ .calendar-cancel {
+ padding: 8px 10px;
+ }
+
+ .clockbox h2 {
+ padding: 8px 15px;
+ }
+
+ .calendar caption {
+ padding: 10px;
+ }
+
+ .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next {
+ z-index: 1;
+ top: 10px;
+ }
+
+ /* History */
+
+ table#change-history tbody th, table#change-history tbody td {
+ font-size: 13px;
+ word-break: break-word;
+ }
+
+ table#change-history tbody th {
+ width: auto;
+ }
+
+ /* Docs */
+
+ table.model tbody th, table.model tbody td {
+ font-size: 13px;
+ word-break: break-word;
+ }
+}
diff --git a/src/staticfiles/admin/css/responsive.3a465780d49f.css.gz b/src/staticfiles/admin/css/responsive.3a465780d49f.css.gz
new file mode 100644
index 0000000..454856b
Binary files /dev/null and b/src/staticfiles/admin/css/responsive.3a465780d49f.css.gz differ
diff --git a/src/staticfiles/admin/css/responsive.css b/src/staticfiles/admin/css/responsive.css
new file mode 100644
index 0000000..5b0d1ec
--- /dev/null
+++ b/src/staticfiles/admin/css/responsive.css
@@ -0,0 +1,992 @@
+/* Tablets */
+
+input[type="submit"], button {
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+@media (max-width: 1024px) {
+ /* Basic */
+
+ html {
+ -webkit-text-size-adjust: 100%;
+ }
+
+ td, th {
+ padding: 10px;
+ font-size: 14px;
+ }
+
+ .small {
+ font-size: 12px;
+ }
+
+ /* Layout */
+
+ #container {
+ min-width: 0;
+ }
+
+ #content {
+ padding: 20px 30px 30px;
+ }
+
+ div.breadcrumbs {
+ padding: 10px 30px;
+ }
+
+ /* Header */
+
+ #header {
+ flex-direction: column;
+ padding: 15px 30px;
+ justify-content: flex-start;
+ }
+
+ #branding h1 {
+ margin: 0 0 8px;
+ font-size: 20px;
+ line-height: 1.2;
+ }
+
+ #user-tools {
+ margin: 0;
+ font-weight: 400;
+ line-height: 1.85;
+ text-align: left;
+ }
+
+ #user-tools a {
+ display: inline-block;
+ line-height: 1.4;
+ }
+
+ /* Dashboard */
+
+ .dashboard #content {
+ width: auto;
+ }
+
+ #content-related {
+ margin-right: -290px;
+ }
+
+ .colSM #content-related {
+ margin-left: -290px;
+ }
+
+ .colMS {
+ margin-right: 290px;
+ }
+
+ .colSM {
+ margin-left: 290px;
+ }
+
+ .dashboard .module table td a {
+ padding-right: 0;
+ }
+
+ td .changelink, td .addlink {
+ font-size: 13px;
+ }
+
+ /* Changelist */
+
+ #changelist #toolbar {
+ border: none;
+ padding: 15px;
+ }
+
+ #changelist-search > div {
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ flex-wrap: wrap;
+ max-width: 480px;
+ }
+
+ #changelist-search label {
+ line-height: 22px;
+ }
+
+ #changelist #toolbar form #searchbar {
+ -webkit-flex: 1 0 auto;
+ flex: 1 0 auto;
+ width: 0;
+ height: 22px;
+ margin: 0 10px 0 6px;
+ }
+
+ #changelist-search .quiet {
+ width: 100%;
+ margin: 5px 0 0 25px;
+ }
+
+ #changelist .actions {
+ display: flex;
+ flex-wrap: wrap;
+ padding: 15px 0;
+ }
+
+ #changelist .actions.selected {
+ border: none;
+ }
+
+ #changelist .actions label {
+ display: flex;
+ }
+
+ #changelist .actions select {
+ background: #fff;
+ }
+
+ #changelist .actions .button {
+ min-width: 48px;
+ margin: 0 10px;
+ }
+
+ #changelist .actions span.all,
+ #changelist .actions span.clear,
+ #changelist .actions span.question,
+ #changelist .actions span.action-counter {
+ font-size: 11px;
+ margin: 0 10px 0 0;
+ }
+
+ #changelist-filter {
+ width: 200px;
+ }
+
+ .change-list .filtered .results,
+ .change-list .filtered .paginator,
+ .filtered #toolbar,
+ .filtered .actions,
+ .filtered div.xfull {
+ margin-right: 230px;
+ }
+
+ #changelist .paginator {
+ border-top-color: #eee;
+ }
+
+ #changelist .results + .paginator {
+ border-top: none;
+ }
+
+ /* Forms */
+
+ label {
+ font-size: 14px;
+ }
+
+ .form-row input[type=text],
+ .form-row input[type=password],
+ .form-row input[type=email],
+ .form-row input[type=url],
+ .form-row input[type=tel],
+ .form-row input[type=number],
+ .form-row textarea,
+ .form-row select,
+ .form-row .vTextField {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 6px 8px;
+ min-height: 36px;
+ font-size: 14px;
+ }
+
+ .form-row select {
+ height: 36px;
+ }
+
+ .form-row select[multiple] {
+ height: auto;
+ min-height: 0;
+ }
+
+ fieldset .fieldBox {
+ float: none;
+ margin: 0 -10px;
+ padding: 0 10px;
+ }
+
+ fieldset .fieldBox + .fieldBox {
+ margin-top: 10px;
+ padding-top: 10px;
+ border-top: 1px solid #eee;
+ }
+
+ textarea {
+ max-width: 518px;
+ max-height: 120px;
+ }
+
+ .aligned label {
+ padding-top: 6px;
+ }
+
+ .aligned .add-another,
+ .aligned .related-lookup,
+ .aligned .datetimeshortcuts,
+ .aligned .related-lookup + strong {
+ align-self: center;
+ margin-left: 15px;
+ }
+
+ form .aligned ul.radiolist {
+ margin-left: 2px;
+ }
+
+ /* Related widget */
+
+ .related-widget-wrapper {
+ float: none;
+ }
+
+ .related-widget-wrapper-link + .selector {
+ max-width: calc(100% - 30px);
+ margin-right: 15px;
+ }
+
+ select + .related-widget-wrapper-link,
+ .related-widget-wrapper-link + .related-widget-wrapper-link {
+ margin-left: 10px;
+ }
+
+ /* Selector */
+
+ .selector {
+ display: flex;
+ width: 100%;
+ }
+
+ .selector .selector-filter {
+ display: flex;
+ align-items: center;
+ }
+
+ .selector .selector-filter label {
+ margin: 0 8px 0 0;
+ }
+
+ .selector .selector-filter input {
+ width: auto;
+ min-height: 0;
+ flex: 1 1;
+ }
+
+ .selector-available, .selector-chosen {
+ width: auto;
+ flex: 1 1;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .selector select {
+ width: 100%;
+ flex: 1 0 auto;
+ margin-bottom: 5px;
+ }
+
+ .selector ul.selector-chooser {
+ width: 26px;
+ height: 52px;
+ padding: 2px 0;
+ margin: auto 15px;
+ border-radius: 20px;
+ transform: translateY(-10px);
+ }
+
+ .selector-add, .selector-remove {
+ width: 20px;
+ height: 20px;
+ background-size: 20px auto;
+ }
+
+ .selector-add {
+ background-position: 0 -120px;
+ }
+
+ .selector-remove {
+ background-position: 0 -80px;
+ }
+
+ a.selector-chooseall, a.selector-clearall {
+ align-self: center;
+ }
+
+ .stacked {
+ flex-direction: column;
+ max-width: 480px;
+ }
+
+ .stacked > * {
+ flex: 0 1 auto;
+ }
+
+ .stacked select {
+ margin-bottom: 0;
+ }
+
+ .stacked .selector-available, .stacked .selector-chosen {
+ width: auto;
+ }
+
+ .stacked ul.selector-chooser {
+ width: 52px;
+ height: 26px;
+ padding: 0 2px;
+ margin: 15px auto;
+ transform: none;
+ }
+
+ .stacked .selector-chooser li {
+ padding: 3px;
+ }
+
+ .stacked .selector-add, .stacked .selector-remove {
+ background-size: 20px auto;
+ }
+
+ .stacked .selector-add {
+ background-position: 0 -40px;
+ }
+
+ .stacked .active.selector-add {
+ background-position: 0 -60px;
+ }
+
+ .stacked .selector-remove {
+ background-position: 0 0;
+ }
+
+ .stacked .active.selector-remove {
+ background-position: 0 -20px;
+ }
+
+ .help-tooltip, .selector .help-icon {
+ display: none;
+ }
+
+ form .form-row p.datetime {
+ width: 100%;
+ }
+
+ .datetime input {
+ width: 50%;
+ max-width: 120px;
+ }
+
+ .datetime span {
+ font-size: 13px;
+ }
+
+ .datetime .timezonewarning {
+ display: block;
+ font-size: 11px;
+ color: #999;
+ }
+
+ .datetimeshortcuts {
+ color: #ccc;
+ }
+
+ .inline-group {
+ overflow: auto;
+ }
+
+ /* Messages */
+
+ ul.messagelist li {
+ padding-left: 55px;
+ background-position: 30px 12px;
+ }
+
+ ul.messagelist li.error {
+ background-position: 30px 12px;
+ }
+
+ ul.messagelist li.warning {
+ background-position: 30px 14px;
+ }
+
+ /* Login */
+
+ .login #header {
+ padding: 15px 20px;
+ }
+
+ .login #branding h1 {
+ margin: 0;
+ }
+
+ /* GIS */
+
+ div.olMap {
+ max-width: calc(100vw - 30px);
+ max-height: 300px;
+ }
+
+ .olMap + .clear_features {
+ display: block;
+ margin-top: 10px;
+ }
+
+ /* Docs */
+
+ .module table.xfull {
+ width: 100%;
+ }
+
+ pre.literal-block {
+ overflow: auto;
+ }
+}
+
+/* Mobile */
+
+@media (max-width: 767px) {
+ /* Layout */
+
+ #header, #content, #footer {
+ padding: 15px;
+ }
+
+ #footer:empty {
+ padding: 0;
+ }
+
+ div.breadcrumbs {
+ padding: 10px 15px;
+ }
+
+ /* Dashboard */
+
+ .colMS, .colSM {
+ margin: 0;
+ }
+
+ #content-related, .colSM #content-related {
+ width: 100%;
+ margin: 0;
+ }
+
+ #content-related .module {
+ margin-bottom: 0;
+ }
+
+ #content-related .module h2 {
+ padding: 10px 15px;
+ font-size: 16px;
+ }
+
+ /* Changelist */
+
+ #changelist {
+ display: flex;
+ flex-direction: column;
+ }
+
+ #changelist #toolbar {
+ order: 1;
+ padding: 10px;
+ }
+
+ #changelist .xfull {
+ order: 2;
+ }
+
+ #changelist-form {
+ order: 3;
+ }
+
+ #changelist-filter {
+ order: 4;
+ }
+
+ #changelist .actions label {
+ flex: 1 1;
+ }
+
+ #changelist .actions select {
+ flex: 1 0;
+ width: 100%;
+ }
+
+ #changelist .actions span {
+ flex: 1 0 100%;
+ }
+
+ .change-list .filtered .results, .change-list .filtered .paginator,
+ .filtered #toolbar, .filtered .actions, .filtered div.xfull {
+ margin-right: 0;
+ }
+
+ #changelist-filter {
+ position: static;
+ width: auto;
+ margin-top: 30px;
+ }
+
+ .object-tools {
+ float: none;
+ margin: 0 0 15px;
+ padding: 0;
+ overflow: hidden;
+ }
+
+ .object-tools li {
+ height: auto;
+ margin-left: 0;
+ }
+
+ .object-tools li + li {
+ margin-left: 15px;
+ }
+
+ /* Forms */
+
+ .form-row {
+ padding: 15px 0;
+ }
+
+ .aligned .form-row,
+ .aligned .form-row > div {
+ display: flex;
+ flex-wrap: wrap;
+ max-width: 100vw;
+ }
+
+ .aligned .form-row > div {
+ width: calc(100vw - 30px);
+ }
+
+ textarea {
+ max-width: none;
+ }
+
+ .vURLField {
+ width: auto;
+ }
+
+ fieldset .fieldBox + .fieldBox {
+ margin-top: 15px;
+ padding-top: 15px;
+ }
+
+ fieldset.collapsed .form-row {
+ display: none;
+ }
+
+ .aligned label {
+ width: 100%;
+ padding: 0 0 10px;
+ }
+
+ .aligned label:after {
+ max-height: 0;
+ }
+
+ .aligned .form-row input,
+ .aligned .form-row select,
+ .aligned .form-row textarea {
+ flex: 1 1 auto;
+ max-width: 100%;
+ }
+
+ .aligned .checkbox-row {
+ align-items: center;
+ }
+
+ .aligned .checkbox-row input {
+ flex: 0 1 auto;
+ margin: 0;
+ }
+
+ .aligned .vCheckboxLabel {
+ flex: 1 0;
+ padding: 1px 0 0 5px;
+ }
+
+ .aligned label + p,
+ .aligned label + div.help,
+ .aligned label + div.readonly {
+ padding: 0;
+ margin-left: 0;
+ }
+
+ .aligned p.file-upload {
+ margin-left: 0;
+ font-size: 13px;
+ }
+
+ span.clearable-file-input {
+ margin-left: 15px;
+ }
+
+ span.clearable-file-input label {
+ font-size: 13px;
+ padding-bottom: 0;
+ }
+
+ .aligned .timezonewarning {
+ flex: 1 0 100%;
+ margin-top: 5px;
+ }
+
+ form .aligned .form-row div.help {
+ width: 100%;
+ margin: 5px 0 0;
+ padding: 0;
+ }
+
+ form .aligned ul {
+ margin-left: 0;
+ padding-left: 0;
+ }
+
+ form .aligned ul.radiolist {
+ margin-right: 15px;
+ margin-bottom: -3px;
+ }
+
+ form .aligned ul.radiolist li + li {
+ margin-top: 5px;
+ }
+
+ /* Related widget */
+
+ .related-widget-wrapper {
+ width: 100%;
+ display: flex;
+ align-items: flex-start;
+ }
+
+ .related-widget-wrapper .selector {
+ order: 1;
+ }
+
+ .related-widget-wrapper > a {
+ order: 2;
+ }
+
+ .related-widget-wrapper .radiolist ~ a {
+ align-self: flex-end;
+ }
+
+ .related-widget-wrapper > select ~ a {
+ align-self: center;
+ }
+
+ select + .related-widget-wrapper-link,
+ .related-widget-wrapper-link + .related-widget-wrapper-link {
+ margin-left: 15px;
+ }
+
+ /* Selector */
+
+ .selector {
+ flex-direction: column;
+ }
+
+ .selector > * {
+ float: none;
+ }
+
+ .selector-available, .selector-chosen {
+ margin-bottom: 0;
+ flex: 1 1 auto;
+ }
+
+ .selector select {
+ max-height: 96px;
+ }
+
+ .selector ul.selector-chooser {
+ display: block;
+ float: none;
+ width: 52px;
+ height: 26px;
+ padding: 0 2px;
+ margin: 15px auto 20px;
+ transform: none;
+ }
+
+ .selector ul.selector-chooser li {
+ float: left;
+ }
+
+ .selector-remove {
+ background-position: 0 0;
+ }
+
+ .selector-add {
+ background-position: 0 -40px;
+ }
+
+ /* Inlines */
+
+ .inline-group[data-inline-type="stacked"] .inline-related {
+ border: 2px solid #eee;
+ border-radius: 4px;
+ margin-top: 15px;
+ overflow: auto;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related > * {
+ box-sizing: border-box;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related + .inline-related {
+ margin-top: 30px;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related .module {
+ padding: 0 10px;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:last-child {
+ border-bottom: none;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related h3 {
+ padding: 10px;
+ border-top-width: 0;
+ border-bottom-width: 2px;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label {
+ margin-right: auto;
+ }
+
+ .inline-group[data-inline-type="stacked"] .inline-related h3 span.delete {
+ float: none;
+ flex: 1 1 100%;
+ margin-top: 5px;
+ }
+
+ .inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) {
+ width: 100%;
+ }
+
+ .inline-group[data-inline-type="stacked"] .aligned label {
+ width: 100%;
+ }
+
+ .inline-group[data-inline-type="stacked"] div.add-row {
+ margin-top: 15px;
+ border: 1px solid #eee;
+ border-radius: 4px;
+ }
+
+ .inline-group div.add-row,
+ .inline-group .tabular tr.add-row td {
+ padding: 0;
+ }
+
+ .inline-group div.add-row a,
+ .inline-group .tabular tr.add-row td a {
+ display: block;
+ padding: 8px 10px 8px 26px;
+ background-position: 8px 9px;
+ }
+
+ /* Submit row */
+
+ .submit-row {
+ padding: 10px 10px 0;
+ margin: 0 0 15px;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .submit-row > * {
+ width: 100%;
+ }
+
+ .submit-row input, .submit-row input.default, .submit-row a, .submit-row a.closelink {
+ float: none;
+ margin: 0 0 10px;
+ text-align: center;
+ }
+
+ .submit-row a.closelink {
+ padding: 10px 0;
+ }
+
+ .submit-row p.deletelink-box {
+ order: 4;
+ }
+
+ /* Messages */
+
+ ul.messagelist li {
+ padding-left: 40px;
+ background-position: 15px 12px;
+ }
+
+ ul.messagelist li.error {
+ background-position: 15px 12px;
+ }
+
+ ul.messagelist li.warning {
+ background-position: 15px 14px;
+ }
+
+ /* Paginator */
+
+ .paginator .this-page, .paginator a:link, .paginator a:visited {
+ padding: 4px 10px;
+ }
+
+ /* Login */
+
+ body.login {
+ padding: 0 15px;
+ }
+
+ .login #container {
+ width: auto;
+ max-width: 480px;
+ margin: 50px auto;
+ }
+
+ .login #header,
+ .login #content {
+ padding: 15px;
+ }
+
+ .login #content-main {
+ float: none;
+ }
+
+ .login .form-row {
+ padding: 0;
+ }
+
+ .login .form-row + .form-row {
+ margin-top: 15px;
+ }
+
+ .login .form-row label {
+ display: block;
+ margin: 0 0 5px;
+ padding: 0;
+ line-height: 1.2;
+ }
+
+ .login .submit-row {
+ padding: 15px 0 0;
+ }
+
+ .login br, .login .submit-row label {
+ display: none;
+ }
+
+ .login .submit-row input {
+ margin: 0;
+ text-transform: uppercase;
+ }
+
+ .errornote {
+ margin: 0 0 20px;
+ padding: 8px 12px;
+ font-size: 13px;
+ }
+
+ /* Calendar and clock */
+
+ .calendarbox, .clockbox {
+ position: fixed !important;
+ top: 50% !important;
+ left: 50% !important;
+ transform: translate(-50%, -50%);
+ margin: 0;
+ border: none;
+ overflow: visible;
+ }
+
+ .calendarbox:before, .clockbox:before {
+ content: '';
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ width: 100vw;
+ height: 100vh;
+ background: rgba(0, 0, 0, 0.75);
+ transform: translate(-50%, -50%);
+ }
+
+ .calendarbox > *, .clockbox > * {
+ position: relative;
+ z-index: 1;
+ }
+
+ .calendarbox > div:first-child {
+ z-index: 2;
+ }
+
+ .calendarbox .calendar, .clockbox h2 {
+ border-radius: 4px 4px 0 0;
+ overflow: hidden;
+ }
+
+ .calendarbox .calendar-cancel, .clockbox .calendar-cancel {
+ border-radius: 0 0 4px 4px;
+ overflow: hidden;
+ }
+
+ .calendar-shortcuts {
+ padding: 10px 0;
+ font-size: 12px;
+ line-height: 12px;
+ }
+
+ .calendar-shortcuts a {
+ margin: 0 4px;
+ }
+
+ .timelist a {
+ background: #fff;
+ padding: 4px;
+ }
+
+ .calendar-cancel {
+ padding: 8px 10px;
+ }
+
+ .clockbox h2 {
+ padding: 8px 15px;
+ }
+
+ .calendar caption {
+ padding: 10px;
+ }
+
+ .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next {
+ z-index: 1;
+ top: 10px;
+ }
+
+ /* History */
+
+ table#change-history tbody th, table#change-history tbody td {
+ font-size: 13px;
+ word-break: break-word;
+ }
+
+ table#change-history tbody th {
+ width: auto;
+ }
+
+ /* Docs */
+
+ table.model tbody th, table.model tbody td {
+ font-size: 13px;
+ word-break: break-word;
+ }
+}
diff --git a/src/staticfiles/admin/css/responsive.css.gz b/src/staticfiles/admin/css/responsive.css.gz
new file mode 100644
index 0000000..454856b
Binary files /dev/null and b/src/staticfiles/admin/css/responsive.css.gz differ
diff --git a/src/staticfiles/admin/css/responsive_rtl.51c7445ceeff.css b/src/staticfiles/admin/css/responsive_rtl.51c7445ceeff.css
new file mode 100644
index 0000000..f999cb1
--- /dev/null
+++ b/src/staticfiles/admin/css/responsive_rtl.51c7445ceeff.css
@@ -0,0 +1,84 @@
+/* TABLETS */
+
+@media (max-width: 1024px) {
+ [dir="rtl"] .colMS {
+ margin-right: 0;
+ }
+
+ [dir="rtl"] #user-tools {
+ text-align: right;
+ }
+
+ [dir="rtl"] #changelist .actions label {
+ padding-left: 10px;
+ padding-right: 0;
+ }
+
+ [dir="rtl"] #changelist .actions select {
+ margin-left: 0;
+ margin-right: 15px;
+ }
+
+ [dir="rtl"] .change-list .filtered .results,
+ [dir="rtl"] .change-list .filtered .paginator,
+ [dir="rtl"] .filtered #toolbar,
+ [dir="rtl"] .filtered div.xfull,
+ [dir="rtl"] .filtered .actions {
+ margin-right: 0;
+ margin-left: 230px;
+ }
+
+ [dir="rtl"] .inline-group ul.tools a.add,
+ [dir="rtl"] .inline-group div.add-row a,
+ [dir="rtl"] .inline-group .tabular tr.add-row td a {
+ padding: 8px 26px 8px 10px;
+ background-position: calc(100% - 8px) 9px;
+ }
+
+ [dir="rtl"] .related-widget-wrapper-link + .selector {
+ margin-right: 0;
+ margin-left: 15px;
+ }
+
+ [dir="rtl"] .selector .selector-filter label {
+ margin-right: 0;
+ margin-left: 8px;
+ }
+
+ [dir="rtl"] .object-tools li {
+ float: right;
+ }
+
+ [dir="rtl"] .object-tools li + li {
+ margin-left: 0;
+ margin-right: 15px;
+ }
+
+ [dir="rtl"] .dashboard .module table td a {
+ padding-left: 0;
+ padding-right: 16px;
+ }
+}
+
+/* MOBILE */
+
+@media (max-width: 767px) {
+ [dir="rtl"] .change-list .filtered .results,
+ [dir="rtl"] .change-list .filtered .paginator,
+ [dir="rtl"] .filtered #toolbar,
+ [dir="rtl"] .filtered div.xfull,
+ [dir="rtl"] .filtered .actions {
+ margin-left: 0;
+ }
+
+ [dir="rtl"] .aligned .add-another,
+ [dir="rtl"] .aligned .related-lookup,
+ [dir="rtl"] .aligned .datetimeshortcuts {
+ margin-left: 0;
+ margin-right: 15px;
+ }
+
+ [dir="rtl"] .aligned ul {
+ margin-right: 0;
+ }
+}
diff --git a/src/staticfiles/admin/css/responsive_rtl.51c7445ceeff.css.gz b/src/staticfiles/admin/css/responsive_rtl.51c7445ceeff.css.gz
new file mode 100644
index 0000000..a422576
Binary files /dev/null and b/src/staticfiles/admin/css/responsive_rtl.51c7445ceeff.css.gz differ
diff --git a/src/staticfiles/admin/css/responsive_rtl.css b/src/staticfiles/admin/css/responsive_rtl.css
new file mode 100644
index 0000000..f999cb1
--- /dev/null
+++ b/src/staticfiles/admin/css/responsive_rtl.css
@@ -0,0 +1,84 @@
+/* TABLETS */
+
+@media (max-width: 1024px) {
+ [dir="rtl"] .colMS {
+ margin-right: 0;
+ }
+
+ [dir="rtl"] #user-tools {
+ text-align: right;
+ }
+
+ [dir="rtl"] #changelist .actions label {
+ padding-left: 10px;
+ padding-right: 0;
+ }
+
+ [dir="rtl"] #changelist .actions select {
+ margin-left: 0;
+ margin-right: 15px;
+ }
+
+ [dir="rtl"] .change-list .filtered .results,
+ [dir="rtl"] .change-list .filtered .paginator,
+ [dir="rtl"] .filtered #toolbar,
+ [dir="rtl"] .filtered div.xfull,
+ [dir="rtl"] .filtered .actions {
+ margin-right: 0;
+ margin-left: 230px;
+ }
+
+ [dir="rtl"] .inline-group ul.tools a.add,
+ [dir="rtl"] .inline-group div.add-row a,
+ [dir="rtl"] .inline-group .tabular tr.add-row td a {
+ padding: 8px 26px 8px 10px;
+ background-position: calc(100% - 8px) 9px;
+ }
+
+ [dir="rtl"] .related-widget-wrapper-link + .selector {
+ margin-right: 0;
+ margin-left: 15px;
+ }
+
+ [dir="rtl"] .selector .selector-filter label {
+ margin-right: 0;
+ margin-left: 8px;
+ }
+
+ [dir="rtl"] .object-tools li {
+ float: right;
+ }
+
+ [dir="rtl"] .object-tools li + li {
+ margin-left: 0;
+ margin-right: 15px;
+ }
+
+ [dir="rtl"] .dashboard .module table td a {
+ padding-left: 0;
+ padding-right: 16px;
+ }
+}
+
+/* MOBILE */
+
+@media (max-width: 767px) {
+ [dir="rtl"] .change-list .filtered .results,
+ [dir="rtl"] .change-list .filtered .paginator,
+ [dir="rtl"] .filtered #toolbar,
+ [dir="rtl"] .filtered div.xfull,
+ [dir="rtl"] .filtered .actions {
+ margin-left: 0;
+ }
+
+ [dir="rtl"] .aligned .add-another,
+ [dir="rtl"] .aligned .related-lookup,
+ [dir="rtl"] .aligned .datetimeshortcuts {
+ margin-left: 0;
+ margin-right: 15px;
+ }
+
+ [dir="rtl"] .aligned ul {
+ margin-right: 0;
+ }
+}
diff --git a/src/staticfiles/admin/css/responsive_rtl.css.gz b/src/staticfiles/admin/css/responsive_rtl.css.gz
new file mode 100644
index 0000000..a422576
Binary files /dev/null and b/src/staticfiles/admin/css/responsive_rtl.css.gz differ
diff --git a/src/staticfiles/admin/css/rtl.30f903442dc5.css b/src/staticfiles/admin/css/rtl.30f903442dc5.css
new file mode 100644
index 0000000..b9e26bf
--- /dev/null
+++ b/src/staticfiles/admin/css/rtl.30f903442dc5.css
@@ -0,0 +1,269 @@
+body {
+ direction: rtl;
+}
+
+/* LOGIN */
+
+.login .form-row {
+ float: right;
+}
+
+.login .form-row label {
+ float: right;
+ padding-left: 0.5em;
+ padding-right: 0;
+ text-align: left;
+}
+
+.login .submit-row {
+ clear: both;
+ padding: 1em 9.4em 0 0;
+}
+
+/* GLOBAL */
+
+th {
+ text-align: right;
+}
+
+.module h2, .module caption {
+ text-align: right;
+}
+
+.module ul, .module ol {
+ margin-left: 0;
+ margin-right: 1.5em;
+}
+
+.viewlink, .addlink, .changelink {
+ padding-left: 0;
+ padding-right: 16px;
+ background-position: 100% 1px;
+}
+
+.deletelink {
+ padding-left: 0;
+ padding-right: 16px;
+ background-position: 100% 1px;
+}
+
+.object-tools {
+ float: left;
+}
+
+thead th:first-child,
+tfoot td:first-child {
+ border-left: none;
+}
+
+/* LAYOUT */
+
+#user-tools {
+ right: auto;
+ left: 0;
+ text-align: left;
+}
+
+div.breadcrumbs {
+ text-align: right;
+}
+
+#content-main {
+ float: right;
+}
+
+#content-related {
+ float: left;
+ margin-left: -300px;
+ margin-right: auto;
+}
+
+.colMS {
+ margin-left: 300px;
+ margin-right: 0;
+}
+
+/* SORTABLE TABLES */
+
+table thead th.sorted .sortoptions {
+ float: left;
+}
+
+thead th.sorted .text {
+ padding-right: 0;
+ padding-left: 42px;
+}
+
+/* dashboard styles */
+
+.dashboard .module table td a {
+ padding-left: .6em;
+ padding-right: 16px;
+}
+
+/* changelists styles */
+
+.change-list .filtered table {
+ border-left: none;
+ border-right: 0px none;
+}
+
+#changelist-filter {
+ right: auto;
+ left: 0;
+ border-left: none;
+ border-right: none;
+}
+
+.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull {
+ margin-right: 0;
+ margin-left: 280px;
+}
+
+#changelist-filter li.selected {
+ border-left: none;
+ padding-left: 10px;
+ margin-left: 0;
+ border-right: 5px solid #eaeaea;
+ padding-right: 10px;
+ margin-right: -15px;
+}
+
+.filtered .actions {
+ margin-left: 280px;
+ margin-right: 0;
+}
+
+#changelist table tbody td:first-child, #changelist table tbody th:first-child {
+ border-right: none;
+ border-left: none;
+}
+
+/* FORMS */
+
+.aligned label {
+ padding: 0 0 3px 1em;
+ float: right;
+}
+
+.submit-row {
+ text-align: left
+}
+
+.submit-row p.deletelink-box {
+ float: right;
+}
+
+.submit-row input.default {
+ margin-left: 0;
+}
+
+.vDateField, .vTimeField {
+ margin-left: 2px;
+}
+
+.aligned .form-row input {
+ margin-left: 5px;
+}
+
+form .aligned p.help, form .aligned div.help {
+ clear: right;
+}
+
+form .aligned ul {
+ margin-right: 163px;
+ margin-left: 0;
+}
+
+form ul.inline li {
+ float: right;
+ padding-right: 0;
+ padding-left: 7px;
+}
+
+input[type=submit].default, .submit-row input.default {
+ float: left;
+}
+
+fieldset .fieldBox {
+ float: right;
+ margin-left: 20px;
+ margin-right: 0;
+}
+
+.errorlist li {
+ background-position: 100% 12px;
+ padding: 0;
+}
+
+.errornote {
+ background-position: 100% 12px;
+ padding: 10px 12px;
+}
+
+/* WIDGETS */
+
+.calendarnav-previous {
+ top: 0;
+ left: auto;
+ right: 10px;
+}
+
+.calendarnav-next {
+ top: 0;
+ right: auto;
+ left: 10px;
+}
+
+.calendar caption, .calendarbox h2 {
+ text-align: center;
+}
+
+.selector {
+ float: right;
+}
+
+.selector .selector-filter {
+ text-align: right;
+}
+
+.inline-deletelink {
+ float: left;
+}
+
+form .form-row p.datetime {
+ overflow: hidden;
+}
+
+.related-widget-wrapper {
+ float: right;
+}
+
+/* MISC */
+
+.inline-related h2, .inline-group h2 {
+ text-align: right
+}
+
+.inline-related h3 span.delete {
+ padding-right: 20px;
+ padding-left: inherit;
+ left: 10px;
+ right: inherit;
+ float:left;
+}
+
+.inline-related h3 span.delete label {
+ margin-left: inherit;
+ margin-right: 2px;
+}
+
+/* IE7 specific bug fixes */
+
+div.colM {
+ position: relative;
+}
+
+.submit-row input {
+ float: left;
+}
diff --git a/src/staticfiles/admin/css/rtl.30f903442dc5.css.gz b/src/staticfiles/admin/css/rtl.30f903442dc5.css.gz
new file mode 100644
index 0000000..d3dcef8
Binary files /dev/null and b/src/staticfiles/admin/css/rtl.30f903442dc5.css.gz differ
diff --git a/src/staticfiles/admin/css/rtl.css b/src/staticfiles/admin/css/rtl.css
new file mode 100644
index 0000000..b9e26bf
--- /dev/null
+++ b/src/staticfiles/admin/css/rtl.css
@@ -0,0 +1,269 @@
+body {
+ direction: rtl;
+}
+
+/* LOGIN */
+
+.login .form-row {
+ float: right;
+}
+
+.login .form-row label {
+ float: right;
+ padding-left: 0.5em;
+ padding-right: 0;
+ text-align: left;
+}
+
+.login .submit-row {
+ clear: both;
+ padding: 1em 9.4em 0 0;
+}
+
+/* GLOBAL */
+
+th {
+ text-align: right;
+}
+
+.module h2, .module caption {
+ text-align: right;
+}
+
+.module ul, .module ol {
+ margin-left: 0;
+ margin-right: 1.5em;
+}
+
+.viewlink, .addlink, .changelink {
+ padding-left: 0;
+ padding-right: 16px;
+ background-position: 100% 1px;
+}
+
+.deletelink {
+ padding-left: 0;
+ padding-right: 16px;
+ background-position: 100% 1px;
+}
+
+.object-tools {
+ float: left;
+}
+
+thead th:first-child,
+tfoot td:first-child {
+ border-left: none;
+}
+
+/* LAYOUT */
+
+#user-tools {
+ right: auto;
+ left: 0;
+ text-align: left;
+}
+
+div.breadcrumbs {
+ text-align: right;
+}
+
+#content-main {
+ float: right;
+}
+
+#content-related {
+ float: left;
+ margin-left: -300px;
+ margin-right: auto;
+}
+
+.colMS {
+ margin-left: 300px;
+ margin-right: 0;
+}
+
+/* SORTABLE TABLES */
+
+table thead th.sorted .sortoptions {
+ float: left;
+}
+
+thead th.sorted .text {
+ padding-right: 0;
+ padding-left: 42px;
+}
+
+/* dashboard styles */
+
+.dashboard .module table td a {
+ padding-left: .6em;
+ padding-right: 16px;
+}
+
+/* changelists styles */
+
+.change-list .filtered table {
+ border-left: none;
+ border-right: 0px none;
+}
+
+#changelist-filter {
+ right: auto;
+ left: 0;
+ border-left: none;
+ border-right: none;
+}
+
+.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull {
+ margin-right: 0;
+ margin-left: 280px;
+}
+
+#changelist-filter li.selected {
+ border-left: none;
+ padding-left: 10px;
+ margin-left: 0;
+ border-right: 5px solid #eaeaea;
+ padding-right: 10px;
+ margin-right: -15px;
+}
+
+.filtered .actions {
+ margin-left: 280px;
+ margin-right: 0;
+}
+
+#changelist table tbody td:first-child, #changelist table tbody th:first-child {
+ border-right: none;
+ border-left: none;
+}
+
+/* FORMS */
+
+.aligned label {
+ padding: 0 0 3px 1em;
+ float: right;
+}
+
+.submit-row {
+ text-align: left
+}
+
+.submit-row p.deletelink-box {
+ float: right;
+}
+
+.submit-row input.default {
+ margin-left: 0;
+}
+
+.vDateField, .vTimeField {
+ margin-left: 2px;
+}
+
+.aligned .form-row input {
+ margin-left: 5px;
+}
+
+form .aligned p.help, form .aligned div.help {
+ clear: right;
+}
+
+form .aligned ul {
+ margin-right: 163px;
+ margin-left: 0;
+}
+
+form ul.inline li {
+ float: right;
+ padding-right: 0;
+ padding-left: 7px;
+}
+
+input[type=submit].default, .submit-row input.default {
+ float: left;
+}
+
+fieldset .fieldBox {
+ float: right;
+ margin-left: 20px;
+ margin-right: 0;
+}
+
+.errorlist li {
+ background-position: 100% 12px;
+ padding: 0;
+}
+
+.errornote {
+ background-position: 100% 12px;
+ padding: 10px 12px;
+}
+
+/* WIDGETS */
+
+.calendarnav-previous {
+ top: 0;
+ left: auto;
+ right: 10px;
+}
+
+.calendarnav-next {
+ top: 0;
+ right: auto;
+ left: 10px;
+}
+
+.calendar caption, .calendarbox h2 {
+ text-align: center;
+}
+
+.selector {
+ float: right;
+}
+
+.selector .selector-filter {
+ text-align: right;
+}
+
+.inline-deletelink {
+ float: left;
+}
+
+form .form-row p.datetime {
+ overflow: hidden;
+}
+
+.related-widget-wrapper {
+ float: right;
+}
+
+/* MISC */
+
+.inline-related h2, .inline-group h2 {
+ text-align: right
+}
+
+.inline-related h3 span.delete {
+ padding-right: 20px;
+ padding-left: inherit;
+ left: 10px;
+ right: inherit;
+ float:left;
+}
+
+.inline-related h3 span.delete label {
+ margin-left: inherit;
+ margin-right: 2px;
+}
+
+/* IE7 specific bug fixes */
+
+div.colM {
+ position: relative;
+}
+
+.submit-row input {
+ float: left;
+}
diff --git a/src/staticfiles/admin/css/rtl.css.gz b/src/staticfiles/admin/css/rtl.css.gz
new file mode 100644
index 0000000..d3dcef8
Binary files /dev/null and b/src/staticfiles/admin/css/rtl.css.gz differ
diff --git a/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.7cf1de939f3b.md b/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.7cf1de939f3b.md
new file mode 100644
index 0000000..86c7c29
--- /dev/null
+++ b/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.7cf1de939f3b.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2012-2015 Kevin Brown, Igor Vaynberg, and Select2 contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.7cf1de939f3b.md.gz b/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.7cf1de939f3b.md.gz
new file mode 100644
index 0000000..43a01ff
Binary files /dev/null and b/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.7cf1de939f3b.md.gz differ
diff --git a/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md b/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md
new file mode 100644
index 0000000..86c7c29
--- /dev/null
+++ b/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2012-2015 Kevin Brown, Igor Vaynberg, and Select2 contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md.gz b/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md.gz
new file mode 100644
index 0000000..43a01ff
Binary files /dev/null and b/src/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md.gz differ
diff --git a/src/staticfiles/admin/css/vendor/select2/select2.3805311d5fc1.css b/src/staticfiles/admin/css/vendor/select2/select2.3805311d5fc1.css
new file mode 100644
index 0000000..447b2b8
--- /dev/null
+++ b/src/staticfiles/admin/css/vendor/select2/select2.3805311d5fc1.css
@@ -0,0 +1,484 @@
+.select2-container {
+ box-sizing: border-box;
+ display: inline-block;
+ margin: 0;
+ position: relative;
+ vertical-align: middle; }
+ .select2-container .select2-selection--single {
+ box-sizing: border-box;
+ cursor: pointer;
+ display: block;
+ height: 28px;
+ user-select: none;
+ -webkit-user-select: none; }
+ .select2-container .select2-selection--single .select2-selection__rendered {
+ display: block;
+ padding-left: 8px;
+ padding-right: 20px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap; }
+ .select2-container .select2-selection--single .select2-selection__clear {
+ position: relative; }
+ .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
+ padding-right: 8px;
+ padding-left: 20px; }
+ .select2-container .select2-selection--multiple {
+ box-sizing: border-box;
+ cursor: pointer;
+ display: block;
+ min-height: 32px;
+ user-select: none;
+ -webkit-user-select: none; }
+ .select2-container .select2-selection--multiple .select2-selection__rendered {
+ display: inline-block;
+ overflow: hidden;
+ padding-left: 8px;
+ text-overflow: ellipsis;
+ white-space: nowrap; }
+ .select2-container .select2-search--inline {
+ float: left; }
+ .select2-container .select2-search--inline .select2-search__field {
+ box-sizing: border-box;
+ border: none;
+ font-size: 100%;
+ margin-top: 5px;
+ padding: 0; }
+ .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
+ -webkit-appearance: none; }
+
+.select2-dropdown {
+ background-color: white;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ box-sizing: border-box;
+ display: block;
+ position: absolute;
+ left: -100000px;
+ width: 100%;
+ z-index: 1051; }
+
+.select2-results {
+ display: block; }
+
+.select2-results__options {
+ list-style: none;
+ margin: 0;
+ padding: 0; }
+
+.select2-results__option {
+ padding: 6px;
+ user-select: none;
+ -webkit-user-select: none; }
+ .select2-results__option[aria-selected] {
+ cursor: pointer; }
+
+.select2-container--open .select2-dropdown {
+ left: 0; }
+
+.select2-container--open .select2-dropdown--above {
+ border-bottom: none;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0; }
+
+.select2-container--open .select2-dropdown--below {
+ border-top: none;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0; }
+
+.select2-search--dropdown {
+ display: block;
+ padding: 4px; }
+ .select2-search--dropdown .select2-search__field {
+ padding: 4px;
+ width: 100%;
+ box-sizing: border-box; }
+ .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
+ -webkit-appearance: none; }
+ .select2-search--dropdown.select2-search--hide {
+ display: none; }
+
+.select2-close-mask {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ display: block;
+ position: fixed;
+ left: 0;
+ top: 0;
+ min-height: 100%;
+ min-width: 100%;
+ height: auto;
+ width: auto;
+ opacity: 0;
+ z-index: 99;
+ background-color: #fff;
+ filter: alpha(opacity=0); }
+
+.select2-hidden-accessible {
+ border: 0 !important;
+ clip: rect(0 0 0 0) !important;
+ height: 1px !important;
+ margin: -1px !important;
+ overflow: hidden !important;
+ padding: 0 !important;
+ position: absolute !important;
+ width: 1px !important; }
+
+.select2-container--default .select2-selection--single {
+ background-color: #fff;
+ border: 1px solid #aaa;
+ border-radius: 4px; }
+ .select2-container--default .select2-selection--single .select2-selection__rendered {
+ color: #444;
+ line-height: 28px; }
+ .select2-container--default .select2-selection--single .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold; }
+ .select2-container--default .select2-selection--single .select2-selection__placeholder {
+ color: #999; }
+ .select2-container--default .select2-selection--single .select2-selection__arrow {
+ height: 26px;
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ width: 20px; }
+ .select2-container--default .select2-selection--single .select2-selection__arrow b {
+ border-color: #888 transparent transparent transparent;
+ border-style: solid;
+ border-width: 5px 4px 0 4px;
+ height: 0;
+ left: 50%;
+ margin-left: -4px;
+ margin-top: -2px;
+ position: absolute;
+ top: 50%;
+ width: 0; }
+
+.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
+ float: left; }
+
+.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
+ left: 1px;
+ right: auto; }
+
+.select2-container--default.select2-container--disabled .select2-selection--single {
+ background-color: #eee;
+ cursor: default; }
+ .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
+ display: none; }
+
+.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
+ border-color: transparent transparent #888 transparent;
+ border-width: 0 4px 5px 4px; }
+
+.select2-container--default .select2-selection--multiple {
+ background-color: white;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ cursor: text; }
+ .select2-container--default .select2-selection--multiple .select2-selection__rendered {
+ box-sizing: border-box;
+ list-style: none;
+ margin: 0;
+ padding: 0 5px;
+ width: 100%; }
+ .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
+ list-style: none; }
+ .select2-container--default .select2-selection--multiple .select2-selection__placeholder {
+ color: #999;
+ margin-top: 5px;
+ float: left; }
+ .select2-container--default .select2-selection--multiple .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold;
+ margin-top: 5px;
+ margin-right: 10px; }
+ .select2-container--default .select2-selection--multiple .select2-selection__choice {
+ background-color: #e4e4e4;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ cursor: default;
+ float: left;
+ margin-right: 5px;
+ margin-top: 5px;
+ padding: 0 5px; }
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
+ color: #999;
+ cursor: pointer;
+ display: inline-block;
+ font-weight: bold;
+ margin-right: 2px; }
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
+ color: #333; }
+
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
+ float: right; }
+
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
+ margin-left: 5px;
+ margin-right: auto; }
+
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
+ margin-left: 2px;
+ margin-right: auto; }
+
+.select2-container--default.select2-container--focus .select2-selection--multiple {
+ border: solid black 1px;
+ outline: 0; }
+
+.select2-container--default.select2-container--disabled .select2-selection--multiple {
+ background-color: #eee;
+ cursor: default; }
+
+.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
+ display: none; }
+
+.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0; }
+
+.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0; }
+
+.select2-container--default .select2-search--dropdown .select2-search__field {
+ border: 1px solid #aaa; }
+
+.select2-container--default .select2-search--inline .select2-search__field {
+ background: transparent;
+ border: none;
+ outline: 0;
+ box-shadow: none;
+ -webkit-appearance: textfield; }
+
+.select2-container--default .select2-results > .select2-results__options {
+ max-height: 200px;
+ overflow-y: auto; }
+
+.select2-container--default .select2-results__option[role=group] {
+ padding: 0; }
+
+.select2-container--default .select2-results__option[aria-disabled=true] {
+ color: #999; }
+
+.select2-container--default .select2-results__option[aria-selected=true] {
+ background-color: #ddd; }
+
+.select2-container--default .select2-results__option .select2-results__option {
+ padding-left: 1em; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__group {
+ padding-left: 0; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -1em;
+ padding-left: 2em; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -2em;
+ padding-left: 3em; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -3em;
+ padding-left: 4em; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -4em;
+ padding-left: 5em; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -5em;
+ padding-left: 6em; }
+
+.select2-container--default .select2-results__option--highlighted[aria-selected] {
+ background-color: #5897fb;
+ color: white; }
+
+.select2-container--default .select2-results__group {
+ cursor: default;
+ display: block;
+ padding: 6px; }
+
+.select2-container--classic .select2-selection--single {
+ background-color: #f7f7f7;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ outline: 0;
+ background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%);
+ background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%);
+ background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
+ .select2-container--classic .select2-selection--single:focus {
+ border: 1px solid #5897fb; }
+ .select2-container--classic .select2-selection--single .select2-selection__rendered {
+ color: #444;
+ line-height: 28px; }
+ .select2-container--classic .select2-selection--single .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold;
+ margin-right: 10px; }
+ .select2-container--classic .select2-selection--single .select2-selection__placeholder {
+ color: #999; }
+ .select2-container--classic .select2-selection--single .select2-selection__arrow {
+ background-color: #ddd;
+ border: none;
+ border-left: 1px solid #aaa;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ height: 26px;
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ width: 20px;
+ background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
+ background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
+ background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); }
+ .select2-container--classic .select2-selection--single .select2-selection__arrow b {
+ border-color: #888 transparent transparent transparent;
+ border-style: solid;
+ border-width: 5px 4px 0 4px;
+ height: 0;
+ left: 50%;
+ margin-left: -4px;
+ margin-top: -2px;
+ position: absolute;
+ top: 50%;
+ width: 0; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
+ float: left; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
+ border: none;
+ border-right: 1px solid #aaa;
+ border-radius: 0;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+ left: 1px;
+ right: auto; }
+
+.select2-container--classic.select2-container--open .select2-selection--single {
+ border: 1px solid #5897fb; }
+ .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
+ background: transparent;
+ border: none; }
+ .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
+ border-color: transparent transparent #888 transparent;
+ border-width: 0 4px 5px 4px; }
+
+.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
+ border-top: none;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%);
+ background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%);
+ background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
+
+.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
+ border-bottom: none;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%);
+ background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%);
+ background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); }
+
+.select2-container--classic .select2-selection--multiple {
+ background-color: white;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ cursor: text;
+ outline: 0; }
+ .select2-container--classic .select2-selection--multiple:focus {
+ border: 1px solid #5897fb; }
+ .select2-container--classic .select2-selection--multiple .select2-selection__rendered {
+ list-style: none;
+ margin: 0;
+ padding: 0 5px; }
+ .select2-container--classic .select2-selection--multiple .select2-selection__clear {
+ display: none; }
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice {
+ background-color: #e4e4e4;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ cursor: default;
+ float: left;
+ margin-right: 5px;
+ margin-top: 5px;
+ padding: 0 5px; }
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
+ color: #888;
+ cursor: pointer;
+ display: inline-block;
+ font-weight: bold;
+ margin-right: 2px; }
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
+ color: #555; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
+ float: right; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
+ margin-left: 5px;
+ margin-right: auto; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
+ margin-left: 2px;
+ margin-right: auto; }
+
+.select2-container--classic.select2-container--open .select2-selection--multiple {
+ border: 1px solid #5897fb; }
+
+.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
+ border-top: none;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0; }
+
+.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
+ border-bottom: none;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0; }
+
+.select2-container--classic .select2-search--dropdown .select2-search__field {
+ border: 1px solid #aaa;
+ outline: 0; }
+
+.select2-container--classic .select2-search--inline .select2-search__field {
+ outline: 0;
+ box-shadow: none; }
+
+.select2-container--classic .select2-dropdown {
+ background-color: white;
+ border: 1px solid transparent; }
+
+.select2-container--classic .select2-dropdown--above {
+ border-bottom: none; }
+
+.select2-container--classic .select2-dropdown--below {
+ border-top: none; }
+
+.select2-container--classic .select2-results > .select2-results__options {
+ max-height: 200px;
+ overflow-y: auto; }
+
+.select2-container--classic .select2-results__option[role=group] {
+ padding: 0; }
+
+.select2-container--classic .select2-results__option[aria-disabled=true] {
+ color: grey; }
+
+.select2-container--classic .select2-results__option--highlighted[aria-selected] {
+ background-color: #3875d7;
+ color: white; }
+
+.select2-container--classic .select2-results__group {
+ cursor: default;
+ display: block;
+ padding: 6px; }
+
+.select2-container--classic.select2-container--open .select2-dropdown {
+ border-color: #5897fb; }
diff --git a/src/staticfiles/admin/css/vendor/select2/select2.3805311d5fc1.css.gz b/src/staticfiles/admin/css/vendor/select2/select2.3805311d5fc1.css.gz
new file mode 100644
index 0000000..66667b7
Binary files /dev/null and b/src/staticfiles/admin/css/vendor/select2/select2.3805311d5fc1.css.gz differ
diff --git a/src/staticfiles/admin/css/vendor/select2/select2.css b/src/staticfiles/admin/css/vendor/select2/select2.css
new file mode 100644
index 0000000..447b2b8
--- /dev/null
+++ b/src/staticfiles/admin/css/vendor/select2/select2.css
@@ -0,0 +1,484 @@
+.select2-container {
+ box-sizing: border-box;
+ display: inline-block;
+ margin: 0;
+ position: relative;
+ vertical-align: middle; }
+ .select2-container .select2-selection--single {
+ box-sizing: border-box;
+ cursor: pointer;
+ display: block;
+ height: 28px;
+ user-select: none;
+ -webkit-user-select: none; }
+ .select2-container .select2-selection--single .select2-selection__rendered {
+ display: block;
+ padding-left: 8px;
+ padding-right: 20px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap; }
+ .select2-container .select2-selection--single .select2-selection__clear {
+ position: relative; }
+ .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
+ padding-right: 8px;
+ padding-left: 20px; }
+ .select2-container .select2-selection--multiple {
+ box-sizing: border-box;
+ cursor: pointer;
+ display: block;
+ min-height: 32px;
+ user-select: none;
+ -webkit-user-select: none; }
+ .select2-container .select2-selection--multiple .select2-selection__rendered {
+ display: inline-block;
+ overflow: hidden;
+ padding-left: 8px;
+ text-overflow: ellipsis;
+ white-space: nowrap; }
+ .select2-container .select2-search--inline {
+ float: left; }
+ .select2-container .select2-search--inline .select2-search__field {
+ box-sizing: border-box;
+ border: none;
+ font-size: 100%;
+ margin-top: 5px;
+ padding: 0; }
+ .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
+ -webkit-appearance: none; }
+
+.select2-dropdown {
+ background-color: white;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ box-sizing: border-box;
+ display: block;
+ position: absolute;
+ left: -100000px;
+ width: 100%;
+ z-index: 1051; }
+
+.select2-results {
+ display: block; }
+
+.select2-results__options {
+ list-style: none;
+ margin: 0;
+ padding: 0; }
+
+.select2-results__option {
+ padding: 6px;
+ user-select: none;
+ -webkit-user-select: none; }
+ .select2-results__option[aria-selected] {
+ cursor: pointer; }
+
+.select2-container--open .select2-dropdown {
+ left: 0; }
+
+.select2-container--open .select2-dropdown--above {
+ border-bottom: none;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0; }
+
+.select2-container--open .select2-dropdown--below {
+ border-top: none;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0; }
+
+.select2-search--dropdown {
+ display: block;
+ padding: 4px; }
+ .select2-search--dropdown .select2-search__field {
+ padding: 4px;
+ width: 100%;
+ box-sizing: border-box; }
+ .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
+ -webkit-appearance: none; }
+ .select2-search--dropdown.select2-search--hide {
+ display: none; }
+
+.select2-close-mask {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ display: block;
+ position: fixed;
+ left: 0;
+ top: 0;
+ min-height: 100%;
+ min-width: 100%;
+ height: auto;
+ width: auto;
+ opacity: 0;
+ z-index: 99;
+ background-color: #fff;
+ filter: alpha(opacity=0); }
+
+.select2-hidden-accessible {
+ border: 0 !important;
+ clip: rect(0 0 0 0) !important;
+ height: 1px !important;
+ margin: -1px !important;
+ overflow: hidden !important;
+ padding: 0 !important;
+ position: absolute !important;
+ width: 1px !important; }
+
+.select2-container--default .select2-selection--single {
+ background-color: #fff;
+ border: 1px solid #aaa;
+ border-radius: 4px; }
+ .select2-container--default .select2-selection--single .select2-selection__rendered {
+ color: #444;
+ line-height: 28px; }
+ .select2-container--default .select2-selection--single .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold; }
+ .select2-container--default .select2-selection--single .select2-selection__placeholder {
+ color: #999; }
+ .select2-container--default .select2-selection--single .select2-selection__arrow {
+ height: 26px;
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ width: 20px; }
+ .select2-container--default .select2-selection--single .select2-selection__arrow b {
+ border-color: #888 transparent transparent transparent;
+ border-style: solid;
+ border-width: 5px 4px 0 4px;
+ height: 0;
+ left: 50%;
+ margin-left: -4px;
+ margin-top: -2px;
+ position: absolute;
+ top: 50%;
+ width: 0; }
+
+.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
+ float: left; }
+
+.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
+ left: 1px;
+ right: auto; }
+
+.select2-container--default.select2-container--disabled .select2-selection--single {
+ background-color: #eee;
+ cursor: default; }
+ .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
+ display: none; }
+
+.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
+ border-color: transparent transparent #888 transparent;
+ border-width: 0 4px 5px 4px; }
+
+.select2-container--default .select2-selection--multiple {
+ background-color: white;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ cursor: text; }
+ .select2-container--default .select2-selection--multiple .select2-selection__rendered {
+ box-sizing: border-box;
+ list-style: none;
+ margin: 0;
+ padding: 0 5px;
+ width: 100%; }
+ .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
+ list-style: none; }
+ .select2-container--default .select2-selection--multiple .select2-selection__placeholder {
+ color: #999;
+ margin-top: 5px;
+ float: left; }
+ .select2-container--default .select2-selection--multiple .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold;
+ margin-top: 5px;
+ margin-right: 10px; }
+ .select2-container--default .select2-selection--multiple .select2-selection__choice {
+ background-color: #e4e4e4;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ cursor: default;
+ float: left;
+ margin-right: 5px;
+ margin-top: 5px;
+ padding: 0 5px; }
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
+ color: #999;
+ cursor: pointer;
+ display: inline-block;
+ font-weight: bold;
+ margin-right: 2px; }
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
+ color: #333; }
+
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
+ float: right; }
+
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
+ margin-left: 5px;
+ margin-right: auto; }
+
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
+ margin-left: 2px;
+ margin-right: auto; }
+
+.select2-container--default.select2-container--focus .select2-selection--multiple {
+ border: solid black 1px;
+ outline: 0; }
+
+.select2-container--default.select2-container--disabled .select2-selection--multiple {
+ background-color: #eee;
+ cursor: default; }
+
+.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
+ display: none; }
+
+.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0; }
+
+.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0; }
+
+.select2-container--default .select2-search--dropdown .select2-search__field {
+ border: 1px solid #aaa; }
+
+.select2-container--default .select2-search--inline .select2-search__field {
+ background: transparent;
+ border: none;
+ outline: 0;
+ box-shadow: none;
+ -webkit-appearance: textfield; }
+
+.select2-container--default .select2-results > .select2-results__options {
+ max-height: 200px;
+ overflow-y: auto; }
+
+.select2-container--default .select2-results__option[role=group] {
+ padding: 0; }
+
+.select2-container--default .select2-results__option[aria-disabled=true] {
+ color: #999; }
+
+.select2-container--default .select2-results__option[aria-selected=true] {
+ background-color: #ddd; }
+
+.select2-container--default .select2-results__option .select2-results__option {
+ padding-left: 1em; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__group {
+ padding-left: 0; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -1em;
+ padding-left: 2em; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -2em;
+ padding-left: 3em; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -3em;
+ padding-left: 4em; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -4em;
+ padding-left: 5em; }
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
+ margin-left: -5em;
+ padding-left: 6em; }
+
+.select2-container--default .select2-results__option--highlighted[aria-selected] {
+ background-color: #5897fb;
+ color: white; }
+
+.select2-container--default .select2-results__group {
+ cursor: default;
+ display: block;
+ padding: 6px; }
+
+.select2-container--classic .select2-selection--single {
+ background-color: #f7f7f7;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ outline: 0;
+ background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%);
+ background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%);
+ background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
+ .select2-container--classic .select2-selection--single:focus {
+ border: 1px solid #5897fb; }
+ .select2-container--classic .select2-selection--single .select2-selection__rendered {
+ color: #444;
+ line-height: 28px; }
+ .select2-container--classic .select2-selection--single .select2-selection__clear {
+ cursor: pointer;
+ float: right;
+ font-weight: bold;
+ margin-right: 10px; }
+ .select2-container--classic .select2-selection--single .select2-selection__placeholder {
+ color: #999; }
+ .select2-container--classic .select2-selection--single .select2-selection__arrow {
+ background-color: #ddd;
+ border: none;
+ border-left: 1px solid #aaa;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ height: 26px;
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ width: 20px;
+ background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
+ background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
+ background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); }
+ .select2-container--classic .select2-selection--single .select2-selection__arrow b {
+ border-color: #888 transparent transparent transparent;
+ border-style: solid;
+ border-width: 5px 4px 0 4px;
+ height: 0;
+ left: 50%;
+ margin-left: -4px;
+ margin-top: -2px;
+ position: absolute;
+ top: 50%;
+ width: 0; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
+ float: left; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
+ border: none;
+ border-right: 1px solid #aaa;
+ border-radius: 0;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+ left: 1px;
+ right: auto; }
+
+.select2-container--classic.select2-container--open .select2-selection--single {
+ border: 1px solid #5897fb; }
+ .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
+ background: transparent;
+ border: none; }
+ .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
+ border-color: transparent transparent #888 transparent;
+ border-width: 0 4px 5px 4px; }
+
+.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
+ border-top: none;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%);
+ background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%);
+ background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
+
+.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
+ border-bottom: none;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%);
+ background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%);
+ background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); }
+
+.select2-container--classic .select2-selection--multiple {
+ background-color: white;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ cursor: text;
+ outline: 0; }
+ .select2-container--classic .select2-selection--multiple:focus {
+ border: 1px solid #5897fb; }
+ .select2-container--classic .select2-selection--multiple .select2-selection__rendered {
+ list-style: none;
+ margin: 0;
+ padding: 0 5px; }
+ .select2-container--classic .select2-selection--multiple .select2-selection__clear {
+ display: none; }
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice {
+ background-color: #e4e4e4;
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ cursor: default;
+ float: left;
+ margin-right: 5px;
+ margin-top: 5px;
+ padding: 0 5px; }
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
+ color: #888;
+ cursor: pointer;
+ display: inline-block;
+ font-weight: bold;
+ margin-right: 2px; }
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
+ color: #555; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
+ float: right; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
+ margin-left: 5px;
+ margin-right: auto; }
+
+.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
+ margin-left: 2px;
+ margin-right: auto; }
+
+.select2-container--classic.select2-container--open .select2-selection--multiple {
+ border: 1px solid #5897fb; }
+
+.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
+ border-top: none;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0; }
+
+.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
+ border-bottom: none;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0; }
+
+.select2-container--classic .select2-search--dropdown .select2-search__field {
+ border: 1px solid #aaa;
+ outline: 0; }
+
+.select2-container--classic .select2-search--inline .select2-search__field {
+ outline: 0;
+ box-shadow: none; }
+
+.select2-container--classic .select2-dropdown {
+ background-color: white;
+ border: 1px solid transparent; }
+
+.select2-container--classic .select2-dropdown--above {
+ border-bottom: none; }
+
+.select2-container--classic .select2-dropdown--below {
+ border-top: none; }
+
+.select2-container--classic .select2-results > .select2-results__options {
+ max-height: 200px;
+ overflow-y: auto; }
+
+.select2-container--classic .select2-results__option[role=group] {
+ padding: 0; }
+
+.select2-container--classic .select2-results__option[aria-disabled=true] {
+ color: grey; }
+
+.select2-container--classic .select2-results__option--highlighted[aria-selected] {
+ background-color: #3875d7;
+ color: white; }
+
+.select2-container--classic .select2-results__group {
+ cursor: default;
+ display: block;
+ padding: 6px; }
+
+.select2-container--classic.select2-container--open .select2-dropdown {
+ border-color: #5897fb; }
diff --git a/src/staticfiles/admin/css/vendor/select2/select2.css.gz b/src/staticfiles/admin/css/vendor/select2/select2.css.gz
new file mode 100644
index 0000000..66667b7
Binary files /dev/null and b/src/staticfiles/admin/css/vendor/select2/select2.css.gz differ
diff --git a/src/staticfiles/admin/css/vendor/select2/select2.min.css b/src/staticfiles/admin/css/vendor/select2/select2.min.css
new file mode 100644
index 0000000..76de04d
--- /dev/null
+++ b/src/staticfiles/admin/css/vendor/select2/select2.min.css
@@ -0,0 +1 @@
+.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
diff --git a/src/staticfiles/admin/css/vendor/select2/select2.min.css.gz b/src/staticfiles/admin/css/vendor/select2/select2.min.css.gz
new file mode 100644
index 0000000..98fc7a9
Binary files /dev/null and b/src/staticfiles/admin/css/vendor/select2/select2.min.css.gz differ
diff --git a/src/staticfiles/admin/css/vendor/select2/select2.min.d44571114a90.css b/src/staticfiles/admin/css/vendor/select2/select2.min.d44571114a90.css
new file mode 100644
index 0000000..76de04d
--- /dev/null
+++ b/src/staticfiles/admin/css/vendor/select2/select2.min.d44571114a90.css
@@ -0,0 +1 @@
+.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
diff --git a/src/staticfiles/admin/css/vendor/select2/select2.min.d44571114a90.css.gz b/src/staticfiles/admin/css/vendor/select2/select2.min.d44571114a90.css.gz
new file mode 100644
index 0000000..98fc7a9
Binary files /dev/null and b/src/staticfiles/admin/css/vendor/select2/select2.min.d44571114a90.css.gz differ
diff --git a/src/staticfiles/admin/css/widgets.5e372b41c483.css b/src/staticfiles/admin/css/widgets.5e372b41c483.css
new file mode 100644
index 0000000..8bd64ce
--- /dev/null
+++ b/src/staticfiles/admin/css/widgets.5e372b41c483.css
@@ -0,0 +1,565 @@
+/* SELECTOR (FILTER INTERFACE) */
+
+.selector {
+ width: 800px;
+ float: left;
+}
+
+.selector select {
+ width: 380px;
+ height: 17.2em;
+}
+
+.selector-available, .selector-chosen {
+ float: left;
+ width: 380px;
+ text-align: center;
+ margin-bottom: 5px;
+}
+
+.selector-chosen select {
+ border-top: none;
+}
+
+.selector-available h2, .selector-chosen h2 {
+ border: 1px solid #ccc;
+ border-radius: 4px 4px 0 0;
+}
+
+.selector-chosen h2 {
+ background: #79aec8;
+ color: #fff;
+}
+
+.selector .selector-available h2 {
+ background: #f8f8f8;
+ color: #666;
+}
+
+.selector .selector-filter {
+ background: white;
+ border: 1px solid #ccc;
+ border-width: 0 1px;
+ padding: 8px;
+ color: #999;
+ font-size: 10px;
+ margin: 0;
+ text-align: left;
+}
+
+.selector .selector-filter label,
+.inline-group .aligned .selector .selector-filter label {
+ float: left;
+ margin: 7px 0 0;
+ width: 18px;
+ height: 18px;
+ padding: 0;
+ overflow: hidden;
+ line-height: 1;
+}
+
+.selector .selector-available input {
+ width: 320px;
+ margin-left: 8px;
+}
+
+.selector ul.selector-chooser {
+ float: left;
+ width: 22px;
+ background-color: #eee;
+ border-radius: 10px;
+ margin: 10em 5px 0 5px;
+ padding: 0;
+}
+
+.selector-chooser li {
+ margin: 0;
+ padding: 3px;
+ list-style-type: none;
+}
+
+.selector select {
+ padding: 0 10px;
+ margin: 0 0 10px;
+ border-radius: 0 0 4px 4px;
+}
+
+.selector-add, .selector-remove {
+ width: 16px;
+ height: 16px;
+ display: block;
+ text-indent: -3000px;
+ overflow: hidden;
+ cursor: default;
+ opacity: 0.3;
+}
+
+.active.selector-add, .active.selector-remove {
+ opacity: 1;
+}
+
+.active.selector-add:hover, .active.selector-remove:hover {
+ cursor: pointer;
+}
+
+.selector-add {
+ background: url("../img/selector-icons.b4555096cea2.svg") 0 -96px no-repeat;
+}
+
+.active.selector-add:focus, .active.selector-add:hover {
+ background-position: 0 -112px;
+}
+
+.selector-remove {
+ background: url("../img/selector-icons.b4555096cea2.svg") 0 -64px no-repeat;
+}
+
+.active.selector-remove:focus, .active.selector-remove:hover {
+ background-position: 0 -80px;
+}
+
+a.selector-chooseall, a.selector-clearall {
+ display: inline-block;
+ height: 16px;
+ text-align: left;
+ margin: 1px auto 3px;
+ overflow: hidden;
+ font-weight: bold;
+ line-height: 16px;
+ color: #666;
+ text-decoration: none;
+ opacity: 0.3;
+}
+
+a.active.selector-chooseall:focus, a.active.selector-clearall:focus,
+a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
+ color: #447e9b;
+}
+
+a.active.selector-chooseall, a.active.selector-clearall {
+ opacity: 1;
+}
+
+a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
+ cursor: pointer;
+}
+
+a.selector-chooseall {
+ padding: 0 18px 0 0;
+ background: url("../img/selector-icons.b4555096cea2.svg") right -160px no-repeat;
+ cursor: default;
+}
+
+a.active.selector-chooseall:focus, a.active.selector-chooseall:hover {
+ background-position: 100% -176px;
+}
+
+a.selector-clearall {
+ padding: 0 0 0 18px;
+ background: url("../img/selector-icons.b4555096cea2.svg") 0 -128px no-repeat;
+ cursor: default;
+}
+
+a.active.selector-clearall:focus, a.active.selector-clearall:hover {
+ background-position: 0 -144px;
+}
+
+/* STACKED SELECTORS */
+
+.stacked {
+ float: left;
+ width: 490px;
+}
+
+.stacked select {
+ width: 480px;
+ height: 10.1em;
+}
+
+.stacked .selector-available, .stacked .selector-chosen {
+ width: 480px;
+}
+
+.stacked .selector-available {
+ margin-bottom: 0;
+}
+
+.stacked .selector-available input {
+ width: 422px;
+}
+
+.stacked ul.selector-chooser {
+ height: 22px;
+ width: 50px;
+ margin: 0 0 10px 40%;
+ background-color: #eee;
+ border-radius: 10px;
+}
+
+.stacked .selector-chooser li {
+ float: left;
+ padding: 3px 3px 3px 5px;
+}
+
+.stacked .selector-chooseall, .stacked .selector-clearall {
+ display: none;
+}
+
+.stacked .selector-add {
+ background: url("../img/selector-icons.b4555096cea2.svg") 0 -32px no-repeat;
+ cursor: default;
+}
+
+.stacked .active.selector-add {
+ background-position: 0 -48px;
+ cursor: pointer;
+}
+
+.stacked .selector-remove {
+ background: url("../img/selector-icons.b4555096cea2.svg") 0 0 no-repeat;
+ cursor: default;
+}
+
+.stacked .active.selector-remove {
+ background-position: 0 -16px;
+ cursor: pointer;
+}
+
+.selector .help-icon {
+ background: url("../img/icon-unknown.a18cb4398978.svg") 0 0 no-repeat;
+ display: inline-block;
+ vertical-align: middle;
+ margin: -2px 0 0 2px;
+ width: 13px;
+ height: 13px;
+}
+
+.selector .selector-chosen .help-icon {
+ background: url("../img/icon-unknown-alt.81536e128bb6.svg") 0 0 no-repeat;
+}
+
+.selector .search-label-icon {
+ background: url("../img/search.7cf54ff789c6.svg") 0 0 no-repeat;
+ display: inline-block;
+ height: 18px;
+ width: 18px;
+}
+
+/* DATE AND TIME */
+
+p.datetime {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-weight: bold;
+}
+
+.datetime span {
+ white-space: nowrap;
+ font-weight: normal;
+ font-size: 11px;
+ color: #ccc;
+}
+
+.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField {
+ min-width: 0;
+ margin-left: 5px;
+ margin-bottom: 4px;
+}
+
+table p.datetime {
+ font-size: 11px;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ height: 16px;
+ width: 16px;
+ overflow: hidden;
+}
+
+.datetimeshortcuts .clock-icon {
+ background: url("../img/icon-clock.e1d4dfac3f2b.svg") 0 0 no-repeat;
+}
+
+.datetimeshortcuts a:focus .clock-icon,
+.datetimeshortcuts a:hover .clock-icon {
+ background-position: 0 -16px;
+}
+
+.datetimeshortcuts .date-icon {
+ background: url("../img/icon-calendar.ac7aea671bea.svg") 0 0 no-repeat;
+ top: -1px;
+}
+
+.datetimeshortcuts a:focus .date-icon,
+.datetimeshortcuts a:hover .date-icon {
+ background-position: 0 -16px;
+}
+
+.timezonewarning {
+ font-size: 11px;
+ color: #999;
+}
+
+/* URL */
+
+p.url {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.url a {
+ font-weight: normal;
+}
+
+/* FILE UPLOADS */
+
+p.file-upload {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.aligned p.file-upload {
+ margin-left: 170px;
+}
+
+.file-upload a {
+ font-weight: normal;
+}
+
+.file-upload .deletelink {
+ margin-left: 5px;
+}
+
+span.clearable-file-input label {
+ color: #333;
+ font-size: 11px;
+ display: inline;
+ float: none;
+}
+
+/* CALENDARS & CLOCKS */
+
+.calendarbox, .clockbox {
+ margin: 5px auto;
+ font-size: 12px;
+ width: 19em;
+ text-align: center;
+ background: white;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
+ overflow: hidden;
+ position: relative;
+}
+
+.clockbox {
+ width: auto;
+}
+
+.calendar {
+ margin: 0;
+ padding: 0;
+}
+
+.calendar table {
+ margin: 0;
+ padding: 0;
+ border-collapse: collapse;
+ background: white;
+ width: 100%;
+}
+
+.calendar caption, .calendarbox h2 {
+ margin: 0;
+ text-align: center;
+ border-top: none;
+ background: #f5dd5d;
+ font-weight: 700;
+ font-size: 12px;
+ color: #333;
+}
+
+.calendar th {
+ padding: 8px 5px;
+ background: #f8f8f8;
+ border-bottom: 1px solid #ddd;
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ color: #666;
+}
+
+.calendar td {
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ padding: 0;
+ border-top: 1px solid #eee;
+ border-bottom: none;
+}
+
+.calendar td.selected a {
+ background: #79aec8;
+ color: #fff;
+}
+
+.calendar td.nonday {
+ background: #f8f8f8;
+}
+
+.calendar td.today a {
+ font-weight: 700;
+}
+
+.calendar td a, .timelist a {
+ display: block;
+ font-weight: 400;
+ padding: 6px;
+ text-decoration: none;
+ color: #444;
+}
+
+.calendar td a:focus, .timelist a:focus,
+.calendar td a:hover, .timelist a:hover {
+ background: #79aec8;
+ color: white;
+}
+
+.calendar td a:active, .timelist a:active {
+ background: #417690;
+ color: white;
+}
+
+.calendarnav {
+ font-size: 10px;
+ text-align: center;
+ color: #ccc;
+ margin: 0;
+ padding: 1px 3px;
+}
+
+.calendarnav a:link, #calendarnav a:visited,
+#calendarnav a:focus, #calendarnav a:hover {
+ color: #999;
+}
+
+.calendar-shortcuts {
+ background: white;
+ font-size: 11px;
+ line-height: 11px;
+ border-top: 1px solid #eee;
+ padding: 8px 0;
+ color: #ccc;
+}
+
+.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next {
+ display: block;
+ position: absolute;
+ top: 8px;
+ width: 15px;
+ height: 15px;
+ text-indent: -9999px;
+ padding: 0;
+}
+
+.calendarnav-previous {
+ left: 10px;
+ background: url("../img/calendar-icons.39b290681a8b.svg") 0 0 no-repeat;
+}
+
+.calendarbox .calendarnav-previous:focus,
+.calendarbox .calendarnav-previous:hover {
+ background-position: 0 -15px;
+}
+
+.calendarnav-next {
+ right: 10px;
+ background: url("../img/calendar-icons.39b290681a8b.svg") 0 -30px no-repeat;
+}
+
+.calendarbox .calendarnav-next:focus,
+.calendarbox .calendarnav-next:hover {
+ background-position: 0 -45px;
+}
+
+.calendar-cancel {
+ margin: 0;
+ padding: 4px 0;
+ font-size: 12px;
+ background: #eee;
+ border-top: 1px solid #ddd;
+ color: #333;
+}
+
+.calendar-cancel:focus, .calendar-cancel:hover {
+ background: #ddd;
+}
+
+.calendar-cancel a {
+ color: black;
+ display: block;
+}
+
+ul.timelist, .timelist li {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+.timelist a {
+ padding: 2px;
+}
+
+/* EDIT INLINE */
+
+.inline-deletelink {
+ float: right;
+ text-indent: -9999px;
+ background: url("../img/inline-delete.fec1b761f254.svg") 0 0 no-repeat;
+ width: 16px;
+ height: 16px;
+ border: 0px none;
+}
+
+.inline-deletelink:focus, .inline-deletelink:hover {
+ cursor: pointer;
+}
+
+/* RELATED WIDGET WRAPPER */
+.related-widget-wrapper {
+ float: left; /* display properly in form rows with multiple fields */
+ overflow: hidden; /* clear floated contents */
+}
+
+.related-widget-wrapper-link {
+ opacity: 0.3;
+}
+
+.related-widget-wrapper-link:link {
+ opacity: .8;
+}
+
+.related-widget-wrapper-link:link:focus,
+.related-widget-wrapper-link:link:hover {
+ opacity: 1;
+}
+
+select + .related-widget-wrapper-link,
+.related-widget-wrapper-link + .related-widget-wrapper-link {
+ margin-left: 7px;
+}
diff --git a/src/staticfiles/admin/css/widgets.5e372b41c483.css.gz b/src/staticfiles/admin/css/widgets.5e372b41c483.css.gz
new file mode 100644
index 0000000..2e537a0
Binary files /dev/null and b/src/staticfiles/admin/css/widgets.5e372b41c483.css.gz differ
diff --git a/src/staticfiles/admin/css/widgets.a7251c097987.css b/src/staticfiles/admin/css/widgets.a7251c097987.css
new file mode 100644
index 0000000..8bd64ce
--- /dev/null
+++ b/src/staticfiles/admin/css/widgets.a7251c097987.css
@@ -0,0 +1,565 @@
+/* SELECTOR (FILTER INTERFACE) */
+
+.selector {
+ width: 800px;
+ float: left;
+}
+
+.selector select {
+ width: 380px;
+ height: 17.2em;
+}
+
+.selector-available, .selector-chosen {
+ float: left;
+ width: 380px;
+ text-align: center;
+ margin-bottom: 5px;
+}
+
+.selector-chosen select {
+ border-top: none;
+}
+
+.selector-available h2, .selector-chosen h2 {
+ border: 1px solid #ccc;
+ border-radius: 4px 4px 0 0;
+}
+
+.selector-chosen h2 {
+ background: #79aec8;
+ color: #fff;
+}
+
+.selector .selector-available h2 {
+ background: #f8f8f8;
+ color: #666;
+}
+
+.selector .selector-filter {
+ background: white;
+ border: 1px solid #ccc;
+ border-width: 0 1px;
+ padding: 8px;
+ color: #999;
+ font-size: 10px;
+ margin: 0;
+ text-align: left;
+}
+
+.selector .selector-filter label,
+.inline-group .aligned .selector .selector-filter label {
+ float: left;
+ margin: 7px 0 0;
+ width: 18px;
+ height: 18px;
+ padding: 0;
+ overflow: hidden;
+ line-height: 1;
+}
+
+.selector .selector-available input {
+ width: 320px;
+ margin-left: 8px;
+}
+
+.selector ul.selector-chooser {
+ float: left;
+ width: 22px;
+ background-color: #eee;
+ border-radius: 10px;
+ margin: 10em 5px 0 5px;
+ padding: 0;
+}
+
+.selector-chooser li {
+ margin: 0;
+ padding: 3px;
+ list-style-type: none;
+}
+
+.selector select {
+ padding: 0 10px;
+ margin: 0 0 10px;
+ border-radius: 0 0 4px 4px;
+}
+
+.selector-add, .selector-remove {
+ width: 16px;
+ height: 16px;
+ display: block;
+ text-indent: -3000px;
+ overflow: hidden;
+ cursor: default;
+ opacity: 0.3;
+}
+
+.active.selector-add, .active.selector-remove {
+ opacity: 1;
+}
+
+.active.selector-add:hover, .active.selector-remove:hover {
+ cursor: pointer;
+}
+
+.selector-add {
+ background: url("../img/selector-icons.b4555096cea2.svg") 0 -96px no-repeat;
+}
+
+.active.selector-add:focus, .active.selector-add:hover {
+ background-position: 0 -112px;
+}
+
+.selector-remove {
+ background: url("../img/selector-icons.b4555096cea2.svg") 0 -64px no-repeat;
+}
+
+.active.selector-remove:focus, .active.selector-remove:hover {
+ background-position: 0 -80px;
+}
+
+a.selector-chooseall, a.selector-clearall {
+ display: inline-block;
+ height: 16px;
+ text-align: left;
+ margin: 1px auto 3px;
+ overflow: hidden;
+ font-weight: bold;
+ line-height: 16px;
+ color: #666;
+ text-decoration: none;
+ opacity: 0.3;
+}
+
+a.active.selector-chooseall:focus, a.active.selector-clearall:focus,
+a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
+ color: #447e9b;
+}
+
+a.active.selector-chooseall, a.active.selector-clearall {
+ opacity: 1;
+}
+
+a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
+ cursor: pointer;
+}
+
+a.selector-chooseall {
+ padding: 0 18px 0 0;
+ background: url("../img/selector-icons.b4555096cea2.svg") right -160px no-repeat;
+ cursor: default;
+}
+
+a.active.selector-chooseall:focus, a.active.selector-chooseall:hover {
+ background-position: 100% -176px;
+}
+
+a.selector-clearall {
+ padding: 0 0 0 18px;
+ background: url("../img/selector-icons.b4555096cea2.svg") 0 -128px no-repeat;
+ cursor: default;
+}
+
+a.active.selector-clearall:focus, a.active.selector-clearall:hover {
+ background-position: 0 -144px;
+}
+
+/* STACKED SELECTORS */
+
+.stacked {
+ float: left;
+ width: 490px;
+}
+
+.stacked select {
+ width: 480px;
+ height: 10.1em;
+}
+
+.stacked .selector-available, .stacked .selector-chosen {
+ width: 480px;
+}
+
+.stacked .selector-available {
+ margin-bottom: 0;
+}
+
+.stacked .selector-available input {
+ width: 422px;
+}
+
+.stacked ul.selector-chooser {
+ height: 22px;
+ width: 50px;
+ margin: 0 0 10px 40%;
+ background-color: #eee;
+ border-radius: 10px;
+}
+
+.stacked .selector-chooser li {
+ float: left;
+ padding: 3px 3px 3px 5px;
+}
+
+.stacked .selector-chooseall, .stacked .selector-clearall {
+ display: none;
+}
+
+.stacked .selector-add {
+ background: url("../img/selector-icons.b4555096cea2.svg") 0 -32px no-repeat;
+ cursor: default;
+}
+
+.stacked .active.selector-add {
+ background-position: 0 -48px;
+ cursor: pointer;
+}
+
+.stacked .selector-remove {
+ background: url("../img/selector-icons.b4555096cea2.svg") 0 0 no-repeat;
+ cursor: default;
+}
+
+.stacked .active.selector-remove {
+ background-position: 0 -16px;
+ cursor: pointer;
+}
+
+.selector .help-icon {
+ background: url("../img/icon-unknown.a18cb4398978.svg") 0 0 no-repeat;
+ display: inline-block;
+ vertical-align: middle;
+ margin: -2px 0 0 2px;
+ width: 13px;
+ height: 13px;
+}
+
+.selector .selector-chosen .help-icon {
+ background: url("../img/icon-unknown-alt.81536e128bb6.svg") 0 0 no-repeat;
+}
+
+.selector .search-label-icon {
+ background: url("../img/search.7cf54ff789c6.svg") 0 0 no-repeat;
+ display: inline-block;
+ height: 18px;
+ width: 18px;
+}
+
+/* DATE AND TIME */
+
+p.datetime {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-weight: bold;
+}
+
+.datetime span {
+ white-space: nowrap;
+ font-weight: normal;
+ font-size: 11px;
+ color: #ccc;
+}
+
+.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField {
+ min-width: 0;
+ margin-left: 5px;
+ margin-bottom: 4px;
+}
+
+table p.datetime {
+ font-size: 11px;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ height: 16px;
+ width: 16px;
+ overflow: hidden;
+}
+
+.datetimeshortcuts .clock-icon {
+ background: url("../img/icon-clock.e1d4dfac3f2b.svg") 0 0 no-repeat;
+}
+
+.datetimeshortcuts a:focus .clock-icon,
+.datetimeshortcuts a:hover .clock-icon {
+ background-position: 0 -16px;
+}
+
+.datetimeshortcuts .date-icon {
+ background: url("../img/icon-calendar.ac7aea671bea.svg") 0 0 no-repeat;
+ top: -1px;
+}
+
+.datetimeshortcuts a:focus .date-icon,
+.datetimeshortcuts a:hover .date-icon {
+ background-position: 0 -16px;
+}
+
+.timezonewarning {
+ font-size: 11px;
+ color: #999;
+}
+
+/* URL */
+
+p.url {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.url a {
+ font-weight: normal;
+}
+
+/* FILE UPLOADS */
+
+p.file-upload {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.aligned p.file-upload {
+ margin-left: 170px;
+}
+
+.file-upload a {
+ font-weight: normal;
+}
+
+.file-upload .deletelink {
+ margin-left: 5px;
+}
+
+span.clearable-file-input label {
+ color: #333;
+ font-size: 11px;
+ display: inline;
+ float: none;
+}
+
+/* CALENDARS & CLOCKS */
+
+.calendarbox, .clockbox {
+ margin: 5px auto;
+ font-size: 12px;
+ width: 19em;
+ text-align: center;
+ background: white;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
+ overflow: hidden;
+ position: relative;
+}
+
+.clockbox {
+ width: auto;
+}
+
+.calendar {
+ margin: 0;
+ padding: 0;
+}
+
+.calendar table {
+ margin: 0;
+ padding: 0;
+ border-collapse: collapse;
+ background: white;
+ width: 100%;
+}
+
+.calendar caption, .calendarbox h2 {
+ margin: 0;
+ text-align: center;
+ border-top: none;
+ background: #f5dd5d;
+ font-weight: 700;
+ font-size: 12px;
+ color: #333;
+}
+
+.calendar th {
+ padding: 8px 5px;
+ background: #f8f8f8;
+ border-bottom: 1px solid #ddd;
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ color: #666;
+}
+
+.calendar td {
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ padding: 0;
+ border-top: 1px solid #eee;
+ border-bottom: none;
+}
+
+.calendar td.selected a {
+ background: #79aec8;
+ color: #fff;
+}
+
+.calendar td.nonday {
+ background: #f8f8f8;
+}
+
+.calendar td.today a {
+ font-weight: 700;
+}
+
+.calendar td a, .timelist a {
+ display: block;
+ font-weight: 400;
+ padding: 6px;
+ text-decoration: none;
+ color: #444;
+}
+
+.calendar td a:focus, .timelist a:focus,
+.calendar td a:hover, .timelist a:hover {
+ background: #79aec8;
+ color: white;
+}
+
+.calendar td a:active, .timelist a:active {
+ background: #417690;
+ color: white;
+}
+
+.calendarnav {
+ font-size: 10px;
+ text-align: center;
+ color: #ccc;
+ margin: 0;
+ padding: 1px 3px;
+}
+
+.calendarnav a:link, #calendarnav a:visited,
+#calendarnav a:focus, #calendarnav a:hover {
+ color: #999;
+}
+
+.calendar-shortcuts {
+ background: white;
+ font-size: 11px;
+ line-height: 11px;
+ border-top: 1px solid #eee;
+ padding: 8px 0;
+ color: #ccc;
+}
+
+.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next {
+ display: block;
+ position: absolute;
+ top: 8px;
+ width: 15px;
+ height: 15px;
+ text-indent: -9999px;
+ padding: 0;
+}
+
+.calendarnav-previous {
+ left: 10px;
+ background: url("../img/calendar-icons.39b290681a8b.svg") 0 0 no-repeat;
+}
+
+.calendarbox .calendarnav-previous:focus,
+.calendarbox .calendarnav-previous:hover {
+ background-position: 0 -15px;
+}
+
+.calendarnav-next {
+ right: 10px;
+ background: url("../img/calendar-icons.39b290681a8b.svg") 0 -30px no-repeat;
+}
+
+.calendarbox .calendarnav-next:focus,
+.calendarbox .calendarnav-next:hover {
+ background-position: 0 -45px;
+}
+
+.calendar-cancel {
+ margin: 0;
+ padding: 4px 0;
+ font-size: 12px;
+ background: #eee;
+ border-top: 1px solid #ddd;
+ color: #333;
+}
+
+.calendar-cancel:focus, .calendar-cancel:hover {
+ background: #ddd;
+}
+
+.calendar-cancel a {
+ color: black;
+ display: block;
+}
+
+ul.timelist, .timelist li {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+.timelist a {
+ padding: 2px;
+}
+
+/* EDIT INLINE */
+
+.inline-deletelink {
+ float: right;
+ text-indent: -9999px;
+ background: url("../img/inline-delete.fec1b761f254.svg") 0 0 no-repeat;
+ width: 16px;
+ height: 16px;
+ border: 0px none;
+}
+
+.inline-deletelink:focus, .inline-deletelink:hover {
+ cursor: pointer;
+}
+
+/* RELATED WIDGET WRAPPER */
+.related-widget-wrapper {
+ float: left; /* display properly in form rows with multiple fields */
+ overflow: hidden; /* clear floated contents */
+}
+
+.related-widget-wrapper-link {
+ opacity: 0.3;
+}
+
+.related-widget-wrapper-link:link {
+ opacity: .8;
+}
+
+.related-widget-wrapper-link:link:focus,
+.related-widget-wrapper-link:link:hover {
+ opacity: 1;
+}
+
+select + .related-widget-wrapper-link,
+.related-widget-wrapper-link + .related-widget-wrapper-link {
+ margin-left: 7px;
+}
diff --git a/src/staticfiles/admin/css/widgets.css b/src/staticfiles/admin/css/widgets.css
new file mode 100644
index 0000000..d3bd67a
--- /dev/null
+++ b/src/staticfiles/admin/css/widgets.css
@@ -0,0 +1,565 @@
+/* SELECTOR (FILTER INTERFACE) */
+
+.selector {
+ width: 800px;
+ float: left;
+}
+
+.selector select {
+ width: 380px;
+ height: 17.2em;
+}
+
+.selector-available, .selector-chosen {
+ float: left;
+ width: 380px;
+ text-align: center;
+ margin-bottom: 5px;
+}
+
+.selector-chosen select {
+ border-top: none;
+}
+
+.selector-available h2, .selector-chosen h2 {
+ border: 1px solid #ccc;
+ border-radius: 4px 4px 0 0;
+}
+
+.selector-chosen h2 {
+ background: #79aec8;
+ color: #fff;
+}
+
+.selector .selector-available h2 {
+ background: #f8f8f8;
+ color: #666;
+}
+
+.selector .selector-filter {
+ background: white;
+ border: 1px solid #ccc;
+ border-width: 0 1px;
+ padding: 8px;
+ color: #999;
+ font-size: 10px;
+ margin: 0;
+ text-align: left;
+}
+
+.selector .selector-filter label,
+.inline-group .aligned .selector .selector-filter label {
+ float: left;
+ margin: 7px 0 0;
+ width: 18px;
+ height: 18px;
+ padding: 0;
+ overflow: hidden;
+ line-height: 1;
+}
+
+.selector .selector-available input {
+ width: 320px;
+ margin-left: 8px;
+}
+
+.selector ul.selector-chooser {
+ float: left;
+ width: 22px;
+ background-color: #eee;
+ border-radius: 10px;
+ margin: 10em 5px 0 5px;
+ padding: 0;
+}
+
+.selector-chooser li {
+ margin: 0;
+ padding: 3px;
+ list-style-type: none;
+}
+
+.selector select {
+ padding: 0 10px;
+ margin: 0 0 10px;
+ border-radius: 0 0 4px 4px;
+}
+
+.selector-add, .selector-remove {
+ width: 16px;
+ height: 16px;
+ display: block;
+ text-indent: -3000px;
+ overflow: hidden;
+ cursor: default;
+ opacity: 0.3;
+}
+
+.active.selector-add, .active.selector-remove {
+ opacity: 1;
+}
+
+.active.selector-add:hover, .active.selector-remove:hover {
+ cursor: pointer;
+}
+
+.selector-add {
+ background: url(../img/selector-icons.svg) 0 -96px no-repeat;
+}
+
+.active.selector-add:focus, .active.selector-add:hover {
+ background-position: 0 -112px;
+}
+
+.selector-remove {
+ background: url(../img/selector-icons.svg) 0 -64px no-repeat;
+}
+
+.active.selector-remove:focus, .active.selector-remove:hover {
+ background-position: 0 -80px;
+}
+
+a.selector-chooseall, a.selector-clearall {
+ display: inline-block;
+ height: 16px;
+ text-align: left;
+ margin: 1px auto 3px;
+ overflow: hidden;
+ font-weight: bold;
+ line-height: 16px;
+ color: #666;
+ text-decoration: none;
+ opacity: 0.3;
+}
+
+a.active.selector-chooseall:focus, a.active.selector-clearall:focus,
+a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
+ color: #447e9b;
+}
+
+a.active.selector-chooseall, a.active.selector-clearall {
+ opacity: 1;
+}
+
+a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
+ cursor: pointer;
+}
+
+a.selector-chooseall {
+ padding: 0 18px 0 0;
+ background: url(../img/selector-icons.svg) right -160px no-repeat;
+ cursor: default;
+}
+
+a.active.selector-chooseall:focus, a.active.selector-chooseall:hover {
+ background-position: 100% -176px;
+}
+
+a.selector-clearall {
+ padding: 0 0 0 18px;
+ background: url(../img/selector-icons.svg) 0 -128px no-repeat;
+ cursor: default;
+}
+
+a.active.selector-clearall:focus, a.active.selector-clearall:hover {
+ background-position: 0 -144px;
+}
+
+/* STACKED SELECTORS */
+
+.stacked {
+ float: left;
+ width: 490px;
+}
+
+.stacked select {
+ width: 480px;
+ height: 10.1em;
+}
+
+.stacked .selector-available, .stacked .selector-chosen {
+ width: 480px;
+}
+
+.stacked .selector-available {
+ margin-bottom: 0;
+}
+
+.stacked .selector-available input {
+ width: 422px;
+}
+
+.stacked ul.selector-chooser {
+ height: 22px;
+ width: 50px;
+ margin: 0 0 10px 40%;
+ background-color: #eee;
+ border-radius: 10px;
+}
+
+.stacked .selector-chooser li {
+ float: left;
+ padding: 3px 3px 3px 5px;
+}
+
+.stacked .selector-chooseall, .stacked .selector-clearall {
+ display: none;
+}
+
+.stacked .selector-add {
+ background: url(../img/selector-icons.svg) 0 -32px no-repeat;
+ cursor: default;
+}
+
+.stacked .active.selector-add {
+ background-position: 0 -48px;
+ cursor: pointer;
+}
+
+.stacked .selector-remove {
+ background: url(../img/selector-icons.svg) 0 0 no-repeat;
+ cursor: default;
+}
+
+.stacked .active.selector-remove {
+ background-position: 0 -16px;
+ cursor: pointer;
+}
+
+.selector .help-icon {
+ background: url(../img/icon-unknown.svg) 0 0 no-repeat;
+ display: inline-block;
+ vertical-align: middle;
+ margin: -2px 0 0 2px;
+ width: 13px;
+ height: 13px;
+}
+
+.selector .selector-chosen .help-icon {
+ background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat;
+}
+
+.selector .search-label-icon {
+ background: url(../img/search.svg) 0 0 no-repeat;
+ display: inline-block;
+ height: 18px;
+ width: 18px;
+}
+
+/* DATE AND TIME */
+
+p.datetime {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-weight: bold;
+}
+
+.datetime span {
+ white-space: nowrap;
+ font-weight: normal;
+ font-size: 11px;
+ color: #ccc;
+}
+
+.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField {
+ min-width: 0;
+ margin-left: 5px;
+ margin-bottom: 4px;
+}
+
+table p.datetime {
+ font-size: 11px;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ height: 16px;
+ width: 16px;
+ overflow: hidden;
+}
+
+.datetimeshortcuts .clock-icon {
+ background: url(../img/icon-clock.svg) 0 0 no-repeat;
+}
+
+.datetimeshortcuts a:focus .clock-icon,
+.datetimeshortcuts a:hover .clock-icon {
+ background-position: 0 -16px;
+}
+
+.datetimeshortcuts .date-icon {
+ background: url(../img/icon-calendar.svg) 0 0 no-repeat;
+ top: -1px;
+}
+
+.datetimeshortcuts a:focus .date-icon,
+.datetimeshortcuts a:hover .date-icon {
+ background-position: 0 -16px;
+}
+
+.timezonewarning {
+ font-size: 11px;
+ color: #999;
+}
+
+/* URL */
+
+p.url {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.url a {
+ font-weight: normal;
+}
+
+/* FILE UPLOADS */
+
+p.file-upload {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.aligned p.file-upload {
+ margin-left: 170px;
+}
+
+.file-upload a {
+ font-weight: normal;
+}
+
+.file-upload .deletelink {
+ margin-left: 5px;
+}
+
+span.clearable-file-input label {
+ color: #333;
+ font-size: 11px;
+ display: inline;
+ float: none;
+}
+
+/* CALENDARS & CLOCKS */
+
+.calendarbox, .clockbox {
+ margin: 5px auto;
+ font-size: 12px;
+ width: 19em;
+ text-align: center;
+ background: white;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
+ overflow: hidden;
+ position: relative;
+}
+
+.clockbox {
+ width: auto;
+}
+
+.calendar {
+ margin: 0;
+ padding: 0;
+}
+
+.calendar table {
+ margin: 0;
+ padding: 0;
+ border-collapse: collapse;
+ background: white;
+ width: 100%;
+}
+
+.calendar caption, .calendarbox h2 {
+ margin: 0;
+ text-align: center;
+ border-top: none;
+ background: #f5dd5d;
+ font-weight: 700;
+ font-size: 12px;
+ color: #333;
+}
+
+.calendar th {
+ padding: 8px 5px;
+ background: #f8f8f8;
+ border-bottom: 1px solid #ddd;
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ color: #666;
+}
+
+.calendar td {
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ padding: 0;
+ border-top: 1px solid #eee;
+ border-bottom: none;
+}
+
+.calendar td.selected a {
+ background: #79aec8;
+ color: #fff;
+}
+
+.calendar td.nonday {
+ background: #f8f8f8;
+}
+
+.calendar td.today a {
+ font-weight: 700;
+}
+
+.calendar td a, .timelist a {
+ display: block;
+ font-weight: 400;
+ padding: 6px;
+ text-decoration: none;
+ color: #444;
+}
+
+.calendar td a:focus, .timelist a:focus,
+.calendar td a:hover, .timelist a:hover {
+ background: #79aec8;
+ color: white;
+}
+
+.calendar td a:active, .timelist a:active {
+ background: #417690;
+ color: white;
+}
+
+.calendarnav {
+ font-size: 10px;
+ text-align: center;
+ color: #ccc;
+ margin: 0;
+ padding: 1px 3px;
+}
+
+.calendarnav a:link, #calendarnav a:visited,
+#calendarnav a:focus, #calendarnav a:hover {
+ color: #999;
+}
+
+.calendar-shortcuts {
+ background: white;
+ font-size: 11px;
+ line-height: 11px;
+ border-top: 1px solid #eee;
+ padding: 8px 0;
+ color: #ccc;
+}
+
+.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next {
+ display: block;
+ position: absolute;
+ top: 8px;
+ width: 15px;
+ height: 15px;
+ text-indent: -9999px;
+ padding: 0;
+}
+
+.calendarnav-previous {
+ left: 10px;
+ background: url(../img/calendar-icons.svg) 0 0 no-repeat;
+}
+
+.calendarbox .calendarnav-previous:focus,
+.calendarbox .calendarnav-previous:hover {
+ background-position: 0 -15px;
+}
+
+.calendarnav-next {
+ right: 10px;
+ background: url(../img/calendar-icons.svg) 0 -30px no-repeat;
+}
+
+.calendarbox .calendarnav-next:focus,
+.calendarbox .calendarnav-next:hover {
+ background-position: 0 -45px;
+}
+
+.calendar-cancel {
+ margin: 0;
+ padding: 4px 0;
+ font-size: 12px;
+ background: #eee;
+ border-top: 1px solid #ddd;
+ color: #333;
+}
+
+.calendar-cancel:focus, .calendar-cancel:hover {
+ background: #ddd;
+}
+
+.calendar-cancel a {
+ color: black;
+ display: block;
+}
+
+ul.timelist, .timelist li {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+.timelist a {
+ padding: 2px;
+}
+
+/* EDIT INLINE */
+
+.inline-deletelink {
+ float: right;
+ text-indent: -9999px;
+ background: url(../img/inline-delete.svg) 0 0 no-repeat;
+ width: 16px;
+ height: 16px;
+ border: 0px none;
+}
+
+.inline-deletelink:focus, .inline-deletelink:hover {
+ cursor: pointer;
+}
+
+/* RELATED WIDGET WRAPPER */
+.related-widget-wrapper {
+ float: left; /* display properly in form rows with multiple fields */
+ overflow: hidden; /* clear floated contents */
+}
+
+.related-widget-wrapper-link {
+ opacity: 0.3;
+}
+
+.related-widget-wrapper-link:link {
+ opacity: .8;
+}
+
+.related-widget-wrapper-link:link:focus,
+.related-widget-wrapper-link:link:hover {
+ opacity: 1;
+}
+
+select + .related-widget-wrapper-link,
+.related-widget-wrapper-link + .related-widget-wrapper-link {
+ margin-left: 7px;
+}
diff --git a/src/staticfiles/admin/css/widgets.css.gz b/src/staticfiles/admin/css/widgets.css.gz
new file mode 100644
index 0000000..f5a2f01
Binary files /dev/null and b/src/staticfiles/admin/css/widgets.css.gz differ
diff --git a/src/staticfiles/admin/fonts/LICENSE.d273d63619c9.txt b/src/staticfiles/admin/fonts/LICENSE.d273d63619c9.txt
new file mode 100644
index 0000000..75b5248
--- /dev/null
+++ b/src/staticfiles/admin/fonts/LICENSE.d273d63619c9.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/src/staticfiles/admin/fonts/LICENSE.d273d63619c9.txt.gz b/src/staticfiles/admin/fonts/LICENSE.d273d63619c9.txt.gz
new file mode 100644
index 0000000..d3fd592
Binary files /dev/null and b/src/staticfiles/admin/fonts/LICENSE.d273d63619c9.txt.gz differ
diff --git a/src/staticfiles/admin/fonts/LICENSE.txt b/src/staticfiles/admin/fonts/LICENSE.txt
new file mode 100644
index 0000000..75b5248
--- /dev/null
+++ b/src/staticfiles/admin/fonts/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/src/staticfiles/admin/fonts/LICENSE.txt.gz b/src/staticfiles/admin/fonts/LICENSE.txt.gz
new file mode 100644
index 0000000..d3fd592
Binary files /dev/null and b/src/staticfiles/admin/fonts/LICENSE.txt.gz differ
diff --git a/src/staticfiles/admin/fonts/README.ab99e6b541ea.txt b/src/staticfiles/admin/fonts/README.ab99e6b541ea.txt
new file mode 100644
index 0000000..b247bef
--- /dev/null
+++ b/src/staticfiles/admin/fonts/README.ab99e6b541ea.txt
@@ -0,0 +1,3 @@
+Roboto webfont source: https://www.google.com/fonts/specimen/Roboto
+WOFF files extracted using https://github.com/majodev/google-webfonts-helper
+Weights used in this project: Light (300), Regular (400), Bold (700)
diff --git a/src/staticfiles/admin/fonts/README.ab99e6b541ea.txt.gz b/src/staticfiles/admin/fonts/README.ab99e6b541ea.txt.gz
new file mode 100644
index 0000000..5c802db
Binary files /dev/null and b/src/staticfiles/admin/fonts/README.ab99e6b541ea.txt.gz differ
diff --git a/src/staticfiles/admin/fonts/README.txt b/src/staticfiles/admin/fonts/README.txt
new file mode 100644
index 0000000..b247bef
--- /dev/null
+++ b/src/staticfiles/admin/fonts/README.txt
@@ -0,0 +1,3 @@
+Roboto webfont source: https://www.google.com/fonts/specimen/Roboto
+WOFF files extracted using https://github.com/majodev/google-webfonts-helper
+Weights used in this project: Light (300), Regular (400), Bold (700)
diff --git a/src/staticfiles/admin/fonts/README.txt.gz b/src/staticfiles/admin/fonts/README.txt.gz
new file mode 100644
index 0000000..5c802db
Binary files /dev/null and b/src/staticfiles/admin/fonts/README.txt.gz differ
diff --git a/src/staticfiles/admin/fonts/Roboto-Bold-webfont.50d75e48e0a3.woff b/src/staticfiles/admin/fonts/Roboto-Bold-webfont.50d75e48e0a3.woff
new file mode 100644
index 0000000..6e0f562
Binary files /dev/null and b/src/staticfiles/admin/fonts/Roboto-Bold-webfont.50d75e48e0a3.woff differ
diff --git a/src/staticfiles/admin/fonts/Roboto-Bold-webfont.woff b/src/staticfiles/admin/fonts/Roboto-Bold-webfont.woff
new file mode 100644
index 0000000..6e0f562
Binary files /dev/null and b/src/staticfiles/admin/fonts/Roboto-Bold-webfont.woff differ
diff --git a/src/staticfiles/admin/fonts/Roboto-Light-webfont.c73eb1ceba33.woff b/src/staticfiles/admin/fonts/Roboto-Light-webfont.c73eb1ceba33.woff
new file mode 100644
index 0000000..b9e9918
Binary files /dev/null and b/src/staticfiles/admin/fonts/Roboto-Light-webfont.c73eb1ceba33.woff differ
diff --git a/src/staticfiles/admin/fonts/Roboto-Light-webfont.woff b/src/staticfiles/admin/fonts/Roboto-Light-webfont.woff
new file mode 100644
index 0000000..b9e9918
Binary files /dev/null and b/src/staticfiles/admin/fonts/Roboto-Light-webfont.woff differ
diff --git a/src/staticfiles/admin/fonts/Roboto-Regular-webfont.35b07eb2f871.woff b/src/staticfiles/admin/fonts/Roboto-Regular-webfont.35b07eb2f871.woff
new file mode 100644
index 0000000..96c1986
Binary files /dev/null and b/src/staticfiles/admin/fonts/Roboto-Regular-webfont.35b07eb2f871.woff differ
diff --git a/src/staticfiles/admin/fonts/Roboto-Regular-webfont.woff b/src/staticfiles/admin/fonts/Roboto-Regular-webfont.woff
new file mode 100644
index 0000000..96c1986
Binary files /dev/null and b/src/staticfiles/admin/fonts/Roboto-Regular-webfont.woff differ
diff --git a/src/staticfiles/admin/img/LICENSE b/src/staticfiles/admin/img/LICENSE
new file mode 100644
index 0000000..a4faaa1
--- /dev/null
+++ b/src/staticfiles/admin/img/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Code Charm Ltd
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/staticfiles/admin/img/LICENSE.2c54f4e1ca1c b/src/staticfiles/admin/img/LICENSE.2c54f4e1ca1c
new file mode 100644
index 0000000..a4faaa1
--- /dev/null
+++ b/src/staticfiles/admin/img/LICENSE.2c54f4e1ca1c
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Code Charm Ltd
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/staticfiles/admin/img/LICENSE.2c54f4e1ca1c.gz b/src/staticfiles/admin/img/LICENSE.2c54f4e1ca1c.gz
new file mode 100644
index 0000000..9306e29
Binary files /dev/null and b/src/staticfiles/admin/img/LICENSE.2c54f4e1ca1c.gz differ
diff --git a/src/staticfiles/admin/img/LICENSE.gz b/src/staticfiles/admin/img/LICENSE.gz
new file mode 100644
index 0000000..9306e29
Binary files /dev/null and b/src/staticfiles/admin/img/LICENSE.gz differ
diff --git a/src/staticfiles/admin/img/README.a70711a38d87.txt b/src/staticfiles/admin/img/README.a70711a38d87.txt
new file mode 100644
index 0000000..4eb2e49
--- /dev/null
+++ b/src/staticfiles/admin/img/README.a70711a38d87.txt
@@ -0,0 +1,7 @@
+All icons are taken from Font Awesome (http://fontawesome.io/) project.
+The Font Awesome font is licensed under the SIL OFL 1.1:
+- https://scripts.sil.org/OFL
+
+SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG
+Font-Awesome-SVG-PNG is licensed under the MIT license (see file license
+in current folder).
diff --git a/src/staticfiles/admin/img/README.a70711a38d87.txt.gz b/src/staticfiles/admin/img/README.a70711a38d87.txt.gz
new file mode 100644
index 0000000..d3afcbd
Binary files /dev/null and b/src/staticfiles/admin/img/README.a70711a38d87.txt.gz differ
diff --git a/src/staticfiles/admin/img/README.txt b/src/staticfiles/admin/img/README.txt
new file mode 100644
index 0000000..4eb2e49
--- /dev/null
+++ b/src/staticfiles/admin/img/README.txt
@@ -0,0 +1,7 @@
+All icons are taken from Font Awesome (http://fontawesome.io/) project.
+The Font Awesome font is licensed under the SIL OFL 1.1:
+- https://scripts.sil.org/OFL
+
+SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG
+Font-Awesome-SVG-PNG is licensed under the MIT license (see file license
+in current folder).
diff --git a/src/staticfiles/admin/img/README.txt.gz b/src/staticfiles/admin/img/README.txt.gz
new file mode 100644
index 0000000..d3afcbd
Binary files /dev/null and b/src/staticfiles/admin/img/README.txt.gz differ
diff --git a/src/staticfiles/admin/img/calendar-icons.39b290681a8b.svg b/src/staticfiles/admin/img/calendar-icons.39b290681a8b.svg
new file mode 100644
index 0000000..dbf21c3
--- /dev/null
+++ b/src/staticfiles/admin/img/calendar-icons.39b290681a8b.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/staticfiles/admin/img/calendar-icons.39b290681a8b.svg.gz b/src/staticfiles/admin/img/calendar-icons.39b290681a8b.svg.gz
new file mode 100644
index 0000000..bef7ce1
Binary files /dev/null and b/src/staticfiles/admin/img/calendar-icons.39b290681a8b.svg.gz differ
diff --git a/src/staticfiles/admin/img/calendar-icons.svg b/src/staticfiles/admin/img/calendar-icons.svg
new file mode 100644
index 0000000..dbf21c3
--- /dev/null
+++ b/src/staticfiles/admin/img/calendar-icons.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/staticfiles/admin/img/calendar-icons.svg.gz b/src/staticfiles/admin/img/calendar-icons.svg.gz
new file mode 100644
index 0000000..bef7ce1
Binary files /dev/null and b/src/staticfiles/admin/img/calendar-icons.svg.gz differ
diff --git a/src/staticfiles/admin/img/gis/move_vertex_off.7a23bf31ef8a.svg b/src/staticfiles/admin/img/gis/move_vertex_off.7a23bf31ef8a.svg
new file mode 100644
index 0000000..228854f
--- /dev/null
+++ b/src/staticfiles/admin/img/gis/move_vertex_off.7a23bf31ef8a.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/staticfiles/admin/img/gis/move_vertex_off.7a23bf31ef8a.svg.gz b/src/staticfiles/admin/img/gis/move_vertex_off.7a23bf31ef8a.svg.gz
new file mode 100644
index 0000000..f17ecfb
Binary files /dev/null and b/src/staticfiles/admin/img/gis/move_vertex_off.7a23bf31ef8a.svg.gz differ
diff --git a/src/staticfiles/admin/img/gis/move_vertex_off.svg b/src/staticfiles/admin/img/gis/move_vertex_off.svg
new file mode 100644
index 0000000..228854f
--- /dev/null
+++ b/src/staticfiles/admin/img/gis/move_vertex_off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/staticfiles/admin/img/gis/move_vertex_off.svg.gz b/src/staticfiles/admin/img/gis/move_vertex_off.svg.gz
new file mode 100644
index 0000000..f17ecfb
Binary files /dev/null and b/src/staticfiles/admin/img/gis/move_vertex_off.svg.gz differ
diff --git a/src/staticfiles/admin/img/gis/move_vertex_on.0047eba25b67.svg b/src/staticfiles/admin/img/gis/move_vertex_on.0047eba25b67.svg
new file mode 100644
index 0000000..96b87fd
--- /dev/null
+++ b/src/staticfiles/admin/img/gis/move_vertex_on.0047eba25b67.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/staticfiles/admin/img/gis/move_vertex_on.0047eba25b67.svg.gz b/src/staticfiles/admin/img/gis/move_vertex_on.0047eba25b67.svg.gz
new file mode 100644
index 0000000..8047dfd
Binary files /dev/null and b/src/staticfiles/admin/img/gis/move_vertex_on.0047eba25b67.svg.gz differ
diff --git a/src/staticfiles/admin/img/gis/move_vertex_on.svg b/src/staticfiles/admin/img/gis/move_vertex_on.svg
new file mode 100644
index 0000000..96b87fd
--- /dev/null
+++ b/src/staticfiles/admin/img/gis/move_vertex_on.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/staticfiles/admin/img/gis/move_vertex_on.svg.gz b/src/staticfiles/admin/img/gis/move_vertex_on.svg.gz
new file mode 100644
index 0000000..8047dfd
Binary files /dev/null and b/src/staticfiles/admin/img/gis/move_vertex_on.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-addlink.d519b3bab011.svg b/src/staticfiles/admin/img/icon-addlink.d519b3bab011.svg
new file mode 100644
index 0000000..e004fb1
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-addlink.d519b3bab011.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-addlink.d519b3bab011.svg.gz b/src/staticfiles/admin/img/icon-addlink.d519b3bab011.svg.gz
new file mode 100644
index 0000000..81cea0d
Binary files /dev/null and b/src/staticfiles/admin/img/icon-addlink.d519b3bab011.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-addlink.svg b/src/staticfiles/admin/img/icon-addlink.svg
new file mode 100644
index 0000000..e004fb1
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-addlink.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-addlink.svg.gz b/src/staticfiles/admin/img/icon-addlink.svg.gz
new file mode 100644
index 0000000..81cea0d
Binary files /dev/null and b/src/staticfiles/admin/img/icon-addlink.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-alert.034cc7d8a67f.svg b/src/staticfiles/admin/img/icon-alert.034cc7d8a67f.svg
new file mode 100644
index 0000000..e51ea83
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-alert.034cc7d8a67f.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-alert.034cc7d8a67f.svg.gz b/src/staticfiles/admin/img/icon-alert.034cc7d8a67f.svg.gz
new file mode 100644
index 0000000..a7e64ac
Binary files /dev/null and b/src/staticfiles/admin/img/icon-alert.034cc7d8a67f.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-alert.svg b/src/staticfiles/admin/img/icon-alert.svg
new file mode 100644
index 0000000..e51ea83
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-alert.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-alert.svg.gz b/src/staticfiles/admin/img/icon-alert.svg.gz
new file mode 100644
index 0000000..a7e64ac
Binary files /dev/null and b/src/staticfiles/admin/img/icon-alert.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-calendar.ac7aea671bea.svg b/src/staticfiles/admin/img/icon-calendar.ac7aea671bea.svg
new file mode 100644
index 0000000..97910a9
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-calendar.ac7aea671bea.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/staticfiles/admin/img/icon-calendar.ac7aea671bea.svg.gz b/src/staticfiles/admin/img/icon-calendar.ac7aea671bea.svg.gz
new file mode 100644
index 0000000..18b5080
Binary files /dev/null and b/src/staticfiles/admin/img/icon-calendar.ac7aea671bea.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-calendar.svg b/src/staticfiles/admin/img/icon-calendar.svg
new file mode 100644
index 0000000..97910a9
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-calendar.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/staticfiles/admin/img/icon-calendar.svg.gz b/src/staticfiles/admin/img/icon-calendar.svg.gz
new file mode 100644
index 0000000..18b5080
Binary files /dev/null and b/src/staticfiles/admin/img/icon-calendar.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-changelink.18d2fd706348.svg b/src/staticfiles/admin/img/icon-changelink.18d2fd706348.svg
new file mode 100644
index 0000000..bbb137a
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-changelink.18d2fd706348.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-changelink.18d2fd706348.svg.gz b/src/staticfiles/admin/img/icon-changelink.18d2fd706348.svg.gz
new file mode 100644
index 0000000..48960ff
Binary files /dev/null and b/src/staticfiles/admin/img/icon-changelink.18d2fd706348.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-changelink.svg b/src/staticfiles/admin/img/icon-changelink.svg
new file mode 100644
index 0000000..bbb137a
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-changelink.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-changelink.svg.gz b/src/staticfiles/admin/img/icon-changelink.svg.gz
new file mode 100644
index 0000000..48960ff
Binary files /dev/null and b/src/staticfiles/admin/img/icon-changelink.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-clock.e1d4dfac3f2b.svg b/src/staticfiles/admin/img/icon-clock.e1d4dfac3f2b.svg
new file mode 100644
index 0000000..bf9985d
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-clock.e1d4dfac3f2b.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/staticfiles/admin/img/icon-clock.e1d4dfac3f2b.svg.gz b/src/staticfiles/admin/img/icon-clock.e1d4dfac3f2b.svg.gz
new file mode 100644
index 0000000..c21e7e7
Binary files /dev/null and b/src/staticfiles/admin/img/icon-clock.e1d4dfac3f2b.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-clock.svg b/src/staticfiles/admin/img/icon-clock.svg
new file mode 100644
index 0000000..bf9985d
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-clock.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/staticfiles/admin/img/icon-clock.svg.gz b/src/staticfiles/admin/img/icon-clock.svg.gz
new file mode 100644
index 0000000..c21e7e7
Binary files /dev/null and b/src/staticfiles/admin/img/icon-clock.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-deletelink.564ef9dc3854.svg b/src/staticfiles/admin/img/icon-deletelink.564ef9dc3854.svg
new file mode 100644
index 0000000..4059b15
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-deletelink.564ef9dc3854.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-deletelink.564ef9dc3854.svg.gz b/src/staticfiles/admin/img/icon-deletelink.564ef9dc3854.svg.gz
new file mode 100644
index 0000000..4b93e9f
Binary files /dev/null and b/src/staticfiles/admin/img/icon-deletelink.564ef9dc3854.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-deletelink.svg b/src/staticfiles/admin/img/icon-deletelink.svg
new file mode 100644
index 0000000..4059b15
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-deletelink.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-deletelink.svg.gz b/src/staticfiles/admin/img/icon-deletelink.svg.gz
new file mode 100644
index 0000000..4b93e9f
Binary files /dev/null and b/src/staticfiles/admin/img/icon-deletelink.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-no.439e821418cd.svg b/src/staticfiles/admin/img/icon-no.439e821418cd.svg
new file mode 100644
index 0000000..2e0d383
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-no.439e821418cd.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-no.439e821418cd.svg.gz b/src/staticfiles/admin/img/icon-no.439e821418cd.svg.gz
new file mode 100644
index 0000000..251b7df
Binary files /dev/null and b/src/staticfiles/admin/img/icon-no.439e821418cd.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-no.svg b/src/staticfiles/admin/img/icon-no.svg
new file mode 100644
index 0000000..2e0d383
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-no.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-no.svg.gz b/src/staticfiles/admin/img/icon-no.svg.gz
new file mode 100644
index 0000000..251b7df
Binary files /dev/null and b/src/staticfiles/admin/img/icon-no.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-unknown-alt.81536e128bb6.svg b/src/staticfiles/admin/img/icon-unknown-alt.81536e128bb6.svg
new file mode 100644
index 0000000..1c6b99f
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-unknown-alt.81536e128bb6.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-unknown-alt.81536e128bb6.svg.gz b/src/staticfiles/admin/img/icon-unknown-alt.81536e128bb6.svg.gz
new file mode 100644
index 0000000..3f254ad
Binary files /dev/null and b/src/staticfiles/admin/img/icon-unknown-alt.81536e128bb6.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-unknown-alt.svg b/src/staticfiles/admin/img/icon-unknown-alt.svg
new file mode 100644
index 0000000..1c6b99f
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-unknown-alt.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-unknown-alt.svg.gz b/src/staticfiles/admin/img/icon-unknown-alt.svg.gz
new file mode 100644
index 0000000..3f254ad
Binary files /dev/null and b/src/staticfiles/admin/img/icon-unknown-alt.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-unknown.a18cb4398978.svg b/src/staticfiles/admin/img/icon-unknown.a18cb4398978.svg
new file mode 100644
index 0000000..50b4f97
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-unknown.a18cb4398978.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-unknown.a18cb4398978.svg.gz b/src/staticfiles/admin/img/icon-unknown.a18cb4398978.svg.gz
new file mode 100644
index 0000000..5710ee7
Binary files /dev/null and b/src/staticfiles/admin/img/icon-unknown.a18cb4398978.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-unknown.svg b/src/staticfiles/admin/img/icon-unknown.svg
new file mode 100644
index 0000000..50b4f97
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-unknown.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-unknown.svg.gz b/src/staticfiles/admin/img/icon-unknown.svg.gz
new file mode 100644
index 0000000..5710ee7
Binary files /dev/null and b/src/staticfiles/admin/img/icon-unknown.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-viewlink.41eb31f7826e.svg b/src/staticfiles/admin/img/icon-viewlink.41eb31f7826e.svg
new file mode 100644
index 0000000..a1ca1d3
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-viewlink.41eb31f7826e.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-viewlink.41eb31f7826e.svg.gz b/src/staticfiles/admin/img/icon-viewlink.41eb31f7826e.svg.gz
new file mode 100644
index 0000000..a965b09
Binary files /dev/null and b/src/staticfiles/admin/img/icon-viewlink.41eb31f7826e.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-viewlink.svg b/src/staticfiles/admin/img/icon-viewlink.svg
new file mode 100644
index 0000000..a1ca1d3
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-viewlink.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-viewlink.svg.gz b/src/staticfiles/admin/img/icon-viewlink.svg.gz
new file mode 100644
index 0000000..a965b09
Binary files /dev/null and b/src/staticfiles/admin/img/icon-viewlink.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-yes.d2f9f035226a.svg b/src/staticfiles/admin/img/icon-yes.d2f9f035226a.svg
new file mode 100644
index 0000000..5883d87
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-yes.d2f9f035226a.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-yes.d2f9f035226a.svg.gz b/src/staticfiles/admin/img/icon-yes.d2f9f035226a.svg.gz
new file mode 100644
index 0000000..c35e8df
Binary files /dev/null and b/src/staticfiles/admin/img/icon-yes.d2f9f035226a.svg.gz differ
diff --git a/src/staticfiles/admin/img/icon-yes.svg b/src/staticfiles/admin/img/icon-yes.svg
new file mode 100644
index 0000000..5883d87
--- /dev/null
+++ b/src/staticfiles/admin/img/icon-yes.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/icon-yes.svg.gz b/src/staticfiles/admin/img/icon-yes.svg.gz
new file mode 100644
index 0000000..c35e8df
Binary files /dev/null and b/src/staticfiles/admin/img/icon-yes.svg.gz differ
diff --git a/src/staticfiles/admin/img/inline-delete.fec1b761f254.svg b/src/staticfiles/admin/img/inline-delete.fec1b761f254.svg
new file mode 100644
index 0000000..17d1ad6
--- /dev/null
+++ b/src/staticfiles/admin/img/inline-delete.fec1b761f254.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/inline-delete.fec1b761f254.svg.gz b/src/staticfiles/admin/img/inline-delete.fec1b761f254.svg.gz
new file mode 100644
index 0000000..75f97b7
Binary files /dev/null and b/src/staticfiles/admin/img/inline-delete.fec1b761f254.svg.gz differ
diff --git a/src/staticfiles/admin/img/inline-delete.svg b/src/staticfiles/admin/img/inline-delete.svg
new file mode 100644
index 0000000..17d1ad6
--- /dev/null
+++ b/src/staticfiles/admin/img/inline-delete.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/inline-delete.svg.gz b/src/staticfiles/admin/img/inline-delete.svg.gz
new file mode 100644
index 0000000..75f97b7
Binary files /dev/null and b/src/staticfiles/admin/img/inline-delete.svg.gz differ
diff --git a/src/staticfiles/admin/img/search.7cf54ff789c6.svg b/src/staticfiles/admin/img/search.7cf54ff789c6.svg
new file mode 100644
index 0000000..c8c69b2
--- /dev/null
+++ b/src/staticfiles/admin/img/search.7cf54ff789c6.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/search.7cf54ff789c6.svg.gz b/src/staticfiles/admin/img/search.7cf54ff789c6.svg.gz
new file mode 100644
index 0000000..28c49b8
Binary files /dev/null and b/src/staticfiles/admin/img/search.7cf54ff789c6.svg.gz differ
diff --git a/src/staticfiles/admin/img/search.svg b/src/staticfiles/admin/img/search.svg
new file mode 100644
index 0000000..c8c69b2
--- /dev/null
+++ b/src/staticfiles/admin/img/search.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/search.svg.gz b/src/staticfiles/admin/img/search.svg.gz
new file mode 100644
index 0000000..28c49b8
Binary files /dev/null and b/src/staticfiles/admin/img/search.svg.gz differ
diff --git a/src/staticfiles/admin/img/selector-icons.b4555096cea2.svg b/src/staticfiles/admin/img/selector-icons.b4555096cea2.svg
new file mode 100644
index 0000000..926b8e2
--- /dev/null
+++ b/src/staticfiles/admin/img/selector-icons.b4555096cea2.svg
@@ -0,0 +1,34 @@
+
diff --git a/src/staticfiles/admin/img/selector-icons.b4555096cea2.svg.gz b/src/staticfiles/admin/img/selector-icons.b4555096cea2.svg.gz
new file mode 100644
index 0000000..99fe621
Binary files /dev/null and b/src/staticfiles/admin/img/selector-icons.b4555096cea2.svg.gz differ
diff --git a/src/staticfiles/admin/img/selector-icons.svg b/src/staticfiles/admin/img/selector-icons.svg
new file mode 100644
index 0000000..926b8e2
--- /dev/null
+++ b/src/staticfiles/admin/img/selector-icons.svg
@@ -0,0 +1,34 @@
+
diff --git a/src/staticfiles/admin/img/selector-icons.svg.gz b/src/staticfiles/admin/img/selector-icons.svg.gz
new file mode 100644
index 0000000..99fe621
Binary files /dev/null and b/src/staticfiles/admin/img/selector-icons.svg.gz differ
diff --git a/src/staticfiles/admin/img/sorting-icons.3a097b59f104.svg b/src/staticfiles/admin/img/sorting-icons.3a097b59f104.svg
new file mode 100644
index 0000000..7c31ec9
--- /dev/null
+++ b/src/staticfiles/admin/img/sorting-icons.3a097b59f104.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/staticfiles/admin/img/sorting-icons.3a097b59f104.svg.gz b/src/staticfiles/admin/img/sorting-icons.3a097b59f104.svg.gz
new file mode 100644
index 0000000..f5a302d
Binary files /dev/null and b/src/staticfiles/admin/img/sorting-icons.3a097b59f104.svg.gz differ
diff --git a/src/staticfiles/admin/img/sorting-icons.svg b/src/staticfiles/admin/img/sorting-icons.svg
new file mode 100644
index 0000000..7c31ec9
--- /dev/null
+++ b/src/staticfiles/admin/img/sorting-icons.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/staticfiles/admin/img/sorting-icons.svg.gz b/src/staticfiles/admin/img/sorting-icons.svg.gz
new file mode 100644
index 0000000..f5a302d
Binary files /dev/null and b/src/staticfiles/admin/img/sorting-icons.svg.gz differ
diff --git a/src/staticfiles/admin/img/tooltag-add.e59d620a9742.svg b/src/staticfiles/admin/img/tooltag-add.e59d620a9742.svg
new file mode 100644
index 0000000..1ca64ae
--- /dev/null
+++ b/src/staticfiles/admin/img/tooltag-add.e59d620a9742.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/tooltag-add.e59d620a9742.svg.gz b/src/staticfiles/admin/img/tooltag-add.e59d620a9742.svg.gz
new file mode 100644
index 0000000..dcd1df1
Binary files /dev/null and b/src/staticfiles/admin/img/tooltag-add.e59d620a9742.svg.gz differ
diff --git a/src/staticfiles/admin/img/tooltag-add.svg b/src/staticfiles/admin/img/tooltag-add.svg
new file mode 100644
index 0000000..1ca64ae
--- /dev/null
+++ b/src/staticfiles/admin/img/tooltag-add.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/tooltag-add.svg.gz b/src/staticfiles/admin/img/tooltag-add.svg.gz
new file mode 100644
index 0000000..dcd1df1
Binary files /dev/null and b/src/staticfiles/admin/img/tooltag-add.svg.gz differ
diff --git a/src/staticfiles/admin/img/tooltag-arrowright.bbfb788a849e.svg b/src/staticfiles/admin/img/tooltag-arrowright.bbfb788a849e.svg
new file mode 100644
index 0000000..b664d61
--- /dev/null
+++ b/src/staticfiles/admin/img/tooltag-arrowright.bbfb788a849e.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/tooltag-arrowright.bbfb788a849e.svg.gz b/src/staticfiles/admin/img/tooltag-arrowright.bbfb788a849e.svg.gz
new file mode 100644
index 0000000..54b1c3f
Binary files /dev/null and b/src/staticfiles/admin/img/tooltag-arrowright.bbfb788a849e.svg.gz differ
diff --git a/src/staticfiles/admin/img/tooltag-arrowright.svg b/src/staticfiles/admin/img/tooltag-arrowright.svg
new file mode 100644
index 0000000..b664d61
--- /dev/null
+++ b/src/staticfiles/admin/img/tooltag-arrowright.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/staticfiles/admin/img/tooltag-arrowright.svg.gz b/src/staticfiles/admin/img/tooltag-arrowright.svg.gz
new file mode 100644
index 0000000..54b1c3f
Binary files /dev/null and b/src/staticfiles/admin/img/tooltag-arrowright.svg.gz differ
diff --git a/src/staticfiles/admin/js/SelectBox.99d0cfd2e80c.js b/src/staticfiles/admin/js/SelectBox.99d0cfd2e80c.js
new file mode 100644
index 0000000..2073f03
--- /dev/null
+++ b/src/staticfiles/admin/js/SelectBox.99d0cfd2e80c.js
@@ -0,0 +1,144 @@
+(function($) {
+ 'use strict';
+ var SelectBox = {
+ cache: {},
+ init: function(id) {
+ var box = document.getElementById(id);
+ var node;
+ SelectBox.cache[id] = [];
+ var cache = SelectBox.cache[id];
+ var boxOptions = box.options;
+ var boxOptionsLength = boxOptions.length;
+ for (var i = 0, j = boxOptionsLength; i < j; i++) {
+ node = boxOptions[i];
+ cache.push({value: node.value, text: node.text, displayed: 1});
+ }
+ },
+ redisplay: function(id) {
+ // Repopulate HTML select box from cache
+ var box = document.getElementById(id);
+ var node;
+ $(box).empty(); // clear all options
+ var new_options = box.outerHTML.slice(0, -9); // grab just the opening tag
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.displayed) {
+ var new_option = new Option(node.text, node.value, false, false);
+ // Shows a tooltip when hovering over the option
+ new_option.setAttribute("title", node.text);
+ new_options += new_option.outerHTML;
+ }
+ }
+ new_options += '';
+ box.outerHTML = new_options;
+ },
+ filter: function(id, text) {
+ // Redisplay the HTML select box, displaying only the choices containing ALL
+ // the words in text. (It's an AND search.)
+ var tokens = text.toLowerCase().split(/\s+/);
+ var node, token;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ node.displayed = 1;
+ var node_text = node.text.toLowerCase();
+ var numTokens = tokens.length;
+ for (var k = 0; k < numTokens; k++) {
+ token = tokens[k];
+ if (node_text.indexOf(token) === -1) {
+ node.displayed = 0;
+ break; // Once the first token isn't found we're done
+ }
+ }
+ }
+ SelectBox.redisplay(id);
+ },
+ delete_from_cache: function(id, value) {
+ var node, delete_index = null;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.value === value) {
+ delete_index = i;
+ break;
+ }
+ }
+ cache.splice(delete_index, 1);
+ },
+ add_to_cache: function(id, option) {
+ SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1});
+ },
+ cache_contains: function(id, value) {
+ // Check if an item is contained in the cache
+ var node;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.value === value) {
+ return true;
+ }
+ }
+ return false;
+ },
+ move: function(from, to) {
+ var from_box = document.getElementById(from);
+ var option;
+ var boxOptions = from_box.options;
+ var boxOptionsLength = boxOptions.length;
+ for (var i = 0, j = boxOptionsLength; i < j; i++) {
+ option = boxOptions[i];
+ var option_value = option.value;
+ if (option.selected && SelectBox.cache_contains(from, option_value)) {
+ SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1});
+ SelectBox.delete_from_cache(from, option_value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ move_all: function(from, to) {
+ var from_box = document.getElementById(from);
+ var option;
+ var boxOptions = from_box.options;
+ var boxOptionsLength = boxOptions.length;
+ for (var i = 0, j = boxOptionsLength; i < j; i++) {
+ option = boxOptions[i];
+ var option_value = option.value;
+ if (SelectBox.cache_contains(from, option_value)) {
+ SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1});
+ SelectBox.delete_from_cache(from, option_value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ sort: function(id) {
+ SelectBox.cache[id].sort(function(a, b) {
+ a = a.text.toLowerCase();
+ b = b.text.toLowerCase();
+ try {
+ if (a > b) {
+ return 1;
+ }
+ if (a < b) {
+ return -1;
+ }
+ }
+ catch (e) {
+ // silently fail on IE 'unknown' exception
+ }
+ return 0;
+ } );
+ },
+ select_all: function(id) {
+ var box = document.getElementById(id);
+ var boxOptions = box.options;
+ var boxOptionsLength = boxOptions.length;
+ for (var i = 0; i < boxOptionsLength; i++) {
+ boxOptions[i].selected = 'selected';
+ }
+ }
+ };
+ window.SelectBox = SelectBox;
+})(django.jQuery);
diff --git a/src/staticfiles/admin/js/SelectBox.99d0cfd2e80c.js.gz b/src/staticfiles/admin/js/SelectBox.99d0cfd2e80c.js.gz
new file mode 100644
index 0000000..1736d8c
Binary files /dev/null and b/src/staticfiles/admin/js/SelectBox.99d0cfd2e80c.js.gz differ
diff --git a/src/staticfiles/admin/js/SelectBox.js b/src/staticfiles/admin/js/SelectBox.js
new file mode 100644
index 0000000..2073f03
--- /dev/null
+++ b/src/staticfiles/admin/js/SelectBox.js
@@ -0,0 +1,144 @@
+(function($) {
+ 'use strict';
+ var SelectBox = {
+ cache: {},
+ init: function(id) {
+ var box = document.getElementById(id);
+ var node;
+ SelectBox.cache[id] = [];
+ var cache = SelectBox.cache[id];
+ var boxOptions = box.options;
+ var boxOptionsLength = boxOptions.length;
+ for (var i = 0, j = boxOptionsLength; i < j; i++) {
+ node = boxOptions[i];
+ cache.push({value: node.value, text: node.text, displayed: 1});
+ }
+ },
+ redisplay: function(id) {
+ // Repopulate HTML select box from cache
+ var box = document.getElementById(id);
+ var node;
+ $(box).empty(); // clear all options
+ var new_options = box.outerHTML.slice(0, -9); // grab just the opening tag
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.displayed) {
+ var new_option = new Option(node.text, node.value, false, false);
+ // Shows a tooltip when hovering over the option
+ new_option.setAttribute("title", node.text);
+ new_options += new_option.outerHTML;
+ }
+ }
+ new_options += '';
+ box.outerHTML = new_options;
+ },
+ filter: function(id, text) {
+ // Redisplay the HTML select box, displaying only the choices containing ALL
+ // the words in text. (It's an AND search.)
+ var tokens = text.toLowerCase().split(/\s+/);
+ var node, token;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ node.displayed = 1;
+ var node_text = node.text.toLowerCase();
+ var numTokens = tokens.length;
+ for (var k = 0; k < numTokens; k++) {
+ token = tokens[k];
+ if (node_text.indexOf(token) === -1) {
+ node.displayed = 0;
+ break; // Once the first token isn't found we're done
+ }
+ }
+ }
+ SelectBox.redisplay(id);
+ },
+ delete_from_cache: function(id, value) {
+ var node, delete_index = null;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.value === value) {
+ delete_index = i;
+ break;
+ }
+ }
+ cache.splice(delete_index, 1);
+ },
+ add_to_cache: function(id, option) {
+ SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1});
+ },
+ cache_contains: function(id, value) {
+ // Check if an item is contained in the cache
+ var node;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.value === value) {
+ return true;
+ }
+ }
+ return false;
+ },
+ move: function(from, to) {
+ var from_box = document.getElementById(from);
+ var option;
+ var boxOptions = from_box.options;
+ var boxOptionsLength = boxOptions.length;
+ for (var i = 0, j = boxOptionsLength; i < j; i++) {
+ option = boxOptions[i];
+ var option_value = option.value;
+ if (option.selected && SelectBox.cache_contains(from, option_value)) {
+ SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1});
+ SelectBox.delete_from_cache(from, option_value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ move_all: function(from, to) {
+ var from_box = document.getElementById(from);
+ var option;
+ var boxOptions = from_box.options;
+ var boxOptionsLength = boxOptions.length;
+ for (var i = 0, j = boxOptionsLength; i < j; i++) {
+ option = boxOptions[i];
+ var option_value = option.value;
+ if (SelectBox.cache_contains(from, option_value)) {
+ SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1});
+ SelectBox.delete_from_cache(from, option_value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ sort: function(id) {
+ SelectBox.cache[id].sort(function(a, b) {
+ a = a.text.toLowerCase();
+ b = b.text.toLowerCase();
+ try {
+ if (a > b) {
+ return 1;
+ }
+ if (a < b) {
+ return -1;
+ }
+ }
+ catch (e) {
+ // silently fail on IE 'unknown' exception
+ }
+ return 0;
+ } );
+ },
+ select_all: function(id) {
+ var box = document.getElementById(id);
+ var boxOptions = box.options;
+ var boxOptionsLength = boxOptions.length;
+ for (var i = 0; i < boxOptionsLength; i++) {
+ boxOptions[i].selected = 'selected';
+ }
+ }
+ };
+ window.SelectBox = SelectBox;
+})(django.jQuery);
diff --git a/src/staticfiles/admin/js/SelectBox.js.gz b/src/staticfiles/admin/js/SelectBox.js.gz
new file mode 100644
index 0000000..1736d8c
Binary files /dev/null and b/src/staticfiles/admin/js/SelectBox.js.gz differ
diff --git a/src/staticfiles/admin/js/SelectFilter2.32ea9335ce47.js b/src/staticfiles/admin/js/SelectFilter2.32ea9335ce47.js
new file mode 100644
index 0000000..4221778
--- /dev/null
+++ b/src/staticfiles/admin/js/SelectFilter2.32ea9335ce47.js
@@ -0,0 +1,246 @@
+/*global SelectBox, gettext, interpolate, quickElement, SelectFilter*/
+/*
+SelectFilter2 - Turns a multiple-select box into a filter interface.
+
+Requires jQuery, core.js, and SelectBox.js.
+*/
+(function($) {
+ 'use strict';
+ function findForm(node) {
+ // returns the node of the form containing the given node
+ if (node.tagName.toLowerCase() !== 'form') {
+ return findForm(node.parentNode);
+ }
+ return node;
+ }
+
+ window.SelectFilter = {
+ init: function(field_id, field_name, is_stacked) {
+ if (field_id.match(/__prefix__/)) {
+ // Don't initialize on empty forms.
+ return;
+ }
+ var from_box = document.getElementById(field_id);
+ from_box.id += '_from'; // change its ID
+ from_box.className = 'filtered';
+
+ var ps = from_box.parentNode.getElementsByTagName('p');
+ for (var i = 0; i < ps.length; i++) {
+ if (ps[i].className.indexOf("info") !== -1) {
+ // Remove
, because it just gets in the way.
+ from_box.parentNode.removeChild(ps[i]);
+ } else if (ps[i].className.indexOf("help") !== -1) {
+ // Move help text up to the top so it isn't below the select
+ // boxes or wrapped off on the side to the right of the add
+ // button:
+ from_box.parentNode.insertBefore(ps[i], from_box.parentNode.firstChild);
+ }
+ }
+
+ //
+ var selector_chosen = quickElement('div', selector_div);
+ selector_chosen.className = 'selector-chosen';
+ var title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name]));
+ quickElement(
+ 'span', title_chosen, '',
+ 'class', 'help help-tooltip help-icon',
+ 'title', interpolate(
+ gettext(
+ 'This is the list of chosen %s. You may remove some by ' +
+ 'selecting them in the box below and then clicking the ' +
+ '"Remove" arrow between the two boxes.'
+ ),
+ [field_name]
+ )
+ );
+
+ var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name'));
+ to_box.className = 'filtered';
+ var clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_remove_all_link');
+ clear_all.className = 'selector-clearall';
+
+ from_box.setAttribute('name', from_box.getAttribute('name') + '_old');
+
+ // Set up the JavaScript event handlers for the select box filter interface
+ var move_selection = function(e, elem, move_func, from, to) {
+ if (elem.className.indexOf('active') !== -1) {
+ move_func(from, to);
+ SelectFilter.refresh_icons(field_id);
+ }
+ e.preventDefault();
+ };
+ choose_all.addEventListener('click', function(e) {
+ move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to');
+ });
+ add_link.addEventListener('click', function(e) {
+ move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to');
+ });
+ remove_link.addEventListener('click', function(e) {
+ move_selection(e, this, SelectBox.move, field_id + '_to', field_id + '_from');
+ });
+ clear_all.addEventListener('click', function(e) {
+ move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from');
+ });
+ filter_input.addEventListener('keypress', function(e) {
+ SelectFilter.filter_key_press(e, field_id);
+ });
+ filter_input.addEventListener('keyup', function(e) {
+ SelectFilter.filter_key_up(e, field_id);
+ });
+ filter_input.addEventListener('keydown', function(e) {
+ SelectFilter.filter_key_down(e, field_id);
+ });
+ selector_div.addEventListener('change', function(e) {
+ if (e.target.tagName === 'SELECT') {
+ SelectFilter.refresh_icons(field_id);
+ }
+ });
+ selector_div.addEventListener('dblclick', function(e) {
+ if (e.target.tagName === 'OPTION') {
+ if (e.target.closest('select').id === field_id + '_to') {
+ SelectBox.move(field_id + '_to', field_id + '_from');
+ } else {
+ SelectBox.move(field_id + '_from', field_id + '_to');
+ }
+ SelectFilter.refresh_icons(field_id);
+ }
+ });
+ findForm(from_box).addEventListener('submit', function() {
+ SelectBox.select_all(field_id + '_to');
+ });
+ SelectBox.init(field_id + '_from');
+ SelectBox.init(field_id + '_to');
+ // Move selected from_box options to to_box
+ SelectBox.move(field_id + '_from', field_id + '_to');
+
+ if (!is_stacked) {
+ // In horizontal mode, give the same height to the two boxes.
+ var j_from_box = $('#' + field_id + '_from');
+ var j_to_box = $('#' + field_id + '_to');
+ j_to_box.height($(filter_p).outerHeight() + j_from_box.outerHeight());
+ }
+
+ // Initial icon refresh
+ SelectFilter.refresh_icons(field_id);
+ },
+ any_selected: function(field) {
+ var any_selected = false;
+ try {
+ // Temporarily add the required attribute and check validity.
+ // This is much faster in WebKit browsers than the fallback.
+ field.attr('required', 'required');
+ any_selected = field.is(':valid');
+ field.removeAttr('required');
+ } catch (e) {
+ // Browsers that don't support :valid (IE < 10)
+ any_selected = field.find('option:selected').length > 0;
+ }
+ return any_selected;
+ },
+ refresh_icons: function(field_id) {
+ var from = $('#' + field_id + '_from');
+ var to = $('#' + field_id + '_to');
+ // Active if at least one item is selected
+ $('#' + field_id + '_add_link').toggleClass('active', SelectFilter.any_selected(from));
+ $('#' + field_id + '_remove_link').toggleClass('active', SelectFilter.any_selected(to));
+ // Active if the corresponding box isn't empty
+ $('#' + field_id + '_add_all_link').toggleClass('active', from.find('option').length > 0);
+ $('#' + field_id + '_remove_all_link').toggleClass('active', to.find('option').length > 0);
+ },
+ filter_key_press: function(event, field_id) {
+ var from = document.getElementById(field_id + '_from');
+ // don't submit form if user pressed Enter
+ if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) {
+ from.selectedIndex = 0;
+ SelectBox.move(field_id + '_from', field_id + '_to');
+ from.selectedIndex = 0;
+ event.preventDefault();
+ return false;
+ }
+ },
+ filter_key_up: function(event, field_id) {
+ var from = document.getElementById(field_id + '_from');
+ var temp = from.selectedIndex;
+ SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
+ from.selectedIndex = temp;
+ return true;
+ },
+ filter_key_down: function(event, field_id) {
+ var from = document.getElementById(field_id + '_from');
+ // right arrow -- move across
+ if ((event.which && event.which === 39) || (event.keyCode && event.keyCode === 39)) {
+ var old_index = from.selectedIndex;
+ SelectBox.move(field_id + '_from', field_id + '_to');
+ from.selectedIndex = (old_index === from.length) ? from.length - 1 : old_index;
+ return false;
+ }
+ // down arrow -- wrap around
+ if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) {
+ from.selectedIndex = (from.length === from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
+ }
+ // up arrow -- wrap around
+ if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) {
+ from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.selectedIndex - 1;
+ }
+ return true;
+ }
+ };
+
+ window.addEventListener('load', function(e) {
+ $('select.selectfilter, select.selectfilterstacked').each(function() {
+ var $el = $(this),
+ data = $el.data();
+ SelectFilter.init($el.attr('id'), data.fieldName, parseInt(data.isStacked, 10));
+ });
+ });
+
+})(django.jQuery);
diff --git a/src/staticfiles/admin/js/SelectFilter2.32ea9335ce47.js.gz b/src/staticfiles/admin/js/SelectFilter2.32ea9335ce47.js.gz
new file mode 100644
index 0000000..33afcb6
Binary files /dev/null and b/src/staticfiles/admin/js/SelectFilter2.32ea9335ce47.js.gz differ
diff --git a/src/staticfiles/admin/js/SelectFilter2.js b/src/staticfiles/admin/js/SelectFilter2.js
new file mode 100644
index 0000000..4221778
--- /dev/null
+++ b/src/staticfiles/admin/js/SelectFilter2.js
@@ -0,0 +1,246 @@
+/*global SelectBox, gettext, interpolate, quickElement, SelectFilter*/
+/*
+SelectFilter2 - Turns a multiple-select box into a filter interface.
+
+Requires jQuery, core.js, and SelectBox.js.
+*/
+(function($) {
+ 'use strict';
+ function findForm(node) {
+ // returns the node of the form containing the given node
+ if (node.tagName.toLowerCase() !== 'form') {
+ return findForm(node.parentNode);
+ }
+ return node;
+ }
+
+ window.SelectFilter = {
+ init: function(field_id, field_name, is_stacked) {
+ if (field_id.match(/__prefix__/)) {
+ // Don't initialize on empty forms.
+ return;
+ }
+ var from_box = document.getElementById(field_id);
+ from_box.id += '_from'; // change its ID
+ from_box.className = 'filtered';
+
+ var ps = from_box.parentNode.getElementsByTagName('p');
+ for (var i = 0; i < ps.length; i++) {
+ if (ps[i].className.indexOf("info") !== -1) {
+ // Remove
, because it just gets in the way.
+ from_box.parentNode.removeChild(ps[i]);
+ } else if (ps[i].className.indexOf("help") !== -1) {
+ // Move help text up to the top so it isn't below the select
+ // boxes or wrapped off on the side to the right of the add
+ // button:
+ from_box.parentNode.insertBefore(ps[i], from_box.parentNode.firstChild);
+ }
+ }
+
+ //
");
+ addButton = $this.filter(":last").next().find("a");
+ }
+ }
+ addButton.on('click', function(e) {
+ e.preventDefault();
+ var template = $("#" + options.prefix + "-empty");
+ var row = template.clone(true);
+ row.removeClass(options.emptyCssClass)
+ .addClass(options.formCssClass)
+ .attr("id", options.prefix + "-" + nextIndex);
+ if (row.is("tr")) {
+ // If the forms are laid out in table rows, insert
+ // the remove button into the last table cell:
+ row.children(":last").append('
");
+ addButton = $this.filter(":last").next().find("a");
+ }
+ }
+ addButton.on('click', function(e) {
+ e.preventDefault();
+ var template = $("#" + options.prefix + "-empty");
+ var row = template.clone(true);
+ row.removeClass(options.emptyCssClass)
+ .addClass(options.formCssClass)
+ .attr("id", options.prefix + "-" + nextIndex);
+ if (row.is("tr")) {
+ // If the forms are laid out in table rows, insert
+ // the remove button into the last table cell:
+ row.children(":last").append('