Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dúvida referente a como adicionar um novo campo no cadastro de fornecedores #66

Closed
gustavlu opened this issue Jul 3, 2019 · 2 comments

Comments

@gustavlu
Copy link

gustavlu commented Jul 3, 2019

Estou como uma dúvida referente à adição de um campo de cadastro de vendedores dentro do cadastro de fornecedores que estou fazendo em meu fork, fiz ele baseado no campo de cadastro de veículos em transportadoras. O código de cadastro está funcionando normalmente, mas o que usa a view editar está com um erro referente ao ManagementForm, o código atualmente está e em seguida o erro. Sei que é muita coisa, mas se puder me ajudar serei grato, estou há quase um mês com essa dúvida e não estou conseguindo resolver:

Model

# -*- coding: utf-8 -*-

from django.db import models

from .base import Pessoa


class Fornecedor(Pessoa):

    class Meta:
        verbose_name = "Fornecedor"


class Vendedor(models.Model):
    fornecedor_vendedor = models.ForeignKey(
        'cadastro.Fornecedor', related_name="vendedor", on_delete=models.CASCADE)
    nome = models.CharField(max_length=255, blank=True, null=True)
    telefone = models.CharField(max_length=255, blank=True, null=True)
    email = models.CharField(max_length=255, blank=True, null=True)

    def __unicode__(self):
        return u'%s / %s / %s' % (self.nome, self.telefone, self.email)

    def __str__(self):
        return u'%s / %s / %s' % (self.nome, self.telefone, self.email)

    def get_telefone_apenas_digitos(self):
        return self.telefone.replace('(', '').replace(' ', '').replace(')', '').replace('-', '')

View Fornecedor

# -*- coding: utf-8 -*-

from django.urls import reverse_lazy

from masterpy.apps.cadastro.forms import FornecedorForm
from masterpy.apps.cadastro.forms.fornecedor import VendedorFormSet
from masterpy.apps.cadastro.models import Fornecedor, Vendedor

from .base import AdicionarPessoaView, PessoasListView, EditarPessoaView


class AdicionarFornecedorView(AdicionarPessoaView):
    template_name = "cadastro/pessoa_add.html"
    success_url = reverse_lazy('cadastro:listafornecedoresview')
    success_message = "Fornecedor <b>%(nome_razao_social)s </b>adicionado com sucesso."
    permission_codename = 'add_fornecedor'

    def get_context_data(self, **kwargs):
        context = super(AdicionarFornecedorView,
                        self).get_context_data(**kwargs)
        context['title_complete'] = 'CADASTRAR FORNECEDOR'
        context['return_url'] = reverse_lazy('cadastro:listafornecedoresview')
        context['tipo_pessoa'] = 'fornecedor'
        return context

    def get(self, request, *args, **kwargs):
        form = FornecedorForm(prefix='fornecedor_form')
        vendedor_form = VendedorFormSet(prefix='vendedor_form')
        vendedor_form.can_delete = False
        return super(AdicionarFornecedorView, self).get(
            request, form, vendedor_form=vendedor_form, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        form = FornecedorForm(request.POST, request.FILES, prefix='fornecedor_form', request=request)
        vendedor_form = VendedorFormSet(request.POST, prefix='vendedor_form')
        return super(AdicionarFornecedorView, self).post(
            request, form, vendedor_form=vendedor_form, *args, **kwargs)


class FornecedoresListView(PessoasListView):
    template_name = 'cadastro/pessoa_list.html'
    model = Fornecedor
    context_object_name = 'all_fornecedores'
    success_url = reverse_lazy('cadastro:listafornecedoresview')
    permission_codename = 'view_fornecedor'

    def get_context_data(self, **kwargs):
        context = super(FornecedoresListView, self).get_context_data(**kwargs)
        context['title_complete'] = 'FORNECEDORES CADASTRADOS'
        context['add_url'] = reverse_lazy('cadastro:addfornecedorview')
        context['tipo_pessoa'] = 'fornecedor'
        return context


class EditarFornecedorView(EditarPessoaView):
    form_class = FornecedorForm
    model = Fornecedor
    template_name = "cadastro/pessoa_edit.html"
    success_url = reverse_lazy('cadastro:listafornecedoresview')
    success_message = "Fornecedor <b>%(nome_razao_social)s </b>editado com sucesso."
    permission_codename = 'change_fornecedor'

    def get_context_data(self, **kwargs):
        context = super(EditarFornecedorView, self).get_context_data(**kwargs)
        context['return_url'] = reverse_lazy('cadastro:listafornecedoresview')
        context['tipo_pessoa'] = 'fornecedor'
        return context

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.get_form_class()
        form_class.prefix = "fornecedor_form"
        form = self.get_form(form_class)

        vendedor_form = VendedorFormSet(
            instance=self.object, prefix='veiculo_form')
        if Vendedor.objects.filter(
                fornecedor_vendedor=self.object.pk).count():
            vendedor_form.extra = 0

        return super(
            EditarFornecedorView, self).get(
            request, form, vendedor_form=vendedor_form, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.get_form_class()
        form = form_class(request.POST, request.FILES,
                          prefix='fornecedor_form',
                          instance=self.object, request=request)

        vendedor_form = VendedorFormSet(
            request.POST, prefix='vendedor_form', instance=self.object)

        return super(EditarFornecedorView, self).post(
            request, form, vendedor_form=vendedor_form, *args, **kwargs)

View Base

# -*- coding: utf-8 -*-

from masterpy.apps.base.custom_views import CustomCreateView, CustomListView, CustomUpdateView

from masterpy.apps.cadastro.forms import PessoaJuridicaForm, PessoaFisicaForm, EnderecoFormSet, TelefoneFormSet, EmailFormSet, \
    SiteFormSet, BancoFormSet, DocumentoFormSet
from masterpy.apps.cadastro.models import PessoaFisica, PessoaJuridica, Endereco, Telefone, Email, Site, Banco, Documento


class AdicionarPessoaView(CustomCreateView):

    def get_success_message(self, cleaned_data):
        return self.success_message % dict(cleaned_data, nome_razao_social=self.object.nome_razao_social)

    def get(self, request, form, *args, **kwargs):
        self.object = None

        veiculo_form = kwargs.pop('veiculo_form', None)

        vendedor_form = kwargs.pop('vendedor_form', None)

        pessoa_juridica_form = PessoaJuridicaForm(prefix='pessoa_jur_form')
        pessoa_fisica_form = PessoaFisicaForm(prefix='pessoa_fis_form')

        endereco_form = EnderecoFormSet(prefix='endereco_form')
        endereco_form.can_delete = False

        banco_form = BancoFormSet(prefix='banco_form')
        banco_form.can_delete = False

        documento_form = DocumentoFormSet(prefix='documento_form')
        documento_form.can_delete = False

        telefone_form = TelefoneFormSet(prefix='telefone_form')
        email_form = EmailFormSet(prefix='email_form')
        site_form = SiteFormSet(prefix='site_form')

        formsets = [telefone_form, email_form, site_form]
        for formset in formsets:
            formset.can_delete = False

        return self.render_to_response(self.get_context_data(form=form,
                                                             pessoa_juridica_form=pessoa_juridica_form,
                                                             pessoa_fisica_form=pessoa_fisica_form,
                                                             endereco_form=endereco_form,
                                                             banco_form=banco_form,
                                                             documento_form=documento_form,
                                                             formsets=formsets,
                                                             vendedor_form=vendedor_form,
                                                             veiculo_form=veiculo_form))

    def post(self, request, form, *args, **kwargs):
        self.object = None
        extra_forms = []

        veiculo_form = kwargs.pop('veiculo_form', None)

        vendedor_form = kwargs.pop('vendedor_form', None)

        endereco_form = EnderecoFormSet(request.POST, prefix='endereco_form')
        banco_form = BancoFormSet(request.POST, prefix='banco_form')
        documento_form = DocumentoFormSet(
            request.POST, prefix='documento_form')

        telefone_form = TelefoneFormSet(request.POST, prefix='telefone_form')
        email_form = EmailFormSet(request.POST, prefix='email_form')
        site_form = SiteFormSet(request.POST, prefix='site_form')

        formsets = [telefone_form, email_form, site_form]

        if veiculo_form:
            extra_forms = [veiculo_form, ]

        if vendedor_form:
            extra_forms = [vendedor_form, ]

        if form.is_valid():

            self.object = form.save(commit=False)
            if self.object.tipo_pessoa == 'PJ':
                pessoa_form = PessoaJuridicaForm(
                    request.POST, prefix='pessoa_jur_form')
            else:
                pessoa_form = PessoaFisicaForm(
                    request.POST, prefix='pessoa_fis_form')

            if (all(formset.is_valid() for formset in formsets) and
                pessoa_form.is_valid() and
                endereco_form.is_valid() and
                banco_form.is_valid() and
                documento_form.is_valid() and
                    all(extra_form.is_valid() for extra_form in extra_forms)):

                self.object.save()

                # Salvar informacoes endereco
                endereco_form.instance = self.object
                end = endereco_form.save()
                if len(end):
                    self.object.endereco_padrao = end[0]

                # Salvar informacoes bancarias
                banco_form.instance = self.object
                ban = banco_form.save()
                if len(ban):
                    self.object.banco_padrao = ban[0]

                # Salvar documentos adicionais
                documento_form.instance = self.object
                documento_form.save()

                # salvar telefone
                telefone_form.instance = self.object
                tel = telefone_form.save()
                if len(tel):
                    self.object.telefone_padrao = tel[0]

                # salvar email
                email_form.instance = self.object
                ema = email_form.save()
                if len(ema):
                    self.object.email_padrao = ema[0]

                # salvar site
                site_form.instance = self.object
                sit = site_form.save()
                if len(sit):
                    self.object.site_padrao = sit[0]

                if veiculo_form:
                    veiculo_form.instance = self.object
                    veiculo_form.save()

                if vendedor_form:
                    vendedor_form.instance = self.object
                    vendedor_form.save()

                # salvar objeto criado e pessoa fisica/juridica
                self.object.save()
                pessoa_form.instance.pessoa_id = self.object
                pessoa_form.save()

                return self.form_valid(form)

        pessoa_juridica_form = PessoaJuridicaForm(
            request.POST, prefix='pessoa_jur_form')
        pessoa_fisica_form = PessoaFisicaForm(
            request.POST, prefix='pessoa_fis_form')

        return self.form_invalid(form=form,
                                 pessoa_juridica_form=pessoa_juridica_form,
                                 pessoa_fisica_form=pessoa_fisica_form,
                                 endereco_form=endereco_form,
                                 banco_form=banco_form,
                                 documento_form=documento_form,
                                 formsets=formsets,
                                 vendedor_form=vendedor_form,
                                 veiculo_form=veiculo_form)


class PessoasListView(CustomListView):

    def __init__(self, *args, **kwargs):
        super(PessoasListView, self).__init__(*args, **kwargs)


class EditarPessoaView(CustomUpdateView):

    def get_success_message(self, cleaned_data):
        return self.success_message % dict(cleaned_data, nome_razao_social=self.object.nome_razao_social)

    def get(self, request, form, *args, **kwargs):
        if self.object.tipo_pessoa == 'PJ':
            pessoa_juridica_form = PessoaJuridicaForm(
                instance=self.object, prefix='pessoa_jur_form')
            pessoa_fisica_form = PessoaFisicaForm(prefix='pessoa_fis_form')
        else:
            pessoa_juridica_form = PessoaJuridicaForm(prefix='pessoa_jur_form')
            pessoa_fisica_form = PessoaFisicaForm(
                instance=self.object, prefix='pessoa_fis_form')


        endereco_form = EnderecoFormSet(
            instance=self.object, prefix='endereco_form')
        banco_form = BancoFormSet(instance=self.object, prefix='banco_form')
        documento_form = DocumentoFormSet(
            instance=self.object, prefix='documento_form')

        telefone_form = TelefoneFormSet(
            instance=self.object, prefix='telefone_form')
        email_form = EmailFormSet(instance=self.object, prefix='email_form')
        site_form = SiteFormSet(instance=self.object, prefix='site_form')

        if Telefone.objects.filter(pessoa_tel=self.object.pk).count():
            telefone_form.extra = 0
        if Endereco.objects.filter(pessoa_end=self.object.pk).count():
            endereco_form.extra = 0
        if Email.objects.filter(pessoa_email=self.object.pk).count():
            email_form.extra = 0
        if Site.objects.filter(pessoa_site=self.object.pk).count():
            site_form.extra = 0
        if Banco.objects.filter(pessoa_banco=self.object.pk).count():
            banco_form.extra = 0
        if Documento.objects.filter(pessoa_documento=self.object.pk).count():
            documento_form.extra = 0

        formsets = [telefone_form, email_form, site_form]

        # Caso Empresa
        logo_file = kwargs.pop('logo_file', None)
        # Caso Transportadora
        veiculo_form = kwargs.pop('veiculo_form', None)
        # Caso Fornecedor
        vendedor_form = kwargs.pop('vendedor_form', None)

        return self.render_to_response(self.get_context_data(form=form,
                                                             pessoa_juridica_form=pessoa_juridica_form,
                                                             pessoa_fisica_form=pessoa_fisica_form,
                                                             endereco_form=endereco_form,
                                                             banco_form=banco_form,
                                                             documento_form=documento_form,
                                                             formsets=formsets,
                                                             logo_file=logo_file,
                                                             vendedor_form=vendedor_form,
                                                             veiculo_form=veiculo_form,
                                                             object=self.object))

    def post(self, request, form, *args, **kwargs):
        self.object = self.get_object()
        extra_forms = []
        veiculo_form = kwargs.pop('veiculo_form', None)

        vendedor_form = kwargs.pop('vendedor_form', None)

        endereco_form = EnderecoFormSet(
            request.POST, prefix='endereco_form', instance=self.object)
        banco_form = BancoFormSet(
            request.POST, prefix='banco_form', instance=self.object)
        documento_form = DocumentoFormSet(
            request.POST, prefix='documento_form', instance=self.object)

        telefone_form = TelefoneFormSet(
            request.POST, prefix='telefone_form', instance=self.object)
        email_form = EmailFormSet(
            request.POST, prefix='email_form', instance=self.object)
        site_form = SiteFormSet(
            request.POST, prefix='site_form', instance=self.object)

        formsets = [telefone_form, email_form, site_form]

        if veiculo_form:
            extra_forms = [veiculo_form, ]

        if vendedor_form:
            extra_forms_vendedor = [vendedor_form, ]

        if form.is_valid():
            self.object = form.save(commit=False)
            if self.object.tipo_pessoa == 'PJ':
                pessoa_form = PessoaJuridicaForm(
                    request.POST, prefix='pessoa_jur_form')
            else:
                pessoa_form = PessoaFisicaForm(
                    request.POST, prefix='pessoa_fis_form')

            if (all(formset.is_valid() for formset in formsets) and
                pessoa_form.is_valid() and
                endereco_form.is_valid() and
                banco_form.is_valid() and
                documento_form.is_valid() and
                    all(extra_forms_vendedor.is_valid() for extra_forms_vendedor in extra_forms_vendedor) and
                    all(extra_form.is_valid() for extra_form in extra_forms)):

                self.object = form.save(commit=False)
                self.object.save()

                if self.object.tipo_pessoa == 'PJ':
                    # Remover pessoa fisica da DB se existir
                    PessoaFisica.objects.filter(
                        pessoa_id=self.object.pk).delete()
                else:
                    # Remover pessoa juridica da DB se existir
                    PessoaJuridica.objects.filter(
                        pessoa_id=self.object.pk).delete()

                # Salvar informacoes endereco
                endereco_form.instance = self.object
                end = endereco_form.save()
                if len(end):
                    self.object.endereco_padrao = end[0]

                # Salvar informacoes bancarias
                banco_form.instance = self.object
                ban = banco_form.save()
                if len(ban):
                    self.object.banco_padrao = ban[0]

                # Salvar documentos adicionais
                documento_form.instance = self.object
                documento_form.save()

                # Salvar telefone
                telefone_form.instance = self.object
                tel = telefone_form.save()
                if len(tel):
                    self.object.telefone_padrao = tel[0]

                # Salvar email
                email_form.instance = self.object
                ema = email_form.save()
                if len(ema):
                    self.object.email_padrao = ema[0]

                # Salvar site
                site_form.instance = self.object
                sit = site_form.save()
                if len(sit):
                    self.object.site_padrao = sit[0]

                if veiculo_form:
                    veiculo_form.instance = self.object
                    veiculo_form.save()

                if vendedor_form:
                    vendedor_form.instance = self.object
                    vendedor_form.save()

                # salvar objeto criado e pessoa fisica/juridica
                self.object.save()
                pessoa_form.instance.pessoa_id = self.object
                pessoa_form.save()

                return self.form_valid(form)

        logo_file = kwargs.pop('logo_file', None)

        if self.object.tipo_pessoa == 'PJ':
            pessoa_juridica_form = PessoaJuridicaForm(
                request.POST, prefix='pessoa_jur_form', instance=self.object)
            pessoa_fisica_form = PessoaFisicaForm(
                request.POST, prefix='pessoa_fis_form')
        else:
            pessoa_juridica_form = PessoaJuridicaForm(
                request.POST, prefix='pessoa_jur_form')
            pessoa_fisica_form = PessoaFisicaForm(
                request.POST, prefix='pessoa_fis_form', instance=self.object)

        return self.form_invalid(form=form,
                                 pessoa_juridica_form=pessoa_juridica_form,
                                 pessoa_fisica_form=pessoa_fisica_form,
                                 endereco_form=endereco_form,
                                 banco_form=banco_form,
                                 documento_form=documento_form,
                                 formsets=formsets,
                                 vendedor_form=vendedor_form,
                                 veiculo_form=veiculo_form,
                                 logo_file=logo_file)

Erro

Environment:

Request Method: POST
Request URL: http://127.0.0.1:8000/cadastro/fornecedor/editar/3/

Django Version: 2.2.2
Python Version: 3.5.3
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'masterpy.apps.base',
'masterpy.apps.login',
'masterpy.apps.cadastro',
'masterpy.apps.vendas',
'masterpy.apps.compras',
'masterpy.apps.fiscal',
'masterpy.apps.financeiro',
'masterpy.apps.estoque']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'masterpy.middleware.LoginRequiredMiddleware']

Traceback:

File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)

File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)

File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/views/generic/base.py" in view
71. return self.dispatch(request, *args, **kwargs)

File "/home/lgustav/PycharmProjects/masterpy/masterpy/apps/base/views_mixins.py" in dispatch
34. return super(CheckPermissionMixin, self).dispatch(request, *args, **kwargs)

File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/views/generic/base.py" in dispatch
97. return handler(request, *args, **kwargs)

File "/home/lgustav/PycharmProjects/masterpy/masterpy/apps/cadastro/views/fornecedor.py" in post
96. request, form, vendedor_form=vendedor_form, *args, **kwargs)

File "/home/lgustav/PycharmProjects/masterpy/masterpy/apps/cadastro/views/base.py" in post
271. all(extra_forms_vendedor.is_valid() for extra_forms_vendedor in extra_forms_vendedor) and

File "/home/lgustav/PycharmProjects/masterpy/masterpy/apps/cadastro/views/base.py" in
271. all(extra_forms_vendedor.is_valid() for extra_forms_vendedor in extra_forms_vendedor) and

File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/forms/formsets.py" in is_valid
301. self.errors

File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/forms/formsets.py" in errors
281. self.full_clean()

File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/forms/formsets.py" in full_clean
322. for i in range(0, self.total_form_count()):

File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/forms/formsets.py" in total_form_count
110. return min(self.management_form.cleaned_data[TOTAL_FORM_COUNT], self.absolute_max)

File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/utils/functional.py" in get
80. res = instance.dict[self.name] = self.func(instance)

File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/forms/formsets.py" in management_form
92. code='missing_management_form',

Exception Type: ValidationError at /cadastro/fornecedor/editar/3/
Exception Value: ['Os dados do ManagementForm não foram encontrados ou foram adulterados']

@gustavlu
Copy link
Author

resolvido, bastou remover None na linha 233 de:

vendedor_form = kwargs.pop('vendedor_form')

no método post de EditarPessoaView no arquivo base

@thiagopena
Copy link
Owner

obrigado @gustavlu !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants