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):
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':
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)
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
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):
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:
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):
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)
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)
<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>
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 = ''
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 = ''
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)