class Programa(models.Model): """ Modelo que representa los programas académicos de la institución """ nombre = models.CharField(help_text="Nombre del programa", verbose_name='programa', max_length=80, unique=True) modalidad = models.CharField(help_text="Modalidad del programa", verbose_name='Modalidad', max_length=3, choices=opc.get_modalidades(), default=opc.get_modalidades()[0][0]) sede = models.CharField(help_text="Sede del programa", verbose_name='Sede', max_length=3, choices=opc.get_sedes(), default=opc.get_sedes()[0][0]) facultad = models.ForeignKey(Facultad, help_text="Nombre de la facultad", verbose_name='Facultad', blank=False) def __unicode__(self): return self.nombre def __str__(self): return '{}'.format(self.nombre)
class UserProfile(models.Model): """ Clase UserProfile que premitirá extender las características del :model:'User' """ """Adición de método para la relación del Usuario con un Rol que lo identifica en el sistema""" rol = models.CharField( help_text= 'Rol que identifica la participación del :model:"User" en el sistema', verbose_name='Rol de Usuario', max_length=4, choices=opc.get_roles(), default=opc.get_roles()[0][0]) """Adición de método para la relación con la :model:'gestorObjetos.RutaCategoria ruta_categoria = models.ForeignKey(RutaCategoria, null=True, blank=True)""" """relación directa al usuario""" user = models.ForeignKey(User, unique=True) class Meta: verbose_name = "Perfil de Usuario" verbose_name_plural = "Perfiles de Usuario" def __unicode__(self): return self.user.first_name def __str__(self): return '{}'.format(self.user.first_name)
class Validacion(models.Model): """ Modelo que rompe la relación muchos a muchos entre :model:'gestorProyectos:Proyecto' y :model:'gestorProyectos:Parametro' para representar la validación pedagógica de los proyectos """ proyecto = models.ForeignKey(Proyecto) parametro = models.ForeignKey(Parametro) fecha = models.DateField(auto_now_add=True) valoracion = models.CharField(verbose_name='Valoración', max_length=4, choices=opc.get_valoracion(), default=opc.get_valoracion()[0][0]) #valoracion = models.DecimalField(verbose_name = 'Valoración', max_digits=4, decimal_places=2, choices=opc.get_valoracion(), default=opc.get_valoracion()[0][0]) observaciones = models.TextField(blank=True, help_text="Opcional", verbose_name='Observaciones') class Meta: verbose_name = "Validación" verbose_name_plural = "Validaciones" def __unicode__(self): return self.parametro.nombre def __str__(self): return '{}'.format(self.parametro.nombre)
class Parametro(models.Model): """ Modelo que representa los parámetros de validación pedagógica """ nombre = models.CharField(help_text="Nombre del parámetro de validación", verbose_name="Parámetro de Validación", max_length=80) descripcion = models.TextField( help_text="Descripción del parámetro de validación", verbose_name='Descripción') tipo = models.CharField(help_text="Tipo parámetro de validación", verbose_name="Asociados a", max_length=4, choices=opc.get_tipo_p(), default=opc.get_tipo_p()[0][0]) ponderacion = models.DecimalField( help_text="Valor porcentual de ponderación del parámetro", verbose_name="Ponderación Porcentual", max_digits=4, decimal_places=2) class Meta: verbose_name = "Parámetro" verbose_name_plural = "Parámetros" def __unicode__(self): return self.nombre def __str__(self): return '{}'.format(self.nombre)
class Proyecto(models.Model): """ Modelo que representa los proyectos académicos """ """Se incluye el campo título pero se debe llenar con la misma información el campo título de la especificación lom del objeto asociado con este proyecto""" titulo = models.CharField(max_length=200, unique=True, null=False) fecha = models.DateTimeField( help_text='Fecha en que el Proyecto es aprobado', verbose_name="Fecha de aprobación") fase = models.CharField(help_text="Movimiento de fase automático", max_length=2, choices=opc.get_fase(), default=opc.get_fase()[0][0]) programa = models.ForeignKey( Programa, help_text='Programa académico al que pertenece el proyecto', verbose_name='Programa') indicadores = models.ManyToManyField( Indicador, blank=True, null=True, help_text="Relacione el/los Indicador (es) de comptencia", verbose_name='Indicador de Competencia') parametros = models.ManyToManyField(Parametro, through="Validacion", blank=True, null=True) operaciones = models.ManyToManyField( OperacionMental, blank=True, null=True, help_text= "Relacione la/las Operación (es) Mental (es) básica (s) para el proyecto", verbose_name='Operaciones Mentales') calificacion = models.CharField( help_text="Calificación final del proyecto", max_length=1, choices=opc.get_calif(), default=opc.get_calif()[0][0]) nota = models.DecimalField( help_text="Nota numérica de la validación del proyecto", verbose_name="Nota Porcentual", max_digits=4, decimal_places=2) def __unicode__(self): return self.titulo def __str__(self): return '{}'.format(self.titulo)
class RegistarUsuarioForm(forms.Form): Usuario = forms.CharField(max_length=100, required=True) Nombre = forms.CharField(max_length=100, required=True) Apellido = forms.CharField(max_length=100, required=True) RolUsu = forms.CharField( widget=forms.Select(choices=opc.get_roles_registro_usu()), label="Tipo de usuario") Email = forms.EmailField()
class Objeto(models.Model): """ Modelo que representa al objeto, ya sea un objeto virtual de aprendizaje o un recurso digital. """ """campo que permite determinar si el objeto es visible en el :model:'gestorObjetos.Repositorio' asociado""" publicado = models.BooleanField( help_text='Marca para publicar en repositorio', verbose_name='Publicado', default=False) """Atributo que permite identificar si es un objeto virtual de aprendizaje o recurso digital""" tipo_obj = models.CharField(help_text='Tipo de Objeto', verbose_name='Tipo de Objeto', max_length=3, choices=opc.get_tipo_obj(), default=opc.get_tipo_obj()[1][0]) """Atributo asociado a la clase :model:'django.core.files' que apunta a la ubicación física del objeto en el sistema de archivos.""" archivo = models.FileField(help_text='Archivo a Subir', verbose_name='Archivo', upload_to=mod_archivo.get_file_path) """Atributo que relaciona uno a uno el objeto con su respectiva especificación LOM""" espec_lom = models.OneToOneField(EspecificacionLOM, help_text='Metadatos para el objeto', verbose_name='Metadato') """Atributo que relaciona al objeto con un :model:'gestorObjetos.Repositorio'.""" repositorio = models.ForeignKey( Repositorio, help_text='Carrera/Facultad donde se aloja el objeto') """Campo que representa la :model:'gestorObjetos.Categoria' o Ruta Taxonómica del :model:'gestorObjetos.Objeto'""" ruta_categoria = models.ForeignKey( RutaCategoria, help_text='Categoría o área de conocimiento') """Relación a los :model:'gestorObjetos.Autor' para definir los autores asociados al objeto""" autores = models.ManyToManyField(Autor, help_text='Personas autoras del objeto') """Relación a las :model:'gestorObjetos.PalabraClave' para definir etiquetas asociadas al objeto""" palabras_claves = models.ManyToManyField( PalabraClave, help_text='Palabras asociadas al objeto.') """Relación al :model:'User' para determinar el creador del objeto""" creador = models.ForeignKey(User, blank=True, null=True, default=1) #proyecto = models.OneToOneField(Proyecto, help_text='proyecto tomado como objeto.', blank=True, null=True) def __unicode__(self): return self.espec_lom.lc1_titulo def __str__(self): return '{}'.format(self.espec_lom.lc1_titulo)
def objeto(request, id_objeto): """ En esta vista se desplegarán la información del Objeto seleccionado """ obj=get_object_or_404(Objeto, pk=id_objeto)#anteriormente tenía obj=Objeto.objects.get(pk=id_objeto), lo cual generaba un error 500 al no encontrarlo, por eso la mejor opción es esta gruposobj = obj.repositorio.grupos.all() gruposu = request.user.groups.all() puedever=False for go in gruposobj: for gu in gruposu: if go == gu: puedever=True if puedever | obj.repositorio.publico: idiom={} nivel_a={} format={} tipo_i={} nivel_i={} contex={} [idiom.update({k:v}) for k,v in opc.get_idiomas()] #[nivel_a.update({k:v}) for k,v in opc.get_nivel_agregacion()] [format.update({k:v}) for k,v in opc.get_tipo_recurso()] #[tipo_i.update({k:v}) for k,v in opc.get_tipo_interactividad()] #[nivel_i.update({k:v}) for k,v in opc.get_nivel_interactividad()] #[contex.update({k:v}) for k,v in opc.get_contexto()] if request.user.is_authenticated(): #data={'usuario':request.user, 'objeto':obj, 'espec':obj.espec_lom, 'autores':obj.autores.all(), 'keywords':obj.palabras_claves.all(),'idioma':idiom[obj.espec_lom.lc1_idioma],'niv_agr':nivel_a[obj.espec_lom.lc1_nivel_agregacion],'formato':format[obj.espec_lom.lc4_tipo_rec],'tipo_i':tipo_i[obj.espec_lom.lc4_tipo_inter],'nivel_i':nivel_i[obj.espec_lom.lc4_nivel_inter],'context':contex[obj.espec_lom.lc4_contexto]} data = {'usuario': request.user, 'objeto': obj, 'espec': obj.espec_lom, 'autores': obj.autores.all(), 'keywords': obj.palabras_claves.all(), 'idioma': idiom[obj.espec_lom.lc1_idioma], #'niv_agr': nivel_a[obj.espec_lom.lc1_nivel_agregacion], 'formato': format[obj.espec_lom.lc4_tipo_rec], #'tipo_i': tipo_i[obj.espec_lom.lc4_tipo_inter], #'nivel_i': nivel_i[obj.espec_lom.lc4_nivel_inter], 'context': contex[obj.espec_lom.lc4_contexto] } else: #data={'objeto':obj, 'espec':obj.espec_lom, 'autores':obj.autores.all(), 'keywords':obj.palabras_claves.all(),'idioma':idiom[obj.espec_lom.lc1_idioma],'niv_agr':nivel_a[obj.espec_lom.lc1_nivel_agregacion],'formato':format[obj.espec_lom.lc4_tipo_rec],'tipo_i':tipo_i[obj.espec_lom.lc4_tipo_inter],'nivel_i':nivel_i[obj.espec_lom.lc4_nivel_inter],'context':contex[obj.espec_lom.lc4_contexto]} data = {'objeto': obj, 'espec': obj.espec_lom, 'autores': obj.autores.all(), 'keywords': obj.palabras_claves.all(), 'idioma': idiom[obj.espec_lom.lc1_idioma], #'niv_agr': nivel_a[obj.espec_lom.lc1_nivel_agregacion], 'formato': format[obj.espec_lom.lc4_tipo_rec], #'tipo_i': tipo_i[obj.espec_lom.lc4_tipo_inter], #'nivel_i': nivel_i[obj.espec_lom.lc4_nivel_inter], 'context': contex[obj.espec_lom.lc4_contexto] } return render_to_response('objeto.html',data,context_instance=RequestContext(request)) else: return HttpResponseRedirect('/')
class Grado(models.Model): """ Modelo que representa los grados escolares relacionados en los estándares de competencias """ nominacion = models.CharField(help_text="Grado de escolaridad", verbose_name='Grado escolar', unique=True, max_length=3, choices=opc.get_grado(), default=opc.get_grado()[0][0]) descripcion = models.TextField(help_text="Descripción del grado escolar", verbose_name='Descripción', blank=True) def __unicode__(self): return self.get_nominacion_display() def __str__(self): return '{}'.format(self.get_nominacion_display())
class cEspecificacionForm(forms.Form): c_titulo = forms.CharField(max_length=200) c_tipo_obj = forms.CharField( max_length=3, widget=forms.Select(choices=opc.get_tipo_obj())) c_idioma = forms.CharField(max_length=2, widget=forms.Select(choices=opc.get_idiomas())) #c_nivel_agregacion = forms.CharField(max_length=2,widget=forms.Select(choices=opc.get_nivel_agregacion())) c_fecha = forms.DateField(initial=datetime.date.today) #c_tipo_inter = forms.CharField(max_length=3,widget=forms.Select(choices=opc.get_tipo_interactividad())) c_tipo_rec = forms.CharField( max_length=50, widget=forms.Select(choices=opc.get_tipo_recurso())) #c_nivel_inter = forms.CharField(max_length=3,widget=forms.Select(choices=opc.get_nivel_interactividad())) c_pro_fase = forms.CharField(max_length=2, widget=forms.Select(choices=opc.get_fase())) c_pro_prog = forms.ModelChoiceField(queryset=Programa.objects.all()) c_pro_calif = forms.CharField(max_length=1, widget=forms.Select(choices=opc.get_calif())) c_pro_fecha = forms.DateField(initial=datetime.date.today) c_pro_gra = forms.ModelChoiceField(queryset=Grado.objects.all())
def download(request,id): f= get_object_or_404(Objeto, pk=id) gruposobj = f.repositorio.grupos.all() gruposu = request.user.groups.all() puededescargar=False for go in gruposobj: for gu in gruposu: if go == gu: puededescargar=True if request.user.is_authenticated(): if puededescargar: return serve_file(request, f.archivo, save_as=opc.set_download_filename(f.espec_lom.lc1_titulo)) elif f.repositorio.publico & f.publicado: return serve_file(request, f.archivo, save_as=opc.set_download_filename(f.espec_lom.lc1_titulo)) else: return HttpResponseRedirect('/') elif f.repositorio.publico & f.publicado: return serve_file(request, f.archivo, save_as=opc.set_download_filename(f.espec_lom.lc1_titulo)) else: return HttpResponseRedirect('/')
def downloadEdit(request, id): codigo_espec_archivo=int(id.split('.')[0].split('_')[1])#toma el id (nombre del archivo) y toma la parte que corresponde al pk del espec del archivo f= get_object_or_404(Objeto, espec_lom=codigo_espec_archivo) gruposobj = f.repositorio.grupos.all() gruposu = request.user.groups.all() puededescargar=False for go in gruposobj: for gu in gruposu: if go == gu: puededescargar=True if request.user.is_authenticated(): if puededescargar: return serve_file(request, f.archivo, save_as=opc.set_download_filename(f.espec_lom.lc1_titulo)) elif f.repositorio.publico & f.publicado: return serve_file(request, f.archivo, save_as=opc.set_download_filename(f.espec_lom.lc1_titulo)) else: return HttpResponseRedirect('/') elif f.repositorio.publico & f.publicado: return serve_file(request, f.archivo, save_as=opc.set_download_filename(f.espec_lom.lc1_titulo)) else: return HttpResponseRedirect('/')
class EspecificacionForm(forms.ModelForm): class Meta: model = EspecificacionLOM fields = '__all__' #modificación de cada uno de los campos que se muestran en la plantilla para que tengan un tamaño fijo widgets = { 'lc1_titulo': TextInput(attrs={'size': 40}), 'lc1_descripcion': Textarea(attrs={ 'cols': 40, 'rows': 5 }), '' #'lc1_cobertura': Textarea(attrs={'cols': 40, 'rows': 5}), #'lc2_version': TextInput(attrs={'size': 40}), #'lc3_requerimientos': Textarea(attrs={'cols': 40, 'rows': 5}), #'lc3_instrucciones': Textarea(attrs={'cols': 40, 'rows': 5}), #'lc4_poblacion': Textarea(attrs={'cols': 40, 'rows': 5}), 'lc5_derechos': Textarea(attrs={ 'cols': 40, 'rows': 2 }), #'lc6_uso_educativo': Textarea(attrs={'cols': 40, 'rows': 5}), } # Reemplazo del campo de idioma para que tenga un comportamiento común lc1_idioma = forms.CharField( max_length=2, widget=forms.Select(choices=opc.get_idiomas()), label="Idioma", help_text='Lenguaje predominante en el objeto') # Reemplazo del campo de Fecha con elfin de colocar un valor inicial lc2_fecha = forms.DateField( initial=datetime.date.today, label="Fecha de Publicación", help_text='Fecha en que el objeto es publicado')
class EspecificacionLOM(models.Model): """ Modelo que representa la especificación asociada a cada :model:'gestorObjetos.Objeto' en el sistema. """ """Nombre para el objeto virtual de aprendizaje o recurso digital.""" lc1_titulo = models.CharField(help_text='Nombre para el objeto', verbose_name='Título', max_length=200, unique=True, null=False) """Lenguaje primario o lenguajes predominante en el objeto y que se utiliza para comunicarse con el usuario.""" lc1_idioma = models.CharField( help_text='Lenguaje predominante en el objeto', verbose_name='Idioma', max_length=2, choices=opc.get_idiomas(), default=opc.get_idiomas()[0][0]) """Descripción Textual del contenido del objeto.""" lc1_descripcion = models.TextField( help_text='Descripción Textual del contenido del objeto', verbose_name="Descripción", null=False) """Lugar, tiempo, cultura, geografía o región en la cual el objeto es aplicado.""" #lc1_cobertura = models.TextField( # help_text='Lugar, tiempo, cultura, geografía o región en la cual el objeto es aplicado', # verbose_name="Cobertura", null=True, blank=True) """ Granularidad Funcional del objeto. N1: recursos digitales, N2:colección de recursos. ejp: lección, N3: Colección de lecciones. ejp: cursos, N4: ejp:conjunto de cursos. """ #lc1_nivel_agregacion = models.CharField(help_text='Granularidad Funcional del objeto.', # verbose_name='Nivel de Agregación', max_length=2, # choices=opc.get_nivel_agregacion(), # default=opc.get_nivel_agregacion()[0][0]) """La edición del objeto.""" lc2_version = models.CharField(help_text='La edición del objeto', verbose_name="Versión", max_length=50, default="1.0") """Fecha en que el objeto es creado.""" lc2_fecha = models.DateTimeField( help_text='Fecha en que el objeto es publicado', verbose_name="Fecha de Publicación", auto_now_add=True) """Tipo de Datos técnico, tipo MIME Types. http://www.iana.org/assignments/media-types/index.html. lc3_formato=models.CharField(help_text='Tipo de datos. Ejp: video/mpeg, text/html, image/jpg', verbose_name="Formato", max_length=100, null=True, default="text/plain") Tamaño del objeto en megabytes. lc3_tamano=models.DecimalField(help_text='Tamaño del objeto en megabytes.', verbose_name="Tamaño", max_digits=50, decimal_places=2, null=False, default="10", editable=False) URL que se usa para acceder al Objeto lc3_ubicacion=models.URLField(max_length=300, null=True, default="url", editable=False)""" """Descripción de cómo instalar este objeto.""" #lc3_instrucciones = models.TextField(help_text='Descripción de cómo usar este objeto.', # verbose_name="Instrucciones", null=True, blank=True) """Modo predominante del aprendizaje que aplica este objeto.""" #lc4_tipo_inter = models.CharField(help_text="Modo predominante del aprendizaje que aplica este objeto", # verbose_name="Tipo de Interactividad", max_length=3, # choices=opc.get_tipo_interactividad(), # default=opc.get_tipo_interactividad()[1][0]) """Tipo de recurso de aprendizaje.""" lc4_tipo_rec = models.CharField( help_text="Tipo de recurso de aprendizaje.", verbose_name="Tipo de Recurso de Aprendizaje", max_length=50, choices=opc.get_tipo_recurso(), default=opc.get_tipo_recurso()[0][0]) """Grado de interactividad que predomina en el objeto.""" #lc4_nivel_inter = models.CharField(help_text="Grado de interactividad que predomina en el objeto.", # verbose_name="Nivel de Interactividad", max_length=3, # choices=opc.get_nivel_interactividad(), # default=opc.get_nivel_interactividad()[0][0]) """Descripción de los Usarios para los cuales este objeto fue diseñado.""" #lc4_poblacion = models.TextField(help_text='Descripción de los Usuarios para los cuales este objeto fue diseñado.', # verbose_name="Población", null=True, blank=True) """Principal ambiente en el cual este objeto es utilizado.""" #lc4_contexto = models.CharField(help_text="Principal ambiente en el cual este objeto es utilizado.", # verbose_name="Contexto", max_length=4, choices=opc.get_contexto(), # default=opc.get_contexto()[0][0]) """Comentarios sobre las condiciones de uso de este objeto.""" lc5_derechos = models.TextField( help_text= 'Condiciones de uso de este objeto. Ejp: copyright, Creative Commons', verbose_name="Derechos de Uso", null=False) """Se proveen comentarios sobre el uso educativo del objeto.""" #lc6_uso_educativo = models.TextField(help_text='Anotación sobre el uso educativo del objeto', # verbose_name="Uso Educativo", null=True, blank=True) """Capacidades técnicas requeridas para usar este objeto. OJO CAMBIAR""" #lc3_requerimientos = models.TextField(verbose_name="ExeLearning", # default="Usar ExeLearning para la creación de objetos, en caso de no tener aún objetos", # null=True, blank=True, editable=False) class Meta: verbose_name = "Metadato" verbose_name_plural = "Metadatos" def __unicode__(self): return self.lc1_titulo def __str__(self): return '{}'.format(self.lc1_titulo)
def catalogar(request): if request.user.profile.rol == 'rdoc': form = CatalogacionExeLearning(request.POST, request.FILES) objetos = Objeto.objects.filter(creador=request.user.id) error = False errorExtension=[] #gruposu = request.user.groups.all() if request.method == 'POST': if form.is_valid(): rep = form.cleaned_data['Repositorio'] cat = form.cleaned_data['Categoria'] filezip = request.FILES['archivoObjeto'] extension = filezip.name.split('.')[-1] if extension != 'zip': errorExtension.append('El archivo debe ser extension .zip') error = True else: error = False if not error: archivos.handle_uploaded_file(filezip) #escribo en otra carpeta temporal archivos.descomprimir(filezip) # obtengo el index.html #files = request.FILES.getlist('archivos') #archCatExe = files[0] metadatos = archivos.extraerMetadatos() # print (filezip) # formObj = ObjetosForm(gruposu, request.FILES.getlist('archivoObjeto')) fechaR = str(datetime.date.today().year) + '-' + str(datetime.date.today().month) + '-' + str( datetime.date.today().day) titulo ='' #se usará para buscar titulo = metadatos[0] try: vf = EspecificacionLOM.objects.get(lc1_titulo=titulo) except EspecificacionLOM.DoesNotExist: vf = None pass if vf == None: formularioEsp= EspecificacionLOM.objects.create( lc1_titulo=metadatos[0], # es el titulo lc1_idioma=metadatos[1], lc1_descripcion=metadatos[3], lc2_version='1.0', lc2_fecha=fechaR, lc4_tipo_rec='application/zip', lc5_derechos=metadatos[4], ) formularioEsp.save() # se guarda la especificaciónLOM primero else: num = 1 #vf.id + 1 for i in range(1,100): titulo = metadatos[0]+'-'+str(num) try: vp = EspecificacionLOM.objects.get(lc1_titulo=titulo) except EspecificacionLOM.DoesNotExist: vp = None pass if vp == None: formularioEsp = EspecificacionLOM.objects.create( lc1_titulo=titulo, # es el titulo lc1_idioma=metadatos[1], lc1_descripcion=metadatos[3], lc2_version='1.0', lc2_fecha=fechaR, lc4_tipo_rec='application/zip', lc5_derechos=metadatos[4], ) formularioEsp.save() break num += 1 print(num) print(type(num)) esp = EspecificacionLOM.objects.get(lc1_titulo=titulo) pc = metadatos[0] # se toman las palabras claves digitadas #rep = Repositorio.objects.get(pk=1) # se toma el repositorio, ver bien OJO # objExe.save(commit=False) # se guarda un instancia temporañ # objExe.espec_lom = esp # se asocia el objeto con su especificaciónLOM # objExe.creador = request.user # Se asocia el objeto con el usuario que lo crea # objExe.repositorio = re # objExe.save() # se guarda el objeto en la base de datos. objExe = Objeto.objects.create( publicado=True, tipo_obj=opc.get_tipo_obj()[1][0], archivo=filezip, espec_lom=esp, repositorio=rep, ruta_categoria=cat, # autores = aut, # palabras_claves=p, creador=request.user ) objExe.save() l_autores = metadatos[2] for l in l_autores: # como el objeto llega como una lista... se debe recorrer per en realidad siempre tiene un solo objeto stri = l.split( ',') # se divide la lista por comas que representa cada string de campos del autor for s in stri: # se recorre cada autor s = metadatos[2].split(' ') # se divide los campos nombres, apellidos y rol en una lista aut, cr = Autor.objects.get_or_create(nombres=s[0].replace('-', ','), apellidos=s[1].replace('-', ','), rol='Autor') if not cr: # Si ya existe el autor entonces se obvia el proceso de crearlo aut.save() # se guarda el autor en la bd objExe.autores.add(aut) # se añade al campo manytomany con Autores. if ',' in pc: # si hay comas en las palabras claves lpc = [x.strip() for x in pc.split( ',')] # se utilizan las palabras claves como una lista de palabras separadas sin comas ni espacios else: lpc = [x.strip() for x in pc.split( ' ')] # se utilizan las palabras claves como una lista de palabras separadas sin espacios for l in lpc: p, b = PalabraClave.objects.get_or_create(palabra_clave=l) # Se crea una palabra clave por cada palabra en la lista if not b: # Si ya existe la palabra entonces se obvia el proceso de crearla p.save() # se guarda la palabra clave en la bd objExe.palabras_claves.add(p) # se añade cada palabra clave al objeto messages.add_message(request, messages.SUCCESS, 'Objeto agregado y catalogado exitosamente') form = CatalogacionExeLearning() else: form = CatalogacionExeLearning(request.POST) else: form = CatalogacionExeLearning(request.POST) print("error dela validacion") else: form = CatalogacionExeLearning() print("error del post") else: return HttpResponseRedirect('/') return render_to_response('catalogacion.html', {'usuario': request.user, 'objetos': objetos, 'form': form, 'l_errores':errorExtension}, context_instance=RequestContext(request))