Foros del Web » Programando para Internet » Python »

Lio mental varias funciones

Estas en el tema de Lio mental varias funciones en el foro de Python en Foros del Web. Hola soy nuevo en el foro, pero pienso estar acompañando mucho tiempo xD, tengo un cacao con el que llevo varios dias sin dar con ...
  #1 (permalink)  
Antiguo 10/10/2011, 12:08
 
Fecha de Ingreso: octubre-2011
Ubicación: Alcobendas
Mensajes: 33
Antigüedad: 12 años, 6 meses
Puntos: 1
Lio mental varias funciones

Hola soy nuevo en el foro, pero pienso estar acompañando mucho tiempo xD, tengo un cacao con el que llevo varios dias sin dar con la tecla, ya que necesito aclararme algunos conceptos.
El tema es que utilizo Django, he implementado una plantilla html para recoger una serie de datos, y estoy programando la plantilla views.py que tiene la sig estructura:


Código Python:
Ver original
  1. def crea_proyecto(request):
  2.     if not request.user.is_authenticated():
  3.         # Redireccionar a la pagina inicial
  4.         return HttpResponseRedirect('/')
  5.     else:
  6.         #Comprobamos si tenemos permisos y las tareas pendientes
  7.         request.session['permisos']=Roles.objects.get(tipo_rol=request.user.rol).permisos.all()
  8.         request.session['tareasPendientes']=Tareas.objects.filter(estado="Pendiente",usuario=request.user)
  9.         form=ProyectoForm()
  10.         p='proyectos'
  11.         n='creaProyecto0'
  12.         miGrupos=Grupos.objects.all()
  13.         miProyectos=Proyectos.objects.all()
  14.         miExperimentos=Experimentos.objects.all()
  15.         sql1='SELECT DISTINCT b.id, b.first_name, b.last_name, b.rol'
  16.         sql2=' FROM auth_user b'
  17.         sql3=''
  18.         if sql3=='':
  19.             sql3=sql3+' WHERE'
  20.         else:
  21.             sql3=sql3+' OR'
  22.         sql3=sql3+' b.jefe='+str(request.user.id)
  23.         if len(miGrupos)!=0:
  24.             sql2=sql2+', auth_user_grupos a'
  25.             if sql3=='':
  26.                 sql3=sql3+' WHERE'
  27.             else:
  28.                 sql3=sql3+' OR'
  29.             sql3=sql3+' (a.user_id=b.id AND a.grupos_id= ANY (SELECT grupos_id FROM auth_user_grupos WHERE user_id='+str(request.user.id)+'))'
  30.         if len(miProyectos)!=0:
  31.             sql2=sql2+', "Proyectos_usuarios" c'
  32.             if sql3=='':
  33.                 sql3=sql3+' WHERE'
  34.             else:
  35.                 sql3=sql3+' OR'
  36.             sql3=sql3+' (c.user_id=b.id AND c.proyectos_id= ANY (SELECT proyectos_id FROM "Proyectos_usuarios" WHERE user_id='+str(request.user.id)+'))'
  37.         if len(miExperimentos)!=0:
  38.             sql2=sql2+', "Experimentos_usuarios" d'
  39.             if sql3=='':
  40.                 sql3=sql3+' WHERE'
  41.             else:
  42.                 sql3=sql3+' OR'
  43.             sql3=sql3+' (d.user_id=b.id AND d.experimentos_id= ANY (SELECT experimentos_id FROM "Experimentos_usuarios" WHERE user_id='+str(request.user.id)+'))'
  44.         if sql3=='':
  45.             sql3=sql3+' WHERE'
  46.         else:
  47.             sql3=sql3+' AND'
  48.         sql3=sql3+' NOT b.rol LIKE \'Administrador\''
  49.         sql=sql1+sql2+sql3
  50.         cursor1=connection.cursor()
  51.         cursor1.execute(sql)
  52.         usuarios=cursor1.fetchall()
  53.         cursor3=connection.cursor()
  54.         sql='SELECT DISTINCT id, tipo, uso, nombre_documento FROM "Documentos" WHERE NOT uso LIKE \'prfl\' AND NOT uso LIKE \'logo\' AND autor_id='+str(request.user.id)
  55.         cursor3.execute(sql)
  56.         documentos=cursor3.fetchall()
  57.         cursor2=connection.cursor()
  58.         sql='SELECT DISTINCT a.id, a.titulo, b.first_name, b.last_name FROM "Tareas" a, auth_user b WHERE (a.usuario_id='+str(request.user.id)+' OR a.autor='+str(request.user.id)+') AND b.id=a.usuario_id'
  59.         cursor2.execute(sql)
  60.         tareas=cursor2.fetchall()
  61.         proyectos=Proyectos.objects.filter(estado='Activo',usuarios=request.user)
  62.         experimentos=Experimentos.objects.filter(estado='Activo',usuarios=request.user)
  63.         if request.method=='POST':
  64.             form=ProyectoForm(request.POST)
  65.             if not form.errors:
  66.                 if(request.POST['usuarios']==''):
  67.                     error='Debes elegir al menos un usuario al que se le asigne el proyecto.'
  68.                     return render_to_response('claboratorio/crea_proyecto.html',{'movil':request.session['movil'],'usuario':request.user,'permisos':request.session['permisos'],'tareasPendientes':request.session['tareasPendientes'],'form':form,'p':p,'n':n,'usuarios':usuarios,'documentos':documentos,'tareas':tareas,'proyectos':proyectos,'experimentos':experimentos,'error':error})
  69.                 else:
  70.                     #Vamos a rellenar todos los campos por los que esté formado el modelo
  71.                                                
  72.                     for i in request.POST.getlist('usuarios'):     
  73.                         usuario=User.objects.get(id=i)
  74.                         fila=Proyectos(titulo=request.POST['titulo'],objetivo=request.POST['objetivo'],autor=request.user.id,estado='Pendiente',porcentaje=0)
  75.                         fila.save()
  76.                         if(request.POST['documentos']!=''):
  77.                             fila.documentos=request.POST.getlist('documentos')
  78.                         #if(request.POST['proyectos']!=''):
  79.                         #   fila.proyectos_rel=request.POST.getlist('proyectos')
  80.                         #   fila.save()
  81.                         if(request.POST['proyectos']!=''):
  82.                             fila.proyectos_rel=Proyectos.objects.get(id=request.POST['proyectos'])
  83.                             fila.proyectos_rel.save()
  84.                        
  85.                         if(request.POST['experimentos']!=''):
  86.                             fila_experimentos=Proyectos_Experimentos(proyecto=fila,experimento=Experimentos.objects.get(id=request.POST['experimentos']))
  87.                             fila_experimentos.save()
  88.                     request.session['mensaje']='Proyecto creado.'
  89.                     request.session['tipo']='confirmacion'
  90.                     return HttpResponseRedirect('/')
  91.             else:
  92.                 error='Por favor, introduce correctamente los campos.'
  93.                 return render_to_response('claboratorio/crea_proyecto.html',{'movil':request.session['movil'],'usuario':request.user,'permisos':request.session['permisos'],'tareasPendientes':request.session['tareasPendientes'],'form':form,'p':p,'n':n,'usuarios':usuarios,'documentos':documentos,'tareas':tareas,'proyectos':proyectos,'experimentos':experimentos,'error':error})
  94.         else:
  95.             return render_to_response('claboratorio/crea_proyecto.html',{'movil':request.session['movil'],'usuario':request.user,'permisos':request.session['permisos'],'tareasPendientes':request.session['tareasPendientes'],'form':form,'p':p,'n':n,'usuarios':usuarios,'documentos':documentos,'tareas':tareas,'proyectos':proyectos,'experimentos':experimentos})


Y como Models.py lo siguiente:

Código Python:
Ver original
  1. class Proyectos(models.Model):
  2.     titulo=models.CharField(max_length=100)
  3.     creacion=models.DateField(default=datetime.datetime.now)
  4.     estado=models.CharField(max_length=30)
  5.     objetivo=models.TextField(null=True)
  6.     conclusion=models.TextField(null=True)
  7.     porcentaje=models.IntegerField()
  8.     modificado=models.DateTimeField(default=datetime.datetime.now)
  9.     autor=models.IntegerField()
  10.     usuarios=models.ManyToManyField(User)
  11.     proyectos_rel=models.ManyToManyField("self")
  12.     documentos=models.ManyToManyField(Documentos)
  13.     class Meta:
  14.         db_table='Proyectos'
  15.     def __unicode__(self):
  16.         return self.titulo
  17.  
  18. class Proyectos_Grupos(models.Model):
  19.     proyecto=models.ForeignKey(Proyectos,primary_key=True)
  20.     grupo=models.ForeignKey(Grupos)
  21.     class Meta:
  22.         db_table='Proyectos_grupos'

La html es la siguiente:
Código HTML:
Ver original
  1. {% block contenido %}
  2.     <h1>Crear proyecto</h1>
  3.     {% if error %}
  4.         <p class="highlight-1">
  5.             <strong>Error:</strong>
  6.             {{ error }}
  7.         </p>
  8.     {% endif %}
  9.     <form action="." method="POST">
  10.         <label for="id_titulo">Título:</label>{{ form.titulo.errors }}
  11.         {{ form.titulo }}
  12.        
  13.         <label for="id_objetivo">Objetivo:</label>{{ form.objetivo.errors }}
  14.         {{ form.objetivo }}
  15.        
  16.         <label>Proyecto asignado a:</label>
  17.         <select name="usuarios" multiple="multiple" size="10">
  18.             <option value="" selected="selected">Ninguno</option>
  19.             {% for i in usuarios %}
  20.                 <option value="{{ i.0 }}">{{ i.1 }} {{ i.2 }} ({{ i.3 }})</option>
  21.             {% endfor %}
  22.         </select>
  23.        
  24.        
  25.         <label>Documentos relacionados:</label>
  26.         <select name="documentos" multiple="multiple" size="10">
  27.             <option value="" selected="selected">Ninguno</option>
  28.             {% for i in documentos %}
  29.                 <option value="{{ i.0 }}">{{ i.2 }} ({{ i.1 }}) - {{ i.3 }}</option>
  30.             {% endfor %}
  31.         </select>
  32.        
  33.         <label>Proyectos relacionados:</label>
  34.         <select id="proyectosSelect" name="proyectos" size="10">
  35.             <option value="" selected="selected" onclick="muestraExperimentos();">Ninguno</option>
  36.             {% for i in proyectos %}
  37.                 <option value="{{ i.id }}" onclick="muestraExperimentos();">{{ i.titulo }}</option>
  38.             {% endfor %}
  39.         </select>
  40.                
  41.         <label>Experimentos relacionados:</label>
  42.         <select id="experimentosSelect" name="experimentos" size="10">
  43.         </select>
  44.         <input class="button" type="submit" value="Crear proyecto" />
  45.     </form>
  46.     <script>
  47.         muestraExperimentos();
  48.     </script>
  49. {% endblock %}



El caso que no consigo hacer que se muestre la lista de 'proyectos' ni tampoco asignarle a la variable usuarios=models.ManyToManyField(User) los usuarios que selecciono en el html.
Agracederia mucho sus explicaciones, ya que llevo unos dias atrancado, y no me entero...espero serles de ayuda más adelante.
Gracias.
  #2 (permalink)  
Antiguo 10/10/2011, 12:50
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Lio mental varias funciones

Estas harcodeando queries, es una de las peores practicas de programación especialmente por que estas usando un framework.

No he terminado de leer tu código (o de hecho leerlo de verdad), pero solo con ver eso te puedo decir que ya van varias cosas mal.
  #3 (permalink)  
Antiguo 10/10/2011, 14:02
 
Fecha de Ingreso: octubre-2011
Ubicación: Alcobendas
Mensajes: 33
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Lio mental varias funciones

En todo caso, agredeceria si supieran como realizar la insercion de usuarios y el poder mostrar los proyectos que existen en la lista, gracias

Última edición por joseosuna2; 10/10/2011 a las 14:08
  #4 (permalink)  
Antiguo 10/10/2011, 15:01
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Lio mental varias funciones

Creo que deberías empezar a leer el Django book

Y empezar a leer tu código.
Código Python:
Ver original
  1. sql3=''
  2.         if sql3=='':
En cuanto vi esto deje de leer el código.
  #5 (permalink)  
Antiguo 10/10/2011, 15:42
 
Fecha de Ingreso: octubre-2011
Ubicación: Alcobendas
Mensajes: 33
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Lio mental varias funciones

te entiendo, el caso es que esa parte parte de codigo ya realizada por otra persona, que hasta a mi me ha costado entender, y no se si lo entiendo completamente, si me lo pudieras explicar lo agradezco.
A parte quisiera saber como hacer la función para almacenar usuarios, y mostrar proyectos..si no gracias de todos modos
  #6 (permalink)  
Antiguo 10/10/2011, 16:14
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Lio mental varias funciones

Cita:
Iniciado por joseosuna2 Ver Mensaje
te entiendo, el caso es que esa parte parte de codigo ya realizada por otra persona, que hasta a mi me ha costado entender, y no se si lo entiendo completamente, si me lo pudieras explicar lo agradezco.
En ese caso si estuviera en tu lugar empezaría a hacerlo desde 0.

Cita:
Iniciado por joseosuna2 Ver Mensaje
A parte quisiera saber como hacer la función para almacenar usuarios, y mostrar proyectos..si no gracias de todos modos
Como te mencione antes deberías leer el Django book es tan. Si estas trabajando con django algo tan básico como buscar, insertar, actualizar y borrar debería ser algo que ya sabes.
  #7 (permalink)  
Antiguo 11/10/2011, 00:54
 
Fecha de Ingreso: octubre-2011
Ubicación: Alcobendas
Mensajes: 33
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Lio mental varias funciones

Ok, me lo lei, pero te lo comentare el problema, gracias

Etiquetas: django, funciones, html, formulario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:42.