<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Buenas,</div><div><br></div><div>Respondo entre lineas.</div><div><br></div><div>DISCLAIMER: Hace años que no hago nada con django, pero creo que no va a hacer falta para esto<br></div><div><br><div class="gmail_quote"><div dir="ltr">El vie., 7 dic. 2018 a las 21:49, César García Tapia (<<a href="mailto:tapia@openshine.com">tapia@openshine.com</a>>) escribió:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr" class="gmail-m_4999372727802019062gmail_signature"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>¡Hola!</div><div><br></div><div>Ando buscando un foro que pueda integrar en una aplicación ya existente en Django. "Integrar" en este caso significa:</div><div><br></div><div>- Poder usar nuestro propio modelo de usuario ya existente.</div></div></div></div></div></div></div></div></div></div></blockquote><div><br></div><div>Me resultaría muy raro uno en el que no puedas usar tu propio modelo ya existente (tras los debidos ajustes) o incluso integrar la autenticación con Ldap u OAUTH. Hay que ser muy cutre para hacer una aplicación que no permita esto, otra cosa es que no esté documentado.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr" class="gmail-m_4999372727802019062gmail_signature"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>- Que la sesión creada en el foro se mantenga en la aplicación y viceversa, sin necesidad de autenticarse por separado.</div></div></div></div></div></div></div></div></div></div></blockquote><div><br></div><div>Supongo que el foro se ejecuta en el mismo proceso todo y les vas a dar el mismo dominio para que compartan la cookie de autorización ¿no? Si es así este requisito sobra, si no es así habrá que hacer un poco de "magia", pero se puede hacer.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr" class="gmail-m_4999372727802019062gmail_signature"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>- Idealmente, que si necesitamos alguna funcionalidad custom, podamos hacerlo con plugins, sin necesidad de forkear nuestra propia versión del foro.</div></div></div></div></div></div></div></div></div></div></blockquote><div><br></div><div>¿Qué sería funcionalidad custom? No es lo mismo algo que se pueda hacer con un par de queries en el context request que algo que afecte a los requisitos intrínsecos de un foro. Supongo que ya habrás visto esta página pero la pongo por si acaso:</div><div><br></div><div><a href="https://djangopackages.org/grids/g/forums/">https://djangopackages.org/grids/g/forums/</a></div><div><br></div><div>Aquí se listan algunas funcionalidades muy genéricas: pre-moderación, post-moderación, notificaciones,... Esta lista debería ser la importante para ayudarte para ver qué está cubierto y qué no. Normalmente las cosas demasiado plugables acaban convirtiéndose en infiernos para la escalabildad, casi es mejor buscar un framework que un "lo hago todo pero nada bien".</div><div><br></div><div>De todas formas, si el foro está varias separado en subapps (y estas tienen bajo acoplamiento), es posible que solo forkeando una de ellas tengas lo que necesites minimizando el dolor.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr" class="gmail-m_4999372727802019062gmail_signature"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>- Y ya si el foro fuera medianamente modernillo y no recordara a forocoches o a un phpBB de hace 20 años, me haríais feliz. :-)</div></div></div></div></div></div></div></div></div></div></blockquote><div><br></div><div>Muy mal se tiene que dar la cosa para que no esté hecho con plantillas y pueda personalizarse. Pero si, que por defecto sean bonicas es un plus ;-)<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr" class="gmail-m_4999372727802019062gmail_signature"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><br></div><div>Opciones que hemos medio descartado:</div><div><br></div><div>- Misago [1] parece muy majo, tiene bastante comunidad y el desarrollo está activo, pero es una aplicación completamente standalone. Ni permiten la integración ni se lo plantean a futuro.</div></div></div></div></div></div></div></div></div></div></blockquote><div><br></div><div>"Ni permiten la integración, ni se lo plantean a futuro", ni falta que hace (añadiría yo). La verdad es que tras revisar el código fuente creo que la documentación buena es el código fuente.<br></div><div><br></div><div>Versión fácil:</div><div>-------------------</div><div>Si tiene integración para registrarse con github (como puede verse en el propio foro del proyecto) seguro que puedes cambiar el proceso de registro para que se autentique contra tu otra aplicación y tenerlo en un plis. Eso si, con un nivel de integración con tu aplicación bastante bajo (olvídate de urls del tipo reverse("delaotraapp:index") si no haces un trabajo de duplicación), pero tirando a muy sencillo de mantener.</div><div><br></div><div><a href="https://misago.gitbook.io/docs/socialauth">https://misago.gitbook.io/docs/socialauth</a><br></div><div><br></div><div>Versión dificil:</div><div>--------------------<br></div><div><br></div><div>La integración es más cuestión de documentación que de implementación. Y la verdad es que esa documentación, si fuese el dueño del proyecto, como mucho la pondría en un link o un apéndice para que no echase para atrás a futuros usuarios porque es algo tedioso.</div><div><br></div><div>Si miras el código fuente verás que en efecto usan su propio modelo de usuario:</div><div><a href="https://github.com/rafalp/Misago/blob/master/devproject/settings.py#L159">https://github.com/rafalp/Misago/blob/master/devproject/settings.py#L159</a></div><div><br></div><div>Y es normal que lo hagan porque hacen bastantes cosas con el:</div><div><a href="https://github.com/rafalp/Misago/blob/master/misago/users/models/user.py#L133">https://github.com/rafalp/Misago/blob/master/misago/users/models/user.py#L133</a></div><div><br></div><div>Pero hay algo que da muy buena espina y es que no han hardcodeado el modelo sino que parece que han tenido cuidado:</div><div><a href="https://github.com/rafalp/Misago/blob/master/misago/users/models/user.py#L488">https://github.com/rafalp/Misago/blob/master/misago/users/models/user.py#L488</a></div><div><br></div><div>No conozco tu modelo, pero el objetivo para hacer la integración es adaptar tu modelo con todas las cosas que necesita el foro y hacer la migración. No se si usas directamente el modelo de usuario de django (te va a tocar migrar a tu modelo propio modelo de usuario) o tienes tu propio modelo de usuario (que va a ser más fácil porque "solo" vas a tener que añadirle lo que necesita misago (ojo cuidado que nos complica la mantenibilidad, pero por lo demás todo va a quedar integrado a tope).</div><div><br></div><div>Ojito que misago usa su propio authentication backend:</div><div><a href="https://github.com/rafalp/Misago/blob/master/misago/users/authbackends.py#L32">https://github.com/rafalp/Misago/blob/master/misago/users/authbackends.py#L32</a></div><div><br></div><div>No parece nada del otro mundo, pero es posible que si te calzas ese "truqui" del select related que hace se degraden las queries al foro. Apúntate también todos los modelos relacionados con el usuario por si te toca crearlos en el script de migrate. Yo me apunto el truqui ese del select-related por si me toca hacer una app django un día de estos, me ha gustado para quitar queries innecesarias.<br></div><div><br></div><div>Y hablando de los scripts de migrate, que sepas que cuando se lancen los scripts de migrate al dar de alta las apps de misago en tu proyecto se van a crear las foreign keys según tengas configurado tus settings, por si pensabas hacer una salida en oculto del foro y luego migrar el modelo de usuario más adelante cuando estés convencido con el resultado:</div><div><a href="https://github.com/rafalp/Misago/blob/master/misago/users/migrations/0001_initial.py#L181">https://github.com/rafalp/Misago/blob/master/misago/users/migrations/0001_initial.py#L181</a></div><div><br></div><div>Si quieres hacer salidas en oculto te recomiendo un feature flipper (django-waffle me hizo feliz en su día):</div><div><a href="https://djangopackages.org/grids/g/feature-flip/">https://djangopackages.org/grids/g/feature-flip/</a></div><div><br></div>También quedaría el tema de adaptar el registro de usuarios (que supongo querrás unificar en un solo sitio). Esto sería algo que corre también de tu cuenta personalizar. Teniendo un api como tienen seguro que puedes integrarlo fácil en tu proceso de registro. Y sería cosa de capar esa funcionalidad del foro.<br></div><div class="gmail_quote"><br></div><div class="gmail_quote">Luego está el tema de personalizar estilos de templates (evitar el efecto frankenweb), incluir urls, escribir los nuevos settings, ... Y todo esto teniendo en cuenta la que se te puede liar en cada actualización porque tienes que repasar las personalizaciones. Cuanta más integración quieras, más dolor al actualizar. Hay cosas que parecen fáciles de integrar, como el tema de añadir más secciones a la visualización del profile, a la edición de profile o pestañas en el listado de usuarios (por ejemplo filtrar por departamento). Y a pesar de eso está tan penósamente documentado que lo vi mirando el código, es posible que haya más cosas fáciles de personalizar que no te obliguen a hacer forks.<br></div><div class="gmail_quote"><br></div>Pero vamos todo esto es algo que podría llevarte un par de días según algunos, vamos a decir un par de semanas para que esté todo bien pulido (testeos de migración, personalizar templates, empollarse bien el proyecto, revisar que no cause problemas en tu app,...):</div><div><a href="https://misago-project.org/t/looking-for-a-forum-solution/564/post/2725/">https://misago-project.org/t/looking-for-a-forum-solution/564/post/2725/</a></div><div><br></div><div>No he mirado los demás. Pero viendo el código de este así en un ratillo parece bastante posible hacer lo que pides, que también es cierto que a nivel funcional has dicho bastante poco. Gracias por poner el link, me ha gustado mucho curiosear el código y ver como resuelve algunos temas difíciles con bastante calidad ;-)<br></div><div><div class="gmail_quote"><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr" class="gmail-m_4999372727802019062gmail_signature"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>- Spirit [2] tiene bastantes estrellas en github, pero apenas tiene documentación. No he encontrado la forma de ver si permite hacer algo de lo que necesitamos.</div><div>- Django-machina [3] parece que sí permite cierto nivel de integración, pero la mecánica del foro es algo viejuna. A pesar de eso, parece la opción más viable.</div><div><br></div><div>Por otro lado, otra opción es usar otro software, tipo Discourse, y tratar de integrarlo con un single sign-on o algo parecido, pero preferiría evitarlo. Implicaría desplegar un entorno completamente distinto, otra base de datos, programar extensiones en otro lenguaje y framework... No suena a buena idea.</div><div><br></div><div>A ver si se os ocurre algo que podamos usar. ¡¡Muchas gracias!!</div><div><br></div><div>César.</div><div><br></div><div>[1] <a href="https://github.com/rafalp/misago" target="_blank">https://github.com/rafalp/misago</a></div><div>[2] <a href="https://github.com/nitely/Spirit" target="_blank">https://github.com/nitely/Spirit</a><br>[3] <a href="https://github.com/ellmetha/django-machina" target="_blank">https://github.com/ellmetha/django-machina</a></div></div></div></div></div></div></div></div></div></div>
_______________________________________________<br>
Asociación Python España: <a href="http://www.es.python.org/" rel="noreferrer" target="_blank">http://www.es.python.org/</a><br>
Python Madrid: <a href="http://www.python-madrid.es/" rel="noreferrer" target="_blank">http://www.python-madrid.es/</a><br>
Madrid mailing list<br>
<a href="mailto:Madrid@lists.es.python.org" target="_blank">Madrid@lists.es.python.org</a><br>
<a href="https://lists.es.python.org/listinfo/madrid" rel="noreferrer" target="_blank">https://lists.es.python.org/listinfo/madrid</a><br>
</blockquote></div></div></div></div></div></div></div></div></div></div></div></div>