]> git.atlas4tour.it Git - pia_atlas.git/commitdiff
- Gestione tour operator con località annessa
authorCostantino Vitale <costantino.vitale@dyrecta.com>
Mon, 3 Oct 2022 15:30:43 +0000 (17:30 +0200)
committerCostantino Vitale <costantino.vitale@dyrecta.com>
Mon, 3 Oct 2022 15:30:43 +0000 (17:30 +0200)
- Gestione amministratore

16 files changed:
.idea/misc.xml
.idea/socoin_atlas.iml
sistema/datatables.py
sistema/forms.py
sistema/models.py
sistema/templates/base.html
sistema/urls.py
utenti/datatables.py
utenti/forms.py
utenti/templates/add_mod_cliente.html [new file with mode: 0644]
utenti/templates/add_mod_tour_operator.html [new file with mode: 0644]
utenti/templates/admin_list.html
utenti/templates/clienti_list.html
utenti/templates/tour_operator_list.html
utenti/urls.py
utenti/views.py

index d28790de07edb35c6cca22cd03eb28b8454e328a..ec83ff998036e2d2bfc49cbce7d3cc49f09891d4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (pia_atlas)" project-jdk-type="Python SDK" />
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (socoin_atlas)" project-jdk-type="Python SDK" />
 </project>
\ No newline at end of file
index a312c3aab382f77006378fb8bd673b1eb2064314..f89b1a889d6c9ce4d8070ff8bceec92f54755348 100644 (file)
@@ -16,7 +16,7 @@
     <content url="file://$MODULE_DIR$">
       <excludeFolder url="file://$MODULE_DIR$/env" />
     </content>
-    <orderEntry type="jdk" jdkName="Python 3.7 (pia_atlas)" jdkType="Python SDK" />
+    <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
   <component name="TemplatesService">
index 90f0e27455b41017ec5af788d803437f9e8566a9..72eeb07e3870a38d9cb836f96b1400f012a8f667 100644 (file)
@@ -2,7 +2,7 @@ from django_datatables_view.base_datatable_view import BaseDatatableView
 from django.utils.html import escape
 from django.db.models import Q
 
-from sistema.models import Localita, Multimedia, TipologiaMultimedia, Percorso, PointOfInterest, Feedback
+from sistema.models import Localita, Multimedia, TipologiaMultimedia, Percorso, PointOfInterest, Feedback, Gestisce
 
 
 class LocalitaDatatables(BaseDatatableView):
@@ -190,4 +190,33 @@ class FeedbackDatatables(BaseDatatableView):
         search = self.request.GET.get('search[value]', None)
         if search:
             qs = qs.filter(Q(utente__icontains=search) | Q(valutazione__icontains=search))
+        return qs
+
+
+class GestisceLocalitaDatatables(BaseDatatableView):
+    model = Gestisce
+    columns = ['id', 'localita', 'data_inizio', 'data_fine', 'del']
+    order_columns = ['id', 'localita', 'data_inizio', 'data_fine', '']
+
+    def get_initial_queryset(self):
+        return self.model.objects.filter(utente_id=self.request.GET.get('pk'), is_active=True)
+
+    def render_column(self, row, column):
+        if column == 'id':
+            return escape('{0}'.format(row.pk))
+        if column == 'localita':
+            return escape('{0}'.format(row.localita))
+        if column == 'data_inizio':
+            return escape('{0}'.format(row.data_inizio or ''))
+        if column == 'data_fine':
+            return escape('{0}'.format(row.data_fine or ''))
+        if column == 'del':
+            return '<button class="btn btn-sm btn-danger" onclick="DeactivateGestioneLocalita(%s)" ><i class="fas fa-circle-minus"></i></button>' % row.pk
+        else:
+            return super(GestisceLocalitaDatatables, self).render_column(row, column)
+
+    def filter_queryset(self, qs):
+        search = self.request.GET.get('search[value]', None)
+        if search:
+            qs = qs.filter(Q(localita__descrizione__icontains=search))
         return qs
\ No newline at end of file
index df266eac6e2c3008003a80c200db160ef02c0fef..5f5f6017a07f261fd3b6c74b1942e76ee21b817a 100644 (file)
@@ -1,6 +1,8 @@
+from datetime import datetime
+
 from django.contrib.auth.forms import *
 
-from sistema.models import Localita, TipologiaMultimedia
+from sistema.models import Localita, TipologiaMultimedia, Gestisce
 
 
 class LocalitaForm(forms.ModelForm):
@@ -45,4 +47,30 @@ class TipoMultimediaForm(forms.ModelForm):
         label="Nome tipologia",
         max_length=255,
         widget=forms.TextInput(attrs={'class': 'form-control', 'form': 'tipo_multimedia_form'})
-    )
\ No newline at end of file
+    )
+
+
+class GestisceForm(forms.ModelForm):
+    data_inizio = forms.DateField(
+        label='Data inizio',
+        initial=None,
+        widget=forms.DateInput(attrs={'type': 'date'}),
+    )
+
+    data_fine = forms.DateField(
+        label='Data fine',
+        initial=None,
+        required=False,
+        widget=forms.DateInput(attrs={'type': 'date'}),
+    )
+
+    class Meta:
+        model = Gestisce
+        exclude = ('utente', 'is_active',)
+
+    def __init__(self, *args, **kwargs):
+        super(GestisceForm, self).__init__(*args, **kwargs)
+        localita = Localita.objects.filter(is_active=True)
+        self.fields['localita'] = forms.ModelChoiceField(queryset=localita, widget=forms.Select(attrs={'class': 'form-control'}), initial='')
+        self.fields['data_inizio'].widget.attrs.update({'class': 'form-control'})
+        self.fields['data_fine'].widget.attrs.update({'class': 'form-control'})
index a6f9a9815241e13dabb66344b0e9da365477dedd..4d456de6ef524e7651a6c1842d62e592ce567e83 100644 (file)
@@ -10,6 +10,8 @@ class Localita(models.Model):
     regione = models.CharField(max_length=50, null=True, blank=True)
     is_active = models.BooleanField(default=True)
 
+    def __str__(self):
+        return self.descrizione + ', ' + self.provincia + ' (' + self.regione + ')'
 
 class Gestisce(models.Model):
     utente = models.ForeignKey(User, on_delete=models.DO_NOTHING)
index 5b94b5075b3418667d4c5e503e698b73230cd7cb..8cf7400c2bd28eca52e7c1a67209fb0957d1a875 100644 (file)
                                    class="dropdown-item has-icon">
                                 <i class="fas fa-cog"></i> Profilo</a></li>
                         <div class="dropdown-divider"></div>
-                        <li><a class="dropdown-item has-icon text-danger" href="/logout/">
+                        <li><a class="dropdown-item has-icon text-danger" href="{% url 'utenti:logout' %}">
                             <i class="fa fa-sign-out-alt"></i> Logout</a></li>
                     </ul>
                 </li>
index 625b6aa804fd19fc13e5567a8f563d15cbee8188..dc97372accd55b2f34e2e200803f4bf41a783eb9 100644 (file)
@@ -1,7 +1,7 @@
 from django.urls import path
 
 from sistema.datatables import LocalitaDatatables, MultimediaDatatables, TipoMultimediaDatatables, PercorsoDatatables, \
-    PoiDatatables, FeedbackDatatables
+    PoiDatatables, FeedbackDatatables, GestisceLocalitaDatatables
 from sistema.views import Home, LocalitaListView, MultimediaListView, PuntiInteresseListView, \
     TipologiaMultimediaListView, PercorsiListView, LocalitaView, TipoMultimediaView, PoiView
 
@@ -22,6 +22,7 @@ urlpatterns = [
     path('percorso_datatables/', PercorsoDatatables.as_view(), name='percorso_datatables'),
     path('poi_datatables/', PoiDatatables.as_view(), name='poi_datatables'),
     path('feedback_datatables/', FeedbackDatatables.as_view(), name='feedback_datatables'),
+    path('gestisce_localita_datatables/', GestisceLocalitaDatatables.as_view(), name='gestisce_localita_datatables'),
 
     ## LOCALITA ##
     path('localita/', LocalitaView.as_view(), name='localita'),
@@ -36,4 +37,5 @@ urlpatterns = [
     path('mod_poi/<int:pk>/', PoiView.as_view(), name='mod_poi'),
 
 
+
 ]
index 8f6d0a803a0470fffb62559951cbcef146da2304..dac241e837eb0be4957dcba3eb557fef02ee48eb 100644 (file)
@@ -11,18 +11,22 @@ class UserDatatables(BaseDatatableView):
     columns = ['id', 'first_name', 'last_name', 'username', 'email', 'last_login', 'mod', 'del']
     order_columns = ['id', 'first_name', 'last_name', 'username', 'email', 'last_login', '', '']
 
-    def get_initial_queryset(self):
+    def get_role(self):
         role = self.request.GET.get('role')
+        if role == settings.ADMIN_GROUPS:
+            return settings.ADMIN_GROUPS
+        elif role == settings.TOUR_OPERATOR_GROUPS:
+            return settings.TOUR_OPERATOR_GROUPS
+        elif role == settings.CLIENTI_GROUPS:
+            return settings.CLIENTI_GROUPS
+        else:
+            return None
 
-        if role:
-            if role == settings.ADMIN_GROUPS:
-                return self.model.objects.filter(groups__name=settings.ADMIN_GROUPS, is_active=True)
-            elif role == settings.TOUR_OPERATOR_GROUPS:
-                return self.model.objects.filter(groups__name=settings.TOUR_OPERATOR_GROUPS, is_active=True)
-            elif role == settings.CLIENTI_GROUPS:
-                return self.model.objects.filter(groups__name=settings.CLIENTI_GROUPS, is_active=True)
-            else:
-                return self.model.objects.none()
+    def get_initial_queryset(self):
+        if self.get_role():
+            return self.model.objects.filter(groups__name=self.get_role(), is_active=True)
+        else:
+            return self.model.objects.none()
 
     def render_column(self, row, column):
         if column == 'id':
@@ -38,9 +42,14 @@ class UserDatatables(BaseDatatableView):
         if column == 'last_login':
             return escape('{0}'.format(row.last_login or ''))
         if column == 'mod':
-            return '<a class="btn btn-sm btn-primary" href="#" ><i class="fas fa-edit"></i></a>' #% row.pk
+            if self.get_role() == settings.ADMIN_GROUPS:
+                return '<a class="btn btn-sm btn-primary" href="/utenti/mod_admin/%s/" ><i class="fas fa-edit"></i></a>' % row.pk
+            elif self.get_role() == settings.TOUR_OPERATOR_GROUPS:
+                return '<a class="btn btn-sm btn-primary" href="/utenti/mod_tour_operator/%s/" ><i class="fas fa-edit"></i></a>' % row.pk
+            else:
+                return '<a class="btn btn-sm btn-primary" href="/utenti/mod_cliente/%s/" ><i class="fas fa-edit"></i></a>' % row.pk
         if column == 'del':
-            return '<a class="btn btn-sm btn-danger" href="#" ><i class="fas fa-trash"></i></a>' #% row.pk
+            return '<a class="btn btn-sm btn-danger" href="DeleteUser(%s)" ><i class="fas fa-trash"></i></a>' % row.pk
         else:
             return super(UserDatatables, self).render_column(row, column)
 
index 22c4b1d5800b1d3506b8ecda2c659d334edd38bd..1318f3c6b1a8ba3a20d6fb4e63d1c946bf3589e6 100644 (file)
@@ -8,17 +8,39 @@ class FormLogin(forms.Form):
     password = forms.CharField(max_length=255, widget=forms.PasswordInput(attrs={'class':'form-control'}))
 
 
+class UserEditForm(UserChangeForm):
+    class Meta:
+        model = User
+        exclude = ['username', 'is_staff', 'is_superuser', 'last_login', 'groups', 'user_permissions', 'is_active', 'date_joined', 'password']
+
+
+class CustomUserCreationForm(forms.ModelForm):
+    class Meta:
+        model = User
+        fields = ['username', 'first_name', 'last_name']
+
+    def __init__(self, *args, **kwargs):
+        super(CustomUserCreationForm, self).__init__(*args, **kwargs)
+        for f in self.fields:
+            self.fields[f].widget.attrs.update({'class': 'form-control'})
+
+
 class RegistrationForm(UserCreationForm):
     class Meta:
         model = User
         fields = ['username', 'first_name', 'last_name', 'email', 'password1', 'password2']
 
+    def __init__(self, *args, **kwargs):
+        super(RegistrationForm, self).__init__(*args, **kwargs)
+        for f in self.fields:
+            self.fields[f].widget.attrs.update({'class': 'form-control'})
+
     def save(self, commit=True):
         user = super().save(commit=False)
         if commit:
             user.save()
-            if user.groups.filter(name=settings.CLIENTI_GROUPS).exists():
-                group = Group(name=settings.CLIENTI_GROUPS)
+            if Group.objects.filter(name=settings.CLIENTI_GROUPS).exists():
+                group = Group.objects.get(name=settings.CLIENTI_GROUPS)
             else:
                 group = Group(name=settings.CLIENTI_GROUPS)
                 group.save()
@@ -28,17 +50,22 @@ class RegistrationForm(UserCreationForm):
             return user
 
 
-class TourOperatorForm(UserCreationForm):
+class TourOperatorNewForm(UserCreationForm):
     class Meta:
         model = User
-        fields = ['username', 'first_name', 'last_name', 'password1', 'password2']
+        fields = ['username', 'email', 'first_name', 'last_name', 'password1']
+
+    def __init__(self, *args, **kwargs):
+        super(TourOperatorNewForm, self).__init__(*args, **kwargs)
+        for f in self.fields:
+            self.fields[f].widget.attrs.update({'class': 'form-control'})
 
     def save(self, commit=True):
         user = super().save(commit=False)
         if commit:
             user.save()
-            if user.groups.filter(name=settings.TOUR_OPERATOR_GROUPS).exists():
-                group = Group(name=settings.TOUR_OPERATOR_GROUPS)
+            if Group.objects.filter(name=settings.TOUR_OPERATOR_GROUPS).exists():
+                group = Group.objects.get(name=settings.TOUR_OPERATOR_GROUPS)
             else:
                 group = Group(name=settings.TOUR_OPERATOR_GROUPS)
                 group.save()
@@ -53,12 +80,17 @@ class AdminForm(UserCreationForm):
         model = User
         fields = ['username', 'first_name', 'last_name', 'password1', 'password2']
 
+    def __init__(self, *args, **kwargs):
+        super(AdminForm, self).__init__(*args, **kwargs)
+        for f in self.fields:
+            self.fields[f].widget.attrs.update({'class': 'form-control'})
+
     def save(self, commit=True):
         user = super().save(commit=False)
         if commit:
             user.save()
-            if user.groups.filter(name=settings.ADMIN_GROUPS).exists():
-                group = Group(name=settings.ADMIN_GROUPS)
+            if Group.objects.filter(name=settings.ADMIN_GROUPS).exists():
+                group = Group.objects.get(name=settings.ADMIN_GROUPS)
             else:
                 group = Group(name=settings.ADMIN_GROUPS)
                 group.save()
@@ -67,8 +99,3 @@ class AdminForm(UserCreationForm):
         else:
             return user
 
-
-class UserEditForm(UserChangeForm):
-    class Meta:
-        model = User
-        exclude = ['username', 'is_staff', 'is_superuser', 'last_login', 'groups', 'user_permissions', 'is_active', 'date_joined', 'password']
\ No newline at end of file
diff --git a/utenti/templates/add_mod_cliente.html b/utenti/templates/add_mod_cliente.html
new file mode 100644 (file)
index 0000000..c912b40
--- /dev/null
@@ -0,0 +1,43 @@
+{% extends 'base.html' %}
+{% load static %}
+{% load crispy_forms_tags %}
+{% block content %}
+
+    <div class="row">
+        <div class="col-12 col-md-12 col-lg-12">
+            <h1 class="line-bolle"><i class="fa-solid fa-crown clr-bolle mr-2" aria-hidden="true"></i> Gestione amministratori</h1>
+            <div class="card">
+                <div class="card-header">
+                    {% if form.instance.pk %}
+                    <h4 class="clr-config">Modifica l'amministratore #{{ form.instance.pk }}</h4>
+                    {% else %}
+                    <h4 class="clr-config">Registra una nuovo amministratire del sistema</h4>
+                    {% endif %}
+                </div>
+
+                <div class="card-body">
+                    <form method="POST" id="admin_form" action="{% url 'utenti:admin' %}">{% csrf_token %}
+                        {% if form.instance.pk %}
+                            <input type="hidden" name="mod" form="admin_form">
+                            <input type="hidden" name="pk" value="{{ form.instance.pk }}" form="admin_form">
+                        {% endif %}
+                            {{form | crispy }}
+                            <br>
+                        <div class="card-footer text-right">
+                            <button class="btn btn-primary" type="button" onclick="javascript:this.form.submit();"><i class="fas fa-save" aria-hidden="true"></i> Salva
+                            </button>
+                        </div>
+
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+    <script>
+
+    </script>
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/utenti/templates/add_mod_tour_operator.html b/utenti/templates/add_mod_tour_operator.html
new file mode 100644 (file)
index 0000000..76bd1f7
--- /dev/null
@@ -0,0 +1,190 @@
+{% extends 'base.html' %}
+{% load static %}
+{% load crispy_forms_tags %}
+{% block content %}
+
+    <div class="row">
+        <div class="col-12 col-md-12 col-lg-12">
+            <h1 class="line-bolle"><i class="fa-solid fa-handshake-angle clr-bolle mr-2" aria-hidden="true"></i> Gestione tour operator</h1>
+            <div class="card">
+                <div class="card-header">
+                    {% if form.instance.pk %}
+                    <h4 class="clr-config">Modifica il tour operator #{{ form.instance.pk }}</h4>
+                    {% else %}
+                    <h4 class="clr-config">Registra una nuovo tour operator nel sistema</h4>
+                    {% endif %}
+                </div>
+
+                <div class="card-body">
+                    <form method="POST" id="tour-operator_form" action="#">{% csrf_token %}
+                        {% if form.instance.pk %}
+                            <input type="hidden" name="mod" form="tour-operator_form">
+                            <input type="hidden" name="pk" value="{{ form.instance.pk }}" form="tour-operator_form">
+                        {% endif %}
+                            {{form | crispy }}
+                    </form>
+
+                    <br>
+                    <hr>
+                    <div class="section-title mt-0">Associa località</div>
+                    <form method="POST" id="gestione_form" action="#">{% csrf_token %}
+                        {{form_gestione | crispy }}
+                    </form>
+
+                        {% if form.instance.pk %}
+                            <br>
+                            <hr>
+                            <div class="section-title mt-0">Località già associate</div>
+                            <div class="row">
+                                <div class="table-responsive">
+                                    <table id="gestisce-table"
+                                           class="table table-sm table-bordered table-striped dataTables_wrapper dt-bootstrap4 no-footer" style="width: 100% !important;">
+                                        <thead>
+                                        <tr>
+                                            <th>#</th>
+                                            <th>Località</th>
+                                            <th>Data inizio</th>
+                                            <th>Data fine</th>
+                                            <th></th>
+                                        </tr>
+                                        </thead>
+                                        <tbody>
+                                        </tbody>
+                                    </table>
+                                </div>
+                            </div>
+                        {% endif %}
+
+                    <br>
+
+                    <div class="card-footer text-right">
+                        <button class="btn btn-primary" type="button" onclick="SubmitForms();"><i class="fas fa-save" aria-hidden="true"></i> Salva
+                        </button>
+                    </div>
+
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+    <script>
+
+        {% if form.instance.pk %}
+            $(document).ready(function () {
+                $('#gestisce-table').dataTable({
+                    processing: true,
+                    serverSide: true,
+                    ajax: {
+                        "url": "{% url 'sistema:gestisce_localita_datatables' %}",
+                        "type": 'GET',
+                        "data": {'pk': {{ form.instance.pk }}},
+                    },
+                    language: {
+                        url: "//cdn.datatables.net/plug-ins/1.10.20/i18n/Italian.json"
+                    },
+                    columnDefs: [
+                            {"targets": 4, "orderable": false},
+                    ],
+                    "order": []
+                });
+            });
+
+            function DeactivateGestioneLocalita(pk){
+                Swal.fire({
+                    title: "Sei sicuro?",
+                    text: "Una volta eliminata non sarà più possibile accedere all'informazione!",
+                    icon: "warning",
+                    showCancelButton: true,
+                    confirmButtonColor: '#3085d6',
+                    cancelButtonColor: '#d33',
+                    confirmButtonText: 'Conferma',
+                    cancelButtonText: 'Annulla',
+                }).then((willDelete) => {
+                    if (willDelete.value) {
+                        $.ajax({
+                            type: 'GET',
+                            data: {
+                                'pk': pk,
+                                'method': 'deactivate-localita',
+                            },
+                            url: '{% url 'utenti:tour_operator' %}',
+                            success: function (response) {
+                                Swal.fire("Fatto!", response.response, "success")
+                                    .then((value) => {
+                                        location.reload();
+                                    });
+                            },
+                            error: () => {
+                                Swal.fire("Attenzione!", response.response, "error")
+                            }
+                        })
+                    } else if (
+                        willDelete.dismiss === Swal.DismissReason.cancel
+                    ) {
+                        Swal.fire(
+                            'Annullato',
+                            'Rimozione annullata.',
+                            'error'
+                        )
+                    }
+                });
+            }
+
+        {% endif %}
+
+        function objectifyForm(formArray) {
+            //serialize data function
+            var returnArray = {};
+            for (var i = 0; i < formArray.length; i++) {
+                returnArray[formArray[i]['name']] = formArray[i]['value'];
+            }
+            return returnArray;
+        }
+
+        function SubmitForms(){
+            tour_operator_form = objectifyForm($('#tour-operator_form').serializeArray());
+            gestione_form = objectifyForm($('#gestione_form').serializeArray());
+
+            method = ''
+            pk_tour_operator_form = ''
+            {% if form.instance.pk %}
+                method = 'mod'
+                pk_tour_operator_form = {{ form.instance.pk }}
+            {% endif %}
+
+            $.ajax({
+                data: {
+                    'tour_operator_form': JSON.stringify(tour_operator_form),
+                    'gestione_form': JSON.stringify(gestione_form),
+                    'pk_tour_operator_form': pk_tour_operator_form,
+                    'method': method,
+                },
+                type: "POST",
+                url: '{% url 'utenti:tour_operator' %}',
+                "headers": {'X-CSRFToken': '{{ csrf_token }}'},
+            })
+                .done(function (response) {
+                    Swal.fire('', "Operazione effettuata con successo", "success").then((value) => {
+                        location.reload();
+                    });
+                })
+                .fail(function (jqXHR, textStatus, errorThrown) {
+                    errore = ''
+                    if (typeof jqXHR.responseText.reason === 'string' || jqXHR.responseText.reason instanceof String) {
+                        errore = jqXHR.responseText
+                    } else {
+                        for (var i = 0; i < jqXHR.responseJSON.reason.length; i++) {
+                            errore += jqXHR.responseJSON.reason[i]
+                            errore += '<br>'
+                        }
+                    }
+                    Swal.fire("Attenzione!", errore, "error")
+
+                });
+
+        }
+    </script>
+
+
+{% endblock %}
\ No newline at end of file
index d275f31ce34c31b5c984a58a526a8bbafbd98055..026e857ffcc225ce8df9f83575d337f51875daf9 100644 (file)
@@ -8,7 +8,7 @@
             <div class="card">
                 <div class="card-header justify-content-between">
                     <h4 class="clr-bolle">Lista amministratori</h4>
-                    <a href="#">
+                    <a href="{% url 'utenti:admin' %}">
                        <button class="btn-sm btn-primary"><i class="fa-solid fa-plus"></i>  Aggiungi un admin</button>
                     </a>
                 </div>
                 "order": []
             });
         });
+
+        function DeleteUser(pk){
+            Swal.fire({
+                title: "Sei sicuro?",
+                text: "Una volta eliminata non sarà più possibile accedere all'informazione!",
+                icon: "warning",
+                showCancelButton: true,
+                confirmButtonColor: '#3085d6',
+                cancelButtonColor: '#d33',
+                confirmButtonText: 'Conferma',
+                cancelButtonText: 'Annulla',
+            }).then((willDelete) => {
+                if (willDelete.value) {
+                    $.ajax({
+                        type: 'GET',
+                        data: {
+                            'pk': pk,
+                            'method': 'del',
+                        },
+                        url: '{% url 'utenti:admin' %}',
+                        success: function (response) {
+                            Swal.fire("Fatto!", response.response, "success")
+                                .then((value) => {
+                                    location.reload();
+                                });
+                        },
+                        error: () => {
+                            Swal.fire("Attenzione!", response.response, "error")
+                        }
+                    })
+                } else if (
+                    willDelete.dismiss === Swal.DismissReason.cancel
+                ) {
+                    Swal.fire(
+                        'Annullato',
+                        'Rimozione annullata.',
+                        'error'
+                    )
+                }
+            });
+        }
+
     </script>
 {% endblock %}
\ No newline at end of file
index 05d2695c18b13c31afc29bc1e50dc6522e1000e9..4c5e302dbe16932d848c038401009b3961819b89 100644 (file)
                 "order": []
             });
         });
+
+        function DeleteUser(pk){
+            Swal.fire({
+                title: "Sei sicuro?",
+                text: "Una volta eliminata non sarà più possibile accedere all'informazione!",
+                icon: "warning",
+                showCancelButton: true,
+                confirmButtonColor: '#3085d6',
+                cancelButtonColor: '#d33',
+                confirmButtonText: 'Conferma',
+                cancelButtonText: 'Annulla',
+            }).then((willDelete) => {
+                if (willDelete.value) {
+                    $.ajax({
+                        type: 'GET',
+                        data: {
+                            'pk': pk,
+                            'method': 'del',
+                        },
+                        url: '{% url 'utenti:cliente' %}',
+                        success: function (response) {
+                            Swal.fire("Fatto!", response.response, "success")
+                                .then((value) => {
+                                    location.reload();
+                                });
+                        },
+                        error: () => {
+                            Swal.fire("Attenzione!", response.response, "error")
+                        }
+                    })
+                } else if (
+                    willDelete.dismiss === Swal.DismissReason.cancel
+                ) {
+                    Swal.fire(
+                        'Annullato',
+                        'Rimozione annullata.',
+                        'error'
+                    )
+                }
+            });
+        }
+
+
     </script>
 {% endblock %}
\ No newline at end of file
index 79a38902dbf769703783e817c9aece7184c3ad60..585f9025b7baab703266296b2b9ea5c43eeeb4ba 100644 (file)
@@ -8,7 +8,7 @@
             <div class="card">
                 <div class="card-header justify-content-between">
                     <h4 class="clr-bolle">Lista tour operator</h4>
-                    <a href="#">
+                    <a href="{% url 'utenti:tour_operator' %}">
                        <button class="btn-sm btn-primary"><i class="fa-solid fa-plus"></i>  Aggiungi un nuovo tour operator</button>
                     </a>
                 </div>
                 "order": []
             });
         });
+
+        function DeleteUser(pk){
+            Swal.fire({
+                title: "Sei sicuro?",
+                text: "Una volta eliminata non sarà più possibile accedere all'informazione!",
+                icon: "warning",
+                showCancelButton: true,
+                confirmButtonColor: '#3085d6',
+                cancelButtonColor: '#d33',
+                confirmButtonText: 'Conferma',
+                cancelButtonText: 'Annulla',
+            }).then((willDelete) => {
+                if (willDelete.value) {
+                    $.ajax({
+                        type: 'GET',
+                        data: {
+                            'pk': pk,
+                            'method': 'del',
+                        },
+                        url: '{% url 'utenti:tour_operator' %}',
+                        success: function (response) {
+                            Swal.fire("Fatto!", response.response, "success")
+                                .then((value) => {
+                                    location.reload();
+                                });
+                        },
+                        error: () => {
+                            Swal.fire("Attenzione!", response.response, "error")
+                        }
+                    })
+                } else if (
+                    willDelete.dismiss === Swal.DismissReason.cancel
+                ) {
+                    Swal.fire(
+                        'Annullato',
+                        'Rimozione annullata.',
+                        'error'
+                    )
+                }
+            });
+        }
+
     </script>
 {% endblock %}
\ No newline at end of file
index 7a3fd5acd7ebe302f932d5cbd567b55769f237ac..7c7104575e4c9bfe72c4b6f37e57c3e56b6cbd34 100644 (file)
@@ -4,7 +4,7 @@ from django.contrib import admin
 from django.contrib.auth import views as auth_views
 
 from utenti.datatables import UserDatatables
-from utenti.views import Autentication, Logout, Register, AdminListView, TourOperatorListView, ClientiListView
+from utenti.views import Autentication, Logout, Register, AdminListView, TourOperatorListView, ClientiListView, TourOperatorView, ClienteView, AdminView
 
 urlpatterns = [
     path('accounts/', include('django.contrib.auth.urls')),
@@ -25,4 +25,15 @@ urlpatterns = [
     path('user_datatables/', UserDatatables.as_view(), name='user_datatables'),
 
 
+    ## TOUR OPERATOR ##
+    path('tour_operator/', TourOperatorView.as_view(), name='tour_operator'),
+    path('mod_tour_operator/<int:pk>/', TourOperatorView.as_view(), name='mod_tour_operator'),
+
+    ## CLIENTE ##
+    path('cliente/', ClienteView.as_view(), name='cliente'),
+    path('mod_cliente/<int:pk>/', ClienteView.as_view(), name='mod_cliente'),
+
+    ## ADMIN ##
+    path('admin/', AdminView.as_view(), name='admin'),
+    path('mod_admin/<int:pk>/', AdminView.as_view(), name='mod_admin'),
 ]
\ No newline at end of file
index 7eea356ea019b5ea9a09fe4d5b64010c1cf5d1a8..3df8067885cb052d8a41b38c62154ba7e1535ba1 100644 (file)
@@ -1,11 +1,19 @@
+import json
+
 from django.contrib.auth import authenticate, login
+from django.contrib.auth.models import User
+from django.http import JsonResponse
 from django.shortcuts import render, redirect
+from django.urls import reverse
 from django.views import View
 from django.contrib import messages
 from django.contrib.auth import login, authenticate, logout
 from django.views.generic import TemplateView
+from rest_framework import status
 
-from utenti.forms import FormLogin, RegistrationForm
+from sistema.forms import GestisceForm
+from sistema.models import Gestisce
+from utenti.forms import FormLogin, RegistrationForm, TourOperatorNewForm, CustomUserCreationForm, AdminForm
 
 
 class Autentication(View):
@@ -84,6 +92,137 @@ class TourOperatorListView(TemplateView):
 class ClientiListView(TemplateView):
     template_name = 'clienti_list.html'
 
+
+class TourOperatorView(View):
+    def add_tour_operator(self, request):
+        form = TourOperatorNewForm(data=json.loads(request.POST.get('tour_operator_form')))
+        if form.is_valid():
+            form.save()
+
+            gestisce_form = GestisceForm(data=json.loads(request.POST.get('gestione_form')))
+            if gestisce_form.is_valid():
+                gestisce = gestisce_form.save(commit=False)
+                gestisce.utente = form.instance
+                gestisce.save()
+
+            messages.add_message(request, messages.INFO, 'Nuova tour operator inserito con successo.')
+        else:
+            errors = ''
+            for err in form.errors.as_data():
+                errors += '<li>' + err + '</li>'
+            messages.add_message(request, messages.ERROR, 'Errore nell\'inserimento del tour operator. Controlla il form.')
+
+    def mod_tour_operator(self, request):
+        form = CustomUserCreationForm(data=json.loads(request.POST.get('tour_operator_form')), instance=User.objects.get(pk=int(self.request.POST.get('pk_tour_operator_form'))))
+        if form.is_valid():
+            form.save()
+
+            gestisce_form = GestisceForm(data=json.loads(request.POST.get('gestione_form')))
+            if gestisce_form.is_valid():
+                gestisce = gestisce_form.save(commit=False)
+                gestisce.utente = form.instance
+                gestisce.save()
+
+            messages.add_message(request, messages.INFO, 'Tour operator aggiornato con successo.')
+        else:
+            errors = ''
+            for err in form.errors.as_data():
+                errors += '<li>' + err + '</li>'
+            messages.add_message(request, messages.ERROR, 'Errore nell\'aggiornamento del tour operator. Controlla il form.')
+
+    def del_tour_operator(self, request):
+        tour_operator = User.objects.get(pk=int(request.GET.get('pk')))
+        tour_operator.is_active = False
+        tour_operator.save()
+
+    def deactivate_localita(self, request):
+        gestisce = Gestisce.objects.get(pk=int(request.GET.get('pk')))
+        gestisce.is_active = False
+        gestisce.save()
+
+    def get(self, request, *args, **kwargs):
+        if request.GET.get('method') == 'del':
+            self.del_tour_operator(request)
+            return JsonResponse({'response': 'Tour operator eliminato con successo'}, status=status.HTTP_200_OK)
+        elif request.GET.get('method') == 'deactivate-localita':
+            self.deactivate_localita(request)
+            return JsonResponse({'response': 'Località eliminata con successo'}, status=status.HTTP_200_OK)
+        elif 'pk' in kwargs:
+            return render(request, 'add_mod_tour_operator.html', {'form': CustomUserCreationForm(instance=User.objects.get(pk=int(self.kwargs['pk']))),
+                                                                  'form_gestione': GestisceForm()})
+        else:
+            return render(request, 'add_mod_tour_operator.html', {'form': TourOperatorNewForm(), 'form_gestione': GestisceForm()})
+
+    def post(self, request, *args, **kwargs):
+        if self.request.POST.get('method') == 'mod':
+            self.mod_tour_operator(request)
+        else:
+            self.add_tour_operator(request)
+
+        return redirect(reverse('utenti:touroperator_list'))
+
+
+class ClienteView(View):
+    def del_cliente(self, request):
+        cliente = User.objects.get(pk=int(request.GET.get('pk')))
+        cliente.is_active = False
+        cliente.save()
+
+    def get(self, request, *args, **kwargs):
+        if request.GET.get('method') == 'del':
+            self.del_cliente(request)
+            return JsonResponse({'response': 'Cliente eliminato con successo'}, status=status.HTTP_200_OK)
+
+
+class AdminView(View):
+
+    def add_admin(self, request):
+        form = AdminForm(request.POST)
+        if form.is_valid():
+            form.save()
+
+            messages.add_message(request, messages.INFO, 'Nuova amministratore inserito con successo.')
+        else:
+            errors = ''
+            for err in form.errors.as_data():
+                errors += '<li>' + err + '</li>'
+            messages.add_message(request, messages.ERROR, 'Errore nell\'inserimento dell\'amministratore. Controlla il form.')
+
+    def mod_admin(self, request):
+        form = CustomUserCreationForm(data=request.POST, instance=User.objects.get(pk=int(self.request.POST.get('pk'))))
+        if form.is_valid():
+            form.save()
+
+            messages.add_message(request, messages.INFO, 'Admin aggiornato con successo.')
+        else:
+            errors = ''
+            for err in form.errors.as_data():
+                errors += '<li>' + err + '</li>'
+            messages.add_message(request, messages.ERROR, 'Errore nell\'aggiornamento dell\'admin. Controlla il form.')
+
+    def del_admin(self, request):
+        admin = User.objects.get(pk=int(request.GET.get('pk')))
+        admin.is_active = False
+        admin.save()
+
+    def get(self, request, *args, **kwargs):
+        if request.GET.get('method') == 'del':
+            self.del_admin(request)
+            return JsonResponse({'response': 'Admin eliminato con successo'}, status=status.HTTP_200_OK)
+        elif 'pk' in kwargs:
+            return render(request, 'add_mod_cliente.html', {'form': CustomUserCreationForm(instance=User.objects.get(pk=int(self.kwargs['pk'])))})
+        else:
+            return render(request, 'add_mod_cliente.html', {'form': AdminForm()})
+
+
+    def post(self, request, *args, **kwargs):
+        if 'mod' in request.POST:
+            self.mod_admin(request)
+        else:
+            self.add_admin(request)
+
+        return redirect(reverse('utenti:admin_list'))
+
 # from braces.views import GroupRequiredMixin
 # class SomeProtectedView(GroupRequiredMixin, TemplateView):
 #