diff --git a/sapl/audiencia/forms.py b/sapl/audiencia/forms.py new file mode 100644 index 000000000..3cd9e9fdb --- /dev/null +++ b/sapl/audiencia/forms.py @@ -0,0 +1,28 @@ +from django import forms +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError +from django.db import transaction +from django.db.models import Q +from django.utils.translation import ugettext_lazy as _ +from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica + +class AudienciaForm(forms.ModelForm): + + class Meta: + model = AudienciaPublica + fields = '__all__' + + def clean(self): + super(AudienciaForm, self).clean() + if self.cleaned_data['hora_inicio'] and self.cleaned_data['hora_fim']: + if (self.cleaned_data['hora_fim'] < + self.cleaned_data['hora_inicio']): + msg = _('A hora de fim não pode ser anterior a hora de ínicio') + raise ValidationError(msg) + + return self.cleaned_data + + @transaction.atomic() + def save(self, commit=True): + audiencia = super(AudienciaForm, self).save(commit) + return audiencia \ No newline at end of file diff --git a/sapl/audiencia/migrations/0001_initial.py b/sapl/audiencia/migrations/0001_initial.py new file mode 100644 index 000000000..0e7bc7800 --- /dev/null +++ b/sapl/audiencia/migrations/0001_initial.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2018-03-01 17:01 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import sapl.audiencia.models +import sapl.utils + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('materia', '0025_auto_20180221_1649'), + ] + + operations = [ + migrations.CreateModel( + name='AudienciaPublica', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('numero', models.PositiveIntegerField(blank=True, verbose_name='Número')), + ('nome', models.CharField(max_length=100, verbose_name='Nome da Audiência Pública')), + ('tema', models.CharField(max_length=100, verbose_name='Tema da Audiência Pública')), + ('data', models.DateField(verbose_name='Data')), + ('hora_inicio', models.CharField(max_length=5, verbose_name='Horário (hh:mm)')), + ('hora_fim', models.CharField(max_length=5, verbose_name='Horário (hh:mm)')), + ('observacao', models.CharField(blank=True, max_length=200, verbose_name='Observação')), + ('audiencia_cancelada', models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Audiência Cancela?')), + ('url_audio', models.URLField(blank=True, max_length=150, verbose_name='URL Arquivo Áudio (Formatos MP3 / AAC)')), + ('url_video', models.URLField(blank=True, max_length=150, verbose_name='URL Arquivo Vídeo (Formatos MP4 / FLV / WebM)')), + ('upload_pauta', models.FileField(blank=True, null=True, upload_to=sapl.audiencia.models.pauta_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Pauta da Audiência Pública')), + ('upload_ata', models.FileField(blank=True, null=True, upload_to=sapl.audiencia.models.ata_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Ata da Audiência Pública')), + ('upload_anexo', models.FileField(blank=True, null=True, upload_to=sapl.audiencia.models.anexo_upload_path, verbose_name='Anexo da Audiência Pública')), + ('materia', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.MateriaLegislativa', verbose_name='Matéria Legislativa')), + ], + options={ + 'verbose_name': 'Audiência Pública', + 'verbose_name_plural': 'Audiências Públicas', + 'ordering': ['nome', 'numero', 'tipo'], + }, + ), + migrations.CreateModel( + name='TipoAudienciaPublica', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nome', models.CharField(choices=[('A', 'Audiência Pública'), ('P', 'Plebiscito'), ('R', 'Referendo'), ('I', 'Iniciativa Popular')], max_length=1, verbose_name='Tipo de Audiência Pública')), + ], + options={ + 'verbose_name': 'Tipo de Audiência Pública', + 'verbose_name_plural': 'Tipos de Audiência Pública', + 'ordering': ['nome'], + }, + ), + migrations.AddField( + model_name='audienciapublica', + name='tipo', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='audiencia.TipoAudienciaPublica', verbose_name='Tipo'), + ), + ] diff --git a/sapl/audiencia/models.py b/sapl/audiencia/models.py index 41b823e5b..2d03c443e 100644 --- a/sapl/audiencia/models.py +++ b/sapl/audiencia/models.py @@ -9,6 +9,24 @@ from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation, restringe_tipos_de_arquivo_txt, texto_upload_path) +def get_audiencia_media_path(instance, subpath, filename): + return './sapl/audiencia/%s/%s/%s' % (instance.numero, subpath, filename) + + +def pauta_upload_path(instance, filename): + return texto_upload_path( + instance, filename, subpath='pauta', pk_first=True) + + +def ata_upload_path(instance, filename): + return texto_upload_path(instance, filename, subpath='ata', pk_first=True) + + +def anexo_upload_path(instance, filename): + return texto_upload_path( + instance, filename, subpath='anexo', pk_first=True) + + @reversion.register() class TipoAudienciaPublica(models.Model): TIPO_AUDIENCIA_CHOICES = Choices(('A', 'audiencia', _('Audiência Pública')), @@ -84,7 +102,7 @@ class AudienciaPublica(models.Model): ordering = ['nome', 'numero', 'tipo'] def __str__(self): - return self.nome + return self.nome + '-' + self.numero def delete(self, using=None, keep_parents=False): if self.upload_pauta: @@ -122,22 +140,4 @@ class AudienciaPublica(models.Model): return models.Model.save(self, force_insert=force_insert, force_update=force_update, using=using, - update_fields=update_fields) - - -def get_audiencia_media_path(instance, subpath, filename): - return './sapl/audiencia/%s/%s/%s' % (instance.numero, subpath, filename) - - -def pauta_upload_path(instance, filename): - return texto_upload_path( - instance, filename, subpath='pauta', pk_first=True) - - -def ata_upload_path(instance, filename): - return texto_upload_path(instance, filename, subpath='ata', pk_first=True) - - -def anexo_upload_path(instance, filename): - return texto_upload_path( - instance, filename, subpath='anexo', pk_first=True) + update_fields=update_fields) \ No newline at end of file diff --git a/sapl/audiencia/urls.py b/sapl/audiencia/urls.py index 0131fb4f3..ece3bf1fb 100644 --- a/sapl/audiencia/urls.py +++ b/sapl/audiencia/urls.py @@ -1,10 +1,10 @@ from django.conf.urls import include, url -from sapl.audiencia.views import (index) +from sapl.audiencia.views import (index, AudienciaCrud) from .apps import AppConfig app_name = AppConfig.name urlpatterns = [ - url(r'^audiencia/', index, name='index'), + url(r'^audiencia/', include(AudienciaCrud.get_urls())), ] \ No newline at end of file diff --git a/sapl/audiencia/views.py b/sapl/audiencia/views.py index cc17d0823..f85800cea 100644 --- a/sapl/audiencia/views.py +++ b/sapl/audiencia/views.py @@ -1,5 +1,31 @@ from django.shortcuts import render from django.http import HttpResponse +from django.core.urlresolvers import reverse +from django.db.models import F +from django.views.generic import ListView +from sapl.comissoes.forms import ParticipacaoCreateForm, ParticipacaoEditForm +from sapl.crud.base import RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud +from sapl.materia.models import MateriaLegislativa + +from .forms import AudienciaForm +from .models import (AudienciaPublica, TipoAudienciaPublica) def index(request): - return HttpResponse("Audiência Pública") \ No newline at end of file + return HttpResponse("Audiência Pública") + +class AudienciaCrud(Crud): + model = AudienciaPublica + public = [RP_LIST, RP_DETAIL, ] + + class BaseMixin(Crud.BaseMixin): + list_field_names = ['materia', 'tipo', 'numero', 'nome', 'tema', + 'data', 'hora_inicio', 'hora_fim', 'observacao', + 'url_audio', 'url_video', 'upload_pauta', + 'upload_ata'] + ordering = 'nome', 'numero', 'tipo', 'data' + + class CreateView(Crud.CreateView): + form_class = AudienciaForm + + def form_valid(self, form): + return super(Crud.CreateView, self).form_valid(form) \ No newline at end of file