bloquear temporariamente a edição por outros usuários

173 views
Skip to first unread message

Fabio C. Barrionuevo da Luz

unread,
Dec 9, 2015, 9:08:34 AM12/9/15
to django...@googlegroups.com
Ola pessoal, antes de eu tentar reinventar a roda, eu gostaria de saber quais as opções vocês conhecem para resolver o seguinte problema:


Eu tenho um determinado model "Documento", que não pode ser editado simultaneamente, ou seja, só pode existir um único usuário que edita uma determinada instancia de "Documento.

1 - Um usuário A abre a pagina de edição de uma instancia de "Documento", que imediatamente tem a funcionalidade de edição para todos os outros usuários.

2 - Uma instancia de "Documento" tem sua edição liberada, apos o usuário A salvar com sucesso ou fechar a janela de edição.

1 é fácil de implementar.
2 também é relativamente fácil de implementar. Eu consigo executar uma tarefa na hora de fechar a janela com o seguinte código Javascript:

function antesDeFechar(evt) {
   // faz um post para alguma url para liberar o documento
}

if (window.addEventListener) {
    window.addEventListener('beforeunload', antesDeFechar, false);
} else {
    window.attachEvent('onbeforeunload', antesDeFechar);
}


Contudo, isso possui alguns problemas como:
* Se por qualquer motivo, como acabar a energia elétrica, travar o browser, essa ação não for executada, eu não conseguirei liberar o documento para que outras pessoas efetuem edição.

alguma ideia?


--
Fábio C. Barrionuevo da Luz
Palmas - Tocantins - Brasil - América do Sul


Blog colaborativo sobre Python e tecnologias Relacionadas, mantido totalmente no https://github.com/pythonclub/pythonclub.github.io .

Todos são livres para publicar. É só fazer fork, escrever sua postagem e mandar o pull-request. Leia mais sobre como publicar em README.md e contributing.md.
Regra básica de postagem:
"Você" acha interessante? É útil para "você"? Pode ser utilizado com Python ou é útil para quem usa Python? Está esperando o que? Publica logo, que estou louco para ler...

Ezequiel Bertti

unread,
Dec 9, 2015, 9:20:30 AM12/9/15
to django...@googlegroups.com

2015-12-09 12:08 GMT-02:00 Fabio C. Barrionuevo da Luz <bna...@gmail.com>:
alguma ideia?

Vc pode fazer um setInterval a cada minuto que chama um ajax mantendo locado o Documento.

Na hora de checar, vc verifica a validade do ultimo lock, se passou X minutos, ele está liberado.

Outro jeito seria usando websocket, mas dependendo de como está sua arquitetura, pode dar muito trabalho para pouca coisa.


--
Ezequiel Bertti
E-Mail: ebe...@gmail.com
Cel: (21) 99188-4860

Fabio C. Barrionuevo da Luz

unread,
Dec 9, 2015, 10:00:53 AM12/9/15
to django...@googlegroups.com
Em 9 de dezembro de 2015 11:19, Ezequiel Bertti <ebe...@gmail.com> escreveu:

2015-12-09 12:08 GMT-02:00 Fabio C. Barrionuevo da Luz <bna...@gmail.com>:
alguma ideia?

Vc pode fazer um setInterval a cada minuto que chama um ajax mantendo locado o Documento.

Na hora de checar, vc verifica a validade do ultimo lock, se passou X minutos, ele está liberado.

Outro jeito seria usando websocket, mas dependendo de como está sua arquitetura, pode dar muito trabalho para pouca coisa.

Obrigado pela ideia Ezequiel.

Eu estou implementando uma app plugável que funcionará de maneira similar ao google docs, por enquanto é só uma prova de conceito.

Não vai ser igual porque google docs usa Transformação Operacional [1], e implementa o próprio motor de edição totalmente em Javascript, e não usa contentEditable pra nada (leia [2] ), porque contentEditable é bugado e inconsistente (leia [3] para entender).

Estou utilizando ckeditor 4.5 para criar a área de edição, e o código gerado por ele é HTML.

Então gerenciar múltiplos usuários editando simultaneamente a mesma instancia de um documento, cujo o conteúdo é HTML fica complicado. 
A solução mais simples que ví foi tentar criar uma especie de bloqueio para editar edições simultâneas.



 


--
Ezequiel Bertti
E-Mail: ebe...@gmail.com
Cel: (21) 99188-4860

--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Caio César Lima Borges

unread,
Dec 10, 2015, 9:04:14 AM12/10/15
to Django Brasil

Marcos Thomaz

unread,
Dec 10, 2015, 2:23:24 PM12/10/15
to django...@googlegroups.com
Tem a opção de utilizar o bloqueio diretamente pelo banco... usando, por exemplo, o descrito em [1]


--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--


Marcos Thomaz da Silva
Analista de Tecnologia da Informação

Fabio C. Barrionuevo da Luz

unread,
Dec 10, 2015, 2:45:59 PM12/10/15
to django...@googlegroups.com
Marcos, eu realmente necessito bloquear totalmente duas pessoas abrirem a view de edição para a mesma instancia de um documento.

A situação é a seguinte:

pessoa A, abre a view de edição do documento X que está na versão 1. pessoa A faz muitas modificações no documento X ( literalmente vai modificar um TextField ),
simultaneamente, e antes de pessoa A salvar suas modificações, uma pessoa B abre a view de edição do documento X que está na versão 1 e faz muitas modificações.

pessoa A salva o documento X, que tem sua versão incrementada para 2.
alguns segundos depois, pessoa B salva o documento X, que tem sua versão incrementada para 3. 

Resultado: Pessoa A perdeu todas as modificações.

É esse o problema que preciso resolver.

Ou seja, enquanto Pessoa A não salvar ou fechar a janela de edição, o documento deve ficar bloqueado para pessoa B editar.


Eu achei algumas apps django que aparentemente tratam esse problema, e estou testando e vendo se algum delas se adequá ao que eu preciso.

https://github.com/theatlantic/django-locking

Marcos Thomaz

unread,
Dec 10, 2015, 2:50:03 PM12/10/15
to django...@googlegroups.com
Ter por exemplo um model que controla os bloqueios, onde ele armazena o id do item bloqueado e também o id da sessão. O id da sessão serviria para verificar se o bloqueio deve ser mantido. Isso porque se a sessão não for válida o bloqueio deixaria de ser avaliado (caso ocorra um evento inesperado, como por exemplo, a máquina reiniciar inesperadamente). 
Reply all
Reply to author
Forward
0 new messages