diff --git a/Admin/settingsLocal.py b/Admin/settingsfjrod.py similarity index 97% rename from Admin/settingsLocal.py rename to Admin/settingsfjrod.py index 24687b9..7d297fc 100644 --- a/Admin/settingsLocal.py +++ b/Admin/settingsfjrod.py @@ -145,10 +145,10 @@ else: DATABASES={ 'default': { 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'Aduanasoft$cfdi_as', - 'USER': 'Aduanasoft', + 'NAME': 'fjrodriguez$default', + 'USER': 'fjrodriguez', 'PASSWORD':'Soluciones28@', - 'HOST': 'Aduanasoft.mysql.pythonanywhere-services.com', + 'HOST': 'fjrodriguez.mysql.pythonanywhere-services.com', 'PORT': '3306', 'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"}, } diff --git a/Clientes/serailizers.py b/Clientes/serailizers.py index 3b2c15e..9bcb88e 100644 --- a/Clientes/serailizers.py +++ b/Clientes/serailizers.py @@ -12,4 +12,9 @@ class TimbresSerializer(serializers.ModelSerializer): class Meta: model = Timbres fields = ['uuid','rfcc','fecha','folio','serie','tipo','rfcp','modo'] + +class CancelaSerializer(serializers.ModelSerializer): + class Meta: + model = Timbres + fields=['uuid','rfcc','rfcp'] \ No newline at end of file diff --git a/Clientes/views.py b/Clientes/views.py index d5e80dc..a6bba56 100644 --- a/Clientes/views.py +++ b/Clientes/views.py @@ -24,7 +24,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from .custom_decorators import is_staff_access, http_basic_auth from .models import Clientes,Timbres,saldoModel,ErroresTimbres from Sistemas.models import BitacoraErrores -from .serailizers import ClienteSerializer,TimbresSerializer +from .serailizers import ClienteSerializer,TimbresSerializer,CancelaSerializer from .forms import ClienteForm,EmailForm from rest_framework.views import APIView @@ -438,9 +438,25 @@ class CancelaTimbre(APIView): msn = f'UUID:{UUID} \nCliente:{rfcc} \n {str(ex)}' BitacoraErrores.objects.create(level=2, message=msn, traceback=traceback.format_exc(), view='Sistemas.CancelaTimbre') return Response({'Error':f'{ex}','isError':True}) + + def get(self,request,*args, **kwargs): + uuid=request.query_params.get('uuid',None) + tim=Timbres.objects.filter(uuid=uuid).first() + if tim is not None: + print(tim.rfcp) + + return Response({"rfcp":tim.rfcp,"detail":""}) + + return Response({"rfcp":"",'detail':"404 not found uuid"}) + + + + + + class add_timbre(APIView): pass diff --git a/IMMEX/admin.py b/IMMEX/admin.py index 07ca77e..90640ff 100644 --- a/IMMEX/admin.py +++ b/IMMEX/admin.py @@ -57,99 +57,54 @@ class ActiveTokenSession_Admin(admin.ModelAdmin): class SuspensionPermisoInline(admin.TabularInline): model = SuspensionPermiso extra = 1 - def get_formset(self, request, obj=None, **kwargs): - # Utiliza el objeto 'obj' (el módulo actual) para filtrar el queryset - formset = super().get_formset(request, obj, **kwargs) + # def get_formset(self, request, obj=None, **kwargs): + # # Utiliza el objeto 'obj' (el módulo actual) para filtrar el queryset + # formset = super().get_formset(request, obj, **kwargs) - if obj: - print('SDL',obj.modulo.permisos.all()) - formset.form.base_fields['permiso'].queryset = obj.modulo.permisos.all() - return formset + # if obj: + # print('SDL',obj.modulo.permisos.all()) + # formset.form.base_fields['permiso'].queryset = obj.modulo.permisos.all() + # return formset class SuspensionModuloInline(admin.TabularInline): model = SuspensionModulo -class SuspensionModuloAdmin(admin.ModelAdmin): - list_display = ['modulo','suspendido','supension_modPerm_id'] - inlines=[SuspensionPermisoInline] - class Suspension_Modulos_Permisos_ClienteAdmin(admin.ModelAdmin): - inlines = [SuspensionModuloInline] + inlines = [SuspensionModuloInline,SuspensionPermisoInline] def save_model(self, request, obj, form, change): super().save_model(request, obj, form, change) for modulo in obj.suspensionmodulo_set.all(): + print(modulo, 'permisos',modulo.modulo.permisos.all()) for permiso in modulo.modulo.permisos.all(): + print('borrar?',permiso.delete) + permObj,created=SuspensionPermiso.objects.get_or_create( - suspension_modulo=modulo, + supension_modPermP=obj, + suspension_modulo=modulo.modulo, permiso=permiso, ) + print(permObj,created) + if permiso.delete: + print('borrar') +class SuspensionPermisoInline2(admin.TabularInline): + model = SuspensionPermiso +class SuspensionPemisoAdmin(admin.ModelAdmin): + inlines=[SuspensionPermisoInline2] + +admin.site.register(Modulo) admin.site.register(Permisos_A24) -admin.site.register(Modulo) -admin.site.register(SuspensionModulo,SuspensionModuloAdmin) + +admin.site.register(SuspensionPermiso) admin.site.register(Suspension_Modulos_Permisos_Cliente, Suspension_Modulos_Permisos_ClienteAdmin) -# class Permisos_A24_Admin(admin.ModelAdmin): -# list_display =['nombre'] -# search_fields = ['nombre'] - -# class Modulo_Admin(admin.ModelAdmin): -# list_display=('nombre','sistema_cliente' -# #,'lista_permisos' -# ) -# filter_horizontal = ['permisos'] - - -# class SuspensionPermisoInline(admin.TabularInline): -# model = SuspensionPermiso -# extra = 1 # Puedes ajustar esto según tus necesidades - -# class SuspensionModuloInline(admin.TabularInline): -# model = SuspensionModulo -# extra = 1 # Ajusta según tus necesidades - -# class SuspensionModulo_Admin(admin.ModelAdmin): -# list_display=['modulo','cliente_nombre','dispositivo','custom_suspendido'] -# search_fields = ['dispositivo__clienteA24__Nombre', 'dispositivo__clienteA24__RFC'] - -# def cliente_nombre(self, obj): -# return f'{obj.dispositivo.clienteA24.Nombre}({obj.dispositivo.clienteA24.RFC})' \ -# if obj.dispositivo and obj.dispositivo.clienteA24 else "N/A" -# cliente_nombre.short_description = 'Nombre del Cliente(RFC)' # Puedes personalizar el encabezado si lo deseas - -# def custom_suspendido(self,obj): -# return "Sí" if obj.suspendido else "No" - -# custom_suspendido.short_description = 'Suspendido' - - -# class ModuloInline(admin.TabularInline): -# model = Modulo -# extra =1 -# autocomplete_fields = ['permisos'] - -# class Sistema_x_ClienteAdmin(admin.ModelAdmin): -# inlines = [ModuloInline] -# search_fields = ['modulos__nombre', 'modulos__permisos__nombre'] -# list_filter =('modulo__permisos__nombre',) - -# class Device_A24_Admin2(admin.ModelAdmin): -# inlines = [SuspensionPermisoInline, SuspensionModuloInline] - - - -# admin.site.register(SuspensionPermiso) -# admin.site.register(SuspensionModulo,SuspensionModulo_Admin) - -# admin.site.register(Permisos_A24,Permisos_A24_Admin) -# admin.site.register(Modulo,Modulo_Admin) admin.site.register(Sistemas_por_cliente_A24) diff --git a/IMMEX/forms.py b/IMMEX/forms.py index 9d1ea2c..f9b9f5f 100644 --- a/IMMEX/forms.py +++ b/IMMEX/forms.py @@ -1,5 +1,6 @@ from django import forms -from .models import ClientesA24 +from django.forms import inlineformset_factory +from .models import ClientesA24, Suspension_Modulos_Permisos_Cliente,SuspensionModulo,SuspensionPermiso,Modulo from datetime import datetime class ClienteForm_IMMEX(forms.ModelForm): @@ -21,4 +22,55 @@ class ClienteForm_IMMEX(forms.ModelForm): if Activo and fecha_baja: self._errors['fecha_baja'] = self.error_class(["El parametro activo no puede estar seleccionado si hay fecha de baja"]) - return self.cleaned_data \ No newline at end of file + return self.cleaned_data + +class SuspensionModulosPermisosClienteForm(forms.ModelForm): + class Meta: + model = Suspension_Modulos_Permisos_Cliente + fields = '__all__' + +class SuspensionPermisoForm(forms.ModelForm): + modulo_extra = forms.ModelChoiceField(queryset=SuspensionModulo.objects.all(), required=False, label='Reasignar Modulo') + class Meta: + model = SuspensionPermiso + fields = '__all__' + +class SuspensionModuloForm(forms.ModelForm): + + class Meta: + model = SuspensionModulo + fields = '__all__' + + +SuspensionModuloFormSet = inlineformset_factory( + Suspension_Modulos_Permisos_Cliente, + SuspensionModulo, + form=SuspensionModuloForm, + extra=5, + can_delete=False, +) + +#se usa "SuspensionModuloFormSet2" en el UpdateView para pasar el Extra igual a cero +SuspensionModuloFormSet2 = inlineformset_factory( + Suspension_Modulos_Permisos_Cliente, + SuspensionModulo, + form=SuspensionModuloForm, + extra=1, + can_delete=True, +) + +SuspensionPermisoFormSetCreate = inlineformset_factory( + Suspension_Modulos_Permisos_Cliente, # Modelo padre + SuspensionPermiso, # Modelo hijo + form=SuspensionPermisoForm, + extra=3, + can_delete=True, +) + +SuspensionPermisoFormSet = inlineformset_factory( + Suspension_Modulos_Permisos_Cliente, # Modelo padre + SuspensionPermiso, # Modelo hijo + form=SuspensionPermisoForm, + extra=0, + can_delete=True, +) diff --git a/IMMEX/migrations/0007_suspensionpermiso_supension_modpermp.py b/IMMEX/migrations/0007_suspensionpermiso_supension_modpermp.py new file mode 100644 index 0000000..e58862e --- /dev/null +++ b/IMMEX/migrations/0007_suspensionpermiso_supension_modpermp.py @@ -0,0 +1,20 @@ +# Generated by Django 4.1.3 on 2023-11-23 05:26 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('IMMEX', '0006_remove_modulo_sistema_cliente'), + ] + + operations = [ + migrations.AddField( + model_name='suspensionpermiso', + name='supension_modPermP', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='IMMEX.suspension_modulos_permisos_cliente'), + preserve_default=False, + ), + ] diff --git a/IMMEX/migrations/0008_alter_suspensionpermiso_suspension_modulo.py b/IMMEX/migrations/0008_alter_suspensionpermiso_suspension_modulo.py new file mode 100644 index 0000000..58da40c --- /dev/null +++ b/IMMEX/migrations/0008_alter_suspensionpermiso_suspension_modulo.py @@ -0,0 +1,19 @@ +# Generated by Django 4.1.3 on 2023-11-23 21:16 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('IMMEX', '0007_suspensionpermiso_supension_modpermp'), + ] + + operations = [ + migrations.AlterField( + model_name='suspensionpermiso', + name='suspension_modulo', + field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='IMMEX.suspensionmodulo'), + ), + ] diff --git a/IMMEX/migrations/0009_alter_suspensionpermiso_suspension_modulo.py b/IMMEX/migrations/0009_alter_suspensionpermiso_suspension_modulo.py new file mode 100644 index 0000000..ceb096f --- /dev/null +++ b/IMMEX/migrations/0009_alter_suspensionpermiso_suspension_modulo.py @@ -0,0 +1,19 @@ +# Generated by Django 4.1.3 on 2023-11-23 21:38 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('IMMEX', '0008_alter_suspensionpermiso_suspension_modulo'), + ] + + operations = [ + migrations.AlterField( + model_name='suspensionpermiso', + name='suspension_modulo', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='IMMEX.suspensionmodulo'), + ), + ] diff --git a/IMMEX/migrations/0010_alter_suspensionpermiso_suspension_modulo.py b/IMMEX/migrations/0010_alter_suspensionpermiso_suspension_modulo.py new file mode 100644 index 0000000..233875a --- /dev/null +++ b/IMMEX/migrations/0010_alter_suspensionpermiso_suspension_modulo.py @@ -0,0 +1,19 @@ +# Generated by Django 4.1.3 on 2023-11-23 21:43 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('IMMEX', '0009_alter_suspensionpermiso_suspension_modulo'), + ] + + operations = [ + migrations.AlterField( + model_name='suspensionpermiso', + name='suspension_modulo', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='IMMEX.modulo'), + ), + ] diff --git a/IMMEX/models.py b/IMMEX/models.py index 3a33693..95a2a64 100644 --- a/IMMEX/models.py +++ b/IMMEX/models.py @@ -105,12 +105,16 @@ class SuspensionModulo(models.Model): class SuspensionPermiso(models.Model): - suspension_modulo = models.ForeignKey(SuspensionModulo, on_delete=models.CASCADE) + supension_modPermP = models.ForeignKey(Suspension_Modulos_Permisos_Cliente, on_delete=models.CASCADE) + suspension_modulo = models.ForeignKey(Modulo, on_delete=models.CASCADE,blank=True,null=True) permiso = models.ForeignKey(Permisos_A24, on_delete=models.CASCADE) suspendido = models.BooleanField(default=False) def __str__(self) -> str: return f'{self.permiso}' + class Meta: + ordering=['suspension_modulo'] + diff --git a/IMMEX/urls.py b/IMMEX/urls.py index b61054e..a7153b9 100644 --- a/IMMEX/urls.py +++ b/IMMEX/urls.py @@ -1,5 +1,6 @@ from django.urls import path, include from . import views +from . import viewsPermisos from rest_framework import routers router = routers.DefaultRouter() @@ -25,5 +26,10 @@ urlpatterns = [ path('api/admin/', include(router.urls)), path('api/checar_permisos/',views.ChecarPermisos.as_view(), name='api_ChecarPermisos'), + path('permisos-clientes/',viewsPermisos.SuspensionPermisosClienteListView.as_view(),name='permisos-clientesModulos'), + path('permisos-clientes-create/',viewsPermisos.SuspensionPermisosClienteCreateView.as_view(),name='permisos-clientesModulos-create'), + path('permisos-clientes-update//',viewsPermisos.SuspensionPermisosCliente_UpdateView.as_view(),name='permisos-clientesModulos-update'), + path('permisos-clientes-delete//',viewsPermisos.SuspensionPermisosCliente_DeleteView.as_view(),name='permisos-clientesModulos-delete'), + ] \ No newline at end of file diff --git a/IMMEX/views.py b/IMMEX/views.py index 4b6b80c..fe8d8c3 100644 --- a/IMMEX/views.py +++ b/IMMEX/views.py @@ -194,6 +194,8 @@ class RegistroUsuarios(APIView): from_email='aduanasoftpruebas@gmail.com', recipient_list=[email], ) + + class Check_IMMEX_RFC(APIView): """Verifica que el cliente pueda Timbrar""" @@ -217,7 +219,6 @@ class Check_IMMEX_RFC(APIView): return Response({'Error':f'check_RFC:{E} RFC:{rfc}','isError':True}) - class RegisterIMMEX_Device_APIView(APIView): """Register IMMEX Devices se manda el siguiente JSON diff --git a/IMMEX/viewsPermisos.py b/IMMEX/viewsPermisos.py new file mode 100644 index 0000000..54a435a --- /dev/null +++ b/IMMEX/viewsPermisos.py @@ -0,0 +1,172 @@ +from django import forms +from django.urls import reverse,reverse_lazy +from django.contrib.auth.mixins import LoginRequiredMixin,UserPassesTestMixin +from django.views.generic import DeleteView +from django.views.generic.list import ListView +from django.views.generic.edit import CreateView,UpdateView +from django.contrib import messages +from .models import Suspension_Modulos_Permisos_Cliente, SuspensionModulo, SuspensionPermiso,Modulo +from .forms import SuspensionModulosPermisosClienteForm, SuspensionPermisoFormSet,SuspensionModuloFormSet,SuspensionModuloFormSet2,SuspensionPermisoFormSetCreate +import time + +class SuspensionPermisosClienteListView(LoginRequiredMixin,UserPassesTestMixin, ListView): + model= Suspension_Modulos_Permisos_Cliente + + template_name='IMMEX/modulos/modulos_clientes.html' + def test_func(self): + res = self.request.user.groups.filter(name= 'admin_soft') + if not res: + messages.error(self.request, f'Lo sentimos. La página que buscas no está disponible, no cuentas con los permisos.') + return res + +class SuspensionPermisosCliente_DeleteView(LoginRequiredMixin,UserPassesTestMixin, DeleteView): + model = Suspension_Modulos_Permisos_Cliente + success_url = reverse_lazy('permisos-clientesModulos') + def test_func(self): + res = self.request.user.groups.filter(name= 'admin_soft') + if not res: + messages.error(self.request, f'Lo sentimos. La página que buscas no está disponible, no cuentas con los permisos.') + return res + +class SuspensionPermisosClienteCreateView(LoginRequiredMixin,UserPassesTestMixin, CreateView): + model = Suspension_Modulos_Permisos_Cliente + form_class = SuspensionModulosPermisosClienteForm + #success_url = '/IMMEX/permisos-clientes/' + template_name ='IMMEX/modulos/modulo-create.html' + def test_func(self): + res = self.request.user.groups.filter(name= 'admin_soft') + if not res: + messages.error(self.request, f'Lo sentimos. La página que buscas no está disponible, no cuentas con los permisos.') + return res + + def get_success_url(self): + # Después de crear el objeto, redirige a la UpdateView correspondiente + return reverse('permisos-clientesModulos-update', kwargs={'pk': self.object.pk}) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + if self.request.POST: + context['modulo_formset'] = SuspensionModuloFormSet(self.request.POST, instance=self.object) + context['permiso_formset'] = SuspensionPermisoFormSetCreate(self.request.POST, instance=self.object) + else: + context['modulo_formset'] = SuspensionModuloFormSet(instance=self.object) + context['permiso_formset'] = SuspensionPermisoFormSetCreate(instance=self.object) + + for form in context['permiso_formset'].forms: + form.fields['modulo_extra'].widget = forms.HiddenInput() + form.fields['modulo_extra'].queryset = SuspensionModulo.objects.none() + form.fields['suspension_modulo'].queryset = Modulo.objects.all() + form.fields['suspension_modulo'].widget = forms.HiddenInput() + + return context + + def form_valid(self, form): + context = self.get_context_data() + modulo_formset = context['modulo_formset'] + permiso_formset = context['permiso_formset'] + + + if modulo_formset.is_valid() and permiso_formset.is_valid(): + self.object = form.save() # Guardamos el objeto principal + + # Guardar SuspensionModulo + modulo_formset.instance = self.object + modulo_formset.save() + + for modulo in self.object.suspensionmodulo_set.all(): + for permiso in modulo.modulo.permisos.all(): + permObj,created=SuspensionPermiso.objects.get_or_create( + supension_modPermP=self.object, + suspension_modulo=modulo.modulo, + permiso=permiso, + ) + + # permiso_formset.instance= self.object + # permiso_formset.save() + + # for permiso in self.object.suspensionpermiso_set.all(): + # # print(permiso.permiso,'iud',permiso.supension_modPermP.id) + # # print(permiso.supension_modPermP,permiso.suspension_modulo) + # suspension_modulo = self.object.suspensionmodulo_set.filter( + # supension_modPerm_id=self.object, + # # suspension_modulo = SuspensionModulo.objects.filter(supension_modPerm_id=self.object, + # modulo__permisos__in=[permiso.permiso] + # ).first() + # #print('suspMod',(suspension_modulo)) + + # permiso.suspension_modulo=suspension_modulo.modulo + # permiso.save() + + + return super().form_valid(form) + else: + return self.render_to_response(self.get_context_data(form=form)) + +class SuspensionPermisosCliente_UpdateView(LoginRequiredMixin,UserPassesTestMixin, UpdateView): + model = Suspension_Modulos_Permisos_Cliente + form_class = SuspensionModulosPermisosClienteForm + success_url = '/IMMEX/permisos-clientes/' + template_name ='IMMEX/modulos/edit_permisos.html' + + def test_func(self): + res = self.request.user.groups.filter(name= 'admin_soft') + if not res: + messages.error(self.request, f'Lo sentimos. La página que buscas no está disponible, no cuentas con los permisos.') + return res + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + if self.request.POST: + context['modulo_formset'] = SuspensionModuloFormSet(self.request.POST, instance=self.object) + context['permiso_formset'] = SuspensionPermisoFormSet(self.request.POST,instance=self.object) + + + else: + context['modulo_formset'] = SuspensionModuloFormSet2(instance=self.object) + + + context['permiso_formset'] = SuspensionPermisoFormSet(instance=self.object) + for form in context['permiso_formset'].forms: + form.fields['modulo_extra'].widget = forms.HiddenInput() + form.fields['modulo_extra'].queryset = SuspensionModulo.objects.none() + form.fields['suspension_modulo'].queryset = Modulo.objects.all() + #form.fields['suspension_modulo'].widget = forms.HiddenInput() + #form.fields['permiso'].widget.attrs['disabled'] = True + + return context + + def form_valid(self, form): + context = self.get_context_data() + modulo_formset = context['modulo_formset'] + permiso_formset = context['permiso_formset'] + print('permiupdate',permiso_formset.is_valid()) + if form.is_valid() and modulo_formset.is_valid() and permiso_formset.is_valid(): + self.object = form.save() + modulo_formset.instance = self.object + + modulo_formset.save() + print('MODULOS',self.object.suspensionmodulo_set.all().values()) + + permiso_formset.instance= self.object + permiso_formset.save() + for permiso in self.object.suspensionpermiso_set.all(): + print('permiso:',permiso.permiso,'iud',permiso.supension_modPermP.id) + print('MODULO PERMISO:',permiso.suspension_modulo) + suspension_modulo = self.object.suspensionmodulo_set.filter( + supension_modPerm_id=self.object, + # suspension_modulo = SuspensionModulo.objects.filter(supension_modPerm_id=self.object, + modulo__permisos__in=[permiso.permiso] + ).first() + if not suspension_modulo == None: + print('suspMod',(suspension_modulo)) + print() + permiso.suspension_modulo=suspension_modulo.modulo + permiso.save() + else: + permiso.delete() + + + return super().form_valid(form) + else: + return self.render_to_response(self.get_context_data(form=form)) \ No newline at end of file diff --git a/Templates/IMMEX/modulos/edit_permisos.html b/Templates/IMMEX/modulos/edit_permisos.html new file mode 100644 index 0000000..6071e01 --- /dev/null +++ b/Templates/IMMEX/modulos/edit_permisos.html @@ -0,0 +1,39 @@ +{% extends 'base.html' %} +{% load widget_tweaks %} + +{% block title %}Add Cliente IMMEX {% endblock title %} + +{% block content %} +

Crear Módulo/Permisos

+
+ {% csrf_token %} + {{ form.as_p }} + +

Selecciona Módulo

+ {{ modulo_formset.management_form }} + {% for form in modulo_formset.forms %} +
+ {{ form}} +
+ + {% endfor %} + +

Selecciona Permisos para modulo

+
+ + {{ permiso_formset.management_form }} + {% for form in permiso_formset.forms %} +
+ {{ form }} + +
+ + {% endfor %} + + +
+ + + +
+{% endblock %} \ No newline at end of file diff --git a/Templates/IMMEX/modulos/modulo-create.html b/Templates/IMMEX/modulos/modulo-create.html new file mode 100644 index 0000000..3e513fa --- /dev/null +++ b/Templates/IMMEX/modulos/modulo-create.html @@ -0,0 +1,36 @@ +{% extends 'base.html' %} +{% load widget_tweaks %} + +{% block title %}Add Cliente IMMEX {% endblock title %} + +{% block content %} +

Crear Módulo/Permisos

+
+ {% csrf_token %} + {{ form.as_p }} + +

Selecciona Módulo

+ {{ modulo_formset.management_form }} + {% for form in modulo_formset.forms %} + {{ form.as_table }} + + {% endfor %} + +

Selecciona Permisos para modulo

+
+ + {{ permiso_formset.management_form }} + {% for form in permiso_formset.forms %} +
+ {{ form }} + +
+ + {% endfor %} + +
+ + + +
+{% endblock %} \ No newline at end of file diff --git a/Templates/IMMEX/modulos/modulos_clientes.html b/Templates/IMMEX/modulos/modulos_clientes.html new file mode 100644 index 0000000..c06eea7 --- /dev/null +++ b/Templates/IMMEX/modulos/modulos_clientes.html @@ -0,0 +1,83 @@ +{% extends 'base.html' %} +{% block title %}Add Modulos Por cliente {% endblock title %} + +{% block content %} + + + + + + + + + + + + {% for row in object_list %} + + + + + + + + + {% endfor %} + +
#Sistema-clienteAgregar Modulos por cliente
{{row.id}}{{row.sistema_cliente}} +
+
+ Edit +
+ +
+ + +
+
+
+ + + + + + +{% endblock content %} \ No newline at end of file