Browse Source

configura ativação para channels

pull/2523/head
Leandro Roberto 7 years ago
parent
commit
aacadb31fc
  1. 36
      docs/instalacao31.rst
  2. 12
      sapl/rules/apps.py
  3. 4
      sapl/settings.py
  4. 2
      sapl/templates/base/time_refresh_log_test.html

36
docs/instalacao31.rst

@ -145,9 +145,14 @@ Criação da `SECRET_KEY <https://docs.djangoproject.com/es/1.9/ref/settings/#st
SERVER_EMAIL = [Insira este parâmetro] SERVER_EMAIL = [Insira este parâmetro]
SOLR_URL = '[Insira este parâmetro]' SOLR_URL = '[Insira este parâmetro]'
USE_SOLR = '[Insira este parâmetro]'
SOLR_COLLECTION = '[Insira este parâmetro]'
FRONTEND_CUSTOM = [True/False] FRONTEND_CUSTOM = [True/False]
SITE_URL = '[Insira este parâmetro]'
TZ = 'America/Sao_Paulo'
* Uma configuração mínima para atender os procedimentos acima seria:: * Uma configuração mínima para atender os procedimentos acima seria::
@ -282,3 +287,34 @@ Feito isso, e você ativando a variável de ambiente FRONTEND_CUSTOM=True (vide
**Deste ponto em diante, é exigido o conhecimento que você pode adquirir em https://cli.vuejs.org/guide/ e em https://vuejs.org/v2/guide/ para colaborar com sapl-frontend** **Deste ponto em diante, é exigido o conhecimento que você pode adquirir em https://cli.vuejs.org/guide/ e em https://vuejs.org/v2/guide/ para colaborar com sapl-frontend**
**OBS: após a separação do sapl para o sapl-frontend, o conteúdo da pasta static é compilado e minificado. É gerado pelo build do sapl-frontend e não deve-se tentar customizar ou criar elementos manipulando diretamente informações na pasta static.** **OBS: após a separação do sapl para o sapl-frontend, o conteúdo da pasta static é compilado e minificado. É gerado pelo build do sapl-frontend e não deve-se tentar customizar ou criar elementos manipulando diretamente informações na pasta static.**
Django-Channels
===============
Para ativar Django-Channels e a comunicação via websockets utilizada pelo entry-point sessao/online de sapl-frontend coloque no arquivo .env a variável:
USE_CHANNEL_LAYERS = True
Ao ativar o channels, no ambiente de desenvolvimento é necessário ativar um servidor redis. Utilize/Instale o docker e execute:
sudo docker run -p 6379:6379 -d redis:5.0.3-stretch
No caso de ambiente de produção, o container do docker sapl para produção já está configurado com redis.
Testes do channels
------------------
Existe uma interface mínima de comunicação para testes dentro do sapl. Pode ser acessada utilizando:
http://localhost:8001/sapl/time-refresh/
Se clicar em `pull`, o websocket de teste deve responder:
{"message": "OK"}
De outro modo, ficando com esta interface aberta, abra outra janela e altere/inclua/apague algo em seu sapl. Será enviado um json que segue este padrão:
{"message": {"action": "post_save", "id": 16923, "app": "materia", "model": "autoria"}}
O papel de /sapl/time-refresh/ é apenas isto, informar que houve ação no registro `id`, da `app` e `model`. Além de `action` que pode ser `post_save` ou `pre-delete`.

12
sapl/rules/apps.py

@ -4,6 +4,7 @@ import logging
from asgiref.sync import async_to_sync from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer from channels.layers import get_channel_layer
import django.apps import django.apps
from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.management import _get_all_permissions from django.contrib.auth.management import _get_all_permissions
from django.core import exceptions from django.core import exceptions
@ -258,6 +259,9 @@ def cria_usuarios_padrao():
def send_signal_for_websocket_time_refresh(inst, action): def send_signal_for_websocket_time_refresh(inst, action):
if not settings.USE_CHANNEL_LAYERS:
return
if hasattr(inst, '_meta') and not inst._meta.app_config is None and \ if hasattr(inst, '_meta') and not inst._meta.app_config is None and \
inst._meta.app_config.name[:4] == 'sapl': inst._meta.app_config.name[:4] == 'sapl':
@ -272,6 +276,7 @@ def send_signal_for_websocket_time_refresh(inst, action):
map(lambda x: x[3], inspect.stack()))) map(lambda x: x[3], inspect.stack())))
if not funcs: if not funcs:
try:
channel_layer = get_channel_layer() channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send)( async_to_sync(channel_layer.group_send)(
@ -285,6 +290,12 @@ def send_signal_for_websocket_time_refresh(inst, action):
} }
} }
) )
except Exception as e:
logger = logging.getLogger(__name__)
logger.info(_("Erro na comunicação com o backend do redis. "
"Certifique se possuir um servidor de redis "
"ativo funcionando como configurado em "
"CHANNEL_LAYERS"))
def revision_pre_delete_signal(sender, **kwargs): def revision_pre_delete_signal(sender, **kwargs):
@ -296,7 +307,6 @@ def revision_pre_delete_signal(sender, **kwargs):
@receiver(post_save, dispatch_uid='sapl_post_save_signal') @receiver(post_save, dispatch_uid='sapl_post_save_signal')
def sapl_post_save_signal(sender, instance, using, **kwargs): def sapl_post_save_signal(sender, instance, using, **kwargs):
send_signal_for_websocket_time_refresh(instance, 'post_save') send_signal_for_websocket_time_refresh(instance, 'post_save')

4
sapl/settings.py

@ -207,6 +207,10 @@ TEMPLATES = [
WSGI_APPLICATION = 'sapl.wsgi.application' WSGI_APPLICATION = 'sapl.wsgi.application'
ASGI_APPLICATION = "sapl.routing.application" ASGI_APPLICATION = "sapl.routing.application"
USE_CHANNEL_LAYERS = config('USE_CHANNEL_LAYERS', cast=bool, default=False)
CHANNEL_LAYERS = { CHANNEL_LAYERS = {
'default': { 'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer', 'BACKEND': 'channels_redis.core.RedisChannelLayer',

2
sapl/templates/base/time_refresh_log_test.html

@ -27,7 +27,7 @@
document.querySelector('#chat-message-submit').onclick = function(e) { document.querySelector('#chat-message-submit').onclick = function(e) {
chatSocket.send(JSON.stringify({ chatSocket.send(JSON.stringify({
'message': 'O' 'message': 'OK'
})); }));
}; };
</script> </script>

Loading…
Cancel
Save