Implementamos tecnologia y es asi como lo hacemos

Cambiar el QuerySet de un ForeingKey de un modelo en Django

Enero 21, 2009 - 12:07 pm - Posted by Camilo Nova

Es posible declarar tipos ForeignKey en un modelo de datos de Django, pero puede que necesitemos filtrar los valores de esta relación, para efectuar tal cambio necesitamos recurrir al Form que muestra ese modelo y modificar el método __init__ de la siguiente manera:

1
2
3
4
class MyModelForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields["myFKField"].queryset = MyModel.objects.all()

Esto permite cambiar los datos que son mostrados por el campo en el Form por unos filtrados que nosotros queramos, existe tambien la posibilidad de trabajar con limit_choices_to de ForeignKey pero esta solución me funciono de inmediato.

Etiquetas:, , | Comente »

Adicionar o Sustraer Dias en Python

Enero 20, 2009 - 3:22 pm - Posted by Camilo Nova

Para agregar o sustraer días a una fecha determinada en python lo mejor es hacerlo así:

1
2
3
4
5
from datetime import date, timedelta
#Agregar
d=date.today()+timedelta(days=dias)
#Sustraer
d=date.today()-timedelta(days=dias)

La operación respeta los días al cambiar de mes y funciona perfecto.

Etiquetas:, | Comente »

Desarrollo Agil de Software

Diciembre 2, 2008 - 8:53 am - Posted by Camilo Nova

Llego al final aquella epoca dorada en la cual uno destinaba 6 meses para desarrollar un proyecto de software, con muchos recursos y tareas repetitivas, junto con un elevado costo.

Hoy en dia los frameworks son mas agiles y permiten una produccion mucho mayor de funcionalidad con menos codigo fuente, esta tendencia provoca que los desarrollos tomen mucho menos tiempo y recursos, lo que implica a su vez que los costos sean menores y que esta industria cada vez sea mas agil.

Yo sigo sorprendido con django, es muy poco el codigo que se debe escribir, basicamente la tarea es de arquitectura y no de codificación, por ahora estoy desarrollando una aplicacion muy sencilla y me ha tomado una tercera parte de lo que me hubiera costado realizarlo en java, creo que he acertado en la tendencia de lenguajes de programacion y esta vez python sigue ganando la batalla.

Etiquetas:, , , , , | Comente »

Convertir numeros y decimales a letras Python

Octubre 16, 2008 - 12:43 pm - Posted by Camilo Nova

Luego de un post anterior sobre convertir numeros a letras en python me ha llegado una modificacion de Ulfang que les presento a continuacion:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
UNIDADES = (
   '',
   'UN ',
   'DOS ',
   'TRES ',
   'CUATRO ',
   'CINCO ',
   'SEIS ',
   'SIETE ',
   'OCHO ',
   'NUEVE ',
   'DIEZ ',
   'ONCE ',
   'DOCE ',
   'TRECE ',
   'CATORCE ',
   'QUINCE ',
   'DIECISEIS ',
   'DIECISIETE ',
   'DIECIOCHO ',
   'DIECINUEVE ',
   'VEINTE '
)
DECENAS = (
   'VENTI',
   'TREINTA ',
   'CUARENTA ',
   'CINCUENTA ',
   'SESENTA ',
   'SETENTA ',
   'OCHENTA ',
   'NOVENTA ',
   'CIEN '
)
CENTENAS = (
   'CIENTO ',
   'DOSCIENTOS ',
   'TRESCIENTOS ',
   'CUATROCIENTOS ',
   'QUINIENTOS ',
   'SEISCIENTOS ',
   'SETECIENTOS ',
   'OCHOCIENTOS ',
   'NOVECIENTOS '
)
 
def toWord(number_in, pesos=True):
 
   """
   Converts a number into string representation
   """
   converted = ''
 
   if type(number_in)  'str':
       number = str(number_in)
   else:
       number = number_in
 
   number = number.replace(",","")
   try:
       number_int, number_dec = number.split(".")
   except ValueError:
       number_int = number
       number_dec = ""
 
   if not (0 < __convertStr(number_int)  0):
           converted += '%sMILLONES ' % __convertNumber(millones)
 
   if(miles):
       if(miles == '001'):
           converted += 'MIL '
       elif(int(miles) > 0):
           converted += '%sMIL ' % __convertNumber(miles)
 
   if(cientos):
       if(cientos == '001'):
           converted += 'UN'
       elif(int(cientos) > 0):
           converted += '%s' % __convertNumber(cientos)
 
   if pesos:
       if number_dec == "":
           number_dec = "00"
       converted += 'PESOS ' + number_dec + "/100 M.N."
   else:
       if number_dec  "":
           converted +=  'PUNTO ' + toWord(number_dec,False)
 
   return converted.title()
 
def __convertNumber(n):
   """
   Max length must be 3 digits
   """
   output = ''
 
   if(n == '100'):
       output = "CIEN "
   elif(n[0] != '0'):
       output = CENTENAS[int(n[0])-1]
 
   k = int(n[1:])
   if(k  30) & (n[2] != '0')):
           output += '%sY %s' % (DECENAS[int(n[1])-2], UNIDADES[int(n[2])])
       else:
           output += '%s%s' % (DECENAS[int(n[1])-2], UNIDADES[int(n[2])])
 
   return output
 
def __convertStr(s):
   """Convert string to either int or float."""
   try:
       ret = int(s)
   except ValueError:
       #Try float.
       ret = float(s)
   return ret

Etiquetas:, | Comente »

Convertir Numeros a Letras Python

Septiembre 11, 2008 - 3:54 pm - Posted by Camilo Nova

Ahora como pueden ver en mi evidente cambio a Python he reescrito el código que convierte de números a letras en esto (70 lineas de codigo menos que en Java y mas facil de entender):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
UNIDADES = (
    '',
    'UN ',
    'DOS ',
    'TRES ',
    'CUATRO ',
    'CINCO ',
    'SEIS ',
    'SIETE ',
    'OCHO ',
    'NUEVE ',
    'DIEZ ',
    'ONCE ',
    'DOCE ',
    'TRECE ',
    'CATORCE ',
    'QUINCE ',
    'DIECISEIS ',
    'DIECISIETE ',
    'DIECIOCHO ',
    'DIECINUEVE ',
    'VEINTE '
)
DECENAS = (
    'VENTI',
    'TREINTA ',
    'CUARENTA ',
    'CINCUENTA ',
    'SESENTA ',
    'SETENTA ',
    'OCHENTA ',
    'NOVENTA ',
    'CIEN '
)
CENTENAS = (
    'CIENTO ',
    'DOSCIENTOS ',
    'TRESCIENTOS ',
    'CUATROCIENTOS ',
    'QUINIENTOS ',
    'SEISCIENTOS ',
    'SETECIENTOS ',
    'OCHOCIENTOS ',
    'NOVECIENTOS '
)
 
def toWord(number):
 
    """
    Converts a number into string representation
    """
    converted = ''
 
    if not (0 < number < 999999999):
 
        return 'No es posible convertir el numero a letras'
 
    number_str = str(number).zfill(9)
    millones = number_str[:3]
    miles = number_str[3:6]
    cientos = number_str[6:]
 
    if(millones):
        if(millones == '001'):
            converted += 'UN MILLON '
        elif(int(millones) > 0):
            converted += '%sMILLONES ' % __convertNumber(millones)
 
    if(miles):
        if(miles == '001'):
            converted += 'MIL '
        elif(int(miles) > 0):
            converted += '%sMIL ' % __convertNumber(miles)
 
    if(cientos):
        if(cientos == '001'):
            converted += 'UN '
        elif(int(cientos) > 0):
            converted += '%s ' % __convertNumber(cientos)
 
    converted += 'PESOS'
 
    return converted.title()
 
def __convertNumber(n):
    """
    Max length must be 3 digits
    """
    output = ''
 
    if(n == '100'):
        output = "CIEN "
    elif(n[0] != '0'):
        output = CENTENAS[int(n[0])-1]
 
    k = int(n[1:])
    if(k <= 20):
        output += UNIDADES[k]
    else:
        if((k > 30) & (n[2] != '0')):
            output += '%sY %s' % (DECENAS[int(n[1])-2], UNIDADES[int(n[2])])
        else:
            output += '%s%s' % (DECENAS[int(n[1])-2], UNIDADES[int(n[2])])
 
    return output

Etiquetas:, | 15 Comentarios »

Convertir Numeros a Letras en Java

Septiembre 11, 2008 - 2:30 pm - Posted by Camilo Nova

Hace rato que tenia esta clase y ahora que la necesito aprovecho para publicarla. Su funcionalidad es de convertir un numero a su representacion en letras

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/**
 * Esta clase provee la funcionalidad de convertir un numero representado en
 * digitos a una representacion en letras. Mejorado para leer centavos
 * 
 * @author Camilo Nova
 * @version 1.0
 */
public abstract class NumberToLetterConverter {
 
	private static final String[] UNIDADES = { "", "UN ", "DOS ", "TRES ",
			"CUATRO ", "CINCO ", "SEIS ", "SIETE ", "OCHO ", "NUEVE ", "DIEZ ",
			"ONCE ", "DOCE ", "TRECE ", "CATORCE ", "QUINCE ", "DIECISEIS",
			"DIECISIETE", "DIECIOCHO", "DIECINUEVE", "VEINTE" };
 
	private static final String[] DECENAS = { "VENTI", "TREINTA ", "CUARENTA ",
			"CINCUENTA ", "SESENTA ", "SETENTA ", "OCHENTA ", "NOVENTA ",
			"CIEN " };
 
	private static final String[] CENTENAS = { "CIENTO ", "DOSCIENTOS ",
			"TRESCIENTOS ", "CUATROCIENTOS ", "QUINIENTOS ", "SEISCIENTOS ",
			"SETECIENTOS ", "OCHOCIENTOS ", "NOVECIENTOS " };
 
	/**
	 * Convierte a letras un numero de la forma $123,456.32 (StoreMath)
	 * <p>
	 * Creation date 5/06/2006 - 10:20:52 AM
	 * 
	 * @param number
	 *            Numero en representacion texto
	 * @return Numero en letras
	 * @since 1.0
	 */
	public static String convertNumberToLetter(String number) {
		return convertNumberToLetter(StoreMath.parseString(number));
	}
 
	/**
	 * Convierte un numero en representacion numerica a uno en representacion de
	 * texto. El numero es valido si esta entre 0 y 999'999.999
	 * <p>
	 * Creation date 3/05/2006 - 05:37:47 PM
	 * 
	 * @param number
	 *            Numero a convertir
	 * @return Numero convertido a texto
	 * @throws NumberFormatException
	 *             Si el numero esta fuera del rango
	 * @since 1.0
	 */
	public static String convertNumberToLetter(double number)
			throws NumberFormatException {
		String converted = new String();
 
		// Validamos que sea un numero legal
		double doubleNumber = StoreMath.round(number);
		if (doubleNumber > 999999999)
			throw new NumberFormatException(
					"El numero es mayor de 999'999.999, "
							+ "no es posible convertirlo");
 
		String splitNumber[] = String.valueOf(doubleNumber).replace('.', '#')
				.split("#");
 
		// Descompone el trio de millones - ¡SGT!
		int millon = Integer.parseInt(String.valueOf(getDigitAt(splitNumber[0],
				8))
				+ String.valueOf(getDigitAt(splitNumber[0], 7))
				+ String.valueOf(getDigitAt(splitNumber[0], 6)));
		if (millon == 1)
			converted = "UN MILLON ";
		if (millon > 1)
			converted = convertNumber(String.valueOf(millon)) + "MILLONES ";
 
		// Descompone el trio de miles - ¡SGT!
		int miles = Integer.parseInt(String.valueOf(getDigitAt(splitNumber[0],
				5))
				+ String.valueOf(getDigitAt(splitNumber[0], 4))
				+ String.valueOf(getDigitAt(splitNumber[0], 3)));
		if (miles == 1)
			converted += "MIL ";
		if (miles > 1)
			converted += convertNumber(String.valueOf(miles)) + "MIL ";
 
		// Descompone el ultimo trio de unidades - ¡SGT!
		int cientos = Integer.parseInt(String.valueOf(getDigitAt(
				splitNumber[0], 2))
				+ String.valueOf(getDigitAt(splitNumber[0], 1))
				+ String.valueOf(getDigitAt(splitNumber[0], 0)));
		if (cientos == 1)
			converted += "UN";
 
		if (millon + miles + cientos == 0)
			converted += "CERO";
		if (cientos > 1)
			converted += convertNumber(String.valueOf(cientos));
 
		converted += "PESOS";
 
		// Descompone los centavos - Camilo
		int centavos = Integer.parseInt(String.valueOf(getDigitAt(
				splitNumber[1], 2))
				+ String.valueOf(getDigitAt(splitNumber[1], 1))
				+ String.valueOf(getDigitAt(splitNumber[1], 0)));
		if (centavos == 1)
			converted += " CON UN CENTAVO";
		if (centavos > 1)
			converted += " CON " + convertNumber(String.valueOf(centavos))
					+ "CENTAVOS";
 
		return converted;
	}
 
	/**
	 * Convierte los trios de numeros que componen las unidades, las decenas y
	 * las centenas del numero.
	 * <p>
	 * Creation date 3/05/2006 - 05:33:40 PM
	 * 
	 * @param number
	 *            Numero a convetir en digitos
	 * @return Numero convertido en letras
	 * @since 1.0
	 */
	private static String convertNumber(String number) {
		if (number.length() > 3)
			throw new NumberFormatException(
					"La longitud maxima debe ser 3 digitos");
 
		String output = new String();
		if (getDigitAt(number, 2) != 0)
			output = CENTENAS[getDigitAt(number, 2) - 1];
 
		int k = Integer.parseInt(String.valueOf(getDigitAt(number, 1))
				+ String.valueOf(getDigitAt(number, 0)));
 
		if (k <= 20)
			output += UNIDADES[k];
		else {
			if (k > 30 && getDigitAt(number, 0) != 0)
				output += DECENAS[getDigitAt(number, 1) - 2] + "Y "
						+ UNIDADES[getDigitAt(number, 0)];
			else
				output += DECENAS[getDigitAt(number, 1) - 2]
						+ UNIDADES[getDigitAt(number, 0)];
		}
 
		// Caso especial con el 100
		if (getDigitAt(number, 2) == 1 && k == 0)
			output = "CIEN";
 
		return output;
	}
 
	/**
	 * Retorna el digito numerico en la posicion indicada de derecha a izquierda
	 * <p>
	 * Creation date 3/05/2006 - 05:26:03 PM
	 * 
	 * @param origin
	 *            Cadena en la cual se busca el digito
	 * @param position
	 *            Posicion de derecha a izquierda a retornar
	 * @return Digito ubicado en la posicion indicada
	 * @since 1.0
	 */
	private static int getDigitAt(String origin, int position) {
		if (origin.length() > position && position >= 0)
			return origin.charAt(origin.length() - position - 1) - 48;
		return 0;
	}
 
}

Etiquetas:, | 8 Comentarios »

Compartir Codigo Limpiamente

Junio 19, 2008 - 6:05 pm - Posted by Camilo Nova

Desde hace mucho tiempo como desarrollador he tenido problemas con mi código, generalmente en el punto de la desesperación lo que buscamos es ayuda de otra persona que sepa, entonces vamos a foros o a canales de IRC en busca de la respuesta.

Luego de comenzar a aprender Django pase por la misma situación que describo, la de una desorientación total, por tal motivo tuve que recurrir al soporte técnico de mas alto nivel, el IRC, una vez allí recordé un problema que siempre tenia al momento de compartir mi código para que otra persona lo viera, generalmente había que enviarlo como archivo adjunto en un email y se perdía la dinámica de la conversación en este proceso.

Django es desarrollado por genios, y creo que quienes lo usan también lo son, por eso no es raro que hayan creado una aplicación que solventara el problema de compartir el código, simplemente deben usarla para que vean la utilidad, esta en dpaste.com

El uso es sencillo, si se quiere compartir con alguien algún pedazo de código en especial, esta aplicación funciona como un tablero donde se publica el código, se identifica por una URL corta y se comparte con la comunidad por 30 días.

No les parece fantastico?

Etiquetas:, , , | Comente »

Encapsulacion en Python

Junio 10, 2008 - 10:49 am - Posted by Camilo Nova

Seguimos estudiando el lenguaje y ahora introducimos la encapsulacion con el mismo ejemplo de las clases:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/env python
 
# Encapsulacion en python
class Automotor(object) :
    """Clase de la cual heredan las demas y que es del nuevo estilo en python"""
 
    def __init__(self, ensambladora, nombre) :
        self.setEnsambladora(ensambladora)
        self.setNombre(nombre)
        print "Automotor", nombre, "Creado!!!"
 
    def setEnsambladora(self, ensambladora) :
        """Determina la ensambladora"""
        self.__ensambladora = ensambladora
 
    def getEnsambladora(self) :
        """Retorna la ensambladora"""
        return self.__ensambladora
 
    def setNombre(self, nombre) :
        """Determina el nombre del automotor"""
        self.__nombre = nombre
 
    def getNombre(self) :
        """Retorna el nombre del automotor"""
        return self.__nombre
 
    #Determinamos que el unico acceso a las variables es por los metodos
    ensambladora = property(getEnsambladora, setEnsambladora)
    nombre = property(getNombre, setNombre)
 
 
class Carro(Automotor) :
    """Esta clase hereda de Automotor y sus metodos"""
    pass
 
class Motocicleta(Automotor) :
    """Esta clase hereda de Automotor y sus metodos, pero es diferente a Carro"""
    pass
 
if __name__ == '__main__':
    carro = Carro("Toyota", "Celica")
    moto = Motocicleta("Auteco", "Pulsar")
 
    print "\n\n"
    print "El carro es", carro.getNombre()
    print "La moto es", moto.getNombre()

Etiquetas:, | Comente »

Herencia en Python

Junio 10, 2008 - 10:31 am - Posted by Camilo Nova

Codigo que muestra el manejo de la herencia en python. Aun me pregunto porque permiten herencia multiple???

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
 
#Herencia en python
class Automotor :
    """Clase de la cual heredan las demas"""
 
    def __init__(self, ensambladora) :
        self.ensambladora = ensambladora
 
    def printEnsambladora(self) :
        print "La ensambladora es", self.ensambladora
 
class Carro(Automotor) :
    """Esta clase hereda de Automotor y sus metodos"""
    pass
 
class Motocicleta(Automotor) :
    """Esta clase hereda de Automotor y sus metodos, pero es diferente a Carro"""
    pass
 
if __name__ == '__main__':
    carro = Carro("Toyota")
    moto = Motocicleta("Auteco")
 
    carro.printEnsambladora()
    moto.printEnsambladora()

Etiquetas:, | 2 Comentarios »

Clases en Python

Junio 10, 2008 - 10:05 am - Posted by Camilo Nova

Ejemplo del manejo de clases en python:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python
 
#Primera clase en python
class Empresa :
    """Clase Empresa, que abstrae una empresa del mundo real"""
 
    def __init__(self, nombreEmpresa, productoReal, cantidadEmpleados) :
        self.nombreEmpresa = nombreEmpresa
        self.productoReal = productoReal
        self.cantidadEmpleados = cantidadEmpleados
 
        print "La empresa", nombreEmpresa, "vende", productoReal, " emplea a", cantidadEmpleados, "empleados."
 
    def venderProducto(self) :
        print "Vendida una unidad de", self.productoReal
 
    def contratarEmpleados(self, cantidad) :
        self.cantidadEmpleados = self.cantidadEmpleados + int(cantidad)
 
        print "La empresa ahora emplea a", self.cantidadEmpleados, "empleados."
 
# Orientacion a Objetos en python
if __name__ == '__main__':
    print "\nCreamos la instancia de la clase:"
    empresa = Empresa("AxiaCore", "AxiaHost", 10)
 
    print "\nVendemos un producto:"
    empresa.venderProducto()
 
    print "\nContratamos 2 empleados:"
    empresa.contratarEmpleados(2)

Etiquetas:, | Comente »

AxiaCore Blog

Publicidad

Traductor

Feed RSS

Etiquetas

Nosotros Leemos

Comentarios Recientes:

  • ullike: HP Compaq 6720s & Jaunty: seguí las instrucciones pero me da un ruido insoportable. cambié todos opciones...
  • carolina: quiero saber mashacerca de ustedes
  • Guillermo Arboleda Cano: Me gustaría obtener más información de los avances del proyecto Epymes, resultado de la...
  • Achuapa: Yo tengo el mismo problema el audio se desfasa por lo menos 8 segundos y el procesador se va a tope :(
  • Camilo Nova: Claro, con gusto, espero poder ayudar mas

Enlaces Recientes:

Archivo

Admin