mirror of https://github.com/interlegis/sapl.git
cristian-longhi
1 year ago
committed by
GitHub
126 changed files with 4395 additions and 2399 deletions
@ -0,0 +1,50 @@ |
|||||
|
|
||||
|
3.1.163-RC16 / 2023-09-13 |
||||
|
========================= |
||||
|
|
||||
|
* Conserta bug em relatórios com emenda longa. (#3674) |
||||
|
* fix: restring acesso ao prometheus metrics para apenas ips locais/invalidos (#3668) |
||||
|
* feat: adiciona filtro de autor no relatorio de tramitacao com data fim de prazo (#3671) |
||||
|
* fix: verifica se existe dispositivo atualizador ao tentar montar nota alteracao (#3669) |
||||
|
* Revert "Remove redirect de URLs (#3652)" |
||||
|
|
||||
|
3.1.163-RC15 / 2023-08-11 |
||||
|
========================= |
||||
|
|
||||
|
* HOT-FIX: conserta geração de CHANGES.md |
||||
|
* fix: Cria novos campos para o model proposicao para salvar o usuario responsavel por cada acao (#3660) |
||||
|
* Simplificação da tela de pesquisa de Matéria Legislativa (#3662) |
||||
|
* bump pyyaml |
||||
|
* Adiciona controle de visibilidade no módulo de relatorios |
||||
|
* Adiciona coluna de justificativa de ausência (#3657) |
||||
|
* Adiciona coluna de justificativa de ausência |
||||
|
* Conserta lógica para embutir SAPL em iframe (#3653) |
||||
|
* Move relatorios para app de relatorios (#3656) |
||||
|
* Remove redirect de URLs (#3652) |
||||
|
* Hot-fix: endpoint do prometheus endpoint URL |
||||
|
* feat: Adiciona funcionalidade de baixar lista de documentos acessorios de um documento administrativo (#3650) |
||||
|
|
||||
|
3.1.163-RC14 / 2023-06-28 |
||||
|
========================= |
||||
|
|
||||
|
* HOT-FIX: conserta changelog |
||||
|
* feat: Torna o campo Data Nascimento de Parlamentares sensivel (#3648) |
||||
|
* hot-fix: desconecta signal pre_save no migrate |
||||
|
|
||||
|
3.1.163-RC13 / 2023-06-18 |
||||
|
========================= |
||||
|
|
||||
|
* Add options to abort release generation |
||||
|
* Adiciona documentação automática de mudanças |
||||
|
* Adiciona link para texto original em Sessão Plenária (#3644) |
||||
|
* Altera nome completo para nome parlamentar em ata (#3645) |
||||
|
* refactor: altera título do link e descrição de relatório |
||||
|
* feat: Script to find and extract codified images pasted into text fields using the tinyMCE editor (#3643) |
||||
|
* feat: adiciona a coluna assunto na list de correspondencias do expediente do dia (#3640) |
||||
|
* fix: força periodo de busca no relatorio audit log (#3639) |
||||
|
* add migrate de ano novo |
||||
|
* impl: add campo para script do google analytics |
||||
|
* refactor: corrige relatório alinhando a proposta da nomenclatura |
||||
|
* hot-fix: corrige inicialização de variável |
||||
|
* fix: ativa filtro que estava comentado para debug |
||||
|
* impl: captura de assinaturas eletrônicas em matérias |
@ -0,0 +1,27 @@ |
|||||
|
# Generated by Django 2.2.28 on 2023-01-31 03:01 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
|
||||
|
|
||||
|
def preencher_ano(apps, schema_editor): |
||||
|
AudienciaPublica = apps.get_model('audiencia', 'AudienciaPublica') |
||||
|
for audiencia in AudienciaPublica.objects.all(): |
||||
|
audiencia.ano = audiencia.data.year |
||||
|
audiencia.save() |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('audiencia', '0016_auto_20201013_1126'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name='audienciapublica', |
||||
|
name='ano', |
||||
|
field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (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=2000, verbose_name='Ano'), |
||||
|
preserve_default=False, |
||||
|
), |
||||
|
migrations.RunPython(preencher_ano), |
||||
|
] |
@ -0,0 +1,17 @@ |
|||||
|
# Generated by Django 2.2.28 on 2023-05-29 19:41 |
||||
|
|
||||
|
from django.db import migrations |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('audiencia', '0017_audienciapublica_ano'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AlterModelOptions( |
||||
|
name='audienciapublica', |
||||
|
options={'ordering': ['ano', 'numero', 'nome', 'tipo'], 'verbose_name': 'Audiência Pública', 'verbose_name_plural': 'Audiências Públicas'}, |
||||
|
), |
||||
|
] |
File diff suppressed because it is too large
@ -0,0 +1,38 @@ |
|||||
|
import json |
||||
|
import logging |
||||
|
|
||||
|
from django.core.management.base import BaseCommand |
||||
|
from sapl.base.models import AuditLog |
||||
|
|
||||
|
logger = logging.getLogger(__name__) |
||||
|
|
||||
|
|
||||
|
class Command(BaseCommand): |
||||
|
def handle(self, **options): |
||||
|
print("Backfilling AuditLog JSON Field...") |
||||
|
logs = AuditLog.objects.filter(data__isnull=True) |
||||
|
error_counter = 0 |
||||
|
if logs: |
||||
|
update_list = [] |
||||
|
for log in logs: |
||||
|
try: |
||||
|
obj = log.object[1:-1] \ |
||||
|
if log.object.startswith('[') else log.object |
||||
|
data = json.loads(obj) |
||||
|
log.data = data |
||||
|
except Exception as e: |
||||
|
error_counter += 1 |
||||
|
logging.error(e) |
||||
|
log.data = None |
||||
|
else: |
||||
|
update_list.append(log) |
||||
|
if len(update_list) == 1000: |
||||
|
AuditLog.objects.bulk_update(update_list, ['data']) |
||||
|
update_list = [] |
||||
|
if update_list: |
||||
|
AuditLog.objects.bulk_update(update_list, ['data']) |
||||
|
print(f"Logs backfilled: {len(logs) - error_counter}") |
||||
|
print(f"Logs with errors: {error_counter}") |
||||
|
print("Finished backfilling") |
||||
|
|
||||
|
|
@ -0,0 +1,18 @@ |
|||||
|
# Generated by Django 2.2.28 on 2022-10-05 18:33 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('base', '0054_auto_20220921_1217'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name='appconfig', |
||||
|
name='mostrar_voto', |
||||
|
field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Exibir voto do Parlamentar antes de encerrar a votação?'), |
||||
|
), |
||||
|
] |
@ -0,0 +1,23 @@ |
|||||
|
# Generated by Django 2.2.28 on 2022-11-18 16:30 |
||||
|
|
||||
|
import django.contrib.postgres.fields.jsonb |
||||
|
from django.db import migrations |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('base', '0055_appconfig_mostrar_voto'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AlterModelOptions( |
||||
|
name='auditlog', |
||||
|
options={'ordering': ('-id', '-timestamp'), 'verbose_name': 'AuditLog', 'verbose_name_plural': 'AuditLogs'}, |
||||
|
), |
||||
|
migrations.AddField( |
||||
|
model_name='auditlog', |
||||
|
name='data', |
||||
|
field=django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='data'), |
||||
|
), |
||||
|
] |
@ -0,0 +1,18 @@ |
|||||
|
# Generated by Django 2.2.28 on 2023-05-29 19:41 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('base', '0056_auto_20221118_1330'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name='appconfig', |
||||
|
name='google_analytics_id_metrica', |
||||
|
field=models.CharField(default='', max_length=256, verbose_name='ID da Métrica do Google Analytics'), |
||||
|
), |
||||
|
] |
File diff suppressed because it is too large
@ -0,0 +1,17 @@ |
|||||
|
# Generated by Django 2.2.28 on 2022-10-19 23:41 |
||||
|
|
||||
|
from django.db import migrations |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('comissoes', '0028_auto_20220807_2257'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AlterModelOptions( |
||||
|
name='reuniao', |
||||
|
options={'ordering': ('-data', '-nome'), 'verbose_name': 'Reunião de Comissão', 'verbose_name_plural': 'Reuniões de Comissão'}, |
||||
|
), |
||||
|
] |
@ -0,0 +1,38 @@ |
|||||
|
from django.http import HttpResponseForbidden |
||||
|
import logging |
||||
|
|
||||
|
# lista de IPs permitidos (localhost, redes locais, etc) |
||||
|
# https://en.wikipedia.org/wiki/Reserved_IP_addresses |
||||
|
ALLOWED_IPS = [ |
||||
|
'127.0.0.1', |
||||
|
'::1', |
||||
|
'10.0.0.0/8', |
||||
|
'172.16.0.0/12', |
||||
|
'192.168.0.0/16', |
||||
|
'fc00::/7', |
||||
|
'::1', |
||||
|
'fe80::/10', |
||||
|
'192.0.2.0/24', |
||||
|
'2001:db8::/32', |
||||
|
'224.0.0.0/4', |
||||
|
'ff00::/8' |
||||
|
] |
||||
|
|
||||
|
RESTRICTED_ENDPOINTS = ['/metrics'] |
||||
|
|
||||
|
|
||||
|
class EndpointRestrictionMiddleware: |
||||
|
logging.getLogger(__name__) |
||||
|
|
||||
|
def __init__(self, get_response): |
||||
|
self.get_response = get_response |
||||
|
|
||||
|
def __call__(self, request): |
||||
|
# IP do cliente |
||||
|
client_ip = request.META.get('REMOTE_ADDR') |
||||
|
|
||||
|
# bloqueia acesso a endpoints restritos para IPs nao permitidos |
||||
|
if request.path in RESTRICTED_ENDPOINTS and client_ip not in ALLOWED_IPS: |
||||
|
return HttpResponseForbidden('Acesso proibido') |
||||
|
|
||||
|
return self.get_response(request) |
@ -0,0 +1,33 @@ |
|||||
|
# Generated by Django 2.2.28 on 2023-05-29 19:41 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('materia', '0081_auto_20220321_0934'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AlterField( |
||||
|
model_name='materialegislativa', |
||||
|
name='ano', |
||||
|
field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (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)], verbose_name='Ano'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='materialegislativa', |
||||
|
name='ano_origem_externa', |
||||
|
field=models.PositiveSmallIntegerField(blank=True, choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (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)], null=True, verbose_name='Ano'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='numeracao', |
||||
|
name='ano_materia', |
||||
|
field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (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)], verbose_name='Ano'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='proposicao', |
||||
|
name='ano', |
||||
|
field=models.PositiveSmallIntegerField(blank=True, choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (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=None, null=True, verbose_name='Ano'), |
||||
|
), |
||||
|
] |
@ -0,0 +1,31 @@ |
|||||
|
# Generated by Django 2.2.28 on 2023-07-31 21:45 |
||||
|
|
||||
|
from django.conf import settings |
||||
|
from django.db import migrations, models |
||||
|
import django.db.models.deletion |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
|
('materia', '0082_auto_20230529_1641'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name='proposicao', |
||||
|
name='usuario_devolucao', |
||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='proposicoes_devolvidas', to=settings.AUTH_USER_MODEL, verbose_name='Usuário Responsável pela Devolução'), |
||||
|
), |
||||
|
migrations.AddField( |
||||
|
model_name='proposicao', |
||||
|
name='usuario_envio', |
||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='proposicoes_enviadas', to=settings.AUTH_USER_MODEL, verbose_name='Usuário Responsável pelo Envio'), |
||||
|
), |
||||
|
migrations.AddField( |
||||
|
model_name='proposicao', |
||||
|
name='usuario_recebimento', |
||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='proposicoes_recebidas', to=settings.AUTH_USER_MODEL, verbose_name='Usuário Responsável pelo Recebimento'), |
||||
|
), |
||||
|
] |
@ -0,0 +1,29 @@ |
|||||
|
# Generated by Django 2.2.28 on 2023-05-29 19:41 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
import sapl.norma.models |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('norma', '0043_viewnormasestatisticas'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AlterField( |
||||
|
model_name='anexonormajuridica', |
||||
|
name='ano', |
||||
|
field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (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)], verbose_name='Ano'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='normaestatisticas', |
||||
|
name='ano', |
||||
|
field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (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=sapl.norma.models.get_ano_atual, verbose_name='Ano'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='normajuridica', |
||||
|
name='ano', |
||||
|
field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (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)], verbose_name='Ano'), |
||||
|
), |
||||
|
] |
@ -0,0 +1,18 @@ |
|||||
|
# Generated by Django 2.2.28 on 2023-01-12 14:32 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('parlamentares', '0040_auto_20220806_1341'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name='parlamentar', |
||||
|
name='telefone_celular', |
||||
|
field=models.CharField(blank=True, max_length=50, verbose_name='Celular'), |
||||
|
), |
||||
|
] |
@ -0,0 +1,18 @@ |
|||||
|
# Generated by Django 2.2.28 on 2023-05-29 19:41 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('parlamentares', '0041_parlamentar_telefone_celular'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AlterField( |
||||
|
model_name='parlamentar', |
||||
|
name='telefone_celular', |
||||
|
field=models.CharField(blank=True, max_length=50, verbose_name='Telefone Celular'), |
||||
|
), |
||||
|
] |
@ -0,0 +1,23 @@ |
|||||
|
# Generated by Django 2.2.28 on 2023-05-29 19:41 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('protocoloadm', '0043_auto_20220919_1705'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AlterField( |
||||
|
model_name='documentoadministrativo', |
||||
|
name='ano', |
||||
|
field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (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)], verbose_name='Ano'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='protocolo', |
||||
|
name='ano', |
||||
|
field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (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)], verbose_name='Ano do Protocolo'), |
||||
|
), |
||||
|
] |
@ -0,0 +1,783 @@ |
|||||
|
import django_filters |
||||
|
from crispy_forms.bootstrap import (FormActions) |
||||
|
from crispy_forms.layout import (HTML, Button, Fieldset, |
||||
|
Layout, Submit) |
||||
|
from django import forms |
||||
|
from django.utils.translation import ugettext_lazy as _ |
||||
|
|
||||
|
from sapl.audiencia.models import AudienciaPublica |
||||
|
from sapl.base.models import Autor |
||||
|
from sapl.comissoes.models import Reuniao |
||||
|
from sapl.crispy_layout_mixin import SaplFormHelper, to_row, form_actions |
||||
|
from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, MateriaEmTramitacao, UnidadeTramitacao, \ |
||||
|
StatusTramitacao |
||||
|
from sapl.norma.models import NormaJuridica |
||||
|
from sapl.protocoloadm.models import DocumentoAdministrativo |
||||
|
from sapl.sessao.models import SessaoPlenaria |
||||
|
from sapl.utils import FilterOverridesMetaMixin, choice_anos_com_normas, qs_override_django_filter, \ |
||||
|
choice_anos_com_materias, choice_tipos_normas, autor_label, autor_modal |
||||
|
|
||||
|
|
||||
|
class RelatorioDocumentosAcessoriosFilterSet(django_filters.FilterSet): |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
parent = super(RelatorioDocumentosAcessoriosFilterSet, self).qs |
||||
|
return parent.distinct().order_by('-data') |
||||
|
|
||||
|
class Meta(FilterOverridesMetaMixin): |
||||
|
model = DocumentoAcessorio |
||||
|
fields = ['tipo', 'materia__tipo', 'data'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super( |
||||
|
RelatorioDocumentosAcessoriosFilterSet, self |
||||
|
).__init__(*args, **kwargs) |
||||
|
|
||||
|
self.filters['tipo'].label = 'Tipo de Documento' |
||||
|
self.filters['materia__tipo'].label = 'Tipo de Matéria do Documento' |
||||
|
self.filters['data'].label = 'Período (Data Inicial - Data Final)' |
||||
|
|
||||
|
self.form.fields['tipo'].required = True |
||||
|
|
||||
|
row0 = to_row([('tipo', 6), |
||||
|
('materia__tipo', 6)]) |
||||
|
|
||||
|
row1 = to_row([('data', 12)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Pesquisa'), |
||||
|
row0, row1, |
||||
|
buttons) |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class RelatorioAtasFilterSet(django_filters.FilterSet): |
||||
|
class Meta(FilterOverridesMetaMixin): |
||||
|
model = SessaoPlenaria |
||||
|
fields = ['data_inicio'] |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
parent = super(RelatorioAtasFilterSet, self).qs |
||||
|
return parent.distinct().prefetch_related('tipo').exclude( |
||||
|
upload_ata='').order_by('-data_inicio', 'tipo', 'numero') |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super(RelatorioAtasFilterSet, self).__init__( |
||||
|
*args, **kwargs) |
||||
|
|
||||
|
self.filters['data_inicio'].label = 'Período de Abertura (Inicial - Final)' |
||||
|
self.form.fields['data_inicio'].required = False |
||||
|
|
||||
|
row1 = to_row([('data_inicio', 12)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Atas das Sessões Plenárias'), |
||||
|
row1, buttons, ) |
||||
|
) |
||||
|
|
||||
|
|
||||
|
def ultimo_ano_com_norma(): |
||||
|
anos_normas = choice_anos_com_normas() |
||||
|
|
||||
|
if anos_normas: |
||||
|
return anos_normas[0] |
||||
|
return '' |
||||
|
|
||||
|
|
||||
|
class RelatorioNormasMesFilterSet(django_filters.FilterSet): |
||||
|
ano = django_filters.ChoiceFilter(required=True, |
||||
|
label='Ano da Norma', |
||||
|
choices=choice_anos_com_normas, |
||||
|
initial=ultimo_ano_com_norma) |
||||
|
|
||||
|
tipo = django_filters.ChoiceFilter(required=False, |
||||
|
label='Tipo Norma', |
||||
|
choices=choice_tipos_normas, |
||||
|
initial=0) |
||||
|
|
||||
|
class Meta: |
||||
|
model = NormaJuridica |
||||
|
fields = ['ano'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super(RelatorioNormasMesFilterSet, self).__init__( |
||||
|
*args, **kwargs) |
||||
|
|
||||
|
self.filters['ano'].label = 'Ano' |
||||
|
self.form.fields['ano'].required = True |
||||
|
|
||||
|
row1 = to_row([('ano', 6), ('tipo', 6)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check col-auto"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Normas por mês do ano.'), |
||||
|
row1, buttons, ) |
||||
|
) |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
parent = super(RelatorioNormasMesFilterSet, self).qs |
||||
|
return parent.distinct().order_by('data') |
||||
|
|
||||
|
|
||||
|
class RelatorioPresencaSessaoFilterSet(django_filters.FilterSet): |
||||
|
class Meta(FilterOverridesMetaMixin): |
||||
|
model = SessaoPlenaria |
||||
|
fields = ['data_inicio', |
||||
|
'sessao_legislativa', |
||||
|
'tipo', |
||||
|
'legislatura'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super().__init__(*args, **kwargs) |
||||
|
|
||||
|
self.form.fields['exibir_ordem_dia'] = forms.BooleanField( |
||||
|
required=False, label='Exibir presença das Ordens do Dia') |
||||
|
self.form.initial['exibir_ordem_dia'] = True |
||||
|
|
||||
|
self.form.fields['exibir_somente_titular'] = forms.BooleanField( |
||||
|
required=False, label='Exibir somente parlamentares titulares') |
||||
|
self.form.initial['exibir_somente_titular'] = False |
||||
|
|
||||
|
self.form.fields['exibir_somente_ativo'] = forms.BooleanField( |
||||
|
required=False, label='Exibir somente parlamentares ativos') |
||||
|
self.form.initial['exibir_somente_ativo'] = False |
||||
|
|
||||
|
self.form.fields['legislatura'].required = True |
||||
|
|
||||
|
self.filters['data_inicio'].label = 'Período (Inicial - Final)' |
||||
|
|
||||
|
tipo_sessao_ordinaria = self.filters['tipo'].queryset.filter( |
||||
|
nome='Ordinária') |
||||
|
if tipo_sessao_ordinaria: |
||||
|
self.form.initial['tipo'] = tipo_sessao_ordinaria.first() |
||||
|
|
||||
|
row1 = to_row([('legislatura', 4), |
||||
|
('sessao_legislativa', 4), |
||||
|
('tipo', 4)]) |
||||
|
row2 = to_row([('exibir_ordem_dia', 12), |
||||
|
('exibir_somente_titular', 12), |
||||
|
('exibir_somente_ativo', 12)]) |
||||
|
row3 = to_row([('data_inicio', 12)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Presença dos parlamentares nas sessões plenárias'), |
||||
|
row1, row2, row3, buttons, ) |
||||
|
) |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
return qs_override_django_filter(self) |
||||
|
|
||||
|
|
||||
|
class RelatorioHistoricoTramitacaoFilterSet(django_filters.FilterSet): |
||||
|
autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput()) |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
parent = super(RelatorioHistoricoTramitacaoFilterSet, self).qs |
||||
|
return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero') |
||||
|
|
||||
|
class Meta(FilterOverridesMetaMixin): |
||||
|
model = MateriaLegislativa |
||||
|
fields = ['tipo', 'tramitacao__status', 'tramitacao__data_tramitacao', |
||||
|
'tramitacao__unidade_tramitacao_local', 'tramitacao__unidade_tramitacao_destino'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super(RelatorioHistoricoTramitacaoFilterSet, self).__init__( |
||||
|
*args, **kwargs) |
||||
|
|
||||
|
self.filters['tipo'].label = 'Tipo de Matéria' |
||||
|
self.filters['tramitacao__status'].label = _('Status') |
||||
|
self.filters['tramitacao__unidade_tramitacao_local'].label = _( |
||||
|
'Unidade Local (Origem)') |
||||
|
self.filters['tramitacao__unidade_tramitacao_destino'].label = _( |
||||
|
'Unidade Destino') |
||||
|
|
||||
|
row1 = to_row([('tramitacao__data_tramitacao', 12)]) |
||||
|
row2 = to_row([('tramitacao__unidade_tramitacao_local', 6), |
||||
|
('tramitacao__unidade_tramitacao_destino', 6)]) |
||||
|
row3 = to_row( |
||||
|
[('tipo', 6), |
||||
|
('tramitacao__status', 6)]) |
||||
|
|
||||
|
row4 = to_row([ |
||||
|
('autoria__autor', 0), |
||||
|
(Button('pesquisar', |
||||
|
'Pesquisar Autor', |
||||
|
css_class='btn btn-primary btn-sm'), 2), |
||||
|
(Button('limpar', |
||||
|
'Limpar Autor', |
||||
|
css_class='btn btn-primary btn-sm'), 2) |
||||
|
]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Pesquisar'), |
||||
|
row1, row2, row3, row4, |
||||
|
HTML(autor_label), |
||||
|
HTML(autor_modal), |
||||
|
buttons, ) |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class RelatorioDataFimPrazoTramitacaoFilterSet(django_filters.FilterSet): |
||||
|
materia__ano = django_filters.ChoiceFilter(required=False, |
||||
|
label='Ano da Matéria', |
||||
|
choices=choice_anos_com_materias) |
||||
|
# materia__autores = django_filters.CharFilter(widget=forms.HiddenInput()) |
||||
|
materia__autores = django_filters.ModelChoiceFilter( |
||||
|
label='Autor da Matéria', |
||||
|
queryset=Autor.objects.all(), field_name='materia__autores') |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
parent = super(RelatorioDataFimPrazoTramitacaoFilterSet, self).qs |
||||
|
return parent.distinct().prefetch_related('materia__tipo').order_by('tramitacao__data_fim_prazo', 'materia__tipo', 'materia__numero') |
||||
|
|
||||
|
class Meta(FilterOverridesMetaMixin): |
||||
|
model = MateriaEmTramitacao |
||||
|
fields = ['materia__tipo', |
||||
|
'tramitacao__unidade_tramitacao_local', |
||||
|
'tramitacao__unidade_tramitacao_destino', |
||||
|
'tramitacao__status', |
||||
|
'tramitacao__data_fim_prazo', |
||||
|
'materia__autores'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super(RelatorioDataFimPrazoTramitacaoFilterSet, self).__init__( |
||||
|
*args, **kwargs) |
||||
|
|
||||
|
self.filters['materia__tipo'].label = 'Tipo de Matéria' |
||||
|
self.filters[ |
||||
|
'tramitacao__unidade_tramitacao_local'].label = 'Unidade Local (Origem)' |
||||
|
self.filters['tramitacao__unidade_tramitacao_destino'].label = 'Unidade Destino' |
||||
|
self.filters['tramitacao__status'].label = 'Status de tramitação' |
||||
|
self.filters['materia__autores'].label = 'Autor da Matéria' |
||||
|
|
||||
|
row1 = to_row([('materia__ano', 12)]) |
||||
|
row2 = to_row([('tramitacao__data_fim_prazo', 12)]) |
||||
|
row3 = to_row([('tramitacao__unidade_tramitacao_local', 6), |
||||
|
('tramitacao__unidade_tramitacao_destino', 6)]) |
||||
|
row4 = to_row( |
||||
|
[('materia__tipo', 6), |
||||
|
('tramitacao__status', 6)]) |
||||
|
row5 = to_row([('materia__autores', 12)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Tramitações'), |
||||
|
row1, row2, row3, row4, row5, |
||||
|
buttons, ) |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class RelatorioReuniaoFilterSet(django_filters.FilterSet): |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
parent = super(RelatorioReuniaoFilterSet, self).qs |
||||
|
return parent.distinct().order_by('-data', 'comissao') |
||||
|
|
||||
|
class Meta: |
||||
|
model = Reuniao |
||||
|
fields = ['comissao', 'data', |
||||
|
'nome', 'tema'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super(RelatorioReuniaoFilterSet, self).__init__( |
||||
|
*args, **kwargs) |
||||
|
|
||||
|
row1 = to_row([('data', 12)]) |
||||
|
row2 = to_row( |
||||
|
[('comissao', 4), |
||||
|
('nome', 4), |
||||
|
('tema', 4)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Reunião de Comissão'), |
||||
|
row1, row2, |
||||
|
buttons, ) |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class RelatorioAudienciaFilterSet(django_filters.FilterSet): |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
parent = super(RelatorioAudienciaFilterSet, self).qs |
||||
|
return parent.distinct().order_by('-data', 'tipo') |
||||
|
|
||||
|
class Meta: |
||||
|
model = AudienciaPublica |
||||
|
fields = ['tipo', 'data', |
||||
|
'nome'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super(RelatorioAudienciaFilterSet, self).__init__( |
||||
|
*args, **kwargs) |
||||
|
|
||||
|
row1 = to_row([('data', 12)]) |
||||
|
row2 = to_row( |
||||
|
[('tipo', 4), |
||||
|
('nome', 4)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Audiência Pública'), |
||||
|
row1, row2, |
||||
|
buttons, ) |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class RelatorioMateriasTramitacaoFilterSet(django_filters.FilterSet): |
||||
|
materia__ano = django_filters.ChoiceFilter(required=True, |
||||
|
label='Ano da Matéria', |
||||
|
choices=choice_anos_com_materias) |
||||
|
|
||||
|
tramitacao__unidade_tramitacao_destino = django_filters.ModelChoiceFilter( |
||||
|
queryset=UnidadeTramitacao.objects.all(), |
||||
|
label=_('Unidade Atual')) |
||||
|
|
||||
|
tramitacao__status = django_filters.ModelChoiceFilter( |
||||
|
queryset=StatusTramitacao.objects.all(), |
||||
|
label=_('Status Atual')) |
||||
|
|
||||
|
materia__autores = django_filters.ModelChoiceFilter( |
||||
|
label='Autor da Matéria', |
||||
|
queryset=Autor.objects.all()) |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
parent = super(RelatorioMateriasTramitacaoFilterSet, self).qs |
||||
|
return parent.distinct().order_by( |
||||
|
'-materia__ano', 'materia__tipo', '-materia__numero' |
||||
|
) |
||||
|
|
||||
|
class Meta: |
||||
|
model = MateriaEmTramitacao |
||||
|
fields = ['materia__ano', 'materia__tipo', |
||||
|
'tramitacao__unidade_tramitacao_destino', |
||||
|
'tramitacao__status', 'materia__autores'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super(RelatorioMateriasTramitacaoFilterSet, self).__init__( |
||||
|
*args, **kwargs) |
||||
|
|
||||
|
self.filters['materia__tipo'].label = 'Tipo de Matéria' |
||||
|
|
||||
|
row1 = to_row([('materia__ano', 12)]) |
||||
|
row2 = to_row([('materia__tipo', 12)]) |
||||
|
row3 = to_row([('tramitacao__unidade_tramitacao_destino', 12)]) |
||||
|
row4 = to_row([('tramitacao__status', 12)]) |
||||
|
row5 = to_row([('materia__autores', 12)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Pesquisa de Matéria em Tramitação'), |
||||
|
row1, row2, row3, row4, row5, |
||||
|
buttons, ) |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class RelatorioMateriasPorAnoAutorTipoFilterSet(django_filters.FilterSet): |
||||
|
ano = django_filters.ChoiceFilter(required=True, |
||||
|
label='Ano da Matéria', |
||||
|
choices=choice_anos_com_materias) |
||||
|
|
||||
|
class Meta: |
||||
|
model = MateriaLegislativa |
||||
|
fields = ['ano'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super(RelatorioMateriasPorAnoAutorTipoFilterSet, self).__init__( |
||||
|
*args, **kwargs) |
||||
|
|
||||
|
row1 = to_row( |
||||
|
[('ano', 12)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Pesquisa de Matéria por Ano Autor Tipo'), |
||||
|
row1, |
||||
|
buttons, ) |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet): |
||||
|
autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput()) |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
parent = super().qs |
||||
|
return parent.distinct().order_by('-ano', '-numero', 'tipo', 'autoria__autor', '-autoria__primeiro_autor') |
||||
|
|
||||
|
class Meta(FilterOverridesMetaMixin): |
||||
|
model = MateriaLegislativa |
||||
|
fields = ['tipo', 'data_apresentacao'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super().__init__(*args, **kwargs) |
||||
|
|
||||
|
self.filters['tipo'].label = 'Tipo de Matéria' |
||||
|
|
||||
|
row1 = to_row( |
||||
|
[('tipo', 12)]) |
||||
|
row2 = to_row( |
||||
|
[('data_apresentacao', 12)]) |
||||
|
row3 = to_row( |
||||
|
[('autoria__autor', 0), |
||||
|
(Button('pesquisar', |
||||
|
'Pesquisar Autor', |
||||
|
css_class='btn btn-primary btn-sm'), 2), |
||||
|
(Button('limpar', |
||||
|
'Limpar Autor', |
||||
|
css_class='btn btn-primary btn-sm'), 10)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Pesquisa de Matéria por Autor'), |
||||
|
row1, row2, |
||||
|
HTML(autor_label), |
||||
|
HTML(autor_modal), |
||||
|
row3, |
||||
|
buttons, ) |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet): |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
parent = super(RelatorioHistoricoTramitacaoAdmFilterSet, self).qs |
||||
|
return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero') |
||||
|
|
||||
|
class Meta(FilterOverridesMetaMixin): |
||||
|
model = DocumentoAdministrativo |
||||
|
fields = ['tipo', 'tramitacaoadministrativo__status', |
||||
|
'tramitacaoadministrativo__data_tramitacao', |
||||
|
'tramitacaoadministrativo__unidade_tramitacao_local', |
||||
|
'tramitacaoadministrativo__unidade_tramitacao_destino'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super(RelatorioHistoricoTramitacaoAdmFilterSet, self).__init__( |
||||
|
*args, **kwargs) |
||||
|
|
||||
|
self.filters['tipo'].label = 'Tipo de Documento' |
||||
|
self.filters['tramitacaoadministrativo__status'].label = _('Status') |
||||
|
self.filters['tramitacaoadministrativo__unidade_tramitacao_local'].label = _( |
||||
|
'Unidade Local (Origem)') |
||||
|
self.filters['tramitacaoadministrativo__unidade_tramitacao_destino'].label = _( |
||||
|
'Unidade Destino') |
||||
|
|
||||
|
row1 = to_row([('tramitacaoadministrativo__data_tramitacao', 12)]) |
||||
|
row2 = to_row([('tramitacaoadministrativo__unidade_tramitacao_local', 6), |
||||
|
('tramitacaoadministrativo__unidade_tramitacao_destino', 6)]) |
||||
|
row3 = to_row( |
||||
|
[('tipo', 6), |
||||
|
('tramitacaoadministrativo__status', 6)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_(''), |
||||
|
row1, row2, row3, |
||||
|
buttons, ) |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class RelatorioNormasPorAutorFilterSet(django_filters.FilterSet): |
||||
|
autorianorma__autor = django_filters.CharFilter(widget=forms.HiddenInput()) |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
parent = super().qs |
||||
|
return parent.distinct().filter(autorianorma__primeiro_autor=True) \ |
||||
|
.order_by('autorianorma__autor', '-autorianorma__primeiro_autor', 'tipo', '-ano', '-numero') |
||||
|
|
||||
|
class Meta(FilterOverridesMetaMixin): |
||||
|
model = NormaJuridica |
||||
|
fields = ['tipo', 'data'] |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super().__init__(*args, **kwargs) |
||||
|
|
||||
|
self.filters['tipo'].label = 'Tipo de Norma' |
||||
|
|
||||
|
row1 = to_row( |
||||
|
[('tipo', 12)]) |
||||
|
row2 = to_row( |
||||
|
[('data', 12)]) |
||||
|
row3 = to_row( |
||||
|
[('autorianorma__autor', 0), |
||||
|
(Button('pesquisar', |
||||
|
'Pesquisar Autor', |
||||
|
css_class='btn btn-primary btn-sm'), 2), |
||||
|
(Button('limpar', |
||||
|
'Limpar Autor', |
||||
|
css_class='btn btn-primary btn-sm'), 10)]) |
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Pesquisar'), |
||||
|
row1, row2, |
||||
|
HTML(autor_label), |
||||
|
HTML(autor_modal), |
||||
|
row3, |
||||
|
form_actions(label='Pesquisar')) |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class RelatorioNormasVigenciaFilterSet(django_filters.FilterSet): |
||||
|
ano = django_filters.ChoiceFilter(required=True, |
||||
|
label='Ano da Norma', |
||||
|
choices=choice_anos_com_normas, |
||||
|
initial=ultimo_ano_com_norma) |
||||
|
|
||||
|
tipo = django_filters.ChoiceFilter(required=False, |
||||
|
label='Tipo Norma', |
||||
|
choices=choice_tipos_normas, |
||||
|
initial=0) |
||||
|
|
||||
|
vigencia = forms.ChoiceField( |
||||
|
label=_('Vigência'), |
||||
|
choices=[(True, "Vigente"), (False, "Não vigente")], |
||||
|
widget=forms.RadioSelect(), |
||||
|
required=True, |
||||
|
initial=True) |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super(RelatorioNormasVigenciaFilterSet, self).__init__( |
||||
|
*args, **kwargs) |
||||
|
|
||||
|
self.filters['ano'].label = 'Ano' |
||||
|
self.form.fields['ano'].required = True |
||||
|
self.form.fields['vigencia'] = self.vigencia |
||||
|
|
||||
|
row1 = to_row([('ano', 6), ('tipo', 6)]) |
||||
|
row2 = to_row([('vigencia', 12)]) |
||||
|
|
||||
|
buttons = FormActions( |
||||
|
*[ |
||||
|
HTML(''' |
||||
|
<div class="form-check"> |
||||
|
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> |
||||
|
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> |
||||
|
</div> |
||||
|
''') |
||||
|
], |
||||
|
Submit('pesquisar', _('Pesquisar'), css_class='float-right', |
||||
|
onclick='return true;'), |
||||
|
css_class='form-group row justify-content-between', |
||||
|
) |
||||
|
|
||||
|
self.form.helper = SaplFormHelper() |
||||
|
self.form.helper.form_method = 'GET' |
||||
|
self.form.helper.layout = Layout( |
||||
|
Fieldset(_('Normas por vigência.'), |
||||
|
row1, row2, |
||||
|
buttons, ) |
||||
|
) |
||||
|
|
||||
|
@property |
||||
|
def qs(self): |
||||
|
return qs_override_django_filter(self) |
File diff suppressed because it is too large
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@ -1,49 +0,0 @@ |
|||||
{% extends "crud/list.html" %} |
|
||||
{% load i18n %} |
|
||||
{% load crispy_forms_tags %} |
|
||||
|
|
||||
{% block base_content %} |
|
||||
{% if not show_results %} |
|
||||
<br> |
|
||||
{% crispy filter.form %} |
|
||||
{% else %} |
|
||||
<div class="actions btn-group float-right" role="group"> |
|
||||
<a href="{% url 'sapl.base:data_fim_prazo_tramitacoes' %}" class="btn btn-outline-primary">{% trans 'Fazer nova pesquisa' %}</a> |
|
||||
</div> |
|
||||
<br /><br /><br /><br /> |
|
||||
<b>PARÂMETROS DE PESQUISA:<br /></b> |
|
||||
 Ano: {{ ano }} <br /> |
|
||||
 Período: {{ data_tramitacao }} <br /> |
|
||||
 Tipo de matéria: {{ tipo }}<br /> |
|
||||
 Status de tramitação: {{ tramitacao__status }}<br /> |
|
||||
 Local de origem: {{ tramitacao__unidade_tramitacao_local }}<br /> |
|
||||
 Local de destino: {{ tramitacao__unidade_tramitacao_destino }}<br /><br /><br /> |
|
||||
{% if object_list %} |
|
||||
{% if object_list|length == 1 %} |
|
||||
<tr><td><h3 style="text-align: left;">Foi encontrada 1 matéria com esses parâmetros.</h3></td></tr><br><br> |
|
||||
{% else %} |
|
||||
<tr><td><h3 style="text-align: left;">Foram encontradas {{object_list|length}} matérias com esses parâmetros.</h3></td></tr><br><br> |
|
||||
{% endif %} |
|
||||
<table class="table table-bordered table-hover"> |
|
||||
<thead class="thead-default" > |
|
||||
<tr class="active"> |
|
||||
<th>Matéria</th> |
|
||||
<th>Ementa</th> |
|
||||
</tr> |
|
||||
</thead> |
|
||||
<tbody> |
|
||||
{% for materia in object_list %} |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.materia:tramitacao_list' materia.pk %}"> |
|
||||
{{materia.tipo.descricao}} - {{materia.tipo.sigla}} {{materia.numero}}/{{materia.ano}} |
|
||||
</a></td> |
|
||||
<td>{{materia.ementa}}</td> |
|
||||
</tr> |
|
||||
{% endfor %} |
|
||||
</tbody> |
|
||||
</table> |
|
||||
{% else %} |
|
||||
<tr><td><h3 style="text-align: left;">Nenhuma matéria encontrada com esses parâmetros.</h3></td></tr><br><br> |
|
||||
{% endif %} |
|
||||
{% endif %} |
|
||||
{% endblock base_content %} |
|
@ -0,0 +1,88 @@ |
|||||
|
{% extends "crud/list.html" %} |
||||
|
{% load i18n common_tags %} |
||||
|
{% load tz %} |
||||
|
{% load crispy_forms_tags staticfiles %} |
||||
|
|
||||
|
{% block head_extra_css %} |
||||
|
created { |
||||
|
background-color: green; |
||||
|
color: #FFF; |
||||
|
} |
||||
|
|
||||
|
deleted { |
||||
|
background-color: red; |
||||
|
color: #FFF; |
||||
|
} |
||||
|
{% endblock head_extra_css %} |
||||
|
|
||||
|
{% block base_content %} |
||||
|
{% crispy filter.form %} |
||||
|
<br> |
||||
|
{% if numero_res > 0 %} |
||||
|
{% if numero_res == 1 %} |
||||
|
<h3>Foi encontrado {{ numero_res }} resultado</h3> |
||||
|
{% else %} |
||||
|
<h3>Foram encontrados {{ numero_res }} resultados</h3> |
||||
|
{% endif %} |
||||
|
<table class="table table-striped table-hover"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th>Data/Hora</th> |
||||
|
<th>Usuário</th> |
||||
|
<th>Operação</th> |
||||
|
<th>Registro</th> |
||||
|
<th>Id</th> |
||||
|
<th> </th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
{% for obj in page_obj %} |
||||
|
<tr class="background:{%if obj.operation == 'D' %}red{%else%}lightgray{%endif%}"> |
||||
|
<td>{{ obj.timestamp|localtime|date:"d/m/Y, H:i:s" }}</td> |
||||
|
<td>{{ obj.username|default:"Não informado" }}</td> |
||||
|
<td>{{ obj.operation|desc_operation }}</td> |
||||
|
<td>{{ obj.model_name }}</td> |
||||
|
<td>{{obj.data.pk}}</td> |
||||
|
<td> |
||||
|
<strong>Atributos ({{obj.data.fields|length}})</strong><br/> |
||||
|
<hr/> |
||||
|
<ul> |
||||
|
{% for key, value in obj.data.fields.items %} |
||||
|
{% if forloop.counter == 11 %} |
||||
|
<div id="{{obj.id}}" style="display:none;"> |
||||
|
{%endif%} |
||||
|
<li> |
||||
|
{{key}}: {{ value|default_if_none:""|obfuscate_value:key }}<br/> |
||||
|
</li> |
||||
|
{% if forloop.last and forloop.counter > 10 %} |
||||
|
</div> |
||||
|
<input class="btn btn-primary btn-sm" type="button" value="Expandir/Colapsar" onclick="toggleDetails({{obj.id}})"/> |
||||
|
{% endif %} |
||||
|
{% endfor %} |
||||
|
</ul> |
||||
|
</td> |
||||
|
</tr> |
||||
|
{% endfor %} |
||||
|
</tbody> |
||||
|
</table> |
||||
|
{% else %} |
||||
|
<font size="4"><p align="center">{{ NO_ENTRIES_MSG }}</p></font> |
||||
|
{% endif %} |
||||
|
<br/> |
||||
|
{% include 'paginacao.html'%} |
||||
|
<br /><br /><br /> |
||||
|
{% endblock base_content %} |
||||
|
{% block extra_js %} |
||||
|
<script language="Javascript"> |
||||
|
function toggleDetails(id) { |
||||
|
let curr = document.getElementById(id); |
||||
|
if (curr.style.display == "none") { |
||||
|
document.getElementById(id).style.display = "block"; |
||||
|
} |
||||
|
else { |
||||
|
document.getElementById(id).style.display = "none"; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
</script> |
||||
|
{% endblock extra_js %} |
@ -1,84 +0,0 @@ |
|||||
{% extends "base.html" %} |
|
||||
{% load i18n crispy_forms_tags %} |
|
||||
|
|
||||
{% block base_content %} |
|
||||
<fieldset> |
|
||||
<legend>Relatórios Administrativos</legend> |
|
||||
<table class="table"> |
|
||||
<thead> |
|
||||
<tr> |
|
||||
<th>Título</th> |
|
||||
<th>Descrição</th> |
|
||||
</tr> |
|
||||
</thead> |
|
||||
<tbody> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:materia_por_tramitacao' %}">Matérias em tramitação</a></td> |
|
||||
<td> Matérias Legislativas por Ano, Tipo, Local atual e Status da Tramitação informados. </td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:materia_por_autor' %}">Matérias por Autor</a></td> |
|
||||
<td> Listagem e totalização de matérias por autor, com filtros para tipo e período. </td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:materia_por_ano_autor_tipo' %}">Matérias por Ano, Autor e Tipo</a></td> |
|
||||
<td> Totalização anual de matérias agrupadas por autor e tipo. </td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:materia_por_ano_assunto' %}">Matérias por Ano, Assunto</a></td> |
|
||||
<td> Totalização de matérias agrupadas por ano e assunto. </td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:presenca_sessao' %}">Presença nas sessões</a></td> |
|
||||
<td>Presença dos parlamentares nas sessões plenárias.</td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:atas' %}">Atas</a></td> |
|
||||
<td> Atas de Sessão Plenária. </td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:historico_tramitacoes' %}">Histórico de tramitações de Matérias</a></td> |
|
||||
<td> Histórico de tramitações por período e local informados. </td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:data_fim_prazo_tramitacoes' %}">Tramitações de Matérias</a></td> |
|
||||
<td> Tramitações de matéria com status informado no intervalo. </td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:reuniao' %}">Reunião de Comissão</a></td> |
|
||||
<td> Reunião de Comissão por data. </td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:audiencia' %}">Audiência Pública</a></td> |
|
||||
<td> Audiência Pública com o tipo. </td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:normas_por_mes' %}">Normas por mês</a></td> |
|
||||
<td> Normas publicadas por mês. </td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:normas_por_vigencia' %}">Normas por vigência</a></td> |
|
||||
<td> Normas vigentes ou não vigentes. </td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:historico_tramitacoes_adm' %}">Histórico de tramitações de Documentos</a></td> |
|
||||
<td> Histórico de tramitações de Documentos por período e local informados. </td> |
|
||||
</tr> |
|
||||
{% if estatisticas_acesso_normas %} |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:estatisticas_acesso' %}">Estatísticas de acesso de Normas</a></td> |
|
||||
<td> Normas por acesso. </td> |
|
||||
</tr> |
|
||||
{% endif %} |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:relatorio_documentos_acessorios' %}"> Documentos Acessórios de Matérias Legislativas</a></td> |
|
||||
<td> Documentos Acessórios por tipo, período e tipo da Matéria Legislativa associada.</td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<td><a href="{% url 'sapl.base:normas_por_autor' %}"> Normas Por Autor</a></td> |
|
||||
<td> Listagem e totalização de normas por autor, com filtros para tipo e período.</td> |
|
||||
</tr> |
|
||||
</tbody> |
|
||||
</table> |
|
||||
</fieldset> |
|
||||
{% endblock base_content %} |
|
@ -0,0 +1,23 @@ |
|||||
|
{% load common_tags%} |
||||
|
|
||||
|
{% for nome, data in signs %} |
||||
|
{% if forloop.first %} |
||||
|
<div class="col d-flex align-items-center"> |
||||
|
<div class="box-assinatura-eletronica"> |
||||
|
<ul class="sigs px-0"> |
||||
|
{% endif %} |
||||
|
<li class="sig"> |
||||
|
<span class="sig-nome"> |
||||
|
{{nome}} |
||||
|
</span> |
||||
|
<small class="sig-data"> |
||||
|
(Assinado em: {{data.0|parse_datetime|date:"DATETIME_FORMAT" }} - |
||||
|
<small>{{data.1}}</small>) |
||||
|
</small> |
||||
|
</li> |
||||
|
{% if forloop.last %} |
||||
|
</ul> |
||||
|
</div> |
||||
|
</div> |
||||
|
{% endif %} |
||||
|
{% endfor %} |
@ -0,0 +1,14 @@ |
|||||
|
{% extends "crud/list.html" %} |
||||
|
{% load i18n %} |
||||
|
{% load common_tags %} |
||||
|
|
||||
|
|
||||
|
{% block more_buttons %} |
||||
|
|
||||
|
{% if perms|get_add_perm:view %} |
||||
|
<a href="{% url 'sapl.relatorios:relatorio_materia_tramitacao' root_pk %}" class="btn btn-outline-primary"> |
||||
|
{% trans "Imprimir" %} |
||||
|
</a> |
||||
|
{% endif %} |
||||
|
|
||||
|
{% endblock more_buttons %} |
@ -0,0 +1,67 @@ |
|||||
|
{% extends "crud/list.html" %} |
||||
|
{% load i18n %} |
||||
|
{% load crispy_forms_tags %} |
||||
|
|
||||
|
{% block base_content %} |
||||
|
{% if not show_results %} |
||||
|
<br> |
||||
|
{% crispy filter.form %} |
||||
|
{% else %} |
||||
|
<div class="actions btn-group float-right" role="group"> |
||||
|
<a href="{% url 'sapl.relatorios:data_fim_prazo_tramitacoes' %}" class="btn btn-outline-primary">{% trans 'Fazer nova pesquisa' %}</a> |
||||
|
</div> |
||||
|
<br /><br /><br /><br /> |
||||
|
<b>PARÂMETROS DE PESQUISA:<br /></b> |
||||
|
 Ano: {{ ano }} <br /> |
||||
|
 Período: {{ data_fim_prazo }} <br /> |
||||
|
 Tipo de matéria: {{ tipo }}<br /> |
||||
|
 Status de tramitação: {{ tramitacao__status }}<br /> |
||||
|
 Local de origem: {{ tramitacao__unidade_tramitacao_local }}<br /> |
||||
|
 Local de destino: {{ tramitacao__unidade_tramitacao_destino }}<br /> |
||||
|
 Autor: {{ materia__autor }}<br /><br /><br /> |
||||
|
{% if object_list %} |
||||
|
{% if object_list|length == 1 %} |
||||
|
<tr><td><h3 style="text-align: left;">Foi encontrada 1 matéria com esses parâmetros.</h3></td></tr><br><br> |
||||
|
{% else %} |
||||
|
<tr><td><h3 style="text-align: left;">Foram encontradas {{object_list|length}} matérias com esses parâmetros.</h3></td></tr><br><br> |
||||
|
{% endif %} |
||||
|
<table class="table table-bordered table-hover"> |
||||
|
<thead class="thead-default" > |
||||
|
<tr class="active"> |
||||
|
<th>Matéria</th> |
||||
|
<th>Ementa</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
{% for materia_em_tramitacao in object_list %} |
||||
|
<tr> |
||||
|
<td width="35%"><a href="{% url 'sapl.materia:tramitacao_list' materia_em_tramitacao.materia.pk %}"> |
||||
|
{{materia_em_tramitacao.materia.tipo.descricao}} - {{materia_em_tramitacao.materia.tipo.sigla}} {{materia_em_tramitacao.materia.numero}}/{{materia_em_tramitacao.materia.ano}} |
||||
|
</a><br> |
||||
|
<small> |
||||
|
<strong>Data de Fim de Prazo:</strong> {{materia_em_tramitacao.tramitacao.data_fim_prazo}} |
||||
|
</small> |
||||
|
</td> |
||||
|
<td> |
||||
|
{{materia_em_tramitacao.materia.ementa}} |
||||
|
|
||||
|
{% if not tramitacao__status or not tramitacao__unidade_tramitacao_destino %} |
||||
|
<small> |
||||
|
<br/> |
||||
|
<strong>Local Atual: </strong>{{ materia_em_tramitacao.materia.tramitacao_set.first.unidade_tramitacao_destino }} |
||||
|
<br/> |
||||
|
<strong>Status: </strong>{{ materia_em_tramitacao.materia.tramitacao_set.first.status }} |
||||
|
<br/> |
||||
|
<strong>Texto da Ação: </strong>{{ materia_em_tramitacao.materia.tramitacao_set.first.texto }} |
||||
|
</small> |
||||
|
{% endif %} |
||||
|
</td> |
||||
|
</tr> |
||||
|
{% endfor %} |
||||
|
</tbody> |
||||
|
</table> |
||||
|
{% else %} |
||||
|
<tr><td><h3 style="text-align: left;">Nenhuma matéria encontrada com esses parâmetros.</h3></td></tr><br><br> |
||||
|
{% endif %} |
||||
|
{% endif %} |
||||
|
{% endblock base_content %} |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue