from django.contrib import admin
from .models import *
from bson import ObjectId
from django.forms import ModelForm, PasswordInput, SelectMultiple
from django.shortcuts import redirect


from django.contrib.auth.models import User

class CustomModelAdmin(admin.ModelAdmin):
    
    def get_user_permissions(self, user):
        if user.is_superuser:
            return set()  # Allow all permissions for superusers

        user_permissions = set()
        # for nivel in user.nivel.all():
        #     for permission in nivel.permissions:
        #         user_permissions.add((permission['app_label'], permission['codename']))
        # for group in user.groups.all():
        #     for permission in group.permissions:
        #         user_permissions.add((permission['app_label'], permission['codename']))
        # return the permissions from django standard user model
        for permission in user.user_permissions.all():
            user_permissions.add((permission.content_type.app_label, permission.codename))
        
        return user_permissions

    def has_view_permission(self, request, obj=None):
        required_permission = self.get_required_permission('view', self.model)
        return self.check_permission(request.user, required_permission)

    def has_add_permission(self, request):
        required_permission = self.get_required_permission('add', self.model)
        return self.check_permission(request.user, required_permission)

    def has_change_permission(self, request, obj=None):
        required_permission = self.get_required_permission('change', self.model)
        return self.check_permission(request.user, required_permission)

    def has_delete_permission(self, request, obj=None):
        required_permission = self.get_required_permission('delete', self.model)
        return self.check_permission(request.user, required_permission)
    
    def get_required_permission(self, action, model):
        model_name = model._meta.model_name
        return f"{action}_{model_name}"

    def check_permission(self, user, required_permission):
        if user.is_superuser:
            return True  # Allow access for superusers
        
        
        user_permissions = self.get_user_permissions(user)
        app_label = self.model._meta.app_label
        
        
        # Restrict access to the 'panel' app only
        #if app_label != 'panel':
         #   return False
        
        return (app_label, required_permission) in user_permissions
    
    def is_panel_app(self):
        return self.model._meta.app_label == 'panel'



# class UsuarioAdminForm(ModelForm):
#     class Meta:	
#         model = Usuario
#         fields = '__all__'
#         widgets = {
#             'password': PasswordInput(),
#         }

# @admin.register(Usuario)
# class UsuarioAdmin(admin.ModelAdmin):
#     form = UsuarioAdminForm


#     def get_form(self, request, obj,  **kwargs):
#         if request.POST:
#             # remember old state
#             _mutable = request.POST._mutable
#             # set to mutable
#             request.POST._mutable = True
#             # сhange the values you want
#             if 'nivel' in request.POST:
#                 request.POST['nivel'] = ObjectId(request.POST['nivel'])
#             # set mutable flag back
#             request.POST._mutable = _mutable
#         return super().get_form(request, obj=obj,  **kwargs)
# #admin.site.register(Usuario, UsuarioAdmin)

# from .forms import NivelForm
# @admin.register(Nivel)
# class NivelAdmin(CustomModelAdmin):
#     form = NivelForm

#dmin.site.register(Nivel, NivelAdmin)

# class NivelAdminForm(ModelForm):
#     class Meta:
#         model = Nivel
#         fields = '__all__'
#         widgets = {
#             'permissions': SelectMultiple(),
#         }
# class NivelAdmin(admin.ModelAdmin):
#     form = NivelAdminForm
# admin.site.register(Nivel, NivelAdmin)

# from panel.forms import FavoritoAdminForm, ContatoClienteAdminForm

# @admin.register(Favorito)
# class FavoritoAdmin(admin.ModelAdmin):
#     form = FavoritoAdminForm


# @admin.register(ContatoCliente)
# class ContatoClienteAdmin(admin.ModelAdmin):
#     form = ContatoClienteAdminForm


# @admin.register(Favorito)
# class FavoritoAdmin(admin.ModelAdmin):

#     def get_form(self, request, obj=None, **kwargs):
#         if request.POST:
#             _mutable = request.POST._mutable
#             request.POST._mutable = True
            
#             if 'cliente' in request.POST and request.POST['cliente']:
#                 try:
#                     request.POST['cliente'] = str(ObjectId(request.POST['cliente']))
#                 except Exception as e:
#                     self.message_user(request, f"Error converting cliente to ObjectId: {e}", level='error')
            
#             if 'tipo_imovel' in request.POST and request.POST['tipo_imovel']:
#                 request.POST['tipo_imovel'] = int(request.POST['tipo_imovel'])
            
#             if 'imovel' in request.POST and request.POST['imovel']:
#                 request.POST['imovel'] = int(request.POST['imovel'])
            
#             request.POST._mutable = _mutable
        
#         return super().get_form(request, obj=obj, **kwargs)



@admin.register(Favorito)
class FavoritoAdmin(admin.ModelAdmin):
    
    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            if 'tipo_imovel' in request.POST:
                request.POST['tipo_imovel'] = int(request.POST['tipo_imovel'])
            if 'imovel' in request.POST:
                request.POST['imovel'] = int(request.POST['imovel'])
            if 'cliente' in request.POST:
                request.POST['cliente'] = ObjectId(request.POST['cliente'])
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)


@admin.register(ContatoCliente)
class ContatoClienteAdmin(admin.ModelAdmin):
    
    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            if 'tipo_imovel' in request.POST:
                request.POST['tipo_imovel'] = int(request.POST['tipo_imovel'])
            if 'imovel' in request.POST:
                request.POST['imovel'] = int(request.POST['imovel'])
            if 'cliente' in request.POST:
                request.POST['cliente'] = ObjectId(request.POST['cliente'])
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)



@admin.register(Categoria)
class CategoriaAdmin(CustomModelAdmin):
    pass

@admin.register(Post)
class PostAdmin(CustomModelAdmin):
    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            # if 'categorias' in request.POST:
            #     request.POST['categorias'] = ObjectId(request.POST['categorias'])
            if 'autor' in request.POST:
                request.POST['autor'] = ObjectId(request.POST['autor'])
            # Process 'categorias' field
            categorias = request.POST.getlist('categorias')
            request.POST.setlist('categorias', [ObjectId(categoria) for categoria in categorias])
            
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)

@admin.register(BannerMosaico)
class BannerMosaicoAdmin(CustomModelAdmin):
    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            # if 'posts' in request.POST:
            #     request.POST['posts'] = ObjectId(request.POST['posts'])
            # Process 'imoveis_exclusivos' field
            posts = request.POST.getlist('posts')
            request.POST.setlist('posts', [ObjectId(post) for post in posts])
            
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)

@admin.register(Simulacao)
class SimulacaoAdmin(CustomModelAdmin):
    pass

@admin.register(Assunto)
class AssuntoAdmin(CustomModelAdmin):
    pass

@admin.register(Contato)
class ContatoAdmin(CustomModelAdmin):
    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            #print(request.POST)
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            if 'assunto' in request.POST:
                request.POST['assunto'] = ObjectId(request.POST['assunto'])
            
            # set mutable flag back
            request.POST._mutable = _mutable
            #print(f"request.POST: {request.POST}")
        return super().get_form(request, obj=obj,  **kwargs)

@admin.register(Imprensa)
class ImprensaAdmin(CustomModelAdmin):
    pass

@admin.register(AssuntoOuvidoria)
class AssuntoOuvidoriaAdmin(CustomModelAdmin):
    pass

@admin.register(Ouvidoria)
class OuvidoriaAdmin(CustomModelAdmin):
    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            if 'assunto' in request.POST:
                request.POST['assunto'] = ObjectId(request.POST['assunto'])
            
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)

@admin.register(GrupoPerguntaFrequente)
class GrupoPerguntaFrequenteAdmin(CustomModelAdmin):
    pass

@admin.register(PerguntaFrequente)
class PerguntaFrequenteAdmin(CustomModelAdmin):
    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            if 'grupo' in request.POST:
                request.POST['grupo'] = ObjectId(request.POST['grupo'])
            
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)

@admin.register(PorqueRemax)
class PorqueRemaxAdmin(CustomModelAdmin):
	pass


class RemaxNoBrasilAdminForm(ModelForm):
    class Meta:
        model = RemaxNoBrasil
        fields = '__all__'
        widgets = {
            'agencias': SelectMultiple(),
            'corretores': SelectMultiple(),
            'imoveis_exclusivos': SelectMultiple(),
        }

@admin.register(RemaxNoBrasil)
class RemaxNoBrasilAdmin(CustomModelAdmin):
    
    form = RemaxNoBrasilAdminForm
    
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        if request.method == 'POST':
            
            # remember old state
            _mutable = request.POST._mutable
            request.POST._mutable = True

            # Process 'agencias' field
            agencias = request.POST.getlist('agencias')
            request.POST.setlist('agencias', [ObjectId(agencia) for agencia in agencias])

            # Process 'corretores' field
            corretores = request.POST.getlist('corretores')
            request.POST.setlist('corretores', [ObjectId(corretor) for corretor in corretores])

            # Process 'imoveis_exclusivos' field
            imoveis_exclusivos = request.POST.getlist('imoveis_exclusivos')
            request.POST.setlist('imoveis_exclusivos', [ObjectId(imovel) for imovel in imoveis_exclusivos])

            # set mutable flag back
            request.POST._mutable = _mutable
        return form

@admin.register(Reconhecimento)
class ReconhecimentoAdmin(CustomModelAdmin):
	pass

@admin.register(RemaxNoMundo)
class RemaxNoMundoAdmin(CustomModelAdmin):
	pass

@admin.register(Universidade)
class UniversidadeAdmin(CustomModelAdmin):
	pass

@admin.register(Parceiro)
class ParceiroAdmin(CustomModelAdmin):
	pass

@admin.register(RelacaoInvestidor)
class RelacaoInvestidorAdmin(CustomModelAdmin):
	pass


from django.contrib.auth.models import Group


admin.site.unregister(Group)
@admin.register(Group)
class GroupAdmin(CustomModelAdmin):
    def is_panel_app(self):
        return self.model._meta.app_label == 'auth'
    
    

@admin.register(Documentacao)
class DocumentacaoAdmin(CustomModelAdmin):
	### show only superusers to access the view.
    def has_view_permission(self, request, obj=None):
        return request.user.is_superuser
    
    # See the api-docs view instead the Documentacao Model. 
    def has_add_permission(self, request):
        return False
    
    def has_change_permission(self, request, obj=None):
        return False
    
    def has_delete_permission(self, request, obj=None):
        return False
    
    def is_panel_app(self):
        return False
    
    def get_queryset(self, request):
        return Documentacao.objects.none()
    
    def has_module_permission(self, request):
        return request.user.is_superuser
    
    def has_module_perms(self, request):
        return request.user.is_superuser
    
    ## modify the change_list.html template
    def change_view(self, request, object_id, form_url='', extra_context=None):
        return redirect('api_docs')
    
    def changelist_view(self, request, extra_context=None):
        return redirect('api_docs')
    
        


@admin.register(EstadoDetalhe)
class EstadoDetalheAdmin(CustomModelAdmin):
    pass


@admin.register(CidadeDetalhe)
class CidadeDetalheAdmin(CustomModelAdmin):
    pass
    
    ### define the list fields
    # list_display = ['nome', 'estado']
    # search_fields = ['nome', 'estado']
    # list_filter = ['nome','estado']

 
    
    # def get_form(self, request, obj,  **kwargs):
    #     if request.POST:
    #         # remember old state
    #         _mutable = request.POST._mutable
    #         # set to mutable
    #         request.POST._mutable = True
    #         # сhange the values you want
    #         if 'estado_id' in request.POST:
    #             request.POST['estado_id'] = ObjectId(request.POST['estado'])
            
    #         # set mutable flag back
    #         request.POST._mutable = _mutable
    #     return super().get_form(request, obj=obj,  **kwargs)
    


@admin.register(BairroDetalhe)
class BairroDetalheAdmin(CustomModelAdmin):
    pass
    
    ### define the list fields
    # list_display = ['nome', 'cidade', 'estado']
    # search_fields = ['nome', 'cidade','estado']
    # list_filter = ['nome','cidade','estado']

 
    
    # def get_form(self, request, obj,  **kwargs):
    #     if request.POST:
    #         # remember old state
    #         _mutable = request.POST._mutable
    #         # set to mutable
    #         request.POST._mutable = True
    #         # сhange the values you want
    #         if 'cidade' in request.POST:
    #             request.POST['cidade'] = ObjectId(request.POST['cidade'])
    #         if 'estado' in request.POST:
    #             request.POST['estado'] = ObjectId(request.POST['estado'])
            
    #         # set mutable flag back
    #         request.POST._mutable = _mutable
    #     return super().get_form(request, obj=obj,  **kwargs)


@admin.register(Construtora)
class ConstrutoraAdmin(CustomModelAdmin):
    pass

@admin.register(PoliticaPrivacidadeTexto)
class PoliticaPrivacidadeTextoAdmin(CustomModelAdmin):
    pass

@admin.register(TermosDeUso)
class TermosDeUsoAdmin(CustomModelAdmin):
    pass


class LancamentoCaracteristicasAdminForm(ModelForm):
    class Meta:
        model = LancamentoCaracteristicas
        fields = '__all__'
        widgets = {
            'caracteristica_id': SelectMultiple(),
        }
@admin.register(LancamentoCaracteristicas)
class LancamentoCaracteristicasAdmin(CustomModelAdmin):
    form = LancamentoCaracteristicasAdminForm


class LancamentoAdminForm(ModelForm):
    class Meta:
        model = Lancamento
        fields = '__all__'
        widgets = {
            'bairro': SelectMultiple(),
            'cidade': SelectMultiple(),
            'estado': SelectMultiple(),
            'caracteristicas': SelectMultiple(),
            'user_create': SelectMultiple(),
            'user_update': SelectMultiple(),
        }

@admin.register(Lancamento)
class LancamentoAdmin(CustomModelAdmin):
    
    form = LancamentoAdminForm

    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            
            # # сhange the values you want
            if 'bairro_id' in request.POST:
                request.POST['bairro_id'] = ObjectId(request.POST['bairro_id']) 
            if 'cidade_id' in request.POST:
                request.POST['cidade_id'] = ObjectId(request.POST['cidade_id'])
            if 'estado_id' in request.POST:
                request.POST['estado_id'] = ObjectId(request.POST['estado_id'])
            if 'construtora_id' in request.POST:
                request.POST['construtora_id'] = ObjectId(request.POST['construtora_id'])
            if 'user_create' in request.POST:
                request.POST['user_create'] = ObjectId(request.POST['user_create'])
            if 'user_update' in request.POST:
                request.POST['user_update'] = ObjectId(request.POST['user_update'])
            if 'created_by' in request.POST:
                if obj is None:
                    request.POST['created_by'] = ObjectId(request.user.id)
                else:
                    request.POST['created_by'] = ObjectId(request.POST['created_by'])
            if 'updated_by' in request.POST:
                if obj is None:
                    request.POST['updated_by'] = ObjectId(request.user.id)
                else:
                    request.POST['updated_by'] = ObjectId(request.POST['updated_by'])
            # Process 'caracteristicas' field
            if 'caracteristicas_id' in request.POST:
                caracteristicas = request.POST.getlist('caracteristicas_id')
                request.POST.setlist('caracteristicas_id', [int(caracteristica) for caracteristica in caracteristicas])
            
            # # Fetch and save the entire object data instead of just the ObjectId
            # import json
            # if 'bairro_id' in request.POST:
            #     bairro_id = ObjectId(request.POST['bairro_id'])
            #     bairro_data = list(Bairro.objects.mongo_find({'_id': ObjectId(bairro_id)}))
            #     request.POST['bairro_id'] = [dict(bairro) for bairro in bairro_data]
            # if 'cidade_id' in request.POST:
            #     cidade_id = ObjectId(request.POST['cidade_id'])
            #     cidade_data = list(Cidade.objects.mongo_find({'_id': ObjectId(cidade_id)}))
            #     request.POST['cidade_id'] = [dict(cidade) for cidade in cidade_data]
            # if 'estado_id' in request.POST:
            #     estado_id = ObjectId(request.POST['estado_id'])
            #     estado_data = list(Estado.objects.mongo_find({'_id': ObjectId(estado_id)}))
            #     request.POST['estado_id'] = [dict(estado) for estado in estado_data]
            # if 'construtora_id' in request.POST:
            #     construtora_id = ObjectId(request.POST['construtora_id'])
            #     construtora_data = list(Construtora.objects.mongo_find({'_id': ObjectId(construtora_id)}))
            #     request.POST['construtora_id'] = [dict(construtora) for construtora in construtora_data]
            # if 'user_create' in request.POST:
            #     request.POST['user_create'] = ObjectId(request.POST['user_create'])
            # if 'user_update' in request.POST:
            #     request.POST['user_update'] = ObjectId(request.POST['user_update'])
            # # Process 'caracteristicas' field
            # if 'caracteristicas_id' in request.POST:
            #     caracteristicas = request.POST.getlist('caracteristicas_id')
            #     caracteristicas_data = list(LancamentoCaracteristicas.objects.mongo_find({'caracteristica_id': {'$in': [int(caracteristica) for caracteristica in caracteristicas]}}))
            #     request.POST.setlist('caracteristicas_id', [dict(caracteristica) for caracteristica in caracteristicas_data])
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)
    

class FotosLancamentoAdminForm(ModelForm):
    class Meta:
        model = LancamentoImagem
        fields = '__all__'
        widgets = {
            'lancamento_id': SelectMultiple(),
        }


@admin.register(LancamentoImagem)
class FotosLancamentoAdmin(CustomModelAdmin):
    form = FotosLancamentoAdminForm

    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            if 'lancamento_id' in request.POST:
                request.POST['lancamento_id'] = [ObjectId(lancamento) for lancamento in request.POST.getlist('lancamento_id')]
            
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)

# class PlantasLancamentoAdminForm(ModelForm):
#     class Meta:
#         model = LancamentoPlanta
#         fields = '__all__'
#         widgets = {
#             'lancamento_id': SelectMultiple(),
#         }
# @admin.register(LancamentoPlanta)
# class PlantasLancamentoAdmin(CustomModelAdmin):
#     form = PlantasLancamentoAdminForm

#     def get_form(self, request, obj,  **kwargs):
#         if request.POST:
#             # remember old state
#             _mutable = request.POST._mutable
#             # set to mutable
#             request.POST._mutable = True
#             # сhange the values you want
#             if 'lancamento_id' in request.POST:
#                 request.POST['lancamento_id'] = [ObjectId(lancamento) for lancamento in request.POST.getlist('lancamento_id')]
            
#             # set mutable flag back
#             request.POST._mutable = _mutable
#         return super().get_form(request, obj=obj,  **kwargs)

class PlantaLancamentoAdminForm(ModelForm):
    class Meta:
        model = LancamentoPlanta
        fields = '__all__'
        widgets = {
            'lancamento_id': SelectMultiple(),
            'user_create': SelectMultiple(),
            'user_update': SelectMultiple(),
        }

@admin.register(LancamentoPlanta)
class PlantaLancamentoAdmin(CustomModelAdmin):
    form = PlantaLancamentoAdminForm

    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            if 'lancamento_id' in request.POST:
                request.POST['lancamento_id'] = [ObjectId(lancamento) for lancamento in request.POST.getlist('lancamento_id')]
            if 'user_create' in request.POST:
                request.POST['user_create'] = ObjectId(request.POST['user_create'])
            if 'user_update' in request.POST:
                request.POST['user_update'] = ObjectId(request.POST['user_update'])
            
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)
    
class FotosPlantaLancamentoAdminForm(ModelForm):
    class Meta:
        model = LancamentoPlantaImagem
        fields = '__all__'
        widgets = {
            'planta_id': SelectMultiple(),
        }

@admin.register(LancamentoPlantaImagem)
class FotosPLantaLancamentoAdmin(CustomModelAdmin):
    form = FotosPlantaLancamentoAdminForm

    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            if 'planta_id' in request.POST:
                request.POST['planta_id'] = ObjectId(request.POST['planta_id'])
            
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)

class AgenciasBannerAdminForm(ModelForm):
    class Meta:
        model = AgenciaBanner
        fields = '__all__'
        widgets = {
            'agencia_id': SelectMultiple(),
        }
@admin.register(AgenciaBanner)
class AgenciasBannerAdmin(CustomModelAdmin):
    form = AgenciasBannerAdminForm

    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            if 'agencia' in request.POST:
                request.POST['agencia'] = [agencia for agencia in request.POST.getlist('agencia')]
            
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)


@admin.register(EmailSettings)
class EmailSettingsAdmin(admin.ModelAdmin):
    pass


class BannerPublicidadeAdminForm(ModelForm):
    class Meta:
        model = BannerPublicidade
        fields = '__all__'
        widgets = {
            'estado_id': SelectMultiple(),
            'cidade_id': SelectMultiple(),
            'user_create': SelectMultiple(),
            'user_update': SelectMultiple(),
        }

@admin.register(BannerPublicidade)
class BannerPublicidadeAdmin(CustomModelAdmin):
    
    form = BannerPublicidadeAdminForm

    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            
            # # сhange the values you want
            if 'user_create' in request.POST:
                request.POST['user_create'] = ObjectId(request.POST['user_create'])
            if 'user_update' in request.POST:
                request.POST['user_update'] = ObjectId(request.POST['user_update'])
            if 'created_by' in request.POST:
                if obj is None:
                    request.POST['created_by'] = ObjectId(request.user.id)
                else:
                    request.POST['created_by'] = ObjectId(request.POST['created_by'])
            if 'updated_by' in request.POST:
                if obj is None:
                    request.POST['updated_by'] = ObjectId(request.user.id)
                else:
                    request.POST['updated_by'] = ObjectId(request.POST['updated_by'])
            if 'estado_id' in request.POST:
                estados = request.POST.getlist('estado_id')
                request.POST.setlist('estado_id', [ObjectId(estado) for estado in estados])
            if 'cidade_id' in request.POST:
                cidades = request.POST.getlist('cidade_id')
                request.POST.setlist('cidade_id', [ObjectId(cidade) for cidade in cidades])
            
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)




class NossaHistoriaAdminForm(ModelForm):
    class Meta:
        model = NossaHistoria
        fields = '__all__'

@admin.register(NossaHistoria)
class NossaHistoriaAdmin(CustomModelAdmin):

    form = NossaHistoriaAdminForm

    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            
            # # сhange the values you want
            if 'created_by' in request.POST:
                if obj is None:
                    request.POST['created_by'] = ObjectId(request.user.id)
                else:
                    request.POST['created_by'] = ObjectId(request.POST['created_by'])
            if 'updated_by' in request.POST:
                if obj is None:
                    request.POST['updated_by'] = ObjectId(request.user.id)
                else:
                    request.POST['updated_by'] = ObjectId(request.POST['updated_by'])
            
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)
    



class PaginaAdminForm(ModelForm):
    class Meta:
        model = Pagina
        fields = '__all__'

@admin.register(Pagina)
class PaginaAdmin(CustomModelAdmin):

    form = PaginaAdminForm

    list_display = ('id', 'titulo', 'slug')

    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            
            # сhange the values you want
            if 'created_by' in request.POST:
                if obj is None:
                    request.POST['created_by'] = ObjectId(request.user.id)
                else:
                    request.POST['created_by'] = ObjectId(request.POST['created_by'])
            if 'updated_by' in request.POST:
                if obj is None:
                    request.POST['updated_by'] = ObjectId(request.user.id)
                else:
                    request.POST['updated_by'] = ObjectId(request.POST['updated_by'])
            
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)



class SEOTagAdminForm(ModelForm):
    class Meta:
        model = SEOTag
        fields = '__all__'

@admin.register(SEOTag)
class SEOTagAdmin(CustomModelAdmin):

    form = SEOTagAdminForm
    
    list_display = ('id', 'titulo', 'descricao')

    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            
            # # сhange the values you want
            if 'created_by' in request.POST:
                if obj is None:
                    request.POST['created_by'] = ObjectId(request.user.id)
                else:
                    request.POST['created_by'] = ObjectId(request.POST['created_by'])
            if 'updated_by' in request.POST:
                if obj is None:
                    request.POST['updated_by'] = ObjectId(request.user.id)
                else:
                    request.POST['updated_by'] = ObjectId(request.POST['updated_by'])
            
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)
    


class SEOPaginaAdminForm(ModelForm):
    class Meta:
        model = SEOPagina
        fields = '__all__'
        widgets = {
            'pagina': SelectMultiple(),
            'seo_tag': SelectMultiple(),
            'cidade': SelectMultiple(),
        }

@admin.register(SEOPagina)
class SEOPaginaAdmin(CustomModelAdmin):

    form = SEOPaginaAdminForm
    
    list_display = ('id', 'get_pagina_titulo', 'get_seo_tag_titulo', 'seo_conteudo', 'idioma', 'get_cidade_name')

    def get_pagina_titulo(self, obj):
        return ", ".join([pagina.titulo for pagina in obj.pagina.all()])
    get_pagina_titulo.short_description = 'Pagina'

    def get_seo_tag_titulo(self, obj):
        return ", ".join([seo_tag.titulo for seo_tag in obj.seo_tag.all()])
    get_seo_tag_titulo.short_description = 'SEO Tag'
    
    def get_cidade_name(self, obj):
        return ", ".join([cidade.city_name for cidade in obj.cidade.all()])
    get_cidade_name.short_description = 'Cidade'

    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            
            # # сhange the values you want
            if 'created_by' in request.POST:
                if obj is None:
                    request.POST['created_by'] = ObjectId(request.user.id)
                else:
                    request.POST['created_by'] = ObjectId(request.POST['created_by'])
            if 'updated_by' in request.POST:
                if obj is None:
                    request.POST['updated_by'] = ObjectId(request.user.id)
                else:
                    request.POST['updated_by'] = ObjectId(request.POST['updated_by'])
            
            # Process 'pagina' field
            paginas = request.POST.getlist('pagina')
            request.POST.setlist('pagina', [ObjectId(pagina) for pagina in paginas])

            # Process 'seo_tag' field
            seo_tags = request.POST.getlist('seo_tag')
            request.POST.setlist('seo_tag', [ObjectId(seo_tag) for seo_tag in seo_tags])

            if 'cidade' in request.POST and request.POST['cidade']:
                request.POST['cidade'] = int(request.POST['cidade'])
            
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)