-
Notifications
You must be signed in to change notification settings - Fork 99
Melhorias de transparência (PNTP): correções de relatórios e novas funcionalidades #3842
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 3.1.x
Are you sure you want to change the base?
Changes from all commits
27c7b29
3893df9
89f381c
5e66298
7c8bca3
d548ee4
3de9532
247c97b
fd3d093
c16200b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| # Generated by Django 2.2.28 on 2026-06-23 22:38 | ||
|
|
||
| from django.db import migrations, models | ||
| import django.db.models.deletion | ||
|
|
||
|
|
||
| def copia_parlamentar_para_autor(apps, schema_editor): | ||
| """Converte o antigo parlamentar_autor no Autor genérico correspondente.""" | ||
| AudienciaPublica = apps.get_model('audiencia', 'AudienciaPublica') | ||
| Autor = apps.get_model('base', 'Autor') | ||
| ContentType = apps.get_model('contenttypes', 'ContentType') | ||
| try: | ||
| ct = ContentType.objects.get( | ||
| app_label='parlamentares', model='parlamentar') | ||
| except ContentType.DoesNotExist: | ||
| return | ||
| for ap in AudienciaPublica.objects.filter(parlamentar_autor__isnull=False): | ||
| autor = Autor.objects.filter( | ||
| content_type=ct, object_id=ap.parlamentar_autor_id).first() | ||
| if autor: | ||
| ap.autor = autor | ||
| ap.save(update_fields=['autor']) | ||
|
|
||
|
|
||
| class Migration(migrations.Migration): | ||
|
|
||
| dependencies = [ | ||
| ('base', '0060_auto_20240812_1628'), | ||
| ('audiencia', '0020_auto_20251201_1450'), | ||
| ] | ||
|
|
||
| operations = [ | ||
| migrations.AddField( | ||
| model_name='audienciapublica', | ||
| name='autor', | ||
| field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='base.Autor', verbose_name='Autor'), | ||
| ), | ||
| migrations.RunPython( | ||
| copia_parlamentar_para_autor, migrations.RunPython.noop), | ||
| # Mantém a coluna parlamentar_autor no banco (removida apenas do estado | ||
| # do Django). Assim uma casa pode dar rollback da imagem sem perder o | ||
| # vínculo, e o código novo simplesmente ignora a coluna. O DROP | ||
| # definitivo fica para uma migração posterior, quando toda a frota | ||
| # estiver estável nesta versão. | ||
| migrations.SeparateDatabaseAndState( | ||
| state_operations=[ | ||
| migrations.RemoveField( | ||
| model_name='audienciapublica', | ||
| name='parlamentar_autor', | ||
| ), | ||
| ], | ||
| database_operations=[], | ||
| ), | ||
| migrations.AlterField( | ||
| model_name='audienciapublica', | ||
| name='ano', | ||
| field=models.PositiveSmallIntegerField(choices=[(2027, 2027), (2026, 2026), (2025, 2025), (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'), | ||
| ), | ||
| ] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| # Generated by Django 2.2.28 on 2026-06-26 15:20 | ||
|
|
||
| from django.db import migrations, models | ||
|
|
||
|
|
||
| class Migration(migrations.Migration): | ||
|
|
||
| dependencies = [ | ||
| ('audiencia', '0021_auto_20260623_1938'), | ||
| ] | ||
|
|
||
| operations = [ | ||
| migrations.AddField( | ||
| model_name='audienciapublica', | ||
| name='data_ultima_atualizacao', | ||
| field=models.DateTimeField(auto_now=True, null=True, verbose_name='Data da Última Atualização'), | ||
| ), | ||
| ] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| # Generated by Django 2.2.28 on 2026-06-26 15:20 | ||
|
|
||
| from django.db import migrations, models | ||
|
|
||
|
|
||
| class Migration(migrations.Migration): | ||
|
|
||
| dependencies = [ | ||
| ('comissoes', '0030_auto_20231007_2149'), | ||
| ] | ||
|
|
||
| operations = [ | ||
| migrations.AddField( | ||
| model_name='comissao', | ||
| name='data_ultima_atualizacao', | ||
| field=models.DateTimeField(auto_now=True, null=True, verbose_name='Data da Última Atualização'), | ||
| ), | ||
| ] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -863,6 +863,11 @@ def get_context_data(self, **kwargs): | |
| context[context_object_name] = self.object | ||
| context.update(kwargs) | ||
|
|
||
| # Mensagem de atualidade (PNTP): data de última atualização da entidade, | ||
| # quando o modelo possuir o campo. Consumido pelo banner em base.html. | ||
| context['data_atualizacao_conteudo'] = getattr( | ||
| self.object, 'data_ultima_atualizacao', None) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Uma ideia: o {% if data_atualizacao_conteudo %}{{ data_atualizacao_conteudo|date:"d/m/Y" }}{% else %}{% now "d/m/Y" %}{% endif %}para {% if data_atualizacao_conteudo %}{{ data_atualizacao_conteudo|date:"d/m/Y" }}{% endif %}
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Boa ideia, mas esbarra num detalhe do escopo do template: Trocar o default do Pra realmente eliminar o condicional, o caminho seria um context processor injetando |
||
|
|
||
| return context | ||
|
|
||
| @property | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| # Generated by Django 2.2.28 on 2026-06-26 15:20 | ||
|
|
||
| from django.db import migrations, models | ||
|
|
||
|
|
||
| class Migration(migrations.Migration): | ||
|
|
||
| dependencies = [ | ||
| ('parlamentares', '0045_auto_20251201_1531'), | ||
| ] | ||
|
|
||
| operations = [ | ||
| migrations.AddField( | ||
| model_name='parlamentar', | ||
| name='data_ultima_atualizacao', | ||
| field=models.DateTimeField(auto_now=True, null=True, verbose_name='Data da Última Atualização'), | ||
| ), | ||
| ] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,28 @@ | ||
| # Generated by Django 2.2.28 on 2026-06-26 15:20 | ||
|
|
||
| from django.db import migrations, models | ||
|
|
||
|
|
||
| class Migration(migrations.Migration): | ||
|
|
||
| dependencies = [ | ||
| ('protocoloadm', '0045_auto_20240711_1405'), | ||
| ] | ||
|
|
||
| operations = [ | ||
| migrations.AddField( | ||
| model_name='documentoadministrativo', | ||
| name='data_ultima_atualizacao', | ||
| field=models.DateTimeField(auto_now=True, null=True, verbose_name='Data da Última Atualização'), | ||
| ), | ||
| migrations.AlterField( | ||
| model_name='documentoadministrativo', | ||
| name='ano', | ||
| field=models.PositiveSmallIntegerField(choices=[(2027, 2027), (2026, 2026), (2025, 2025), (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=[(2027, 2027), (2026, 2026), (2025, 2025), (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'), | ||
| ), | ||
| ] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Então, a gente tem um problema de inconsistência de nomes que poderiamos (ou não) tentar resolver nesse PR. Temos os seguintes casos:
data_ultima_atualizacaoeultima_atualizacaoNeste caso eu acho que deveriamos remover o ultima_atualizacao e deixar somente data_ultima_atualizacao.
ultima_atualizacaoNestes a gente só renomeia pra data_ultima_atualizacao
O problema: a gente precisa percorrer onde
ultima_atualizacaoé utilizado removendo linhas assim:materia.ultima_edicao = tz.localize(datetime.now()), poisdata_ultima_atualizacaotemauto_now=True. E naqueles que for só renomear, se certificar de incluir auto_now=True,There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Concordo que a inconsistência é real. Mapeando o que temos hoje:
data_ultima_atualizacao+ultima_edicao):MateriaLegislativa,NormaJuridica,DocumentoAdministrativo.ultima_edicao:Proposicao,Tramitacao,TramitacaoAdministrativo.O porém: os dois não são sinônimos.
data_ultima_atualizacaoéauto_now("linha salva por último", automático);ultima_edicaoé gerenciado explicitamente e — ponto crítico — em vários fluxos ele é copiado de outro registro, não setado como "agora":materia/forms.py:591->ultima_edicao=tramitacao.ultima_edicaomateria/forms.py:722->tram_anexada.ultima_edicao = nova_tram_principal.ultima_edicaoprotocoloadm/forms.py:795,914Com
auto_now=Trueé impossível preservar esse timestamp copiado (o auto_now força "agora" em todo save), então renomearultima_edicao-> campo auto_now quebraria a semântica de anexação/cópia de tramitações. Somando a isso, é um refactor em models centrais (materia/norma/protocoloadm) com rename de coluna + migration de dados nas ~1200 casas — pra fazer com segurança teria que ser expand/contract.Proposta: manter este PR aditivo e tratar a unificação numa PR/issue separada, feita com calma. Abro a issue de follow-up se topar.