Obtener Módulos de un Proyecto y Vistas de una Aplicación en Django

Debido a un requerimiento en un proyecto necesitabamos tener una página donde administrar todas las aplicaciones que hemos creado en nuestro proyecto Django y poder revisar que vistas(views) tiene cada uno de estas aplicaciones, para ello creamos una aplicación llamada permisos y una vista llamada AplicacionesProyecto de la siguiente manera:

[sourcecode language="python"]
class AplicacionesProyecto(View):

def get(self, request, *args, **kwargs):
aplicaciones = [ app for app in miproyecto.settings.INSTALLED_APPS if not "django" in app ]
context={‘aplicaciones’:aplicaciones}
return render(request, ‘reporte_aplicaciones.html’,context)
[/sourcecode]

Nuestro template se llama reporte_aplicaciones.html y tiene la siguiente estructura:

[sourcecode language="html"]
{% extends "base_permisos.html" %}
{% block titulo_opcion %}
Reporte de Aplicaciones
{% endblock titulo_opcion %}
{% block cuerpo_opcion %}
<table class="table table-striped">
<tbhead>
<tr>
<th>Nombre</th>
<th>Vistas</th>
</tr>
</tbhead>
<tbody>
{% for app in aplicaciones %}
<tr>
<td>{{ app }}</td>
<td>
<a class="btn btn-small" href="{% url ‘permisos:reporte_vistas’ app %}">
<span class="glyphicon glyphicon-folder-open"></span>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock cuerpo_opcion %}
[/sourcecode]

La idea es obtener un listado de tal manera que al dar click en el enlace de cada uno de los módulos podamos ver las vistas(Views) que tiene cada una de las aplicaciones:

[sourcecode language="python"]
class ReporteVistas(View):

def get(self, request, *args, **kwargs):
aplicacion = self.kwargs['aplicacion']
lista_clases = []
for nombre_modulo,instancia_modulo in inspect.getmembers(sys.modules[aplicacion]):
if nombre_modulo==’views’:
codigo_fuente = inspect.getsource(instancia_modulo)
codigo_fuente = codigo_fuente.replace(" ", "")
for miembro in dir(instancia_modulo):
obj = getattr(instancia_modulo, miembro)
if inspect.isclass(obj):
cadena_clase = ‘class’ + miembro
if codigo_fuente.find(cadena_clase)>=0:
lista_clases.append(miembro)
context={‘vistas’:lista_clases}
return render(request, ‘reporte_vistas_aplicacion.html’,context)
[/sourcecode]

Nuestro template es reporte_vistas_aplicacion.html y tiene el siguiente contenido:

[sourcecode language="html"]
{% extends "base_permisos.html" %}
{% block titulo_opcion %}
Reporte de Vistas
{% endblock titulo_opcion %}
{% block cuerpo_opcion %}
{% for vista in vistas %}
{{ vista }}
{% endfor %}
{% endblock cuerpo_opcion %}
[/sourcecode]

Los urls respectivos son de la siguiente manera, archivo urls.py:

[sourcecode language="python"]
url(r’^aplicaciones_proyecto’, login_required(AplicacionesProyecto.as_view()), name="aplicaciones_proyecto"),
url(r’^reporte_vistas/(?P<aplicacion>.+)/$’, login_required(ReporteVistas.as_view()), name="reporte_vistas"),
[/sourcecode]

Así de esta manera tenemos un procedimiento un tanto rudimentario pero útil con el que obtenemos, las aplicaciones de nuestro proyecto y las vistas de cada una de ellas.
Hasta la próxima.

Comentarios

Comments powered by Disqus