diff --git a/sapl/base/forms.py b/sapl/base/forms.py index fecba4a52..4043c1310 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -23,7 +23,7 @@ from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, from sapl.audiencia.models import AudienciaPublica,TipoAudienciaPublica from sapl.comissoes.models import Reuniao, Comissao from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao, StatusTramitacao) -from sapl.norma.models import (NormaJuridica) +from sapl.norma.models import (NormaJuridica, NormaEstatisticas) from sapl.parlamentares.models import SessaoLegislativa from sapl.sessao.models import SessaoPlenaria from sapl.settings import MAX_IMAGE_UPLOAD_SIZE @@ -728,6 +728,45 @@ class RelatorioNormasMesFilterSet(django_filters.FilterSet): return parent.distinct().order_by('data') +class EstatisticasAcessoNormasFilterSet(django_filters.FilterSet): + + ano = django_filters.ChoiceFilter(required=True, + label='Ano de acesso', + choices=RANGE_ANOS) + + filter_overrides = {models.DateField: { + 'filter_class': django_filters.DateFromToRangeFilter, + 'extra': lambda f: { + 'label': '%s (%s)' % (f.verbose_name, _('Ano')), + 'widget': RangeWidgetOverride} + }} + + + class Meta: + model = NormaEstatisticas + fields = ['ano'] + + def __init__(self, *args, **kwargs): + super(EstatisticasAcessoNormasFilterSet, self).__init__( + *args, **kwargs) + self.filters['ano'].label = 'Ano' + self.form.fields['ano'].required = True + + row1 = to_row([('ano', 12)]) + + self.form.helper = FormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Normas por acessos nos meses do ano.'), + row1, form_actions(label='Pesquisar')) + ) + + @property + def qs(self): + parent = super(EstatisticasAcessoNormasFilterSet, self).qs + return parent.distinct().order_by('horario_acesso') + + class RelatorioNormasVigenciaFilterSet(django_filters.FilterSet): ano = django_filters.ChoiceFilter(required=True, diff --git a/sapl/base/views.py b/sapl/base/views.py index 599d6b05f..402b43cf8 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -10,6 +10,7 @@ from django.contrib.auth.tokens import default_token_generator from django.core.exceptions import ObjectDoesNotExist, PermissionDenied from django.core.mail import send_mail from django.core.urlresolvers import reverse +from django.db import connection from django.db.models import Count from django.http import Http404, HttpResponseRedirect from django.template import TemplateDoesNotExist @@ -49,7 +50,8 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm, RelatorioPresencaSessaoFilterSet, RelatorioReuniaoFilterSet, UsuarioCreateForm, UsuarioEditForm, RelatorioNormasMesFilterSet, - RelatorioNormasVigenciaFilterSet) + RelatorioNormasVigenciaFilterSet, + EstatisticasAcessoNormasFilterSet) from .models import AppConfig, CasaLegislativa @@ -859,8 +861,8 @@ class RelatorioNormasVigenciaView(FilterView): class EstatisticasAcessoNormas(FilterView): - model = NormaJuridica - filterset_class = RelatorioNormasMesFilterSet + model = NormaEstatisticas + filterset_class = EstatisticasAcessoNormasFilterSet template_name = 'base/EstatisticasAcessoNormas_filter.html' def get_context_data(self, **kwargs): @@ -877,26 +879,36 @@ class EstatisticasAcessoNormas(FilterView): context['show_results'] = show_results_filter_set(qr) context['ano'] = self.request.GET['ano'] + + query = ''' + select norma_id, ano, extract(month from horario_acesso) as mes, count(*) + from norma_normaestatisticas + where ano = {} + group by mes, ano, norma_id + order by mes asc, ano; + '''.format(context['ano']) + cursor = connection.cursor() + cursor.execute(query) + rows = cursor.fetchall() normas_mes = collections.OrderedDict() meses = {1: 'Janeiro', 2: 'Fevereiro', 3:'Março', 4: 'Abril', 5: 'Maio', 6:'Junho', 7: 'Julho', 8: 'Agosto', 9:'Setembro', 10:'Outubro', 11:'Novembro', 12:'Dezembro'} - for norma in context['object_list']: - if not meses[norma.data.month] in normas_mes: - normas_mes[meses[norma.data.month]] = [] - norma_est = [norma, len(NormaEstatisticas.objects.filter(norma=norma))] - normas_mes[meses[norma.data.month]].append(norma_est) - meses_sem_acesso = [] + for row in rows: + if not meses[int(row[2])] in normas_mes: + normas_mes[meses[int(row[2])]] = [] + norma_est = [NormaJuridica.objects.get(id=row[0]), row[3]] + normas_mes[meses[int(row[2])]].append(norma_est) + # Ordena por acesso e limita em 5 for n in normas_mes: sorted_by_value = sorted(normas_mes[n], key=lambda kv: kv[1], reverse=True) normas_mes[n] = sorted_by_value[0:5] - if all(v[1]==0 for v in normas_mes[n]): - meses_sem_acesso.append(n) + + import ipdb; ipdb.set_trace() context['normas_mes'] = normas_mes - context['meses_sem_acesso'] = meses_sem_acesso return context diff --git a/sapl/norma/migrations/0018_normaestatisticas_ano.py b/sapl/norma/migrations/0018_normaestatisticas_ano.py new file mode 100644 index 000000000..05c277991 --- /dev/null +++ b/sapl/norma/migrations/0018_normaestatisticas_ano.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-12-19 18:35 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0017_normaestatisticas'), + ] + + operations = [ + migrations.AddField( + model_name='normaestatisticas', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], default=2018, verbose_name='Ano'), + ), + ] diff --git a/sapl/norma/migrations/0019_auto_20181219_1807.py b/sapl/norma/migrations/0019_auto_20181219_1807.py new file mode 100644 index 000000000..ff6acc161 --- /dev/null +++ b/sapl/norma/migrations/0019_auto_20181219_1807.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-12-19 20:07 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0018_normaestatisticas_ano'), + ] + + operations = [ + migrations.AlterField( + model_name='normaestatisticas', + name='horario_acesso', + field=models.DateTimeField(blank=True, null=True), + ), + ] diff --git a/sapl/norma/models.py b/sapl/norma/models.py index 80075f113..b17873ecb 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -3,6 +3,7 @@ from django.db import models from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ from model_utils import Choices +import datetime import reversion from sapl.base.models import Autor @@ -194,8 +195,9 @@ class NormaJuridica(models.Model): class NormaEstatisticas(models.Model): usuario = models.CharField(max_length=50) horario_acesso = models.DateTimeField( - blank=True, null=True, - auto_now=True) + blank=True, null=True) + ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'), + choices=RANGE_ANOS, default=datetime.date.today().year) norma = models.ForeignKey(NormaJuridica, on_delete=models.CASCADE) def __str__(self): diff --git a/sapl/norma/views.py b/sapl/norma/views.py index f7800c42f..47b270c25 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -1,4 +1,4 @@ - +import datetime import logging import re import sapl @@ -194,7 +194,9 @@ class NormaCrud(Crud): estatisticas_acesso_normas = AppConfig.objects.first().estatisticas_acesso_normas if estatisticas_acesso_normas == 'S': NormaEstatisticas.objects.create(usuario=str(self.request.user), - norma_id=kwargs['pk']) + norma_id=kwargs['pk'], + ano = datetime.date.today().year, + horario_acesso=datetime.datetime.now()) return super().get(request, *args, **kwargs) diff --git a/sapl/templates/base/EstatisticasAcessoNormas_filter.html b/sapl/templates/base/EstatisticasAcessoNormas_filter.html index a8246e22d..27acb3419 100644 --- a/sapl/templates/base/EstatisticasAcessoNormas_filter.html +++ b/sapl/templates/base/EstatisticasAcessoNormas_filter.html @@ -16,10 +16,7 @@
{% if normas_mes|length == 0 %}
-

{% trans 'Não foi encontrada nenhuma norma com os parâmetros buscados.'%}

- {% elif normas_mes|length == meses_sem_acesso|length %} -
-

{% trans 'Nenhuma norma teve acesso neste ano.'%}

+

{% trans 'Nenhuma norma teve acesso neste ano.'%}

{% else %} {% for mes, normas in normas_mes.items %}
@@ -30,7 +27,6 @@ - {% if not mes in meses_sem_acesso %} @@ -53,10 +49,6 @@ {% endfor %}
- {% else %} -

{% trans 'Nenhuma norma deste mês teve acessos.'%}

-

- {% endif %}
{% endfor %} {% endif %}