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