mirror of https://github.com/interlegis/sapl.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
389 lines
16 KiB
389 lines
16 KiB
"""
|
|
Todas as permissões do django framework seguem o padrão
|
|
|
|
[app_label].[radical_de_permissao]_[model]
|
|
|
|
ou seja, em sapl.norma.NormaJuridica, por exemplo, o django framework cria
|
|
três permissões registadas na classe Permission:
|
|
|
|
definição uso
|
|
|
|
- add_normajuridica norma.add_normajuridica
|
|
- change_normajuridica norma.change_normajuridica
|
|
- delete_normajuridica norma.delete_normajuridica
|
|
|
|
No SAPL foram acrescidas em todos os models as duas regras abaixo, adicionadas
|
|
com o Signal post_migrate `create_proxy_permissions`
|
|
localizado em sapl.rules.apps.py.
|
|
|
|
- list_normajuridica norma.list_normajuridica
|
|
- detail_normajuridica norma.detail_normajuridica
|
|
|
|
Tanto o Crud implementado em sapl.crud.base.py quanto o Signal post_migrate
|
|
`update_groups` que é responsável por ler o mapa deste
|
|
arquivo (sapl.rules.map_rules.py) e criar os grupos definidos na regra de
|
|
negócio trabalham com os cinco radiais de permissão
|
|
e com qualquer outro tipo de permissão customizada, nesta ordem de precedência.
|
|
|
|
"""
|
|
from sapl.audiencia import models as audiencia
|
|
from sapl.base import models as base
|
|
from sapl.comissoes import models as comissoes
|
|
from sapl.compilacao import models as compilacao
|
|
from sapl.lexml import models as lexml
|
|
from sapl.materia import models as materia
|
|
from sapl.norma import models as norma
|
|
from sapl.painel import models as painel
|
|
from sapl.parlamentares import models as parlamentares
|
|
from sapl.protocoloadm import models as protocoloadm
|
|
from sapl.rules import (RP_ADD, RP_CHANGE, RP_DELETE, RP_DETAIL, RP_LIST,
|
|
SAPL_GROUP_ADMINISTRATIVO, SAPL_GROUP_ANONYMOUS,
|
|
SAPL_GROUP_AUTOR, SAPL_GROUP_COMISSOES,
|
|
SAPL_GROUP_GERAL, SAPL_GROUP_LOGIN_SOCIAL,
|
|
SAPL_GROUP_MATERIA, SAPL_GROUP_NORMA,
|
|
SAPL_GROUP_PAINEL, SAPL_GROUP_PARLAMENTAR,
|
|
SAPL_GROUP_PROTOCOLO, SAPL_GROUP_SESSAO,
|
|
SAPL_GROUP_VOTANTE)
|
|
from sapl.sessao import models as sessao
|
|
|
|
|
|
__base__ = [RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE]
|
|
__listdetailchange__ = [RP_LIST, RP_DETAIL, RP_CHANGE]
|
|
|
|
__perms_publicas__ = {RP_LIST, RP_DETAIL}
|
|
|
|
|
|
rules_group_administrativo = {
|
|
'group': SAPL_GROUP_ADMINISTRATIVO,
|
|
'rules': [
|
|
(materia.MateriaLegislativa, [
|
|
'can_access_impressos'], __perms_publicas__),
|
|
# TODO: tratar em sapl.api a questão de ostencivo e restritivo
|
|
(protocoloadm.DocumentoAdministrativo, __base__, set()),
|
|
(protocoloadm.Anexado, __base__, set()),
|
|
(protocoloadm.DocumentoAcessorioAdministrativo, __base__, set()),
|
|
(protocoloadm.TramitacaoAdministrativo, __base__, set()),
|
|
]
|
|
}
|
|
|
|
rules_group_audiencia = {
|
|
'group': SAPL_GROUP_GERAL,
|
|
'rules': [
|
|
(audiencia.AudienciaPublica, __base__, __perms_publicas__),
|
|
(audiencia.TipoAudienciaPublica, __base__, __perms_publicas__),
|
|
(audiencia.AnexoAudienciaPublica, __base__, __perms_publicas__),
|
|
]
|
|
}
|
|
|
|
|
|
rules_group_protocolo = {
|
|
'group': SAPL_GROUP_PROTOCOLO,
|
|
'rules': [
|
|
(protocoloadm.Protocolo, __base__ + [
|
|
'action_anular_protocolo'], set()),
|
|
(protocoloadm.DocumentoAdministrativo,
|
|
[RP_ADD] + __listdetailchange__, set()),
|
|
(protocoloadm.DocumentoAcessorioAdministrativo, __listdetailchange__, set()),
|
|
|
|
(materia.MateriaLegislativa, __listdetailchange__, __perms_publicas__),
|
|
(materia.MateriaLegislativa, [
|
|
'can_access_impressos'], __perms_publicas__),
|
|
(materia.DocumentoAcessorio, __listdetailchange__, __perms_publicas__),
|
|
(materia.Anexada, __base__, __perms_publicas__),
|
|
(materia.Autoria, __base__, __perms_publicas__),
|
|
|
|
(materia.Proposicao, ['detail_proposicao_enviada',
|
|
'detail_proposicao_devolvida',
|
|
'detail_proposicao_incorporada'], set()), # TODO: tratar em sapl.api questão de que proposições incorporadas serem públicas
|
|
(compilacao.TextoArticulado, [
|
|
'view_restricted_textoarticulado'], __perms_publicas__)
|
|
]
|
|
}
|
|
|
|
rules_group_comissoes = {
|
|
'group': SAPL_GROUP_COMISSOES,
|
|
'rules': [
|
|
(materia.PautaReuniao, __base__, __perms_publicas__),
|
|
(comissoes.Comissao, __base__, __perms_publicas__),
|
|
(comissoes.Composicao, __base__, __perms_publicas__),
|
|
(comissoes.Participacao, __base__, __perms_publicas__),
|
|
(materia.Relatoria, __base__, __perms_publicas__),
|
|
(comissoes.Reuniao, __base__, __perms_publicas__),
|
|
(comissoes.DocumentoAcessorio, __base__, __perms_publicas__),
|
|
]
|
|
}
|
|
|
|
rules_group_materia = {
|
|
'group': SAPL_GROUP_MATERIA,
|
|
'rules': [
|
|
(materia.Anexada, __base__, __perms_publicas__),
|
|
(materia.Autoria, __base__, __perms_publicas__),
|
|
(materia.DespachoInicial, __base__, __perms_publicas__),
|
|
(materia.DocumentoAcessorio, __base__, __perms_publicas__),
|
|
(materia.MateriaAssunto, __base__, __perms_publicas__),
|
|
(materia.AssuntoMateria, __base__, __perms_publicas__),
|
|
|
|
(materia.MateriaLegislativa, __base__ +
|
|
['can_access_impressos'], __perms_publicas__),
|
|
(materia.Numeracao, __base__, __perms_publicas__),
|
|
(materia.Tramitacao, __base__, __perms_publicas__),
|
|
(norma.LegislacaoCitada, __base__, __perms_publicas__),
|
|
(norma.AutoriaNorma, __base__, __perms_publicas__),
|
|
(compilacao.Dispositivo, __base__ + [
|
|
'change_dispositivo_edicao_dinamica',
|
|
|
|
# TODO: adicionar 'change_dispositivo_registros_compilacao'
|
|
# quando testes forem feitos para permtir que matérias possam
|
|
# ser vinculadas a outras matérias via registro de compilação.
|
|
# Normalmente emendas e/ou projetos substitutivos podem alterar
|
|
# uma matéria original.
|
|
# Fazer esse registro de compilação ofereceria
|
|
# um autografo eletrônico pronto para ser convertido em Norma.
|
|
], __perms_publicas__)
|
|
]
|
|
}
|
|
|
|
rules_group_norma = {
|
|
'group': SAPL_GROUP_NORMA,
|
|
'rules': [
|
|
(norma.NormaJuridica, __base__, __perms_publicas__),
|
|
(norma.NormaRelacionada, __base__, __perms_publicas__),
|
|
(norma.AnexoNormaJuridica, __base__, __perms_publicas__),
|
|
(norma.AutoriaNorma, __base__, __perms_publicas__),
|
|
(norma.NormaEstatisticas, __base__, __perms_publicas__),
|
|
|
|
# Publicacao está com permissão apenas para norma e não para matéria
|
|
# e proposições apenas por análise do contexto, não é uma limitação
|
|
# da ferramenta.
|
|
(compilacao.Publicacao, __base__, __perms_publicas__),
|
|
(compilacao.Vide, __base__, __perms_publicas__),
|
|
(compilacao.Nota, __base__, __perms_publicas__),
|
|
(compilacao.Dispositivo, __base__ + [
|
|
'view_dispositivo_notificacoes',
|
|
'change_dispositivo_edicao_dinamica',
|
|
'change_dispositivo_edicao_avancada',
|
|
'change_dispositivo_registros_compilacao',
|
|
'change_dispositivo_de_vigencia_global'
|
|
], __perms_publicas__)
|
|
]
|
|
}
|
|
|
|
rules_group_sessao = {
|
|
'group': SAPL_GROUP_SESSAO,
|
|
'rules': [
|
|
(sessao.SessaoPlenaria, __base__, __perms_publicas__),
|
|
(sessao.SessaoPlenariaPresenca, __base__, __perms_publicas__),
|
|
(sessao.ExpedienteMateria, __base__, __perms_publicas__),
|
|
(sessao.OcorrenciaSessao, __base__, __perms_publicas__),
|
|
(sessao.IntegranteMesa, __base__, __perms_publicas__),
|
|
(sessao.ExpedienteSessao, __base__, __perms_publicas__),
|
|
(sessao.Orador, __base__, __perms_publicas__),
|
|
(sessao.OradorExpediente, __base__, __perms_publicas__),
|
|
(sessao.OradorOrdemDia, __base__, __perms_publicas__),
|
|
(sessao.OrdemDia, __base__, __perms_publicas__),
|
|
(sessao.PresencaOrdemDia, __base__, __perms_publicas__),
|
|
(sessao.RegistroVotacao, __base__, __perms_publicas__),
|
|
(sessao.VotoParlamentar, __base__, __perms_publicas__),
|
|
(sessao.JustificativaAusencia, __base__, __perms_publicas__),
|
|
(sessao.RetiradaPauta, __base__, __perms_publicas__),
|
|
]
|
|
}
|
|
|
|
rules_group_painel = {
|
|
'group': SAPL_GROUP_PAINEL,
|
|
'rules': [
|
|
(painel.Painel, __base__, __perms_publicas__),
|
|
(painel.Cronometro, __base__, __perms_publicas__),
|
|
]
|
|
}
|
|
|
|
rules_group_autor = {
|
|
'group': SAPL_GROUP_AUTOR,
|
|
'rules': [
|
|
(materia.Proposicao, __base__, set()),
|
|
(compilacao.Dispositivo, __base__ + [
|
|
'change_your_dispositivo_edicao_dinamica',
|
|
], __perms_publicas__)
|
|
]
|
|
}
|
|
|
|
rules_group_parlamentar = {
|
|
'group': SAPL_GROUP_PARLAMENTAR,
|
|
'rules': []
|
|
}
|
|
|
|
rules_group_votante = {
|
|
'group': SAPL_GROUP_VOTANTE,
|
|
'rules': [
|
|
(parlamentares.Votante, ['can_vote'], set())
|
|
]
|
|
}
|
|
|
|
rules_group_geral = {
|
|
'group': SAPL_GROUP_GERAL,
|
|
'rules': [
|
|
(base.AppConfig, __base__ + [
|
|
'menu_sistemas',
|
|
'view_tabelas_auxiliares'
|
|
], set()),
|
|
|
|
(base.CasaLegislativa, __listdetailchange__ +
|
|
[RP_ADD], __perms_publicas__),
|
|
(base.TipoAutor, __base__, __perms_publicas__),
|
|
(base.Autor, __base__, __perms_publicas__),
|
|
|
|
(protocoloadm.StatusTramitacaoAdministrativo, __base__, set()),
|
|
(protocoloadm.TipoDocumentoAdministrativo, __base__, set()),
|
|
|
|
(comissoes.CargoComissao, __base__, __perms_publicas__),
|
|
(comissoes.TipoComissao, __base__, __perms_publicas__),
|
|
(comissoes.Periodo, __base__, __perms_publicas__),
|
|
|
|
(materia.AssuntoMateria, __base__,
|
|
__perms_publicas__), # não há implementação
|
|
(materia.MateriaAssunto, __base__,
|
|
__perms_publicas__), # não há implementação
|
|
(materia.MateriaLegislativa, [
|
|
'can_access_impressos'], __perms_publicas__),
|
|
(materia.TipoProposicao, __base__, __perms_publicas__),
|
|
(materia.TipoMateriaLegislativa, __base__, __perms_publicas__),
|
|
(materia.RegimeTramitacao, __base__, __perms_publicas__),
|
|
(materia.Origem, __base__, __perms_publicas__),
|
|
(materia.TipoDocumento, __base__, __perms_publicas__),
|
|
(materia.Orgao, __base__, __perms_publicas__),
|
|
(materia.TipoFimRelatoria, __base__, __perms_publicas__),
|
|
(materia.Parecer, __base__, __perms_publicas__),
|
|
(materia.StatusTramitacao, __base__, __perms_publicas__),
|
|
(materia.UnidadeTramitacao, __base__, __perms_publicas__),
|
|
|
|
|
|
(norma.AssuntoNorma, __base__, __perms_publicas__),
|
|
(norma.TipoNormaJuridica, __base__, __perms_publicas__),
|
|
(norma.TipoVinculoNormaJuridica, __base__, __perms_publicas__),
|
|
(norma.NormaEstatisticas, __base__, __perms_publicas__),
|
|
|
|
(parlamentares.Legislatura, __base__, __perms_publicas__),
|
|
(parlamentares.SessaoLegislativa, __base__, __perms_publicas__),
|
|
(parlamentares.Coligacao, __base__, __perms_publicas__),
|
|
(parlamentares.ComposicaoColigacao, __base__, __perms_publicas__),
|
|
(parlamentares.Partido, __base__, __perms_publicas__),
|
|
(parlamentares.HistoricoPartido, __base__, __perms_publicas__),
|
|
(parlamentares.NivelInstrucao, __base__, __perms_publicas__),
|
|
(parlamentares.SituacaoMilitar, __base__, __perms_publicas__),
|
|
(parlamentares.Parlamentar, __base__, __perms_publicas__),
|
|
(parlamentares.TipoDependente, __base__, __perms_publicas__),
|
|
(parlamentares.Dependente, __base__, __perms_publicas__),
|
|
(parlamentares.Filiacao, __base__, __perms_publicas__),
|
|
(parlamentares.TipoAfastamento, __base__, __perms_publicas__),
|
|
(parlamentares.Mandato, __base__, __perms_publicas__),
|
|
(parlamentares.CargoMesa, __base__, __perms_publicas__),
|
|
(parlamentares.ComposicaoMesa, __base__, __perms_publicas__),
|
|
(parlamentares.Frente, __base__, __perms_publicas__),
|
|
(parlamentares.Votante, __base__, __perms_publicas__),
|
|
(parlamentares.Bloco, __base__, __perms_publicas__),
|
|
|
|
|
|
(sessao.CargoBancada, __base__, __perms_publicas__),
|
|
(sessao.Bancada, __base__, __perms_publicas__),
|
|
(sessao.TipoSessaoPlenaria, __base__, __perms_publicas__),
|
|
(sessao.TipoResultadoVotacao, __base__, __perms_publicas__),
|
|
(sessao.TipoExpediente, __base__, __perms_publicas__),
|
|
(sessao.TipoJustificativa, __base__, __perms_publicas__),
|
|
(sessao.JustificativaAusencia, __base__, __perms_publicas__),
|
|
(sessao.ResumoOrdenacao, __base__, __perms_publicas__),
|
|
(sessao.TipoRetiradaPauta, __base__, __perms_publicas__),
|
|
|
|
(lexml.LexmlProvedor, __base__, set()),
|
|
(lexml.LexmlPublicador, __base__, set()),
|
|
|
|
(compilacao.VeiculoPublicacao, __base__, __perms_publicas__),
|
|
(compilacao.TipoTextoArticulado, __base__, __perms_publicas__),
|
|
(compilacao.TipoNota, __base__, __perms_publicas__),
|
|
(compilacao.TipoVide, __base__, __perms_publicas__),
|
|
(compilacao.TipoPublicacao, __base__, __perms_publicas__),
|
|
|
|
# este model é um espelho do model integrado e sua edição pode
|
|
# confundir Autores, operadores de matéria e/ou norma.
|
|
# Por isso está adicionado apenas para o operador geral
|
|
(compilacao.TextoArticulado,
|
|
__base__ + ['lock_unlock_textoarticulado'], set()),
|
|
|
|
# estes tres models são complexos e a principio apenas o admin tem perm
|
|
(compilacao.TipoDispositivo, [], set()),
|
|
(compilacao.TipoDispositivoRelationship, [], set()),
|
|
(compilacao.PerfilEstruturalTextoArticulado, [], set()),
|
|
|
|
(audiencia.AudienciaPublica, __base__, __perms_publicas__),
|
|
(audiencia.TipoAudienciaPublica, __base__, __perms_publicas__),
|
|
|
|
|
|
|
|
|
|
]
|
|
}
|
|
|
|
|
|
# não possui efeito e é usada nos testes que verificam se todos os models estão
|
|
# neste arquivo rules.py
|
|
rules_group_anonymous = {
|
|
'group': SAPL_GROUP_ANONYMOUS,
|
|
'rules': [
|
|
(materia.AcompanhamentoMateria, [RP_ADD, RP_DELETE], set()),
|
|
(protocoloadm.AcompanhamentoDocumento, [RP_ADD, RP_DELETE], set()),
|
|
]
|
|
}
|
|
|
|
rules_group_login_social = {
|
|
'group': SAPL_GROUP_LOGIN_SOCIAL,
|
|
'rules': []
|
|
}
|
|
|
|
rules_group_geral['rules'] = (rules_group_geral['rules'] +
|
|
rules_group_administrativo['rules'] +
|
|
rules_group_protocolo['rules'] +
|
|
rules_group_comissoes['rules'] +
|
|
rules_group_audiencia['rules'] +
|
|
rules_group_materia['rules'] +
|
|
rules_group_norma['rules'] +
|
|
rules_group_sessao['rules'] +
|
|
rules_group_painel['rules'] +
|
|
rules_group_login_social['rules'])
|
|
|
|
|
|
rules_patterns = [
|
|
rules_group_audiencia,
|
|
rules_group_administrativo,
|
|
rules_group_protocolo,
|
|
rules_group_comissoes,
|
|
rules_group_materia,
|
|
rules_group_norma,
|
|
rules_group_sessao,
|
|
rules_group_painel,
|
|
rules_group_geral,
|
|
rules_group_autor,
|
|
rules_group_parlamentar,
|
|
rules_group_votante,
|
|
|
|
rules_group_anonymous, # anotação para validação do teste de rules
|
|
rules_group_login_social # TODO não implementado
|
|
]
|
|
|
|
|
|
rules_patterns_public = {}
|
|
|
|
|
|
def _get_registration_key(model):
|
|
return '%s:%s' % (model._meta.app_label, model._meta.model_name)
|
|
|
|
|
|
for rules_group in rules_patterns:
|
|
for rules in rules_group['rules']:
|
|
key = _get_registration_key(rules[0])
|
|
if key not in rules_patterns_public:
|
|
rules_patterns_public[key] = set()
|
|
|
|
r = set(map(lambda x, m=rules[0]: '{}{}{}'.format(
|
|
m._meta.app_label,
|
|
x,
|
|
m._meta.model_name), rules[2]))
|
|
rules_patterns_public[key] = rules_patterns_public[key] | r
|
|
|