mirror of https://github.com/interlegis/sapl.git
Marcio Mazza
9 years ago
36 changed files with 778 additions and 936 deletions
@ -0,0 +1,26 @@ |
|||||
|
|
||||
|
CargoComissao: |
||||
|
Período de composição de Comissão: |
||||
|
- nome:10 unico |
||||
|
|
||||
|
Periodo: |
||||
|
Cargo de Comissão: |
||||
|
- data_inicio data_fim |
||||
|
|
||||
|
TipoComissao: |
||||
|
Tipo Comissão: |
||||
|
- nome:9 sigla |
||||
|
- dispositivo_regimental:9 natureza |
||||
|
|
||||
|
Comissao: |
||||
|
Dados Básicos: |
||||
|
- nome:9 sigla |
||||
|
- tipo data_criacao unidade_deliberativa data_extincao |
||||
|
Dados Complementares: |
||||
|
- local_reuniao agenda_reuniao telefone_reuniao |
||||
|
- endereco_secretaria telefone_secretaria fax_secretaria |
||||
|
- secretario:4 email |
||||
|
- finalidade |
||||
|
Temporária: |
||||
|
- apelido_temp:8 data_instalacao_temp |
||||
|
- data_final_prevista_temp data_prorrogada_temp data_fim_comissao |
@ -0,0 +1,39 @@ |
|||||
|
|
||||
|
TipoNota: |
||||
|
Tipo da Nota: |
||||
|
- sigla:2 nome |
||||
|
- modelo |
||||
|
|
||||
|
TipoVide: |
||||
|
Tipo de Vide: |
||||
|
- sigla:2 nome |
||||
|
|
||||
|
TipoPublicacao: |
||||
|
Tipo de Publicação: |
||||
|
- sigla:2 nome |
||||
|
|
||||
|
VeiculoPublicacao: |
||||
|
Veículo de Publicação: |
||||
|
- sigla:2 nome |
||||
|
|
||||
|
PerfilEstruturalTextoArticulado: |
||||
|
Perfil Estrutural de Textos Articulados: |
||||
|
- sigla:2 nome |
||||
|
|
||||
|
TipoDispositivo: |
||||
|
Dados Básicos: |
||||
|
- nome:8 class_css |
||||
|
Configurações para Edição do Rótulo: |
||||
|
- rotulo_prefixo_texto rotulo_sufixo_texto rotulo_ordinal contagem_continua |
||||
|
Configurações para Renderização de Rótulo e Texto: |
||||
|
- rotulo_prefixo_html rotulo_sufixo_html |
||||
|
- texto_prefixo_html dispositivo_de_articulacao texto_sufixo_html |
||||
|
Configurações para Nota Automática: |
||||
|
- nota_automatica_prefixo_html nota_automatica_sufixo_html |
||||
|
Configurações para Variações Numéricas: |
||||
|
- formato_variacao0 |
||||
|
- rotulo_separador_variacao01:5 formato_variacao1 |
||||
|
- rotulo_separador_variacao12:5 formato_variacao2 |
||||
|
- rotulo_separador_variacao23:5 formato_variacao3 |
||||
|
- rotulo_separador_variacao34:5 formato_variacao4 |
||||
|
- rotulo_separador_variacao45:5 formato_variacao5 |
@ -0,0 +1,138 @@ |
|||||
|
from math import ceil |
||||
|
from os.path import dirname, join |
||||
|
|
||||
|
import rtyaml |
||||
|
from crispy_forms.bootstrap import FormActions |
||||
|
from crispy_forms.helper import FormHelper |
||||
|
from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit |
||||
|
from django.utils.translation import ugettext as _ |
||||
|
|
||||
|
|
||||
|
def to_column(name_span): |
||||
|
fieldname, span = name_span |
||||
|
return Div(fieldname, css_class='col-md-%d' % span) |
||||
|
|
||||
|
|
||||
|
def to_row(names_spans): |
||||
|
return Div(*map(to_column, names_spans), css_class='row-fluid') |
||||
|
|
||||
|
|
||||
|
def to_fieldsets(fields): |
||||
|
for field in fields: |
||||
|
if isinstance(field, list): |
||||
|
legend, *row_specs = field |
||||
|
rows = [to_row(name_span_list) for name_span_list in row_specs] |
||||
|
yield Fieldset(legend, *rows) |
||||
|
else: |
||||
|
yield field |
||||
|
|
||||
|
|
||||
|
def form_actions(more=[], save_label=_('Salvar')): |
||||
|
return FormActions( |
||||
|
Submit('salvar', save_label, css_class='pull-right'), *more) |
||||
|
|
||||
|
|
||||
|
class SaplFormLayout(Layout): |
||||
|
|
||||
|
def __init__(self, *fields): |
||||
|
buttons = form_actions(more=[ |
||||
|
HTML('<a href="{{ view.cancel_url }}"' |
||||
|
' class="btn btn-inverse">%s</a>' % _('Cancelar'))]) |
||||
|
_fields = list(to_fieldsets(fields)) + [to_row([(buttons, 12)])] |
||||
|
super(SaplFormLayout, self).__init__(*_fields) |
||||
|
|
||||
|
|
||||
|
def get_field_display(obj, fieldname): |
||||
|
field = obj._meta.get_field(fieldname) |
||||
|
verbose_name = str(field.verbose_name) |
||||
|
if field.choices: |
||||
|
value = getattr(obj, 'get_%s_display' % fieldname)() |
||||
|
else: |
||||
|
value = getattr(obj, fieldname) |
||||
|
if value is None: |
||||
|
display = '' |
||||
|
elif 'date' in str(type(value)): |
||||
|
display = value.strftime("%d/%m/%Y") # TODO: localize |
||||
|
elif 'bool' in str(type(value)): |
||||
|
display = 'Sim' if value else 'Não' |
||||
|
else: |
||||
|
display = str(value) |
||||
|
return verbose_name, display |
||||
|
|
||||
|
|
||||
|
class CrispyLayoutFormMixin(object): |
||||
|
|
||||
|
def get_layout(self): |
||||
|
filename = join( |
||||
|
dirname(self.model._meta.app_config.models_module.__file__), |
||||
|
'layouts.yaml') |
||||
|
return read_layout_from_yaml(filename, self.model.__name__) |
||||
|
|
||||
|
@property |
||||
|
def fields(self): |
||||
|
'''Returns all fields in the layout''' |
||||
|
return [fieldname for legend_rows in self.get_layout() |
||||
|
for row in legend_rows[1:] |
||||
|
for fieldname, span in row] |
||||
|
|
||||
|
def get_form(self, form_class=None): |
||||
|
form = super(CrispyLayoutFormMixin, self).get_form(form_class) |
||||
|
form.helper = FormHelper() |
||||
|
form.helper.layout = SaplFormLayout(*self.get_layout()) |
||||
|
return form |
||||
|
|
||||
|
@property |
||||
|
def list_field_names(self): |
||||
|
'''The list of field names to display on table |
||||
|
|
||||
|
This base implementation returns the field names |
||||
|
in the first fieldset of the layout. |
||||
|
''' |
||||
|
rows = self.get_layout()[0][1:] |
||||
|
return [fieldname for row in rows for fieldname, __ in row] |
||||
|
|
||||
|
def get_column(self, fieldname, span): |
||||
|
obj = self.get_object() |
||||
|
verbose_name, text = get_field_display(obj, fieldname) |
||||
|
return { |
||||
|
'id': fieldname, |
||||
|
'span': span, |
||||
|
'verbose_name': verbose_name, |
||||
|
'text': text, |
||||
|
} |
||||
|
|
||||
|
@property |
||||
|
def layout_display(self): |
||||
|
return [ |
||||
|
{'legend': legend, |
||||
|
'rows': [[self.get_column(fieldname, span) |
||||
|
for fieldname, span in row] |
||||
|
for row in rows] |
||||
|
} for legend, *rows in self.get_layout()] |
||||
|
|
||||
|
|
||||
|
def read_yaml_from_file(filename): |
||||
|
# TODO cache this at application level |
||||
|
with open(filename, 'r') as yamlfile: |
||||
|
return rtyaml.load(yamlfile) |
||||
|
|
||||
|
|
||||
|
def read_layout_from_yaml(filename, key): |
||||
|
# TODO cache this at application level |
||||
|
yaml = read_yaml_from_file(filename) |
||||
|
base = yaml[key] |
||||
|
|
||||
|
def line_to_namespans(line): |
||||
|
split = [cell.split(':') for cell in line.split()] |
||||
|
namespans = [[s[0], int(s[1]) if len(s) > 1 else 0] for s in split] |
||||
|
remaining = 12 - sum(s for n, s in namespans) |
||||
|
nondefined = [ns for ns in namespans if not ns[1]] |
||||
|
while nondefined: |
||||
|
span = ceil(remaining / len(nondefined)) |
||||
|
namespan = nondefined.pop(0) |
||||
|
namespan[1] = span |
||||
|
remaining = remaining - span |
||||
|
return list(map(tuple, namespans)) |
||||
|
|
||||
|
return [[legend] + [line_to_namespans(l) for l in lines] |
||||
|
for legend, lines in base.items()] |
@ -0,0 +1,7 @@ |
|||||
|
|
||||
|
Country: |
||||
|
Basic Data: |
||||
|
- name:9 continent |
||||
|
- population is_cold |
||||
|
More Details: |
||||
|
- description |
@ -0,0 +1,11 @@ |
|||||
|
|
||||
|
LexmlProvedor: |
||||
|
Provedor Lexml: |
||||
|
- id_provedor:2 nome |
||||
|
- id_responsavel:2 nome_responsavel email_responsavel |
||||
|
- xml |
||||
|
|
||||
|
LexmlPublicador: |
||||
|
Publicador Lexml: |
||||
|
- id_publicador:2 nome sigla |
||||
|
- id_responsavel:2 nome_responsavel email_responsavel |
@ -0,0 +1,111 @@ |
|||||
|
|
||||
|
Origem: |
||||
|
Origem: |
||||
|
- nome:8 sigla |
||||
|
|
||||
|
TipoMateriaLegislativa: |
||||
|
Tipo Matéria Legislativa: |
||||
|
- sigla:4 descricao |
||||
|
|
||||
|
RegimeTramitacao: |
||||
|
Tipo de Documento: |
||||
|
- descricao |
||||
|
|
||||
|
TipoDocumento: |
||||
|
Regime Tramitação: |
||||
|
- descricao |
||||
|
|
||||
|
TipoFimRelatoria: |
||||
|
Tipo Fim de Relatoria: |
||||
|
- descricao |
||||
|
|
||||
|
MateriaLegislativa: |
||||
|
Identificação Básica: |
||||
|
- tipo numero ano |
||||
|
- data_apresentacao numero_protocolo tipo_apresentacao |
||||
|
- texto_original |
||||
|
Outras Informações: |
||||
|
- apelido dias_prazo polemica |
||||
|
- objeto regime_tramitacao em_tramitacao |
||||
|
- data_fim_prazo data_publicacao complementar |
||||
|
Origem Externa: |
||||
|
- tipo_origem_externa numero_origem_externa ano_origem_externa |
||||
|
- local_origem_externa data_origem_externa |
||||
|
Dados Textuais: |
||||
|
- ementa |
||||
|
- indexacao |
||||
|
- observacao |
||||
|
|
||||
|
Anexada: |
||||
|
Matéria Legislativa: |
||||
|
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
||||
|
- data_anexacao data_desanexacao |
||||
|
Matéria Anexada: |
||||
|
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
||||
|
- data_anexacao data_desanexacao |
||||
|
|
||||
|
TipoAutor: |
||||
|
Tipo Autor: |
||||
|
- descricao |
||||
|
|
||||
|
Autor: |
||||
|
Autor: |
||||
|
- tipo:3 nome |
||||
|
- username |
||||
|
|
||||
|
Autoria: |
||||
|
Autoria: |
||||
|
- tip_autor_FIXME nom_autor_FIXME primeiro_autor |
||||
|
|
||||
|
DocumentoAcessorio: |
||||
|
Documento Acessório: |
||||
|
- tipo nome |
||||
|
- data autor |
||||
|
- nom_arquivo_FIXME |
||||
|
- ementa |
||||
|
- txt_observacao_FIXME |
||||
|
|
||||
|
Numeracao: |
||||
|
Numeração: |
||||
|
- tipo_materia numero_materia |
||||
|
- ano_materia data_materia |
||||
|
|
||||
|
Orgao: |
||||
|
Órgão: |
||||
|
- nome:4 sigla telefone endereco unidade_deliberativa |
||||
|
|
||||
|
Relatoria: |
||||
|
Relatoria: |
||||
|
- data_designacao_relator |
||||
|
- dados_FIXME |
||||
|
- data_destituicao_relator tipo_fim_relatoria |
||||
|
|
||||
|
TipoProposicao: |
||||
|
Tipo Proposição: |
||||
|
- descricao |
||||
|
- materia_ou_documento tipo_documento |
||||
|
- modelo |
||||
|
|
||||
|
Proposicao: |
||||
|
Proposição: |
||||
|
- tipo dat_criacao_FIXME data_recebimento |
||||
|
- descricao_FIXME |
||||
|
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
||||
|
- nom_arquivo_FIXME modelo_FIXME |
||||
|
|
||||
|
StatusTramitacao: |
||||
|
Status Tramitação: |
||||
|
- indicador:3 sigla:2 descricao |
||||
|
|
||||
|
UnidadeTramitacao: |
||||
|
Unidade Tramitação: |
||||
|
- orgao |
||||
|
- comissao |
||||
|
- parlamentar |
||||
|
|
||||
|
Tramitacao: |
||||
|
Tramitação: |
||||
|
- cod_ult_tram_dest_FIXME unidade_tramitacao_local |
||||
|
- status turno urgente |
||||
|
- unidade_tramitacao_destino data_encaminhamento data_fim_prazo |
||||
|
- texto |
@ -0,0 +1,31 @@ |
|||||
|
|
||||
|
AssuntoNorma: |
||||
|
Assunto Norma Jurídica: |
||||
|
- assunto descricao |
||||
|
|
||||
|
TipoNormaJuridica: |
||||
|
Tipo Norma Jurídica: |
||||
|
- descricao sigla equivalente_lexml |
||||
|
|
||||
|
NormaJuridica: |
||||
|
Identificação Básica: |
||||
|
- tipo numero ano |
||||
|
- data esfera_federacao complemento |
||||
|
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
||||
|
- data_publicacao veiculo_publicacao pagina_inicio_publicacao pagina_fim_publicacao |
||||
|
- file_FIXME tip_situacao_norma_FIXME |
||||
|
- ementa |
||||
|
- indexacao |
||||
|
- observacao |
||||
|
|
||||
|
NormaJuridica: |
||||
|
Identificação Básica: |
||||
|
- tipo:5 numero:2 ano:2 data |
||||
|
- ementa |
||||
|
|
||||
|
LegislacaoCitada: |
||||
|
Legislação Citada: |
||||
|
- tip_norma_FIXME num_norma_FIXME ano_norma_FIXME |
||||
|
- disposicoes parte livro titulo |
||||
|
- capitulo secao subsecao artigo |
||||
|
- paragrafo inciso alinea item |
@ -0,0 +1,4 @@ |
|||||
|
|
||||
|
Cronometro: |
||||
|
Cronometro: |
||||
|
- status:3 data_cronometro:6 tipo |
@ -0,0 +1,69 @@ |
|||||
|
|
||||
|
CargoMesa: |
||||
|
Cargo na Mesa: |
||||
|
- descricao:10 unico |
||||
|
|
||||
|
Legislatura: |
||||
|
Legislatura: |
||||
|
- data_inicio data_fim data_eleicao |
||||
|
|
||||
|
Coligacao: |
||||
|
Coligação: |
||||
|
- nome:5 legislatura:5 numero_votos |
||||
|
|
||||
|
Partido: |
||||
|
Partido Político: |
||||
|
- nome:6 sigla data_criacao data_extincao |
||||
|
|
||||
|
Dependente: |
||||
|
Dependentes: |
||||
|
- nome |
||||
|
- tipo sexo data_nascimento |
||||
|
- cpf rg titulo_eleitor |
||||
|
|
||||
|
SessaoLegislativa: |
||||
|
Sessão Legislativa: |
||||
|
- numero:4 tipo:4 legislatura:4 data_inicio data_fim data_inicio_intervalo data_fim_intervalo |
||||
|
|
||||
|
Parlamentar: |
||||
|
Cadastro do Parlamentar: |
||||
|
- nome_parlamentar:8 ativo |
||||
|
- nome_completo |
||||
|
- nivel_instrucao sexo data_nascimento |
||||
|
- cpf rg titulo_eleitor |
||||
|
- situacao_militar profissao |
||||
|
- endereco_web |
||||
|
- email |
||||
|
- numero_gab_parlamentar telefone fax |
||||
|
- endereco_residencia cep_residencia |
||||
|
- municipio_residencia |
||||
|
- telefone_residencia fax_residencia |
||||
|
- locais_atuacao |
||||
|
- fotografia |
||||
|
- biografia |
||||
|
|
||||
|
Filiacao: |
||||
|
'Filiações Partidárias ': |
||||
|
- partido data data_desfiliacao |
||||
|
|
||||
|
Mandato: |
||||
|
Mandato: |
||||
|
- legislatura coligacao votos_recebidos |
||||
|
- ind_titular_FIXME dat_inicio_mandato_FIXME data_fim_mandato data_expedicao_diploma |
||||
|
- observacao |
||||
|
|
||||
|
TipoDependente: |
||||
|
Tipo de Dependente: |
||||
|
- descricao |
||||
|
|
||||
|
NivelInstrucao: |
||||
|
Nível Instrução: |
||||
|
- descricao |
||||
|
|
||||
|
TipoAfastamento: |
||||
|
Tipo de Afastamento: |
||||
|
- descricao:5 dispositivo:5 afastamento |
||||
|
|
||||
|
SituacaoMilitar: |
||||
|
Tipo Situação Militar: |
||||
|
- descricao |
@ -0,0 +1,48 @@ |
|||||
|
|
||||
|
TipoDocumentoAdministrativo: |
||||
|
Tipo Documento Administrativo: |
||||
|
- sigla:4 descricao |
||||
|
|
||||
|
DocumentoAdministrativo: |
||||
|
Indentificação Básica: |
||||
|
- tipo numero ano |
||||
|
- data numero_protocolo |
||||
|
- assunto |
||||
|
- interessado tramitacao |
||||
|
- texto_integral |
||||
|
Outras Informações: |
||||
|
- dias_prazo data_fim_prazo |
||||
|
- observacao |
||||
|
|
||||
|
DocumentoAcessorioAdministrativo: |
||||
|
Documento Acessório: |
||||
|
- tipo nome data |
||||
|
- autor |
||||
|
- arquivo |
||||
|
- assunto |
||||
|
|
||||
|
StatusTramitacaoAdministrativo: |
||||
|
Status Tramitação Administrativo: |
||||
|
- indicador:3 sigla:2 descricao |
||||
|
|
||||
|
TramitacaoAdministrativo: |
||||
|
Tramitação: |
||||
|
- data_tramitacao:4 unidade_tramitacao_local |
||||
|
- status:4 unidade_tramitacao_destino |
||||
|
- data_encaminhamento data_fim_prazo |
||||
|
- texto |
||||
|
|
||||
|
Protocolo: |
||||
|
Indentificação Documento: |
||||
|
- tipo_protocolo |
||||
|
- tipo_documento numero_paginas |
||||
|
- assunto_ementa |
||||
|
- interessado |
||||
|
- observacao |
||||
|
|
||||
|
Protocolo: |
||||
|
Indentificação da Matéria: |
||||
|
- tipo_materia numero_paginas |
||||
|
- assunto_ementa |
||||
|
- autor |
||||
|
- observacao |
@ -1,37 +0,0 @@ |
|||||
from crispy_forms.bootstrap import FormActions |
|
||||
from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit |
|
||||
from django.utils.translation import ugettext as _ |
|
||||
|
|
||||
|
|
||||
def to_column(name_span): |
|
||||
fieldname, span = name_span |
|
||||
return Div(fieldname, css_class='col-md-%d' % span) |
|
||||
|
|
||||
|
|
||||
def to_row(names_spans): |
|
||||
return Div(*map(to_column, names_spans), css_class='row-fluid') |
|
||||
|
|
||||
|
|
||||
def to_fieldsets(fields): |
|
||||
for field in fields: |
|
||||
if isinstance(field, list): |
|
||||
legend, *row_specs = field |
|
||||
rows = [to_row(name_span_list) for name_span_list in row_specs] |
|
||||
yield Fieldset(legend, *rows) |
|
||||
else: |
|
||||
yield field |
|
||||
|
|
||||
|
|
||||
def form_actions(more=[], save_label=_('Salvar')): |
|
||||
return FormActions( |
|
||||
Submit('salvar', save_label, css_class='pull-right'), *more) |
|
||||
|
|
||||
|
|
||||
class SaplFormLayout(Layout): |
|
||||
|
|
||||
def __init__(self, *fields): |
|
||||
buttons = form_actions(more=[ |
|
||||
HTML('<a href="{{ view.cancel_url }}"' |
|
||||
' class="btn btn-inverse">%s</a>' % _('Cancelar'))]) |
|
||||
_fields = list(to_fieldsets(fields)) + [to_row([(buttons, 12)])] |
|
||||
super(SaplFormLayout, self).__init__(*_fields) |
|
@ -0,0 +1,41 @@ |
|||||
|
|
||||
|
TipoSessaoPlenaria: |
||||
|
Tipo de Sessão Plenária: |
||||
|
- nome quorum_minimo |
||||
|
|
||||
|
SessaoPlenaria: |
||||
|
Dados Básicos: |
||||
|
- numero:1 tipo:3 legislatura sessao_legislativa |
||||
|
- data_inicio:5 hora_inicio:5 iniciada |
||||
|
- data_fim:5 hora_fim:5 finalizada |
||||
|
- upload_pauta upload_ata |
||||
|
- url_audio url_video |
||||
|
|
||||
|
ExpedienteMateria: |
||||
|
Cadastro de Matérias do Expediente: |
||||
|
- data_ordem tip_sessao_FIXME numero_ordem |
||||
|
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
||||
|
- tipo_votacao |
||||
|
- observacao |
||||
|
|
||||
|
OrdemDia: |
||||
|
Cadastro de Matérias da Ordem do Dia: |
||||
|
- data_ordem tip_sessao_FIXME numero_ordem |
||||
|
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
||||
|
- tipo_votacao |
||||
|
- observacao |
||||
|
|
||||
|
TipoResultadoVotacao: |
||||
|
Tipo de Resultado da Votação: |
||||
|
- nome |
||||
|
|
||||
|
TipoExpediente: |
||||
|
Tipo de Expediente: |
||||
|
- nome |
||||
|
|
||||
|
RegistroVotacao: |
||||
|
Votação Simbólica: |
||||
|
- numero_votos_sim numero_votos_nao numero_abstencoes nao_votou_FIXME |
||||
|
- votacao_branco_FIXME ind_votacao_presidente_FIXME |
||||
|
- tipo_resultado_votacao |
||||
|
- observacao |
@ -0,0 +1,29 @@ |
|||||
|
from crispy_layout_mixin import read_layout_from_yaml |
||||
|
|
||||
|
|
||||
|
def test_read_layout_from_yaml(tmpdir): |
||||
|
|
||||
|
contents = ''' |
||||
|
ModelName: |
||||
|
Cool Legend: |
||||
|
- name:9 place tiny |
||||
|
- field nature:2 |
||||
|
- kind:1 date unit:5 status |
||||
|
More data: |
||||
|
- equalA equalB equalC |
||||
|
- highlander ''' |
||||
|
file = tmpdir.join('zzz.yaml') |
||||
|
file.write(contents) |
||||
|
|
||||
|
expected = [ |
||||
|
['Cool Legend', |
||||
|
[('name', 9), ('place', 2), ('tiny', 1)], |
||||
|
[('field', 10), ('nature', 2)], |
||||
|
[('kind', 1), ('date', 3), ('unit', 5), ('status', 3)], |
||||
|
], |
||||
|
['More data', |
||||
|
[('equalA', 4), ('equalB', 4), ('equalC', 4)], |
||||
|
[('highlander', 12)], |
||||
|
], |
||||
|
] |
||||
|
assert read_layout_from_yaml(file.strpath, 'ModelName') == expected |
Loading…
Reference in new issue