From b6ad2e779e2a731fe81dd62bfa7e4112ce6344c4 Mon Sep 17 00:00:00 2001 From: Costantino Vitale Date: Fri, 14 Oct 2022 15:23:22 +0200 Subject: [PATCH] - Modifica saltaggio poi - Modifica salvataggio multimedia associati --- media/icon/default.png | Bin 0 -> 14842 bytes sistema/datatables.py | 22 +-- sistema/forms.py | 11 ++ sistema/models.py | 8 +- sistema/templates/add_mod_poi.html | 219 +++++++++++++++++++---------- sistema/views.py | 37 +++-- 6 files changed, 195 insertions(+), 102 deletions(-) create mode 100644 media/icon/default.png diff --git a/media/icon/default.png b/media/icon/default.png new file mode 100644 index 0000000000000000000000000000000000000000..d826176b11dce60c07d944f25831338f94480ee0 GIT binary patch literal 14842 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 M4TD={H>|_|KXK)REdT%j literal 0 HcmV?d00001 diff --git a/sistema/datatables.py b/sistema/datatables.py index db18796..6a17edb 100644 --- a/sistema/datatables.py +++ b/sistema/datatables.py @@ -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 '' #% row.pk + if column == 'media': + return f'vedi' if column == 'del': - return '' #% row.pk + return '' % 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 diff --git a/sistema/forms.py b/sistema/forms.py index f90e132..f00808f 100644 --- a/sistema/forms.py +++ b/sistema/forms.py @@ -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: diff --git a/sistema/models.py b/sistema/models.py index e083044..bbc1792 100644 --- a/sistema/models.py +++ b/sistema/models.py @@ -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) diff --git a/sistema/templates/add_mod_poi.html b/sistema/templates/add_mod_poi.html index 2808607..1d06cff 100644 --- a/sistema/templates/add_mod_poi.html +++ b/sistema/templates/add_mod_poi.html @@ -5,35 +5,101 @@
-

Gestione punti di interesse

-
-
- {% if form.instance.pk %} -

Modifica il punto di interesse #{{ form.instance.pk }}

- {% else %} -

Aggiungi una nuovo punto di interesse nel sistema

- {% endif %} +

Gestione + punti di interesse

+ + + +
+
+
+
+ {% if form.instance.pk %} +

Modifica il punto di interesse #{{ form.instance.pk }}

+ {% else %} +

Aggiungi una nuovo punto di interesse nel sistema

+ {% endif %} +
+
{% csrf_token %} +
+ {% if form.instance.pk %} + + + {% endif %} + {{ form | crispy }} +
+
+ +
+
+
-
-
{% csrf_token %} - {% if form.instance.pk %} - - - {% endif %} - {{form | crispy }} -
-
-
-
Multimedia
-
{% csrf_token %} - {{form_multimedia | crispy }} -
+
+
+
+

Lista file multimediali associati al punto di interesse

+
+
+
+
+ + + + + + + + + + + + + + +
+
+
-
@@ -41,60 +107,69 @@ diff --git a/sistema/views.py b/sistema/views.py index f50e355..596b01a 100644 --- a/sistema/views.py +++ b/sistema/views.py @@ -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 += '
  • ' + err + '
  • ' 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) -- 2.43.0