from crispy_forms.bootstrap import FieldWithButtons, FormActions, StrictButton from crispy_forms.helper import FormHelper from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset, Layout, Row) from django import forms from django.core.exceptions import NON_FIELD_ERRORS from django.forms.models import ModelForm from django.utils.translation import ugettext_lazy as _ from compilacao.models import (NOTAS_PUBLICIDADE_CHOICES, PARTICIPACAO_SOCIAL_CHOICES, Dispositivo, Nota, Publicacao, TextoArticulado, TipoNota, TipoPublicacao, TipoTextoArticulado, TipoVide, VeiculoPublicacao, Vide) from crispy_layout_mixin import SaplFormLayout, to_column, to_row from sapl.utils import YES_NO_CHOICES error_messages = { 'required': _('Este campo é obrigatório'), 'invalid': _('URL inválida.') } ta_error_messages = { 'required': _('Este campo é obrigatório'), } class TipoTaForm(ModelForm): sigla = forms.CharField( label=TipoTextoArticulado._meta.get_field( 'sigla').verbose_name) descricao = forms.CharField( label=TipoTextoArticulado._meta.get_field( 'descricao').verbose_name) participacao_social = forms.NullBooleanField( label=TipoTextoArticulado._meta.get_field( 'participacao_social').verbose_name, widget=forms.Select(choices=YES_NO_CHOICES), required=True) class Meta: model = TipoTextoArticulado fields = ['sigla', 'descricao', 'content_type', 'participacao_social', ] def __init__(self, *args, **kwargs): row1 = to_row([ ('sigla', 2), ('descricao', 4), ('content_type', 3), ('participacao_social', 3), ]) self.helper = FormHelper() self.helper.layout = SaplFormLayout( Fieldset(_('Identificação Básica'), row1, css_class="col-md-12")) super(TipoTaForm, self).__init__(*args, **kwargs) class TaForm(ModelForm): tipo_ta = forms.ModelChoiceField( label=TipoTextoArticulado._meta.verbose_name, queryset=TipoTextoArticulado.objects.all(), required=True, empty_label=None) numero = forms.IntegerField( label=TextoArticulado._meta.get_field( 'numero').verbose_name, required=True) ano = forms.IntegerField( label=TextoArticulado._meta.get_field( 'ano').verbose_name, required=True) data = forms.DateField( label=TextoArticulado._meta.get_field( 'data').verbose_name, input_formats=['%d/%m/%Y'], required=True, widget=forms.DateInput( format='%d/%m/%Y'), error_messages=ta_error_messages ) ementa = forms.CharField( label='', widget=forms.Textarea, error_messages=ta_error_messages) observacao = forms.CharField( label='', widget=forms.Textarea, error_messages=ta_error_messages, required=False) participacao_social = forms.NullBooleanField( label=TextoArticulado._meta.get_field( 'participacao_social').verbose_name, widget=forms.Select(choices=PARTICIPACAO_SOCIAL_CHOICES), required=False) class Meta: model = TextoArticulado fields = ['tipo_ta', 'numero', 'ano', 'data', 'ementa', 'observacao', 'participacao_social', ] def __init__(self, *args, **kwargs): row1 = to_row([ ('tipo_ta', 3), ('numero', 2), ('ano', 2), ('data', 2), ('participacao_social', 3), ]) self.helper = FormHelper() self.helper.layout = SaplFormLayout( Fieldset(_('Identificação Básica'), row1, css_class="col-md-12"), Fieldset( TextoArticulado._meta.get_field('ementa').verbose_name, Column('ementa'), css_class="col-md-12"), Fieldset( TextoArticulado._meta.get_field('observacao').verbose_name, Column('observacao'), css_class="col-md-12"), ) super(TaForm, self).__init__(*args, **kwargs) instance = getattr(self, 'instance', None) if instance and instance.pk: self.fields['tipo_ta'].widget.attrs['disabled'] = True self.fields['tipo_ta'].required = False def clean_tipo_ta(self): instance = getattr(self, 'instance', None) if instance and instance.pk: return instance.tipo_ta else: return self.cleaned_data['tipo_ta'] class NotaForm(ModelForm): titulo = forms.CharField( label=Nota._meta.get_field('titulo').verbose_name, required=False) texto = forms.CharField( label=Nota._meta.get_field('texto').verbose_name, widget=forms.Textarea, error_messages=error_messages) url_externa = forms.URLField( label=Nota._meta.get_field('url_externa').verbose_name, required=False, error_messages=error_messages) publicidade = forms.ChoiceField( required=True, label=Nota._meta.get_field('publicidade').verbose_name, choices=NOTAS_PUBLICIDADE_CHOICES, widget=forms.Select(attrs={'class': 'selector'})) tipo = forms.ModelChoiceField( label=Nota._meta.get_field('tipo').verbose_name, queryset=TipoNota.objects.all(), empty_label=None) publicacao = forms.DateField( label=Nota._meta.get_field('publicacao').verbose_name, input_formats=['%d/%m/%Y'], required=True, widget=forms.DateInput( format='%d/%m/%Y'), error_messages=error_messages ) efetividade = forms.DateField( label=Nota._meta.get_field('efetividade').verbose_name, input_formats=['%d/%m/%Y'], required=True, widget=forms.DateInput( format='%d/%m/%Y'), error_messages=error_messages) dispositivo = forms.ModelChoiceField(queryset=Dispositivo.objects.all(), widget=forms.HiddenInput()) pk = forms.IntegerField(widget=forms.HiddenInput(), required=False) class Meta: model = Nota fields = ['titulo', 'texto', 'url_externa', 'publicidade', 'publicacao', 'efetividade', 'tipo', 'dispositivo', 'pk' ] def __init__(self, *args, **kwargs): row1 = to_row([ ('tipo', 4), ]) row1.append( Column( Field( 'titulo', placeholder=_('Título da Nota (opcional)') ), css_class='col-md-8')) row3 = to_row([ ('publicidade', 6), ('publicacao', 3), ('efetividade', 3), ]) buttons = FormActions( HTML('' '%s' % _('Cancelar')), Button( 'submit-form', 'Salvar', css_class='btn btn-primary pull-right') ) self.helper = FormHelper() self.helper.layout = Layout( Div( Div(HTML(_('Notas')), css_class='panel-heading'), Div( row1, to_row([(Field( 'texto', placeholder=_('Adicionar Nota')), 12)]), to_row([(Field( 'url_externa', placeholder=_('URL Externa (opcional)')), 12)]), row3, to_row([(buttons, 12)]), css_class="panel-body" ), css_class="panel panel-primary" ) ) super(NotaForm, self).__init__(*args, **kwargs) class VideForm(ModelForm): dispositivo_base = forms.ModelChoiceField( queryset=Dispositivo.objects.all(), widget=forms.HiddenInput()) dispositivo_ref = forms.ModelChoiceField( queryset=Dispositivo.objects.all(), widget=forms.HiddenInput()) tipo_ta = forms.ModelChoiceField( label=_('Tipo do Texto Articulado'), queryset=TipoTextoArticulado.objects.all(), required=False) tipo_model = forms.ChoiceField( choices=[], label=_('Tipos de...'), required=False) num_ta = forms.IntegerField( label=_('Núm Texto Articulado'), required=False) ano_ta = forms.IntegerField( label=_('Ano Texto Articulado'), required=False) texto = forms.CharField( label='', widget=forms.Textarea, required=False) tipo = forms.ModelChoiceField( label=TipoVide._meta.verbose_name, queryset=TipoVide.objects.all(), required=True, error_messages=error_messages) busca_dispositivo = forms.CharField( label=_('Buscar Dispositivo a Referenciar'), required=False) pk = forms.IntegerField(widget=forms.HiddenInput(), required=False) class Meta: model = Vide fields = ['dispositivo_base', 'dispositivo_ref', 'texto', 'tipo', 'pk'] error_messages = { NON_FIELD_ERRORS: { 'unique_together': _("Ja existe um Vide deste tipo para o Dispositivo Referido "), } } def __init__(self, *args, **kwargs): buttons = FormActions( HTML('' '%s' % _('Cancelar')), Button( 'submit-form', 'Salvar', css_class='btn-primary pull-right') ) fields_form = Div( Row(to_column((Field( 'tipo', placeholder=_('Selecione um Tipo de Vide')), 12))), Row(to_column((Field( 'texto', placeholder=_('Texto Adicional ao Vide')), 12))), Row(to_column((buttons, 12)))) fields_search = Div( Row( to_column(('tipo_ta', 6)), to_column(('tipo_model', 6))), Row( to_column(('num_ta', 6)), to_column(('ano_ta', 6))), Row(to_column((FieldWithButtons( Field( 'busca_dispositivo', placeholder=_('Digite palavras, letras, ' 'números ou algo' ' que estejam ' 'no rótulo ou no texto.')), StrictButton("Buscar", css_class='btn-busca')), 12))), Row(to_column( (Div(css_class='container-busca'), 12))) ) self.helper = FormHelper() self.helper.layout = Layout( Div( Div(HTML(_('Vides')), css_class='panel-heading'), Div( to_column(( fields_form, 4)), to_column(( fields_search, 8)), css_class="panel-body" ), css_class="panel panel-primary" ) ) if 'choice_model_type_foreignkey_in_extenal_views' in kwargs: ch = kwargs.pop('choice_model_type_foreignkey_in_extenal_views') if 'data' in kwargs: choice = ch(kwargs['data']['tipo_ta']) self.base_fields['tipo_model'].choices = choice super(VideForm, self).__init__(*args, **kwargs) class PublicacaoForm(ModelForm): tipo_publicacao = forms.ModelChoiceField( label=TipoPublicacao._meta.verbose_name, queryset=TipoPublicacao.objects.all()) veiculo_publicacao = forms.ModelChoiceField( label=VeiculoPublicacao._meta.verbose_name, queryset=VeiculoPublicacao.objects.all()) url_externa = forms.CharField( label=Publicacao._meta.get_field('url_externa').verbose_name, required=False) data = forms.DateField( label=Publicacao._meta.get_field('data').verbose_name, input_formats=['%d/%m/%Y'], required=True, widget=forms.DateInput( format='%d/%m/%Y'), error_messages=error_messages ) hora = forms.TimeField( label=Publicacao._meta.get_field('hora').verbose_name, required=False, widget=forms.TextInput( attrs={'class': 'hora_hms'})) numero = forms.IntegerField( label=Publicacao._meta.get_field( 'numero').verbose_name, required=False) ano = forms.IntegerField( label=Publicacao._meta.get_field( 'ano').verbose_name) edicao = forms.IntegerField( label=Publicacao._meta.get_field( 'edicao').verbose_name, required=False) pagina_inicio = forms.IntegerField( label=Publicacao._meta.get_field( 'pagina_inicio').verbose_name, required=False) pagina_fim = forms.IntegerField( label=Publicacao._meta.get_field( 'pagina_fim').verbose_name, required=False) ta = forms.ModelChoiceField(queryset=TextoArticulado.objects.all(), widget=forms.HiddenInput()) class Meta: model = Publicacao fields = ['tipo_publicacao', 'veiculo_publicacao', 'url_externa', 'data', 'hora', 'numero', 'ano', 'edicao', 'pagina_inicio', 'pagina_fim', 'ta'] def __init__(self, *args, **kwargs): row1 = to_row([ ('tipo_publicacao', 4), ('veiculo_publicacao', 6), ('ano', 2), ]) row2 = to_row([ ('data', 4), ('hora', 4), ('numero', 2), ('edicao', 2), ]) row3 = to_row([ ('pagina_inicio', 2), ('pagina_fim', 2), ('url_externa', 8), ]) self.helper = FormHelper() self.helper.layout = SaplFormLayout( Fieldset(Publicacao._meta.verbose_name, row1, row2, row3, css_class="col-md-12")) super(PublicacaoForm, self).__init__(*args, **kwargs) pass class DispositivoForm(ModelForm): class Meta: model = Dispositivo fields = [] def __init__(self, *args, **kwargs): self.helper = FormHelper() """self.helper.layout = SaplFormLayout( Fieldset(Publicacao._meta.verbose_name, row1, row2, row3, css_class="col-md-12"))""" super(PublicacaoForm, self).__init__(*args, **kwargs)