]> git.atlas4tour.it Git - pia_atlas.git/commitdiff
- Modifica saltaggio poi
authorCostantino Vitale <costantino.vitale@dyrecta.com>
Fri, 14 Oct 2022 13:23:22 +0000 (15:23 +0200)
committerCostantino Vitale <costantino.vitale@dyrecta.com>
Fri, 14 Oct 2022 13:23:22 +0000 (15:23 +0200)
- Modifica salvataggio multimedia associati

media/icon/default.png [new file with mode: 0644]
sistema/datatables.py
sistema/forms.py
sistema/models.py
sistema/templates/add_mod_poi.html
sistema/views.py

diff --git a/media/icon/default.png b/media/icon/default.png
new file mode 100644 (file)
index 0000000..d826176
Binary files /dev/null and b/media/icon/default.png differ
index db187965944055dc9fb240415af545ec92e03177..6a17edb07f045415d1c9227bd7da1a4a9fa2e0a8 100644 (file)
@@ -3,6 +3,7 @@ from django.utils.html import escape
 from django.db.models import Q
 
 from sistema.models import Localita, Multimedia, TipologiaMultimedia, Percorso, PointOfInterest, Feedback, Gestisce
+from socoin_atlas.settings import MEDIA_URL
 
 
 class LocalitaDatatables(BaseDatatableView):
@@ -41,11 +42,14 @@ class LocalitaDatatables(BaseDatatableView):
 
 class MultimediaDatatables(BaseDatatableView):
     model = Multimedia
-    columns = ['id', 'tipologia', 'nome', 'descrizione', 'testo', 'mod', 'del']
-    order_columns = ['id', 'tipologia', 'nome', 'descrizione', 'testo', 'mod', 'del']
+    columns = ['id', 'tipologia', 'nome', 'descrizione', 'media', 'del']
+    order_columns = ['id', 'tipologia', 'nome', 'descrizione', 'media', 'del']
 
     def get_initial_queryset(self):
-        return self.model.objects.filter(is_active=True)
+        poi = self.request.GET.get('pk')
+        if poi:
+            return self.model.objects.filter(pk=int(poi), is_active=True)
+        return None
 
     def render_column(self, row, column):
         if column == 'id':
@@ -53,15 +57,13 @@ class MultimediaDatatables(BaseDatatableView):
         if column == 'tipologia':
             return escape('{0}'.format(row.tipologia.nome))
         if column == 'nome':
-            return escape('{0}'.format(row.provincia))
+            return escape('{0}'.format(row.nome))
         if column == 'descrizione':
             return escape('{0}'.format(row.descrizione))
-        if column == 'testo':
-            return escape('{0}'.format(row.testo))
-        if column == 'mod':
-            return '<a class="btn btn-sm btn-primary" href="#" ><i class="fas fa-edit"></i></a>' #% row.pk
+        if column == 'media':
+            return f'<a href=" {MEDIA_URL} {row.media} " target="_blank">vedi</a>'
         if column == 'del':
-            return '<a class="btn btn-sm btn-danger" href="#" ><i class="fas fa-trash"></i></a>' #% row.pk
+            return '<button class="btn btn-sm btn-danger" onclick="DeleteMultimedia(%s)"><i class="fas fa-trash"></i></button>' % row.pk
         else:
             return super(MultimediaDatatables, self).render_column(row, column)
 
@@ -190,7 +192,7 @@ class FeedbackDatatables(BaseDatatableView):
     def filter_queryset(self, qs):
         search = self.request.GET.get('search[value]', None)
         if search:
-            qs = qs.filter(Q(utente__icontains=search) | Q(valutazione__icontains=search))
+            qs = qs.filter(Q(utente__username__icontains=search) | Q(commento__icontains=search))
         return qs
 
 
index f90e1327185e8f1027062db71a8df241f50b99c5..f00808f37798774c9c63e9ee15e6df2f5414d596 100644 (file)
@@ -1,6 +1,7 @@
 
 from django.contrib.auth.forms import *
 from sistema.models import Localita, TipologiaMultimedia, Gestisce, PointOfInterest, Percorso, Multimedia
+from socoin_atlas.settings import MEDIA_URL
 
 
 class LocalitaForm(forms.ModelForm):
@@ -55,9 +56,19 @@ class PoiForm(forms.ModelForm):
 
     def __init__(self, *args, **kwargs):
         super(PoiForm, self).__init__(*args, **kwargs)
+        self.fields['icona'].required = False
         for f in self.fields:
             self.fields[f].widget.attrs.update({'class': 'form-control'})
 
+    def save(self, commit=True):
+        poi = super().save(commit=False)
+        if commit:
+            if not self.cleaned_data['media']:
+                poi.media = MEDIA_URL + 'icon/default.png'
+
+            poi.save()
+        return poi
+
 
 class PercorsoForm(forms.ModelForm):
     class Meta:
index e0830445c46689268b4b9573a98d60f2d7e593a6..bbc179205cbeeb6be61ac23673dc7a6a2abc4408 100644 (file)
@@ -3,7 +3,7 @@ from django.contrib.auth.models import User
 from django.utils import timezone
 from rest_framework import serializers
 
-from socoin_atlas.settings import MEDIA_ROOT, STATICFILES_DIRS, STATIC_URL
+from socoin_atlas.settings import MEDIA_URL
 
 
 class Localita(models.Model):
@@ -29,6 +29,7 @@ class PointOfInterest(models.Model):
     nome = models.CharField(max_length=255, null=False)
     lat = models.FloatField()
     long = models.FloatField()
+    icona = models.FileField(upload_to='icon/', null=True)
     is_active = models.BooleanField(default=True)
 
 
@@ -88,11 +89,6 @@ class Multimedia(models.Model):
     testo = models.TextField(max_length=255, null=False)
     is_active = models.BooleanField(default=True)
 
-    def save(self, *args, **kwargs):
-        if not self.media:
-            self.media = STATIC_URL + 'assets/img/image-64.png'
-        super().save()
-
 
 class Feedback(models.Model):
     utente = models.ForeignKey(User, on_delete=models.DO_NOTHING)
index 2808607749c801abd8186a5db92e4d69403ea7f3..1d06cffcb2c4b2b354f3da99abf189fc5b968760 100644 (file)
 
     <div class="row">
         <div class="col-12 col-md-12 col-lg-12">
-            <h1 class="line-bolle"><i class="fa-solid fa-location-dot clr-bolle mr-2" aria-hidden="true"></i> Gestione punti di interesse </h1>
-            <div class="card">
-                <div class="card-header">
-                    {% if form.instance.pk %}
-                    <h4 class="clr-config">Modifica il punto di interesse #{{ form.instance.pk }}</h4>
-                    {% else %}
-                    <h4 class="clr-config">Aggiungi una nuovo punto di interesse nel sistema</h4>
-                    {% endif %}
+            <h1 class="line-bolle"><i class="fa-solid fa-location-dot clr-bolle mr-2" aria-hidden="true"></i> Gestione
+                punti di interesse </h1>
+
+            <ul class="nav nav-pills mb-3" id="myTab2" role="tablist">
+                <li class="nav-item">
+                    <a class="nav-link active" id="generale-tab" data-bs-toggle="tab" href="#generale"
+                       role="tab"
+                       aria-selected="false">Punto di interesse</a>
+                </li>
+                {% if form.instance.pk %}
+                    <li class="nav-item">
+                        <a class="nav-link" id="multimedia-tab" data-bs-toggle="tab" href="#multimedia"
+                           role="tab" aria-selected="false">File multimediali</a>
+                    </li>
+                {% endif %}
+            </ul>
+
+            <div class="tab-content" id="myTab3Content">
+                <div class="tab-pane fade show active" id="generale" role="tabpanel" aria-labelledby="generale-tab">
+                    <div class="card">
+                        <div class="card-header">
+                            {% if form.instance.pk %}
+                                <h4 class="clr-config">Modifica il punto di interesse #{{ form.instance.pk }}</h4>
+                            {% else %}
+                                <h4 class="clr-config">Aggiungi una nuovo punto di interesse nel sistema</h4>
+                            {% endif %}
+                        </div>
+                        <form method="POST" id="poi_form" action="{% url 'sistema:poi' %}">{% csrf_token %}
+                            <div class="card-body">
+                                {% if form.instance.pk %}
+                                    <input type="hidden" name="mod" form="poi_form">
+                                    <input type="hidden" name="pk" value="{{ form.instance.pk }}" form="poi_form">
+                                {% endif %}
+                                {{ form | crispy }}
+                                <br>
+                            </div>
+                            <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 class="card-body">
-                    <form method="POST" id="poi_form" action="{% url 'sistema:poi' %}">{% csrf_token %}
-                        {% if form.instance.pk %}
-                            <input type="hidden" name="mod" form="poi_form">
-                            <input type="hidden" name="pk" value="{{ form.instance.pk }}" form="poi_form">
-                        {% endif %}
-                            {{form | crispy }}
-                            <br>
-                    </form>
-                    <hr>
-                    <div class="section-title mt-0">Multimedia</div>
-                    <form method="POST" id="multimedia_form" action="{% url 'sistema:poi' %}">{% csrf_token %}
-                        {{form_multimedia | crispy }}
-                    </form>
+            <div class="tab-pane fade" id="multimedia" role="tabpanel" aria-labelledby="multimedia-tab">
+                <div class="card">
+                    <div class="card-header">
+                        <h4 class="clr-config">Lista file multimediali associati al punto di interesse</h4>
+                    </div>
+                    <div class="card-body">
+                        <div class="row">
+                            <div class="table-responsive">
+                                <table id="multimedia-table"
+                                       class="table table-sm table-bordered table-striped dataTables_wrapper dt-bootstrap4 no-footer"
+                                       style="width: 100% !important;">
+                                    <thead>
+                                    <tr>
+                                        <th>#</th>
+                                        <th>Tipologia</th>
+                                        <th>Nome</th>
+                                        <th>Descrizione</th>
+                                        <th>Media</th>
+                                        <th></th>
+                                    </tr>
+                                    </thead>
+                                    <tbody>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
                 </div>
 
-                <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 class="card">
+                    <div class="card-header">
+                        <h4 class="clr-config">Inserisci file multimediali per il punto di interesse</h4>
+                    </div>
+                    <form method="POST" id="multimedia_form" action="{% url 'sistema:poi' %}">{% csrf_token %}
+                        <div class="card-body">
+                            {% if form.instance.pk %}
+                                <input type="hidden" name="add-multimedia" form="multimedia_form">
+                                <input type="hidden" name="pk_multimedia" value="{{ form.instance.pk }}"
+                                       form="multimedia_form">
+                            {% endif %}
+                            {{ form_multimedia | crispy }}
+                        </div>
+                        <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>
 
 
     <script>
-        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(){
-            poi_form = objectifyForm($('#poi_form').serializeArray());
-            multimedia_form = objectifyForm($('#multimedia_form').serializeArray());
 
-            method = ''
-            pk_poi_form = ''
-            pk_multimedia_form = ''
+        $(document).ready(function () {
             {% if form.instance.pk %}
-                method = 'mod'
-                pk_poi_form = {{ form.instance.pk }}
-                pk_multimedia_form = {{ form_multimedia.instance.pk }}
+                $('#multimedia-table').dataTable({
+                    processing: true,
+                    serverSide: true,
+                    ajax: {
+                        "url": "{% url 'sistema:multimedia_datatables' %}",
+                        "type": 'GET',
+                        "data": {'pk': {{ form.instance.pk }} },
+                    },
+                    language: {
+                        url: "//cdn.datatables.net/plug-ins/1.10.20/i18n/Italian.json"
+                    },
+                    columnDefs: [
+                        {"targets": 5, "orderable": false, "width": "5%"},
+                    ],
+                    "order": []
+                });
             {% endif %}
+        });
 
-          $.ajax({
-                data: {
-                    'poi_form': JSON.stringify(poi_form),
-                    'multimedia_form': JSON.stringify(multimedia_form),
-                    'pk_poi_form': pk_poi_form,
-                    'pk_multimedia_form': pk_multimedia_form,
-                    'method': method,
-                },
-                type: "POST",
-                url: '{% url 'sistema:poi' %}',
-                "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>'
-                        }
+        function DeleteMultimedia(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-multimedia',
+                            },
+                            url: '{% url 'sistema:poi' %}',
+                            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'
+                        )
                     }
-                    Swal.fire("Attenzione!", errore, "error")
-
                 });
+            }
 
-        }
     </script>
 
 
index f50e3552166c67c8ed43ee091b699ff402b85f55..596b01ab31854fb680507dd3d47b0f7c92284b02 100644 (file)
@@ -179,16 +179,13 @@ class PoiView(View):#PermissionRequiredMixin
         return JsonResponse({'response': poi_coords}, status=status.HTTP_200_OK)
 
     def add_poi(self, request):
-        form = PoiForm(data=json.loads(request.POST.get('poi_form')))
+        '''
+            bisogna controllare il salvataggio dei media nel form multimedia
+        '''
+        form = PoiForm(request.POST)
         if form.is_valid():
             form.save()
 
-            multimedia_form = MultimediaForm(data=json.loads(request.POST.get('multimedia_form')))
-            if multimedia_form.is_valid():
-                multimedia = multimedia_form.save(commit=False)
-                multimedia.poi = form.instance
-                multimedia.save()
-
             messages.add_message(request, messages.INFO, 'Nuova punto di interesse inserito con successo.')
         else:
             errors = ''
@@ -196,15 +193,18 @@ class PoiView(View):#PermissionRequiredMixin
                 errors += '<li>' + err + '</li>'
             messages.add_message(request, messages.ERROR, 'Errore nell\'inserimento del punto di interesse. Controlla il form.')
 
+    def add_multimedia(self, request):
+        multimedia_form = MultimediaForm(request.POST)
+        if multimedia_form.is_valid():
+            multimedia = multimedia_form.save(commit=False)
+            multimedia.poi = PointOfInterest.objects.get(pk=int(self.request.POST.get('pk_multimedia')))
+            multimedia.save()
+
     def mod_poi(self, request):
         form = PoiForm(request.POST, instance=PointOfInterest.objects.get(pk=int(self.request.POST.get('pk'))))
         if form.is_valid():
             form.save()
 
-            multimedia_form = MultimediaForm(data=json.loads(request.POST.get('multimedia_form')), instance=Multimedia.objects.get(pk=int(self.request.POST.get('pk_multimedia_form'))))
-            if multimedia_form.is_valid():
-                multimedia_form.save()
-
             messages.add_message(request, messages.INFO, 'Punto di interesse aggiornata con successo.')
         else:
             errors = ''
@@ -217,20 +217,29 @@ class PoiView(View):#PermissionRequiredMixin
         tipologia.is_active = False
         tipologia.save()
 
+    def del_multimedia(self, request):
+        multimedia = Multimedia.objects.get(pk=int(request.GET.get('pk')))
+        multimedia.is_active = False
+        multimedia.save()
+
     def get(self, request, *args, **kwargs):
         if request.GET.get('method') == 'del':
             self.del_poi(request)
-
+            return JsonResponse({'response': 'Punto di interesse eliminato con successo'}, status=status.HTTP_200_OK)
+        elif request.GET.get('method') == 'del-multimedia':
+            self.del_multimedia(request)
             return JsonResponse({'response': 'Punto di interesse eliminato con successo'}, status=status.HTTP_200_OK)
         elif 'pk' in kwargs:
             return render(request, 'add_mod_poi.html', {'form': PoiForm(instance=PointOfInterest.objects.get(pk=int(self.kwargs['pk']))),
-                                                        'form_multimedia': MultimediaForm(instance=Multimedia.objects.get(poi_id=int(self.kwargs['pk'])))})
+                                                        'form_multimedia': MultimediaForm()})
         else:
             return render(request, 'add_mod_poi.html', {'form': PoiForm(), 'form_multimedia': MultimediaForm()})
 
     def post(self, request, *args, **kwargs):
-        if self.request.POST.get('method') == 'mod':
+        if 'mod' in request.POST:
             self.mod_poi(request)
+        elif 'add-multimedia'in request.POST:
+            self.add_multimedia(request)
         else:
             self.add_poi(request)