source: consulta_publica/procesamiento/views.py @ 7095598

baseconstituyenteestudiantesgeneralplan_patriasala
Last change on this file since 7095598 was 692b6c9, checked in by rudmanmrrod <rudman22@…>, 7 años ago

Modificado el metodo de borrar procesamiento para borrar también el directorio

  • Propiedad mode establecida a 100644
File size: 16.7 KB
Línea 
1# -*- coding: utf-8 -*-
2"""
3Sistema de Consulta Pública
4
5Copyleft (@) 2017 CENDITEL nodo Mérida - https://planificacion.cenditel.gob.ve/trac/wiki/ModeladoTopicos_2017
6"""
7## @package procesamiento.views
8#
9# Vistas correspondientes a la aplicación procesamiento
10# @author Rodrigo Boet (rboet at cenditel.gob.ve)
11# @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
12# (CENDITEL) nodo Mérida - Venezuela</a>
13# @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
14# @version 1.0
15from shutil import copy, rmtree
16from django.shortcuts import render
17from django.views.generic import (
18    FormView, TemplateView, CreateView, ListView,
19    DeleteView, UpdateView
20    )
21from django.core.urlresolvers import reverse_lazy
22from django.http import JsonResponse
23from django.contrib.messages.views import SuccessMessageMixin
24from django.contrib.auth.mixins import LoginRequiredMixin
25from braces.views import GroupRequiredMixin
26from django.contrib.auth.models import User
27## Importaciones de la consulta
28from consulta_publica.settings import PROCESAMIENTO_PATH, BASE_DIR
29from consulta.models import Consulta
30## Importaciones propias
31from .forms import ProcesamientoSelectForm, ProcesamientoForm, ProcesamientoActionForm
32from .models import Procesamiento
33## Importaciones de los utils
34from utils.freeling import *
35from utils.corpusScript import *
36from utils.run_lda import generate_comand
37
38
39class ProcesamientoIndex(GroupRequiredMixin,LoginRequiredMixin,FormView):
40    """!
41    Clase que gestiona la vista principal del procesamiento
42
43    @author Rodrigo Boet (rboet at cenditel.gob.ve)
44    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
45    @date 28-03-2017
46    @version 1.0.0
47    """
48    template_name = "procesamiento.index.html"
49    form_class = ProcesamientoSelectForm
50    group_required = u"Administrador"
51
52    def get_success_url(self):
53        """!
54        Metodo que permite definir la url de dirección al ser válido el formulario
55   
56        @author Rodrigo Boet (rboet at cenditel.gob.ve)
57        @copyright GNU/GPLv2
58        @date 28-03-2017
59        @param self <b>{object}</b> Objeto que instancia la clase
60        @return Retorna la url
61        """
62        consulta = self.request.POST['consultas']
63        return reverse_lazy('procesamiento_select',
64                            kwargs={'pk': consulta})
65
66class ProcesamientoSelect(GroupRequiredMixin,LoginRequiredMixin,FormView):
67    """!
68    Clase que gestiona la vista principal de las opciones del procesamiento
69
70    @author Rodrigo Boet (rboet at cenditel.gob.ve)
71    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
72    @date 28-03-2017
73    @version 1.0.0
74    """
75    template_name = "procesamiento.select.html"
76    form_class = ProcesamientoActionForm
77    group_required = u"Administrador"
78   
79    def get_form_kwargs(self,**kwargs):
80        """!
81        Metodo que permite pasar el id de la consulta y pasarlo al form
82   
83        @author Rodrigo Boet (rboet at cenditel.gob.ve)
84        @copyright GNU/GPLv2
85        @date 17-04-2017
86        @param self <b>{object}</b> Objeto que instancia la clase
87        @return Retorna el kwargs con el id de la consulta
88        """
89        kwargs = super(ProcesamientoSelect, self).get_form_kwargs()
90        kwargs.update({'pk': self.kwargs['pk']})
91        return kwargs
92       
93    def get_context_data(self, **kwargs):
94        """!
95        Metodo para cargar/obtener valores en el contexto de la vista
96   
97        @author Rodrigo Boet (rboet at cenditel.gob.ve)
98        @copyright GNU/GPLv2
99        @date 28-03-2017
100        @param self <b>{object}</b> Objeto que instancia la clase
101        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
102        @return Retorna los datos de contexto
103        """
104        kwargs['pk'] = self.kwargs['pk']
105        procesamiento = Procesamiento.objects.filter(consulta_id=kwargs['pk'])
106        if(procesamiento):
107            kwargs['procesamiento'] = True
108        return super(ProcesamientoSelect, self).get_context_data(**kwargs)
109   
110    def form_valid(self,form):
111        """!
112        Metodo que permite procesar si el formulario es válido
113   
114        @author Rodrigo Boet (rboet at cenditel.gob.ve)
115        @copyright GNU/GPLv2
116        @date 29-03-2017
117        @param self <b>{object}</b> Objeto que instancia el método
118        @param form <b>{object}</b> Objeto que contiene el formulario
119        @return Retorna un redirect a la success_url
120        """       
121        procesamiento_id  = form.cleaned_data['procesamiento']
122       
123        procesamiento = Procesamiento.objects.get(pk=procesamiento_id)
124        excluded_words = procesamiento.excluded_words
125       
126        if len(excluded_words)>0:
127            excluded_words = [item.strip() for item in excluded_words.split(",")]
128                   
129        dir_consulta = "_".join(procesamiento.consulta.nombre_consulta.split(" "))
130        ## Se crea el directorio del procesamiento
131        procesamiento_dir = PROCESAMIENTO_PATH+"/"+dir_consulta
132        if not os.path.exists(procesamiento_dir):
133            os.mkdir(procesamiento_dir)
134           
135        ## Se preparan los archivos/directorios necesarios para el pre-procesamiento
136        self.prepare_files(procesamiento_dir)
137       
138        ## Se realiza el freeling y procesamiento con LDA
139        self.make_process(procesamiento_dir,procesamiento.words,procesamiento.excluded_words)
140       
141        ## Se guarda como corrido el procesamiento
142        procesamiento.used = True
143        procesamiento.save()
144       
145        if self.request.is_ajax():
146            return JsonResponse({"code":True})
147        else:
148            return super(ProcesamientoSelect, self).form_valid(form)
149       
150    def prepare_files(self,dest):
151        """!
152        Metodo para copiar los corpus del destino al origen y crear los directorios
153   
154        @author Rodrigo Boet (rboet at cenditel.gob.ve)
155        @copyright GNU/GPLv2
156        @date 08-02-2017
157        @param self <b>{object}</b> Objeto que instancia el método
158        @param dest <b>{str}</b> Recibe la ruta de destino
159        """
160        ## Se crean los directorios necesarios para el pre-procesamiento
161        if not os.path.exists(dest+"/lower/"):
162            os.mkdir(dest+"/lower/")
163        if not os.path.exists(dest+"/pp/"):
164            os.mkdir(dest+"/pp/")
165        if not os.path.exists(dest+"/lda/"):
166            os.mkdir(dest+"/lda/")
167        if not os.path.exists(dest+"/freeling/"):
168            os.mkdir(dest+"/freeling/")
169        if not os.path.exists(dest+"/noaccent/"):
170            os.mkdir(dest+"/noaccent/")
171           
172    def make_process(self, path, word_list, exluded_words):
173        """!
174        Metodo para realizar el pre-procesamiento y lda
175   
176        @author Rodrigo Boet (rboet at cenditel.gob.ve)
177        @copyright GNU/GPLv2
178        @date 09-02-2017
179        @param self <b>{object}</b> Objeto que instancia el método
180        @param path <b>{str}</b> Recibe la ruta de origen del corpus
181        @param word_list <b>{list}</b> Recibe una lista palabras a excluir
182        @param exluded_words <b>{list}</b> Recibe una lista de las palabras a excluir
183        """
184        orig_corpus_path = path + '/orig/'
185        lower_corpus_path = path + '/lower/'
186        pp_corpus_path = path + '/pp/'
187        lda_corpus_path = path + '/lda/'
188       
189        ## Crea los archivos de puro minusculas
190        files_to_lower(orig_corpus_path,lower_corpus_path)
191       
192        ## Se realiza el pre-procesamiento
193        if len(word_list)>1:
194            file_words_pp,corpus_words = preprocess(lower_corpus_path,do_fl=True,pos_list=word_list)
195        else:
196            file_words_pp,corpus_words = preprocess(lower_corpus_path,do_fl=True)
197       
198        ## Se genera el archivo de vocabulario excluido
199        generate_exluded_file(path+"/",pp_corpus_path,file_words_pp,exluded_words)
200       
201        ## Se generan los archivos .dat
202        corpus_script(pp_corpus_path,lda_corpus_path)
203       
204        ## Se generan los archivos con el LDA
205        corpus_dat = lda_corpus_path+'corpus.dat' 
206        generate_comand(BASE_DIR,corpus_dat,path,9)
207   
208class ProcesamientoCreate(GroupRequiredMixin,LoginRequiredMixin,SuccessMessageMixin,CreateView):
209    """!
210    Clase que gestiona la creación de perfiles procesamiento
211
212    @author Rodrigo Boet (rboet at cenditel.gob.ve)
213    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
214    @date 28-03-2017
215    @version 1.0.0
216    """
217    model = Procesamiento
218    form_class = ProcesamientoForm
219    template_name = "procesamiento.create.html"
220    success_message = "Se creó el perfil de procesamiento con éxito"
221    success_url = reverse_lazy('procesamiento_index')
222    group_required = u"Administrador"
223   
224    def get_form_kwargs(self,**kwargs):
225        """!
226        Metodo que permite pasar el id de la consulta y pasarlo al form
227   
228        @author Rodrigo Boet (rboet at cenditel.gob.ve)
229        @copyright GNU/GPLv2
230        @date 17-04-2017
231        @param self <b>{object}</b> Objeto que instancia la clase
232        @return Retorna el kwargs con el id de la consulta
233        """
234        kwargs = super(ProcesamientoCreate, self).get_form_kwargs()
235        kwargs.update({'pk': self.kwargs['pk']})
236        return kwargs
237   
238    def get_context_data(self, **kwargs):
239        """!
240        Metodo para cargar/obtener valores en el contexto de la vista
241   
242        @author Rodrigo Boet (rboet at cenditel.gob.ve)
243        @copyright GNU/GPLv2
244        @date 28-03-2017
245        @param self <b>{object}</b> Objeto que instancia la clase
246        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
247        @return Retorna los datos de contexto
248        """
249        kwargs['pk'] = self.kwargs['pk']
250        return super(ProcesamientoCreate, self).get_context_data(**kwargs)
251   
252    def form_valid(self,form):
253        """!
254        Metodo que al que accede si el formulario es válido
255   
256        @author Rodrigo Boet (rboet at cenditel.gob.ve)
257        @copyright GNU/GPLv2
258        @date 28-03-2017
259        @param self <b>{object}</b> Objeto que instancia la clase
260        @param form <b>{object}</b> Objeto que contiene el formulario de registro
261        @return Retorna el formulario validado
262        """
263        consulta = Consulta.objects.get(pk=self.kwargs['pk'])
264        user = User.objects.get(pk=self.request.user.id)
265        self.object = form.save(commit=False)
266        self.object.procesamiento_dir = form.cleaned_data['procesamiento_dir']
267        self.object.words = form.cleaned_data['words']
268        self.object.excluded_words = form.cleaned_data['excluded_words']
269        self.object.consulta = consulta
270        self.object.user = user
271        self.object.save()
272        return super(ProcesamientoCreate, self).form_valid(form)
273   
274   
275class ProcesamientoList(GroupRequiredMixin,LoginRequiredMixin,ListView):
276    """!
277    Clase que gestiona la lista de los perfiles procesamiento
278
279    @author Rodrigo Boet (rboet at cenditel.gob.ve)
280    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
281    @date 28-03-2017
282    @version 1.0.0
283    """
284    model = Procesamiento
285    template_name = "procesamiento.list.html"
286    group_required = u"Administrador"
287   
288    def get_context_data(self, **kwargs):
289        """!
290        Metodo para cargar/obtener valores en el contexto de la vista
291   
292        @author Rodrigo Boet (rboet at cenditel.gob.ve)
293        @copyright GNU/GPLv2
294        @date 28-03-2017
295        @param self <b>{object}</b> Objeto que instancia la clase
296        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
297        @return Retorna los datos de contexto
298        """
299        kwargs['pk'] = self.kwargs['pk']
300        context = super(ProcesamientoList, self).get_context_data(**kwargs)
301        context['object_list'] = Procesamiento.objects.filter(consulta_id=kwargs['pk']).all()
302        return context
303       
304   
305   
306class ProcesamientoDelete(GroupRequiredMixin,LoginRequiredMixin,SuccessMessageMixin,DeleteView):
307    """!
308    Clase que gestiona la borrado de perfiles de procesamiento
309
310    @author Rodrigo Boet (rboet at cenditel.gob.ve)
311    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
312    @date 28-03-2017
313    @version 1.0.0
314    """
315    model = Procesamiento
316    template_name = "procesamiento.delete.html"
317    success_message = "Se eliminó el perfil de procesamiento con éxito"
318    group_required = u"Administrador"
319   
320    def post(self,request,*args, **kwargs):
321        """!
322        Metodo de la petición de borrado por POST
323   
324        @author Rodrigo Boet (rboet at cenditel.gob.ve)
325        @copyright GNU/GPLv2
326        @date 04-05-2017
327        @param self <b>{object}</b> Objeto que instancia la clase
328        @param request <b>{object}</b> Objeto que contiene la petición
329        @param args <b>{object}</b> Objeto que contiene los argumentos
330        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
331        @return Retorna el borrado por post
332        """
333        procesamiento = self.model.objects.get(pk=kwargs['pk'])
334        ## Se genera el nombre del directorio del procesamiento
335        dir_consulta = "_".join(procesamiento.consulta.nombre_consulta.split(" "))
336        procesamiento_dir = PROCESAMIENTO_PATH+"/"+dir_consulta
337        ## Se borra el directorio de la consulta
338        rmtree(procesamiento_dir)
339        return super(ProcesamientoDelete, self).post(request,*args, **kwargs)
340   
341    def get_context_data(self, **kwargs):
342        """!
343        Metodo para cargar/obtener valores en el contexto de la vista
344   
345        @author Rodrigo Boet (rboet at cenditel.gob.ve)
346        @copyright GNU/GPLv2
347        @date 28-03-2017
348        @param self <b>{object}</b> Objeto que instancia la clase
349        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
350        @return Retorna los datos de contexto
351        """
352        kwargs['pk'] = self.kwargs['pk_consulta']
353        return super(ProcesamientoDelete, self).get_context_data(**kwargs)
354   
355   
356    def get_success_url(self):
357        """!
358        Metodo que permite definir la url de dirección al ser válido el formulario
359   
360        @author Rodrigo Boet (rboet at cenditel.gob.ve)
361        @copyright GNU/GPLv2
362        @date 28-03-2017
363        @param self <b>{object}</b> Objeto que instancia la clase
364        @return Retorna la url
365        """
366        pk = self.kwargs['pk_consulta']
367        return reverse_lazy('procesamiento_list',
368                            kwargs={'pk': pk})
369   
370   
371class ProcesamientoUpdate(GroupRequiredMixin,LoginRequiredMixin,SuccessMessageMixin,UpdateView):
372    """!
373    Clase que gestiona la actualización de perfiles de procesamiento
374
375    @author Rodrigo Boet (rboet at cenditel.gob.ve)
376    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
377    @date 28-03-2017
378    @version 1.0.0
379    """
380    model = Procesamiento
381    form_class = ProcesamientoForm
382    template_name = "procesamiento.update.html"
383    success_message = "Se actualizó el perfil de procesamiento con éxito"
384    group_required = u"Administrador"
385   
386    def get_form_kwargs(self,**kwargs):
387        """!
388        Metodo que permite pasar el id de la consulta y pasarlo al form
389   
390        @author Rodrigo Boet (rboet at cenditel.gob.ve)
391        @copyright GNU/GPLv2
392        @date 17-04-2017
393        @param self <b>{object}</b> Objeto que instancia la clase
394        @return Retorna el kwargs con el id de la consulta
395        """
396        kwargs = super(ProcesamientoUpdate, self).get_form_kwargs()
397        kwargs.update({'pk': self.kwargs['pk']})
398        return kwargs
399   
400    def get_context_data(self, **kwargs):
401        """!
402        Metodo para cargar/obtener valores en el contexto de la vista
403   
404        @author Rodrigo Boet (rboet at cenditel.gob.ve)
405        @copyright GNU/GPLv2
406        @date 28-03-2017
407        @param self <b>{object}</b> Objeto que instancia la clase
408        @param kwargs <b>{object}</b> Objeto que contiene los datos de contexto
409        @return Retorna los datos de contexto
410        """
411        kwargs['pk'] = self.kwargs['pk_consulta']
412        return super(ProcesamientoUpdate, self).get_context_data(**kwargs)
413   
414    def get_success_url(self):
415        """!
416        Metodo que permite definir la url de dirección al ser válido el formulario
417   
418        @author Rodrigo Boet (rboet at cenditel.gob.ve)
419        @copyright GNU/GPLv2
420        @date 28-03-2017
421        @param self <b>{object}</b> Objeto que instancia la clase
422        @return Retorna la url
423        """
424        pk = self.kwargs['pk_consulta']
425        return reverse_lazy('procesamiento_list',
426                            kwargs={'pk': pk})
427   
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.