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 %}
-