Index: procesamiento/views.py
===================================================================
--- procesamiento/views.py	(revision 0ff122b697211e39002ab2e9b7ae219151b90c13)
+++ procesamiento/views.py	(revision 0ff122b697211e39002ab2e9b7ae219151b90c13)
@@ -0,0 +1,359 @@
+# -*- coding: utf-8 -*-
+"""
+Sistema de Consulta PÃºblica
+
+Copyleft (@) 2017 CENDITEL nodo MÃ©rida - https://planificacion.cenditel.gob.ve/trac/wiki/ModeladoTopicos_2017
+"""
+## @package procesamiento.views
+#
+# Vistas correspondientes a la aplicaciÃ³n procesamiento
+# @author Rodrigo Boet (rboet at cenditel.gob.ve)
+# @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e InvestigaciÃ³n en TecnologÃ­as Libres
+# (CENDITEL) nodo MÃ©rida - Venezuela</a>
+# @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versiÃ³n 2 (GPLv2)</a>
+# @version 1.0
+from shutil import copy
+from django.shortcuts import render
+from django.views.generic import (
+    FormView, TemplateView, CreateView, ListView,
+    DeleteView, UpdateView
+    )
+from django.core.urlresolvers import reverse_lazy
+from django.http import JsonResponse
+from django.contrib.messages.views import SuccessMessageMixin
+## Importaciones de la consulta
+from consulta_publica.settings import PROCESAMIENTO_PATH, BASE_DIR
+from consulta.models import Consulta
+## Importaciones propias
+from .forms import ProcesamientoSelectForm, ProcesamientoForm, ProcesamientoActionForm
+from .models import Procesamiento
+## Importaciones de los utils
+from utils.freeling import *
+from utils.corpusScript import *
+from utils.run_lda import generate_comand
+
+
+class ProcesamientoIndex(FormView):
+    """!
+    Clase que gestiona la vista principal del procesamiento
+
+    @author Rodrigo Boet (rboet at cenditel.gob.ve)
+    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versiÃ³n 2 (GPLv2)</a>
+    @date 28-03-2017
+    @version 1.0.0
+    """
+    template_name = "procesamiento.index.html"
+    form_class = ProcesamientoSelectForm
+
+    def get_success_url(self):
+        """!
+        Metodo que permite definir la url de direcciÃ³n al ser vÃ¡lido el formulario
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 28-03-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @return Retorna la url
+        """
+        consulta = self.request.POST['consultas']
+        return reverse_lazy('procesamiento_select',
+                            kwargs={'pk': consulta})
+
+class ProcesamientoSelect(FormView):
+    """!
+    Clase que gestiona la vista principal de las opciones del procesamiento
+
+    @author Rodrigo Boet (rboet at cenditel.gob.ve)
+    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versiÃ³n 2 (GPLv2)</a>
+    @date 28-03-2017
+    @version 1.0.0
+    """
+    template_name = "procesamiento.select.html"
+    form_class = ProcesamientoActionForm
+    
+    def get_context_data(self, **kwargs):
+        """!
+        Metodo para cargar/obtener valores en el contexto de la vista
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 28-03-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
+        @return Retorna los datos de contexto
+        """
+        kwargs['pk'] = self.kwargs['pk']
+        procesamiento = Procesamiento.objects.filter(consulta_id=kwargs['pk'])
+        if(procesamiento):
+            kwargs['procesamiento'] = True
+        return super(ProcesamientoSelect, self).get_context_data(**kwargs)
+    
+    def form_valid(self,form):
+        """!
+        Metodo que permite procesar si el formulario es vÃ¡lido
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 29-03-2017
+        @param self <b>{object}</b> Objeto que instancia el mÃ©todo
+        @param form <b>{object}</b> Objeto que contiene el formulario
+        @return Retorna un redirect a la success_url
+        """        
+        procesamiento_id  = form.cleaned_data['procesamiento']
+        
+        procesamiento = Procesamiento.objects.get(pk=procesamiento_id)
+        excluded_words = procesamiento.excluded_words
+        
+        if len(excluded_words)>0:
+            excluded_words = excluded_words.split(",")
+        
+        ## Se crea el directorio del procesamiento
+        procesamiento_dir = PROCESAMIENTO_PATH+"/"+procesamiento.procesamiento_dir
+        if not os.path.exists(procesamiento_dir):
+            os.mkdir(procesamiento_dir)
+            
+        ## Se preparan los archivos/directorios necesarios para el pre-procesamiento
+        self.prepare_files(procesamiento.corpus_dir,procesamiento_dir)
+        
+        ## Se realiza el freeling y procesamiento con LDA
+        self.make_process(procesamiento_dir,procesamiento.words,procesamiento.excluded_words)
+        
+        ## Se guarda como corrido el procesamiento
+        procesamiento.used = True
+        procesamiento.save()
+        
+        if self.request.is_ajax():
+            return JsonResponse({"code":True})
+        else:
+            return super(ProcesamientoSelect, self).form_valid(form)
+        
+    def prepare_files(self,path,dest):
+        """!
+        Metodo para copiar los corpus del destino al origen y crear los directorios
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 08-02-2017
+        @param self <b>{object}</b> Objeto que instancia el mÃ©todo
+        @param path <b>{str}</b> Recibe la ruta de origen
+        @param dest <b>{str}</b> Recibe la ruta de destino
+        """
+        ## Se crea el directorio orig si no existe
+        if not os.path.exists(dest+"/orig/"):
+            os.mkdir(dest+"/orig/")
+        ## Se obtiene una lista de los archivos en el directorio
+        list_files = corpus_files = os.listdir(path)
+        ## Se copian los archivos del directorio a la raiz de proyecto
+        for item in list_files:
+            copy(path+"/"+item, dest+"/orig/")
+        ## Se crean los directorios necesarios para el pre-procesamiento
+        if not os.path.exists(dest+"/lower/"):
+            os.mkdir(dest+"/lower/")
+        if not os.path.exists(dest+"/pp/"):
+            os.mkdir(dest+"/pp/")
+        if not os.path.exists(dest+"/lda/"):
+            os.mkdir(dest+"/lda/")
+        if not os.path.exists(dest+"/freeling/"):
+            os.mkdir(dest+"/freeling/")
+        if not os.path.exists(dest+"/noaccent/"):
+            os.mkdir(dest+"/noaccent/")
+            
+    def make_process(self, path, word_list, exluded_words):
+        """!
+        Metodo para realizar el pre-procesamiento y lda
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 09-02-2017
+        @param self <b>{object}</b> Objeto que instancia el mÃ©todo
+        @param path <b>{str}</b> Recibe la ruta de origen del corpus
+        @param word_list <b>{list}</b> Recibe una lista palabras a excluir
+        @param exluded_words <b>{list}</b> Recibe una lista de las palabras a excluir
+        """
+        orig_corpus_path = path + '/orig/'
+        lower_corpus_path = path + '/lower/'
+        pp_corpus_path = path + '/pp/'
+        lda_corpus_path = path + '/lda/'
+        
+        ## Crea los archivos de puro minusculas
+        files_to_lower(orig_corpus_path,lower_corpus_path)
+        
+        ## Se realiza el pre-procesamiento
+        if len(word_list)>1:
+            file_words_pp,corpus_words = preprocess(lower_corpus_path,do_fl=True,pos_list=word_list)
+        else:
+            file_words_pp,corpus_words = preprocess(lower_corpus_path,do_fl=True)
+        
+        ## Se genera el archivo de vocabulario excluido
+        generate_exluded_file(path+"/",pp_corpus_path,file_words_pp,exluded_words)
+        
+        ## Se generan los archivos .dat
+        corpus_script(pp_corpus_path,lda_corpus_path)
+        
+        ## Se generan los archivos con el LDA
+        corpus_dat = lda_corpus_path+'corpus.dat' 
+        generate_comand(BASE_DIR,corpus_dat,path,9)
+    
+class ProcesamientoCreate(SuccessMessageMixin,CreateView):
+    """!
+    Clase que gestiona la creaciÃ³n de perfiles procesamiento
+
+    @author Rodrigo Boet (rboet at cenditel.gob.ve)
+    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versiÃ³n 2 (GPLv2)</a>
+    @date 28-03-2017
+    @version 1.0.0
+    """
+    model = Procesamiento
+    form_class = ProcesamientoForm
+    template_name = "procesamiento.create.html"
+    success_message = "Se creÃ³ el perfil de procesamiento con Ã©xito"
+    success_url = reverse_lazy('procesamiento_index')
+    
+    def get_context_data(self, **kwargs):
+        """!
+        Metodo para cargar/obtener valores en el contexto de la vista
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 28-03-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
+        @return Retorna los datos de contexto
+        """
+        kwargs['pk'] = self.kwargs['pk']
+        return super(ProcesamientoCreate, self).get_context_data(**kwargs)
+    
+    def form_valid(self,form):
+        """!
+        Metodo que al que accede si el formulario es vÃ¡lido
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 28-03-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @param form <b>{object}</b> Objeto que contiene el formulario de registro
+        @return Retorna el formulario validado
+        """
+        consulta = Consulta.objects.get(pk=self.kwargs['pk'])
+        self.object = form.save(commit=False)
+        self.object.procesamiento_dir = form.cleaned_data['procesamiento_dir']
+        self.object.corpus_dir = form.cleaned_data['corpus_dir']
+        self.object.words = form.cleaned_data['words']
+        self.object.excluded_words = form.cleaned_data['excluded_words']
+        self.object.consulta = consulta
+        self.object.save()
+        return super(ProcesamientoCreate, self).form_valid(form)
+    
+    
+class ProcesamientoList(ListView):
+    """!
+    Clase que gestiona la lista de los perfiles procesamiento
+
+    @author Rodrigo Boet (rboet at cenditel.gob.ve)
+    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versiÃ³n 2 (GPLv2)</a>
+    @date 28-03-2017
+    @version 1.0.0
+    """
+    model = Procesamiento
+    template_name = "procesamiento.list.html"
+    
+    def get_context_data(self, **kwargs):
+        """!
+        Metodo para cargar/obtener valores en el contexto de la vista
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 28-03-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
+        @return Retorna los datos de contexto
+        """
+        kwargs['pk'] = self.kwargs['pk']
+        return super(ProcesamientoList, self).get_context_data(**kwargs)
+    
+    
+class ProcesamientoDelete(SuccessMessageMixin,DeleteView):
+    """!
+    Clase que gestiona la borrado de perfiles de procesamiento
+
+    @author Rodrigo Boet (rboet at cenditel.gob.ve)
+    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versiÃ³n 2 (GPLv2)</a>
+    @date 28-03-2017
+    @version 1.0.0
+    """
+    model = Procesamiento
+    template_name = "procesamiento.delete.html"
+    success_message = "Se eliminÃ³ el perfil de procesamiento con Ã©xito"
+    
+    def get_context_data(self, **kwargs):
+        """!
+        Metodo para cargar/obtener valores en el contexto de la vista
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 28-03-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
+        @return Retorna los datos de contexto
+        """
+        kwargs['pk'] = self.kwargs['pk_consulta']
+        return super(ProcesamientoDelete, self).get_context_data(**kwargs)
+    
+    
+    def get_success_url(self):
+        """!
+        Metodo que permite definir la url de direcciÃ³n al ser vÃ¡lido el formulario
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 28-03-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @return Retorna la url
+        """
+        pk = self.kwargs['pk_consulta']
+        return reverse_lazy('procesamiento_list',
+                            kwargs={'pk': pk})
+    
+    
+class ProcesamientoUpdate(SuccessMessageMixin,UpdateView):
+    """!
+    Clase que gestiona la actualizaciÃ³n de perfiles de procesamiento
+
+    @author Rodrigo Boet (rboet at cenditel.gob.ve)
+    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versiÃ³n 2 (GPLv2)</a>
+    @date 28-03-2017
+    @version 1.0.0
+    """
+    model = Procesamiento
+    form_class = ProcesamientoForm
+    template_name = "procesamiento.update.html"
+    success_message = "Se actualizÃ³ el perfil de procesamiento con Ã©xito"
+    
+    def get_context_data(self, **kwargs):
+        """!
+        Metodo para cargar/obtener valores en el contexto de la vista
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 28-03-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
+        @return Retorna los datos de contexto
+        """
+        kwargs['pk'] = self.kwargs['pk_consulta']
+        return super(ProcesamientoUpdate, self).get_context_data(**kwargs)
+    
+    def get_success_url(self):
+        """!
+        Metodo que permite definir la url de direcciÃ³n al ser vÃ¡lido el formulario
+    
+        @author Rodrigo Boet (rboet at cenditel.gob.ve)
+        @copyright GNU/GPLv2
+        @date 28-03-2017
+        @param self <b>{object}</b> Objeto que instancia la clase
+        @return Retorna la url
+        """
+        pk = self.kwargs['pk_consulta']
+        return reverse_lazy('procesamiento_list',
+                            kwargs={'pk': pk})
+    
