Giter VIP home page Giter VIP logo

saap's Introduction

SAAP - Sistema de Apoio à Atividade Parlamentar

Esta página reúne informações úteis sobre o desenvolvimento atual do SAAP.

Isso significa que toda a informação aqui apresentada aplica-se apenas para a versão 3.1.0 e superior.

Desenvolvimento

Instalação do Ambiente de Desenvolvimento

Deploy

Deploy SAAP com Nginx + Gunicorn

Docker

Container SAAP + Postgres

Suporte aos utilizadores

Sala do Discord "Somos Interlegis" sobre o SAAP

Tradução

Instruções para Tradução

Implementação

Instruções para Implementação e Testes

Atualização de release

Instruções para Atualização

Orientações gerais sobre o GitHub

Instruções para GitHub

Issues

  • Abra todas as questões sobre o desenvolvimento atual no GitHub Issue Tracker.
  • Você pode escrever suas issues em Português ou Inglês (ao menos por enquanto).

Referências

Estes guias, o projeto e as configurações do ambiente foram desenvolvidos, corrigidos e aperfeiçoados a partir do fork de Jonatha Cardoso (ex-servidor da Câmara Municipal de Novo Hamburgo/RS).

O mesmo teve como ponto de partida o projeto original do SAAP, desenvolvido por Leandro Silva (servidor na Câmara Municipal de Jataí/GO) e Ramiro Luz (servidor na Câmara Municipal de Curitiba/PR).

Para testar o SAAP, basta acessar a versão de demonstração.

saap's People

Contributors

dependabot[bot] avatar jeanferri avatar leandrojatai avatar ojonathacardoso avatar ramiroluz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

saap's Issues

Owner/modifier/workspace da agenda

O módulo de agenda não está com os campos de owner, modifier, created e modified, pois não usa o SAAP auditoria. É importante não apenas conseguir isto, mas também ajustar a sistemática da agenda, que tá usando o generic.ListView, diferente dos demais, o que acabou por fazer algumas engembrações - quem ver o código vai compreender. Não é grave, mas acho pertinente observar isto.

Correções de erros na instalação

Um dos grandes problemas que enfrentei durante a instalação do projeto que está no GitHub do Interlegis foi a quantidade de erros, toda vez que tentava rodar o servidor. Foram dias testando e resolvendo, até que funcionasse. Desta forma - até por não saber método melhor para resolver isto - decidi por copiar os arquivos/pastas alteradas na hora da instalação, conforme explicado no respectivo item do tutorial de Instalação.

Porém, é óbvio que sei que o melhor seria resolver todos esses erros, sem que precisasse fazer essa "gambiarra". Porém, esse é um trabalho, ao meu ver, árduo, que não tem, a princípio, impacto para o usuário final, mas é importante para quem trabalha no back-end da aplicação.

Gestão de Gabinete (Bauru): Aniversários

Já é possível extrair aniversariantes no SAAP, mas seria interessante, até baseada na tela de agenda, um módulo para ver os aniversariantes, em formato de calendário, com algumas outras funcionalidades relacionadas.

Resultados duplicados nas pesquisas em campos Multiple choice

Embora estejam em uso há muitos meses, agora comecei a perceber que as pesquisas em campos que usam Multiple choice, o banco ao invés de pegar os registros com "distinct", está exibindo-os X vezes.
Por exemplo, filtrando contatos de 2 grupos, se eu tenho um contato nos dois, ele aparecerá duas vezes.

Alternância entre layout antigo e novo

Em 2019, eu atualizei o layout do SAAP, para refletir às atualizações do SAPL.

O probleema que começou a acontecer, às vezes, é que após uma atualização, o layout antigo volta - o que fez com que eu colocasse, nas instruções de atualização, os comandos de collect_static.

O certo, óbvio, é que isso não aconteça, e que sempre o layout novo e atual seja exibido.

ListWithSearch recarrega filtros em branco

Diferente das telas dos relatórios, que utilizam FilterSet, as telas de pesquisa de contatos e processos usa o ListWithSearch.
Na prática, o que acontece é que ao digitar os filtros e pesquisar, ao recarregar a lista, os filtros retornam todos em branco - com exceção do filtro do nome. Procurei no código e fiz diversos testes, sem sucesso.
Como podem ver, na URL os dados aparecem corretamente, porém não carrega no form.

image

Relatório agrupado de contatos

Criar relatório agrupado por bairros, por grupos, por cidades, sexo... Apenas com os contadores.

Exemplo: Contatos por bairro, contatos por grupos, contatos por cidades, por sexo, por formação acadêmica, etc...

Importação automática de dados durante a instalação

Durante a instalação, há uma série de dados básicos que são importados no banco, como, por exemplo, nomes de partidos, diversos tipos, tabela de estados e municípios, e etc. Acho que seria interessante que o processo fosse automatizado, sem necessitar da intervenção do usuário. Algo que, no primeiro "migrate", já haja essa importação. Tentei pesquisar a respeito e não encontrei nada.

Erro durante geração da secret_key na instalação em Ubuntu 20.04

Durante a instalação em Ubuntu 20.04, na hora de rodar o comando para gerar a secret_key, aparece o seguinte erro:

Traceback (most recent call last):
File "./manage.py", line 10, in
execute_from_command_line(sys.argv)
File "/var/interlegis/.virtualenvs/saap/lib/python3.8/site-packages/django/core/management/init.py", line 353, in execute_from_command_line
utility.execute()
File "/var/interlegis/.virtualenvs/saap/lib/python3.8/site-packages/django/core/management/init.py", line 327, in execute
django.setup()
File "/var/interlegis/.virtualenvs/saap/lib/python3.8/site-packages/django/init.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/var/interlegis/.virtualenvs/saap/lib/python3.8/site-packages/django/apps/registry.py", line 108, in populate
app_config.import_models(all_models)
File "/var/interlegis/.virtualenvs/saap/lib/python3.8/site-packages/django/apps/config.py", line 202, in import_models
self.models_module = import_module(models_module_name)
File "/usr/lib/python3.8/importlib/init.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in _call_with_frames_removed
File "/var/interlegis/.virtualenvs/saap/lib/python3.8/site-packages/django/contrib/auth/models.py", line 4, in
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
File "/var/interlegis/.virtualenvs/saap/lib/python3.8/site-packages/django/contrib/auth/base_user.py", line 49, in
class AbstractBaseUser(models.Model):
RuntimeError: class not set defining 'AbstractBaseUser' as <class 'django.contrib.auth.base_user.AbstractBaseUser'>. Was classcell propagated to type.new?

Ajuste na quantidade de registros exibidos na lista filtrada

Não existe uma funcionalidade que permita personalizar, assim como há em muitos sistemas, a quantidade de registros que se deseja exibir por página nas listas filtradas. O padrão, se não me engano, foi aumentado para 100, mas há muitas pesquisas que passam de 5 mil contatos. Porém, às vezes há pesquisas que 50, 60, que poderiam ser divididas em duas ou três.
Sugiro definir as quantidades de 10, 20, 30, 50, 100 ou 250.

image
image

Erro ao usar o comando "python manage.py generate_secret_key"

Quando executo o comando: "python manage.py generate_secret_key"

dá o seguinte erro e não gera a Secret_Key:

Traceback (most recent call last):
File "manage.py", line 10, in
execute_from_command_line(sys.argv)
File "/root/.virtualenvs/saap/lib/python3.5/site-packages/django/core/management/init.py", line 353, in execute_from_command_line
utility.execute()
File "/root/.virtualenvs/saap/lib/python3.5/site-packages/django/core/management/init.py", line 327, in execute
django.setup()
File "/root/.virtualenvs/saap/lib/python3.5/site-packages/django/init.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/root/.virtualenvs/saap/lib/python3.5/site-packages/django/apps/registry.py", line 108, in populate
app_config.import_models(all_models)
File "/root/.virtualenvs/saap/lib/python3.5/site-packages/django/apps/config.py", line 202, in import_models
self.models_module = import_module(models_module_name)
File "/root/.virtualenvs/saap/lib/python3.5/importlib/init.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 986, in _gcd_import
File "", line 969, in _find_and_load
File "", line 958, in _find_and_load_unlocked
File "", line 673, in _load_unlocked
File "", line 665, in exec_module
File "", line 222, in _call_with_frames_removed
File "/root/.virtualenvs/saap/lib/python3.5/site-packages/social/apps/django_app/default/models.py", line 1, in
from social_django.models import AbstractUserSocialAuth, UserSocialAuth, Nonce, Association, Code, DjangoStorage
ImportError: No module named 'social_django'

Criar sistema de agenda e visitas

Creio que para deixar o SAAP completo para os gabinetes, seria importante recriar o sistema de agenda, não apenas para compromissos do vereador e gabinete, mas também pela possibilidade de associar com um contato.

A tela de processos tem como objetivo anotar qualquer processo que o gabinete queira acompanhar - até por isso, por demanda dos mesmos, foram inseridos diversos campos. Porém, seria interessante, quem sabe, ter uma tela separada de visitas, apenas com os campos relacionados a tal. Um processo pode ter diversas visitas ligadas a ele.

Documentos para referência:
SAAP
Manual do SAAP
Guia do usuário
Manual de referência

image

Revisar e reordenar header dos arquivos python

Verifiquei que os arquivos, principalmente os models, views, forms, reports..., estão com os headers bagunçados, quem sabe com chamadas desnecessárias. É importante revisar isto.
Também, creio que há outras questões a serem revisadas, como códigos comentados não utilizados, métodos/funções/classes não usadas...

Fazer guia de ajuda/tutorial de uso

Após anos de uso, decidi compilar todas as orientações de uso do SAAP em um curso que estamos montando e preparando pra disponibilizar na Escola do Legislativo da Câmara de Novo Hamburgo.

Porém, assim como no SAPL, quero colocar um tutorial de ajuda no SAAP, clicando naquele "?" no alto da página, baseando-me no conteúdo deste curso.

Mensagem de DEFAULT_PAGINATION_CLASS

Quando rodo o runserver, para testes, aparece a seguinte mensagem:

(rest_framework.W001) You have specified a default PAGE_SIZE pagination rest_framework setting,without specifying also a DEFAULT_PAGINATION_CLASS. HINT: The default for DEFAULT_PAGINATION_CLASS is None. In previous versions this was PageNumberPagination. If you wish to define PAGE_SIZE globally whilst defining pagination_class on a per-view basis you may silence this check.

Não interfere, aparentemente, em nada relacionado ao sistema. Porém, acho necessário ver se não é algum erro ou algo importante a ser considerado.

Pesquisa automática e preenchimento por CEP/Endereço

Ao mexer no código, em 2018, vi que havia uma função exatamente para que, ao preencher o CEP, os demais dados fossem preenchidos - não por consulta em Correios, mas pela base de dados. Cheguei a fazer testes, ver os arquivos, mas não consegui identificar e fazer o mecanismo funcionar.

Dockerizar o SAAP

Ainda em 2018, ao ter o SAAP pronto, tentei criar um Docker do mesmo, porém sem sucesso. Decidi usá-lo como Deploy. Porém, assim como SAPL, é importante que o SAAP tenha sua versão dockerizada, até para facilitar o uso por outras Casas Legislativas.

Para ter como base, anexo o Dockerfile que usei à época, mas sem sucesso. Saliento que algumas modificações que fiz não estão nesse arquivo.
Dockerfile.zip

Erro ao rodar manage.py reset_db

Ao rodar o comando:
python manage.py reset_db

Ocorre o seguinte erro:
...lib/python3.4/site-packages/django_extensions/management/commands/reset_db.py", line 152, in handle
cursor.execute(drop_query)

psycopg2.OperationalError: ERRO: banco de dados "saap" está sendo acessado por outros usuários
DETAIL: Há 1 outra sessão utilizando o banco de dados.

Consultando o banco é possível ver que existem duas conexões abertas pelo manage.py, uma delas para o Login Social. Provavelmente é a causa do problema.

postgres=# select usename, application_name, datname, client_addr, client_hostname, client_port, query from pg_stat_activity;

usename | application_name | datname | client_addr | client_hostname | client_port | query
----------+------------------+-----------+-------------+-----------------+-------------+------------------------------------------------------------------------------------------------------------------------
postgres | psql | postgres | | | -1 | select usename, application_name, datname, client_addr, client_hostname, client_port, query from pg_stat_activity;
saap | | saap | ::1 | | 60404 | SELECT "auth_group"."id", "auth_group"."name" FROM "auth_group" WHERE "auth_group"."name" = 'Usuários de Login Social'
saap | | template1 | ::1 | | 60405 | SET default_transaction_isolation TO DEFAULT
(3 registros)

Isolar, generalizar e renomear globalrules em um projeto reutilizável

issues starter:

  • Isolar em um projeto independente reutilizável por outros projetos
  • generalizar geração de grupos transferindo as variáveis de ambiente de grupo para a estrutura de rules_patterns a ser criadas em arquivos rules.py das apps de outros projetos
  • mapear e documentar criação de rules_patterns
  • usar mecanismos de, possivelmente, post_migrate para mapeamento e execução dos arquivos rules.py através da classe Rules.
  • refatorar classe rules para tratar retiradas de permissão em rules.py pelo desenvolvimento
  • renomear globalrules para algo que contemple e integre as rules, o crud original e o crud_custom
  • evoluir essa uniao (globalrules + crud + crud_custom) para contemplar:
    • a arquitetura atual de abstração;
    • a abstração do djangorestframework.

Criar manual de administração

Criar manual ou página com instruções para administrar o sistema.

Tópicos:

  • Criar super usuário
  • Criação dos registros iniciais de áreas de trabalho, usuários, impressos, etc ...
  • Instruções para final de legislatura, inicio de nova legislatura.

Revisar versão mobile do SAAP

Alguns gabinetes já usaram versão mobile do SAAP, mas nunca foi realmente revisado e verificado se está de acordo, se precisa de alguma modificação...
O SAPL já está bem compatível em mobile, mas o SAAP, realmente precisa dessa revisão e, se necessário, correção.

Alerta no runserver após atualizar pyyaml

Ao rodar o runserver para testes, o mesmo exibe o seguinte alerta.

/var/interlegis/saap/saap/core/templatetags/menus.py:58: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
menu = yaml.load(rendered)

Revisar dependências

Em meu GitHub pessoal, e aqui mesmo no repo do Interlegis, há alertas de problemas com versões desatualizadas das dependências instaladas pelo pip em requirements.txt.

É necessário revisar tais dependências - inclusive a versão do Django - e fazer as devidas atualizações e testes, a fim de deixar o SAAP mais seguro e atualizado.

image

image

Criar tela de erro 404 e 500

Atualmente, a tela exibida é a padrão do servidor, porém, assim como no SAPL, é interessante que seja criada a tela de erros.

Erro ao acessar Dados auxiliares - Partidos.

Ao acessar Dados auxiliares - Partidos com o usuário admin, ocorre essa exceção.

Ainda não foram cadastradas áreas de trabalho nem operadores.

http://127.0.0.1:8000/sistema/parlamentar/partido/

Environment:

Request Method: GET
Request URL: http://127.0.0.1:8000/sistema/parlamentar/partido/

Django Version: 1.9.9
Python Version: 3.5.2
Installed Applications:
('django_admin_bootstrapped',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'social.apps.django_app.default',
'django_extensions',
'djangobower',
'bootstrap3',
'crispy_forms',
'easy_thumbnails',
'image_cropping',
'floppyforms',
'sass_processor',
'rest_framework',
'taggit',
'modelcluster',
'saap.core',
'saap.cerimonial',
'saap.globalrules')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware')

Traceback:

File "/home/ramiro/.pyenv/versions/3.5.2/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response

  1.                 response = self.process_exception_by_middleware(e, request)
    

File "/home/ramiro/.pyenv/versions/3.5.2/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response

  1.                 response = wrapped_callback(request, _callback_args, *_callback_kwargs)
    

File "/home/ramiro/.pyenv/versions/3.5.2/lib/python3.5/site-packages/django/views/generic/base.py" in view

  1.         return self.dispatch(request, _args, *_kwargs)
    

File "/home/ramiro/python/saap/saap/globalrules/crud_custom.py" in dispatch

  1.             self, request, _args, *_kwargs)
    

File "/home/ramiro/.pyenv/versions/3.5.2/lib/python3.5/site-packages/django/contrib/auth/mixins.py" in dispatch

  1.     return super(PermissionRequiredMixin, self).dispatch(request, _args, *_kwargs)
    

File "/home/ramiro/.pyenv/versions/3.5.2/lib/python3.5/site-packages/django/views/generic/base.py" in dispatch

  1.     return handler(request, _args, *_kwargs)
    

File "/home/ramiro/python/saap/saap/core/views.py" in get

  1.             self, request, _args, *_kwargs)
    

File "/home/ramiro/.pyenv/versions/3.5.2/lib/python3.5/site-packages/django/views/generic/list.py" in get

  1.     self.object_list = self.get_queryset()
    

File "/home/ramiro/python/saap/saap/globalrules/crud_custom.py" in get_queryset

  1.         list_field_names = self.list_field_names
    

File "/home/ramiro/python/saap/saap/crispy_layout_mixin.py" in list_field_names

  1.     rows = self.get_layout()[0][1:]
    

File "/home/ramiro/python/saap/saap/crispy_layout_mixin.py" in get_layout

  1.     return read_layout_from_yaml(yaml_layout, self.layout_key)
    

File "/home/ramiro/python/saap/saap/crispy_layout_mixin.py" in read_layout_from_yaml

  1. base = yaml[key]
    

Exception Type: KeyError at /sistema/parlamentar/partido/
Exception Value: 'Partido'

Criação de formulário para criar grupo de contatos

A tela de Grupo de contatos é bem simples e fácil de operar, porém, traz um problema: a escassez de opções para pesquisar contatos e criar um grupo. Eu só posso pesquisar por nome. Se eu quisesse criar um grupo com homens que não possuem data de nascimento, eu não conseguiria.
Por diversas vezes achei que era desnecessário isto, mas no dia-a-dia, percebi que essa era uma demanda constante dos usuários.
Por mais que hajam diversos filtros nos outros campos, seria interessante agregar mais filtros na criação de grupos de contatos - até também passando a ideia de um "preset" pra busca.
Uma ideia seria criar um botão "Criar grupo" direto na tela de contatos, a partir da seleção feita no filtro.

image

Importação de dados por planilha

Sem dúvida, o maior trabalho que tivemos quando da implantação foi a importação dos contatos. O processo era totalmente manual, importando por planilha, porém revisando o CSV e construindo o SQL quase que artesanalmente, dada a falta de normalização dos dados armazenados pela maioria dos gabinetes.
Desta forma, penso que seria fundamental haver um sistema de importação através de arquivo XLS/ODS/CSV.

Sugiro que na importação sejam definidas quais colunas são cada campo. Também forçar o usuário quebrar numero e complemento, delimita campos, converter telefone e CEP - uma das principais dificuldades. Na verdade, antes do sistema, era uma bagunça completa, e o sistema, devido ao banco e ao sistema, trouxe organização. A conversão de dados de telefone e CEP, e principalmente a quebra do endereço, foi um trabalho quase desumano.

Para ter uma ideia, anexo três arquivos. Um é o modelo onde os gabinetes deveriam preencher os dados, o outro é a conversão dos dados em comandos SQL e o último é a correção/conversão de CEPs e Telefones.

modelo_contatos.xlsx
telefone_cep.xlsx
conversao_banco.xlsx
arquivos_originais_ods.zip

Quebra de sistema

Após uma atualização automática do servidor, deu erro no Gunicorn que impediu de subir o sistema, impossibilitando o uso do SAAP.
A alternativa foi instalar tudo do zero, quando encontramos erro na instalação do Node.js e o Bower.
Ubuntu Server 20.04

Refatorar e revisar HTML e CSS

Já estava desorganizado quando iniciei a mexer no projeto, em 2018. Porém, com o passar do tempo, o mesmo ficou mais desorganizado, além de haver, aparentemente, muito código repetido no CSS. Seria necessário revisar e reorganizar os arquivos CSS.
Também há algum código nos arquivos Python que não tem uso - vários comentados - e que poderiam ser revisados para, conforme a necessidade, serem removidos.

Erro na geração da chave

De acordo com Jeferson Souza da Silva (Técnico em Informática na CM de Ourilândia do Norte) e com Délio Azeredo (Diretor de TI da CM de Marabá), a instalação do SAAP está com problema, na hora de gerar a chave secreta, conforme imagens em anexo.
saap
captura erro imp saap

Tratar configurações iniciais não definidas.

Quando uma variável inicial não for definida, ou não existir no banco, as opções nos formulários não devem ser definidas e uma mensagem deve ser registrada no log.

INITIAL_VALUE_FORMS_UF
INITIAL_VALUE_FORMS_MUNICIPIO
INITIAL_VALUE_FORMS_CEP

Criar instruções de deploy

Criar instruções separadas para deploy.

  • Em servidor próprio.
  • Em hospedagens externas tradicionais, DigitalOcean, Heroku, Locaweb Jelastic, Configr, etc ...

Criar sistema de mala direta e geração de documentos

Conforme pesquisei, as versões anteriores do SAAP possuíam mecanismo de mala direta. Cabe salientar que gabinetes me perguntaram sobre isto, e a única funcionalidade que pude fazer para "suprir" essa necessidade foi a geração, no relatório de contatos, de uma lista dos mesmos em formato de e-mail, para ser colado no "Para" de qualquer sistema de e-mail.
Porém, acho fundamental o SAAP ter novamente tal funcionalidade.

Também seria interessante a possibilidade de ter um sistema que gere, assim como na Mala Direta do Word, um documento de mesmo conteúdo, alterando apenas alguns dados, determinados pelo usuário

Para isto, deixo em anexo como base os manuais antigos do SAAP.

SAAP
Manual do SAAP
Guia do usuário
Manual de referência

image
image

Erro ao editar/excluir Área de trabalho dentro do SAAP

Embora tenha conseguido arrumar a tela de área de trabalho e operadores dentro do SAAP, a mesma tem um problema que não consegui resolver. Ao editar ou excluir uma área de trabalho, aparece a mensagem abaixo. Tentei pesquisar, descobrir, mas não tive sucesso.

image

Mensagens de erro personalizadas

No projeto original do Interlegis, havia um arquivo 403.html, mas que não era chamado de nenhuma forma. Na verdade, não há nenhum código pra exibir uma mensagem personalizada de erro, seja para o NGINX ou para o Django/Gunicorn. Apenas as mensagens padrão de "Bad request" e "Not found"

Gestão de Gabinete (Bauru): Gestão de documentos

Algo que pode ser interessante é a gestão de documentos, um módulo para armazenar documentos importantes. Claro, isso deve ser discutido, pois pode impactar a administração do servidor, se começarem a armazenar muitos arquivos, arquivos grandes, inúteis, etc...

Restrição de inclusão de usuários em áreas de trabalho

Atualmente o sistema não restringe o cadastro de um operador em mais de uma área de trabalho (AT), mas não sabe lidar com o caso de um usuário estar em mais de uma AT.

Existem duas alternativas a implementar:

  1. Não permitir que um usuário seja incluso em mais de uma AT. Isso é mais fácil de fazer e se resume a uma validação na inclusão/edição de operadores
  2. Caso o usuário esteja em mais de uma AT, ao logar deverá ser dado a ele a possibilidade de em que AT sua sessão será iniciada... tal solução envolve uma mudança no crud_custom na app globalroles e é bem mais complexa que a alternativa 1.

Simplificar ambiente de desenvolvimento

O ambiente de desenvolvimento não precisa de servidor Web nem servidor de banco de dados.

Ainda, o comando manage.py não funciona pois falta uma configuração para o decouple, seria necessário avaliar se a configuração não poderia ter um valor default caso o arquivo .env não exista.

decouple.UndefinedValueError: INITIAL_VALUE_FORMS_UF option not found and default value was not defined.

Reorganizar reports.py

O arquivo de reports está com os campos desorganizados e desordenados. Para facilitar na manipulaçao do código, é melhor fazer a organização.

Erro na tela de criar usuários - Django Admin

Ao tentar adicionar/editar usuários no Django Admin, conforme informado pelo @marciovilasboas, verificou-se que a tela dava erro de

Após testes, identificamos que, por algum motivo, o arquivo admin.py do pacote image-cropping estava diferente, pois deveria ser assim:

from __future__ import unicode_literals

from .utils import get_backend


class ImageCroppingMixin(object):
    def formfield_for_dbfield(self, db_field, **kwargs):
        crop_fields = getattr(self.model, 'crop_fields', {})
        if db_field.name in crop_fields:
            target = crop_fields[db_field.name]
            kwargs['widget'] = get_backend().get_widget(db_field, target, self.admin_site)

        return super(ImageCroppingMixin, self).formfield_for_dbfield(db_field, **kwargs)

image

Migrar de "cerimonial" para "SAAP"

Por algum motivo, tanto no banco de dados quanto no código, existem os aplicativos "core" e "cerimonial", ao invés de "core" e "saap". Desta forma, acho mais lógico alterar para "saap". É estranho pesquisar na tabela "cerimonial_contatos"...

image
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.