Crear una imagen de nuestros modelos en Django

Hace un tiempo conocí la posibilidad de hacer una imagen con tus modelos de tus apps Django, el proceso es bastante simple y sirve para que veas como estarían quedando relacionados tus apps. Comencemos entonces.

Lo primero es que debes tener instalado
pip install pygraphviz
Una vez instalado debes instalar django_extensions y colocarlo en settings.py, esto puedes hacerlo con el comando
pip install django_extensions

Ahora, simplemente ejecutas
./manage.py graph_models -a -g -o mis_modelos.png

Puedes ejecutar el comando especificando cuales apps mostrar en la imagen con el siguiente comando
./manage.py graph_models app1 app2 app3 -o mis_modelos.png
models

CATARSIS

Hoy no hablaré de programación, trucos, tips ni nada de eso, simplemente haré un poco de catarsis de algunas cosas que simplemente me molestan de la situación actual que vivimos, te adelanto mi querido amigo lector si eres susceptible busca algo mejor que hacer, NO LEAS ESTE POST.

Comenzamos con los servicios públicos, hoy visitando a un familiar que requiere una operación ambulatoria en el Seguro Social de Ciudad Bolívar me ocurrió lo siguiente, un ciudadano vestido con uniforme de militar (miliciano probablemente o soldado, ni idea, no se distinguir los uniformes), me niega el acceso al centro hospitalario con una actitud de “Yo soy el que mando y tu no pasas”, sin embargo comienzo a conversar, le explico que mi familiar está sola en el área de hospitalización, sin embargo hace caso omiso a mis palabras, seguidamente llega una persona identificada como personal de seguridad del centro y me dice “El área donde vas no se permite acceso a hombres, ya que es una zona solo para mujeres, ellas necesitan privacidad, si quieres llama a alguien (sexo femenino) para que venga a acompañarla”, le explico a este ciudadano que no contamos con alguien sexo femenino, pues ella es la única mujer que vive actualmente en casa, su hija vive a 1057Kms de distancia, al final me dicen “Bueno vale déjalo entrar que vaya y haga rapidito lo que va a hacer y que se salga”, no sin antes hacerme una requisa como si estuviera entrando en un penal. ¿Cuál es mi sorpresa al subir a la zona de hospitalización? ¿Privacidad? JAJAJAJAJA, 8 mujeres, acostadas en un cuarto sin divisiones de ningún tipo, con diferentes enfermedades, mi familiar fue por una operación ambulatoria está expuesta a otras enfermedades, no hay controles sanitarios de ningún tipo, sin embargo debe pasar la noche en ese lugar (ni idea el por qué), un baño que no sirve, enfermeras mal habladas y más vigilancia, un efectivo de la policía del estado Bolívar, continúan las preguntas ¿Qué viene a hacer? mi cerebro respondió “A comprar chicha pendeja”, pero de mi boca salió “a visitar a un familiar”, JAMAS me pidieron identificación alguna, simplemente me anotaron en un cuaderno muy parecido al de Jim Carroll, converse con mi familiar y al rato, 40 o 45 minutos después llega otro ciudadano con uniforme, otra sorpresa más, en sus palabras, “¿Cuál es el familiar que se va a quedar para darle el brazalete”?, pues si, te dan un brazalete, de esos que se usan cuando vas a una barra libre, rumba, entre otros si eres un visitante que va a ir a diario a acompañar al paciente, me vino a la cabeza “WTF ¿En serio se gastan el dinero comprando brazaletes, muy bonitos (mañana les tomo fotos), para colocárselos a los visitantes, pero no pueden reparar un puto baño para los pacientes?”, continuando con mi visita, llegó la hora de irme… Otra sorpresa más, resulta que la vigilancia y todo esa parafernalia absurda como si fueras a visitar a un reo se lo hacen a los visitantes, veo a un ciudadano identificado con un carnet de la institución sacando frente a las narices del guardia y de la forma más descarada posible una caja de jeringas y me quede a ver si era que las llevaba a otro punto del centro, pues no, las metió en su vehículo, arrancó y se fue saludando a todos, hermosa escena y aquí es donde dicen “Es que las trasladaba a otro centro donde hacen falta”, supongamos que es así ¿No necesita el guardia o el personal de seguridad revisar con una hoja de salida, firmada por alguien, que lo que sale es lo que dice y quien se lo lleva es la persona indicada?, digo.

Gastar dinero en cosas absurdas como el brazalete, tener a la guardia nacional para que igual se roben los insumos del hospital, pero que el acompañante no pueda subir una comida decente, definitivamente hay muchas cosas malas en esto, pero ni modo, esto sucede a diario hoy me tocó a mi verlo, a lo mejor tu lo ves y ya es normal para ti.

Segunda acción del día, ya no en el hospital, más bien como parte de lo que decidí hacer para ganarme la vida. Las personas siempre han creído que quienes se dedican a las tecnologías, son hippies, greñuos, drogos, entre otros y que por ende el trabajo (diseñar, desarrollar, planificar, poner en marcha un proyecto, una idea) es un trabajo que cualquier mortal hace, puede que si, pero antes de hacerlo debe hacer algo bien importante y es EDUCARSE en el área que desea entrar, si quiere hacer de esto su estilo de vida, debe no solo educarse, también debe comprar equipos de calidad, servidores para pruebas, unos buenos cascos (audífonos), muy buena conexión a Internet y alimentarse como todos, que sucede con ello, TODO eso cuesta y los cálculos de sus trabajos se hacen en base a eso. No se como lo hacen los médicos para decir “Hoy mi consulta cuesta 2000Bs”, yo tengo una escala bastante simple, sumo todos mis gastos, los divido entre 30 y tengo lo que debo producir por día para mantener el estilo de vida, en base a eso coloco precios. Aunado a ello los gastos operativos de Hosting y Dominio en caso de ser un sitio web, sin embargo los clientes insisten en colocarle precios a tu trabajo, como el cuento del tornillo. Considero que parte de la culpa la tienen muchos que trabajan en está área y la manera de conseguir clientes es bajar en lo mínimo precio, devaluando su trabajo y menospreciando su talento simplemente por tener “clientes”, recuerdo una vez a un compañero cuando asistimos a una reunión a un periódico de la ciudad para diseñarle su sitio web y al terminar la reunión mi compañero dijo “No trabajaré con está persona, no sabe lo que quiere y como no sabe eso, querrá pagarte como le da la gana”, tenía razón en ese entonces, está vez me pasó a mi en solitario,
CLIENTE: “Necesito un sitio web (no conoce la diferencia entre sitio web y aplicación web, es aceptable) que me permita llevar el control de mis pacientes, citas, historia, les envíe mensajes de texto cuando tengan cita y les permita pagarme en linea con TDC” ahhhh “Por supuesto debo llevar el control de los ingresos/egresos, pagos a la secretaria, gastos de material que uso por paciente y gráficos de cuanto gasto en material mensual, semestral y anual”
YO: ¿Cuánto es su presupuesto?
CLIENTE:”No se cuanto cuesta, pero tengo disponible 10000Bs, si puedes llevarlo menos mejor, pues los 10mil completos los pago si me lo entregas en 15 días”
YO: uhhhhh, no creo de verdad, es casi imposible, en este punto de la conversación trato de orientarlo diciéndole que con el presupuesto que tiene podemos hacer algo mucho más simple, simplemente contactos, currículo, home, entre otros.
CLIENTE: Ok, pasame el presupuesto

Es increíble, pero yo le envio el presupuesto y sin embargo le parece exagerado JAJAJAJAJAJA “Are you kidding me”.

Hace unos meses se hizo muy popular la campaña “No cobro por que hago, cobro por lo que se”, deberíamos ponerla en práctica en TODAS las ciudades de Venezuela.

Ya para terminar, agradezco si llegaste hasta aquí, quiero decirte que si eres un desarrollador, diseñador, programador o alguien relacionado con las tecnologías, cobres lo que es, valora tu trabajo, pues de no hacerlo jodes a otros que si lo valoramos.

Instalando psycopg2

Esta entrada es para que no se olvide el comando y para ayudarlos a ustedes cuando tengan que usar Python con PostgreSQL (ya que tengo memoria de pez), al grano entonces, debemos instalar lo siguiente:

En el caso de usar Debian/Ubuntu
apt-get install libpq-dev python-dev

Si usas CentOS/Fedora
yum install python-devel postgresql-devel

Una vez instalado podremos instalarlo con el comando

pip install psycopg2

¿Simple, no?, más que una entrada es una receta :)

Taller Django Capitulo Ciudad Bolívar

django-logo-positive

Taller teórico-practico acerca del framework web Django. Al finalizar el taller el participante será capaz de crear una aplicación web usando el framework, así mismo conocer las diferentes ventajas de uso.

CONTENIDO DEL TALLER:
✔ Entendiendo como trabaja Django
✔ El modelo de datos
✔ El Shell de Django
✔ Vistas (Views)
✔ Plantillas (Templates) usando bootstrap
✔ Los formularios
✔ Los archivos estáticos (STATIC_URL)
✔ Gestión de usuarios
✔ Despliegue en el servidor web (virtualenv)

COSTO: 1150 Bs P/P

DURACIÓN: 16 Horas

FECHA: 19 y 20 de diciembre

Puedes apartar tu cupo con el 50% y el otro 50% el día del taller.

CERTIFICADO, MATERIAL DE APOYO, CARPETA INCLUIDOS

Información:
TLF: 0426-2795326
Correo: contacto@grupolab42.com.ve
TWITTER: @Lab42software

Para reservar su cupo deben hacer deposito o transferencia al numero de cuenta:
0105 0064 89 1064587348 del Banco Mercantil
A nombre de: LAB42 Software C.A.
RIF: J-402775199
Una vez hecho deben enviar sus datos junto al numero de voucher o transferencia al correo contacto@grupolab42.com.ve para confirmar su reserva.

PEP8 + Sublime Text 3

Algo que deberías hacer es respetar PEP8, te dejo un pequeño “plugin” para Sublime Text 3 que te ayudará con eso. Lo primero que debes hacer es instalar lo siguiente, abres Sublime Text 3 vas al menú View + Show Console y pegas esto.

import urllib.request,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

Esto te va a permitir instalar paquetes en tu sublime text, seguidamente la combinación de teclas ctrl + shift + p y en el cuadro que se despliega escribes install, seguidamente Buscas Python Flake8 Lint y comienza la instalación. Ya con eso tienes quien te avise si respetas o no el PEP8. Saludos y Happy Coding :)

Estilos a Forms Django

Saludos, un post rápido, donde explicaré la manera de como darle estilos CSS a los formularios creados con Django. La primera forma es la siguiente

Primera Forma
class MyForm(forms.Form): myfield = forms.CharField(widget=forms.TextInput(attrs={'class' : 'myfieldclass'}))

Segunda Forma:

class MyForm(forms.ModelForm):
class Meta:
model = MyModel

def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['myfield'].widget.attrs.update({'class' : 'myfieldclass'})

Tercera Forma:

class MyForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'myfield': forms.TextInput(attrs={'class': 'myfieldclass'}),
}

La diferencia entre cada una de ellas es visible, en la primera le das estilo solo al input text que necesitas, puedes definir diferentes estilos para diferentes input text. En la segunda le das el mismo estilos a todos los campos (fields) del formulario y en la tercera le das estilo solo a los campos de texto (TextInput) el mismo estilo para todos

Lógicamente debes cambiar el “myfieldclass” por tu class en CSS.

Si deseas agregar un “Placeholder”, basta con agregar siguiente a (attrs={'class: 'myfieldclass', 'placeholder': 'lo que desees'})

Nginx + Uwsgi + Virtualenv + pip + Django en Debian 7

La puesta en producción de un proyecto desarrollado en Django, a veces suele ser complicada si se es un novato, sin embargo en esta oportunidad trataré de hacerte la vida más fácil con este post, espero sepas aprovecharlo y comentar.

Comenzamos instalando pip y virtualenv para crear nuestro entorno virtual de trabajo para Django, esto lo hacemos (dependiendo de la distribución de GNU/Linux que estés usando), en mi caso uso Debian GNU/Linux.

apt-get install python-pip python-virtualenv

Una vez instalado esto creamos nuestro entorno virtual con el siguiente comando

$virtualenv --no-site-packages mysite

Con esto se creara nuestro entorno virtual, con ello listo, procedemos a a activarlo con el comando
$cd mysite
$source bin/activate

Listo, vamos a instalar Django y las dependencias de nuestro proyecto.
$pip install Django==1.6.5

Creamos el proyecto con el comando de costumbre $django-admin.py startproject myproject

Ahora procederemos a instalar nuestro Nginx, la versión para este post es la 1.7 y de manera simple pueden descargarse un .deb desde este enlace NGINX

Ejecutan el .deb tal cual y con ello queda instalado el nginx, procedemos a configurarlo para que acepte nuestra aplicación hecha con Django, lo primero que debemos hacer es crear un archivo en /etc/nginx/conf.d que contendrá todo la información de nuestra app
server {
listen 9000;
server_name localhost;
access_log /var/log/myproject/myproject_access_log;
error_log /var/log/myproject/myproject_error_log;
root /home/usuario/dev/mysite/myproject;

location /static {
alias /home/usuario/dev/mysite/myproject/static;
}
location / {
uwsgi_pass unix:/tmp/uwsgi_myproject.sock;
include uwsgi_params;
}
}

Explicamos un poco, le estamos diciendo a nginx que escuche en el puerto 9000, configurando el access_log y error_log en una carpeta que debemos crear en la ruta /var/log/myproject, el root de nuestra app estará en /home/usuario/dev/mysite/myproject al igual que los archivos estáticos, luego simplemente le damos la location del uwsgi_pass e incluimos el uwsgi_params.

Ahora vamos a configurar el uwsgi, aún no lo hemos instalado, lo que debemos hacer es
$pip install uwsgi

Seguidamente debemos crear un archivo con la siguiente información
[uwsgi]
chdir=/home/usuario/dev/mysite/myproject
module=myproject.wsgi:application
socket=/tmp/uwsgi_myproject.sock # Debe ser la misma del archivo de configuración de Nginx
master=True
pidfile=/tmp/myproject.pid
vacuum=True
max-requests=5000
daemonize=/tmp/myproject.log

Ahora simplemente toca reiniciar el nginx /etc/init.d/nginx restart y reiniciamos el uwsgi ../bin/uwsgi --ini uwsgi.ini

Con esto ya tendrás tu sitio arriba.

Captura de pantalla - 220614 - 22:31:16¿Simple no?, cualquier duda comenta…

Cada vez que hagas un cambio debes reiniciar el uwsgi con el comando arriba descrito, buenas noches y happy coding :)