mirror of https://github.com/interlegis/sapl.git
Browse Source
* add model OperadorAutor * refatora autor e impl form e view para operadores * refatora AutorForm para seleção de usuários * remove OperadorAutorCrud * restrige usuários na lista de operadores * ajusta qs p/ lista de usuários em autor * add listview com pesquisa para autores * remove pesquisa independente de autores * ajustes no filtro de autores e display de operadores * refatora restrições de usuário em proposição * corrige exclusão de vinculo de usuário votante * impl edição de votante e autor para usuário * corrige run python em migration * organia imports em sapl/base/forms.py * add restrição de user ativo na lista de user de autor * corrige erro apontado por test_str_sanity * ajusta teste de criação de proposição * ajusta erro apontado em rules/test_rulespull/3378/head
Leandro Roberto Silva
4 years ago
committed by
GitHub
24 changed files with 900 additions and 828 deletions
@ -0,0 +1,62 @@ |
|||
# Generated by Django 2.2.13 on 2021-03-14 18:32 |
|||
|
|||
from django.conf import settings |
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
|
|||
|
|||
def adjust_user_oto_m2m(apps, schema_editor): |
|||
Autor = apps.get_model('base', 'Autor') |
|||
autores = Autor.objects.all() |
|||
for a in autores: |
|||
if a.user: |
|||
a.operadores.add(a.user) |
|||
|
|||
|
|||
def adjust_remove_grupo_parlamentar(apps, schema_editor): |
|||
Group = apps.get_model('auth', 'Group') |
|||
Group.objects.filter(name='Parlamentar').delete() |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
|||
('base', '0045_auto_20210301_1537'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.CreateModel( |
|||
name='OperadorAutor', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, |
|||
primary_key=True, serialize=False, verbose_name='ID')), |
|||
('autor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, |
|||
related_name='operadorautor_set', to='base.Autor', verbose_name='Autor')), |
|||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, |
|||
related_name='operadorautor_set', to=settings.AUTH_USER_MODEL, verbose_name='Operador do Autor')), |
|||
], |
|||
options={ |
|||
'verbose_name': 'Operador do Autor', |
|||
'verbose_name_plural': 'Operadores do Autor', |
|||
'unique_together': {('user', 'autor')}, |
|||
}, |
|||
), |
|||
|
|||
migrations.AddField( |
|||
model_name='autor', |
|||
name='operadores', |
|||
field=models.ManyToManyField( |
|||
related_name='autor_set', through='base.OperadorAutor', to=settings.AUTH_USER_MODEL), |
|||
), |
|||
|
|||
migrations.RunPython(adjust_user_oto_m2m), |
|||
|
|||
migrations.RunPython(adjust_remove_grupo_parlamentar), |
|||
|
|||
migrations.RemoveField( |
|||
model_name='autor', |
|||
name='user', |
|||
), |
|||
|
|||
] |
@ -0,0 +1,19 @@ |
|||
# Generated by Django 2.2.13 on 2021-03-15 18:22 |
|||
|
|||
from django.conf import settings |
|||
from django.db import migrations, models |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('base', '0046_auto_20210314_1532'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.AlterField( |
|||
model_name='autor', |
|||
name='operadores', |
|||
field=models.ManyToManyField(related_name='autor_set', through='base.OperadorAutor', to=settings.AUTH_USER_MODEL, verbose_name='Operadores'), |
|||
), |
|||
] |
@ -0,0 +1,43 @@ |
|||
# Generated by Django 2.2.13 on 2021-03-15 18:22 |
|||
|
|||
from django.conf import settings |
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
|
|||
|
|||
def remove_grupo_votante_de_usuario(apps, schema_editor): |
|||
Group = apps.get_model('auth', 'Group') |
|||
User = apps.get_model('auth', 'User') |
|||
|
|||
g, created = Group.objects.get_or_create(name='Votante') |
|||
|
|||
# usuários do grupo votante sem vínculo com parlamentar |
|||
users_votantes = g.user_set.filter(votante_set__isnull=True) |
|||
for u in users_votantes: |
|||
u.groups.remove(g) |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('parlamentares', '0034_auto_20210303_1428'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.AlterField( |
|||
model_name='votante', |
|||
name='parlamentar', |
|||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, |
|||
related_name='votante_set', to='parlamentares.Parlamentar', verbose_name='Parlamentar'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='votante', |
|||
name='user', |
|||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, |
|||
related_name='votante_set', to=settings.AUTH_USER_MODEL, verbose_name='User'), |
|||
), |
|||
|
|||
migrations.RunPython(remove_grupo_votante_de_usuario), |
|||
|
|||
|
|||
] |
@ -1,14 +0,0 @@ |
|||
{% extends "crud/detail.html" %} |
|||
{% load i18n %} |
|||
{% load crispy_forms_tags staticfiles %} |
|||
|
|||
{% block sub_actions %} |
|||
<div class="actions btn-group btn-group-sm" role="group"> |
|||
<a href="{% url 'sapl.base:pesquisar_autor' %}" class="btn btn-outline-primary"> |
|||
{% blocktrans with verbose_name=view.verbose_name %} Pesquisar {{ verbose_name }} {% endblocktrans %} |
|||
</a> |
|||
<a href="{{ view.create_url }}" class="btn btn-outline-primary"> |
|||
{% blocktrans with verbose_name=view.verbose_name %} Adicionar {{ verbose_name }} {% endblocktrans %} |
|||
</a> |
|||
</div> |
|||
{% endblock sub_actions %} |
@ -1,51 +0,0 @@ |
|||
{% extends "crud/list.html" %} |
|||
{% load i18n %} |
|||
{% load crispy_forms_tags staticfiles %} |
|||
|
|||
{% block base_content %} |
|||
{% if not show_results %} |
|||
{% crispy filter.form %} |
|||
{% else %} |
|||
<div class="actions btn-group float-right btn-group-sm" role="group"> |
|||
<a href="{% url 'sapl.base:pesquisar_autor' %}" class="btn btn-outline-primary">{% trans 'Fazer nova pesquisa' %}</a> |
|||
{% if not request.user.is_anonymous %} |
|||
<a href="{% url 'sapl.base:autor_create' %}"class="btn btn-outline-primary">Cadastrar Autor</a> |
|||
{% endif %} |
|||
</div> |
|||
<br> |
|||
{% if numero_res > 0 %} |
|||
{% if numero_res == 1 %} |
|||
<p>Foi encontrado {{ numero_res }} resultado</p> |
|||
{% else %} |
|||
<p>Foram encontrados {{ numero_res }} resultados</p> |
|||
{% endif %} |
|||
<table class="table table-striped table-hover"> |
|||
<thead> |
|||
<tr> |
|||
<th>Tipo do Autor</th> |
|||
<th>Nome do Autor</th> |
|||
<th>Usuário</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
{% for autor in page_obj %} |
|||
<tr> |
|||
<td>{{ autor.tipo }}</td> |
|||
<td> |
|||
<a href="{% url 'sapl.base:autor_detail' autor.pk %}"> |
|||
{% if autor.nome %} {{ autor.nome }} {% else %} - {% endif %} |
|||
</a> |
|||
</td> |
|||
<td>{% if autor.user %} {{ autor.user }} {% else %} - {% endif %}</td> |
|||
</tr> |
|||
{% endfor %} |
|||
</tbody> |
|||
</table> |
|||
{% else %} |
|||
<font size="4"><p align="center">{{ NO_ENTRIES_MSG }}</p></font> |
|||
{% endif %} |
|||
{% endif %} |
|||
<br/> |
|||
{% include 'paginacao.html'%} |
|||
<br /><br /><br /> |
|||
{% endblock base_content %} |
@ -0,0 +1,34 @@ |
|||
{% load crispy_forms_filters common_tags %} |
|||
{% load l10n %} |
|||
|
|||
<div class="{% if inline_class %}form-check{% endif %}{% if field_class %} {{ field_class }}{% endif %}"{% if flat_attrs %} {{ flat_attrs|safe }}{% endif %}> |
|||
{% include 'bootstrap4/layout/field_errors_block.html' %} |
|||
|
|||
{% for choice in field.field.choices %} |
|||
{% if choice.2 %} |
|||
<div class="form-check"> |
|||
{% if choice.2|meta_model_value:'label' == 'auth.User' %} |
|||
<label class="form-check-label d-flex align-items-center py-2" id="id_{{ field.id_for_label }}_{{ forloop.counter }}" for="id_{{ field.html_name }}_{{ forloop.counter }}"> |
|||
|
|||
<input type="checkbox" class="form-check-input"{% if choice.0 in field.value or choice.0|stringformat:"s" in field.value or choice.0|stringformat:"s" == field.value|default_if_none:""|stringformat:"s" %} checked="checked"{% endif %} name="{{ field.html_name }}" id="id_{{ field.html_name }}_{{ forloop.counter }}" value="{{ choice.0|unlocalize }}" {{ field.field.widget.attrs|flatatt }}> |
|||
<div class="d-inline-block"> |
|||
{{choice.2.get_full_name}} |
|||
<i>({{choice.2}})</i><br> |
|||
<small>{{choice.2.email}}</small> |
|||
</div> |
|||
</label> |
|||
{% endif %} |
|||
|
|||
</div> |
|||
{% else %} |
|||
{% if not inline_class %}<div class="form-check">{% endif %} |
|||
<label id="id_{{ field.id_for_label }}_{{ forloop.counter }}" class="form-check-{% if inline_class %}{{ inline_class }}{% else %}label{% endif %}" for="id_{{ field.html_name }}_{{ forloop.counter }}"> |
|||
<input type="checkbox" class="form-check-input"{% if choice.0 in field.value or choice.0|stringformat:"s" in field.value or choice.0|stringformat:"s" == field.value|default_if_none:""|stringformat:"s" %} checked="checked"{% endif %} name="{{ field.html_name }}" id="id_{{ field.html_name }}_{{ forloop.counter }}" value="{{ choice.0|unlocalize }}" {{ field.field.widget.attrs|flatatt }}> |
|||
{{ choice.1|unlocalize }} |
|||
</label> |
|||
{% if not inline_class %}</div>{% endif %} |
|||
{% endif %} |
|||
{% endfor %} |
|||
|
|||
{% include 'bootstrap4/layout/help_text.html' %} |
|||
</div> |
Loading…
Reference in new issue