|
| 1 | +## Cómo contribuir a este proyecto |
| 2 | + |
| 3 | +Si quieres contribuir a este proyecto, hay muchas cosas que puedes hacer. |
| 4 | +Tenemos una etiqueta en los _issues_ del [repositorio de este |
| 5 | +proyecto](https://github.com/pythoncanarias/pycan-web/issues) para |
| 6 | +[aquellas tareas que pensamos que son un buen punto de partida](https://github.com/pythoncanarias/pycan-web/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) |
| 7 | +para empezar a contribuir |
| 8 | +al desarrollo. |
| 9 | + |
| 10 | +Además de las tareas propias de desarrollo, hay muchas otras formas de ayudar, |
| 11 | +una de las principales es aportar nuevas ideas para mejorar la web, así |
| 12 | +como avisarnos de cualquier error que encuentres en la misma. |
| 13 | + |
| 14 | +Para contribuir como desarrollador, en el documento [README.md](README.md) se |
| 15 | +explica cómo montar un entorno de desarrollo propio usando _Docker_ y |
| 16 | +_Docker Compose_. |
| 17 | + |
| 18 | +## Notas para los desarrolladores |
| 19 | + |
| 20 | +El desarrollo consiste en una aplicación Django, y algunas partes de _frontend_ |
| 21 | +escritas en _javascript_ plano. Por el momento no nos hemos decidido a usar |
| 22 | +ningún _framework_, aunque algunos del equipo tenemos una cierta preferencia |
| 23 | +por [vue.js](https://vuejs.org/). |
| 24 | + |
| 25 | +Se ha intentado seguir en lo posible las prácticas habituales en Django, pero |
| 26 | +en algunos casos se han realizado modificaciones sobre lo que podría |
| 27 | +considerarse un proyecto Django _estándar_. Explicaremos estas divergencias en las |
| 28 | +siguientes secciones. |
| 29 | + |
| 30 | +### Organización de código de las aplicaciones de Django |
| 31 | + |
| 32 | +Como hay muchas aplicaciones o _apps_, las tenemos todas todas bajo una única |
| 33 | +carpeta `apps`, para reducir la cantidad de _ruido_ en |
| 34 | +la carpeta raíz. Si crees necesario añadir una nueva _app_, créala por favor al |
| 35 | +mismo nivel que las actuales. |
| 36 | + |
| 37 | +### Estilo de código |
| 38 | + |
| 39 | +Intentamos adaptarnos lo más posible a la recomendaciones del |
| 40 | +[PEP-8](https://www.python.org/dev/peps/pep-0008/), pero somos más flexibles en |
| 41 | +el tema de la longitud de caracteres de la línea, intentamos mantenerlo por |
| 42 | +debajo de 96 caracteres por línea. |
| 43 | + |
| 44 | +Algunos de nosotros usamos la herramienta [black](https://github.com/psf/black) |
| 45 | +para formatear el código, pero no se considera obligatorio. |
| 46 | + |
| 47 | +### Dependecias |
| 48 | + |
| 49 | +Intentamos mantener el número de dependencias bajo. Un alto número de |
| 50 | +dependencias frena las actualizaciones generales, que es un objetivo que |
| 51 | +queremos mejorar. Eso no significa que no se acepten nuevas dependencias, pero |
| 52 | +sí que pedimos que analices primero si las ventajas de usar esa nueva librería |
| 53 | +realmente nos aportan una funcionalidad importante. |
| 54 | + |
| 55 | +### Separación entre lógica de negocio, modelos y vistas |
| 56 | + |
| 57 | +Intentamos (pero no siempre conseguimos) mantener el código de los modelos y de |
| 58 | +las vistas lo más sencillo y directo posible. Mantenemos la idea de que es |
| 59 | +preferible tener las reglas de negocio y el código más importante en ficheros |
| 60 | +de servicios aparte, donde un fichero de servicios es simplemente un fichero |
| 61 | +Python en el que se incorpora todo el código relativo a un dominio o |
| 62 | +aplicación. |
| 63 | + |
| 64 | +Veamos, por ejemplo, la _app_ `notice`, que se usa para enviar notificaciones |
| 65 | +a los miembros ante determinados eventos, como por ejemplo el aviso un mes |
| 66 | +antes de que se venza su permanencia a la organización. |
| 67 | + |
| 68 | +En la clase `apps.notice.models.Notice` se definen algunos métodos, pero |
| 69 | +solo aquellos que afectan o cambian el estado del propio modelo, sin |
| 70 | +ninguna tercera parte implicada. En concreto, no existe un método |
| 71 | +para enviar la notificación en si. |
| 72 | + |
| 73 | +Este acto de enviar la notificación está implementado por separado, dentro del |
| 74 | +módulo `apps.notica.tasks`, primero porque es relativamente complejo y segundo, |
| 75 | +e incluso más importante, porque involucra a más elementos que el `notice` en |
| 76 | +cuestión: implica saber de la existencia de un sistema de colas, del subsistema |
| 77 | +de envío de mensajes ([sendgrid](https://sendgrid.com/) en nuestro caso), etc. |
| 78 | + |
| 79 | +En resumen, se recomiendo que las clases definan métodos unicamente para |
| 80 | +consultar o cambiar su estado interno, pero que cualquier interacción con |
| 81 | +otras clases o componentes debe realizarse fuera de la clase, preferiblemente |
| 82 | +en un módulo aparte. |
| 83 | + |
| 84 | + |
| 85 | +### Asigna nombres únicos a las clases |
| 86 | + |
| 87 | +Hay muchas razones para esto, pero veamos solo una. Si nos encontramos con una |
| 88 | +nueva clase mientras examinamos el código, lo deseable es que una búsqueda o un |
| 89 | +_grep_ por el nombre de la clase nos devuelva solo la definición y los usos de |
| 90 | +la misma. Cualquier otra cosa que aparezca será ruido. Si tengo dos clases con |
| 91 | +el mismo nombre en ficheros diferentes, esto solo complica el entender en que |
| 92 | +contextos y de que forma se usa cada una de las clases. Razones similares se |
| 93 | +pueden argumentar para las variables o constantes globales. |
| 94 | + |
| 95 | +De la misma forma que no existe en español dos sinónimos que signifiquen |
| 96 | +_exactamente_ lo mismo (Siempre hay algún matiz que los diferencia) no deberían |
| 97 | +existir en nuestro programa dos clases que se llamen exactamente iguales, |
| 98 | +porque, si fuera así, ¿por qué no son la misma? |
| 99 | + |
| 100 | +Tenemos ahora mismo en nuestro código un ejemplo de dos clases con el mismo |
| 101 | +nombre, la clase `Membership` en `organization.models` y la clase |
| 102 | +`Membership` en el módulo `members.models`. Es verdad que el programa |
| 103 | +funciona, porque las clases están aisladas en sus propios módulos, pero hubiera |
| 104 | +sido preferible haber buscado otro nombre que no estuviera en conflicto con uno |
| 105 | +ya existente (`@jileon`: Yo lo sé bien ya que fui yo el que creó la clase |
| 106 | +duplicada). |
| 107 | + |
| 108 | + |
| 109 | +### Funciones vs clases para vistas |
| 110 | + |
| 111 | +Para las vistas, preferimos, en general, usar funciones en vez de vistas |
| 112 | +basadas en clases. En ningún caso debe entenderse esta recomendación como una |
| 113 | +prohibición de usar _CBV_, es solo que preferimos usarlas para casos sencillos |
| 114 | +y/o triviales, y usar funciones para todo lo demás. |
0 commit comments