Adding tags is now possible
This commit is contained in:
parent
490a0e9f3e
commit
66581a9d2d
1
Pipfile
1
Pipfile
@ -12,6 +12,7 @@ easy-thumbnails = "*"
|
|||||||
image = "*"
|
image = "*"
|
||||||
django-widget-tweaks = "*"
|
django-widget-tweaks = "*"
|
||||||
django-svg-icons = "*"
|
django-svg-icons = "*"
|
||||||
|
django-taggit = "*"
|
||||||
|
|
||||||
# Commented out to not explicitly specify Python 3 subversion.
|
# Commented out to not explicitly specify Python 3 subversion.
|
||||||
# [requires]
|
# [requires]
|
||||||
|
@ -43,7 +43,8 @@ INSTALLED_APPS = [
|
|||||||
'django.contrib.messages',
|
'django.contrib.messages',
|
||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
'easy_thumbnails',
|
'easy_thumbnails',
|
||||||
'widget_tweaks'
|
'widget_tweaks',
|
||||||
|
'taggit'
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
@ -48,3 +48,7 @@ class PlaceImageCreateForm(forms.ModelForm):
|
|||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
self.fields['filename'].required = False
|
self.fields['filename'].required = False
|
||||||
|
|
||||||
|
|
||||||
|
class TagSubmitForm(forms.Form):
|
||||||
|
tag_list = forms.CharField(max_length=500)
|
@ -10,6 +10,7 @@ from django.db import models
|
|||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.contrib.auth.models import AbstractUser
|
from django.contrib.auth.models import AbstractUser
|
||||||
from easy_thumbnails.fields import ThumbnailerImageField
|
from easy_thumbnails.fields import ThumbnailerImageField
|
||||||
|
from taggit.managers import TaggableManager
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
|
|
||||||
@ -55,6 +56,7 @@ class Place (models.Model):
|
|||||||
longitude = models.FloatField()
|
longitude = models.FloatField()
|
||||||
description = models.TextField()
|
description = models.TextField()
|
||||||
|
|
||||||
|
tags = TaggableManager(blank=True)
|
||||||
# Get center position of LP-geocoordinates.
|
# Get center position of LP-geocoordinates.
|
||||||
|
|
||||||
def average_latlon(place_list):
|
def average_latlon(place_list):
|
||||||
|
@ -17,10 +17,8 @@
|
|||||||
{% block title %}{{place.name}}{% endblock %}
|
{% block title %}{{place.name}}{% endblock %}
|
||||||
|
|
||||||
{% block additional_menu_items %}
|
{% block additional_menu_items %}
|
||||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_edit' pk=place.pk %}" class="LP-Link"><span
|
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_edit' pk=place.pk %}" class="LP-Link"><span class="LP-Link__Text">Edit place</span></a></li>
|
||||||
class="LP-Link__Text">Edit place</span></a></li>
|
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_delete' pk=place.pk %}" class="LP-Link"><span class="LP-Link__Text">Delete place</span></a></li>
|
||||||
<li class="LP-Menu__Item LP-Menu__Item--additional"><a href="{% url 'place_delete' pk=place.pk %}" class="LP-Link"><span
|
|
||||||
class="LP-Link__Text">Delete place</span></a></li>
|
|
||||||
{% endblock additional_menu_items %}
|
{% endblock additional_menu_items %}
|
||||||
|
|
||||||
{% block maincontent %}
|
{% block maincontent %}
|
||||||
@ -40,24 +38,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<section class="LP-Section">
|
<section class="LP-Section">
|
||||||
<h1 class="LP-Headline">Map-Links</h1>
|
<!--
|
||||||
{% include 'partials/osm_map.html' %}
|
|
||||||
<div class="LP-LinkList">
|
|
||||||
<ul class="LP-LinkList__Container">
|
|
||||||
<li class="LP-LinkList__Item"><a target="_blank"
|
|
||||||
href="https://www.google.com/maps?q={{place.latitude}},{{place.longitude}}"
|
|
||||||
class="LP-Link"><span class="LP-Text">Google Maps</span></a></li>
|
|
||||||
<li class="LP-LinkList__Item"><a target="_blank"
|
|
||||||
href="https://www.tim-online.nrw.de/tim-online2/?center={{place.latitude}},{{place.longitude}}&icon=true&bg=dop"
|
|
||||||
class="LP-Link"><span class="LP-Text">TIM Online</span></a></li>
|
|
||||||
<li class="LP-LinkList__Item"><a target="_blank"
|
|
||||||
href="http://www.openstreetmap.org/?mlat={{place.latitude}}&mlon={{place.longitude}}&zoom=16"
|
|
||||||
class="LP-Link"><span class="LP-Text">OSM</span></a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="LP-Section">
|
|
||||||
<input name='basic' value='tag1, tag2'>
|
<input name='basic' value='tag1, tag2'>
|
||||||
<script>
|
<script>
|
||||||
// The DOM element you wish to replace with Tagify
|
// The DOM element you wish to replace with Tagify
|
||||||
@ -67,10 +48,50 @@
|
|||||||
new Tagify(input, {
|
new Tagify(input, {
|
||||||
'whitelist': ['wurstwasser']
|
'whitelist': ['wurstwasser']
|
||||||
})
|
})
|
||||||
</script>
|
</script>-->
|
||||||
|
|
||||||
|
<div class="LP-TagList">
|
||||||
|
<ul class="LP-TagList__List">
|
||||||
|
{% for tag in place.tags.all %}
|
||||||
|
<li class="LP-TagList__Item">
|
||||||
|
<div class="LP-Tag">
|
||||||
|
<p class="LP-Paragraph">{{tag}}</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form class="LP-Form LP-Form--inline" method="POST" action="{% url 'place_tag_submit' place_id=place.id %}">
|
||||||
|
<fieldset class="LP-Form__Fieldset">
|
||||||
|
<legend class="LP-Form__Legend">Tags hinzufügen</legend>
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="LP-Form__Composition LP-Form__Composition--breakable">
|
||||||
|
<div class="LP-Form__Field">
|
||||||
|
{% include 'partials/form/inputField.html' with field=tagging_form.tag_list %}
|
||||||
|
</div>
|
||||||
|
<div class="LP-Form__Field LP-Form__Button LP-Input">
|
||||||
|
<button class="LP-Button">hinzufügen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
</form>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="LP-Section">
|
<section class="LP-Section">
|
||||||
|
<h1 class="LP-Headline">Map-Links</h1>
|
||||||
|
{% include 'partials/osm_map.html' %}
|
||||||
|
<div class="LP-LinkList">
|
||||||
|
<ul class="LP-LinkList__Container">
|
||||||
|
<li class="LP-LinkList__Item"><a target="_blank" href="https://www.google.com/maps?q={{place.latitude}},{{place.longitude}}" class="LP-Link"><span class="LP-Text">Google Maps</span></a></li>
|
||||||
|
<li class="LP-LinkList__Item"><a target="_blank" href="https://www.tim-online.nrw.de/tim-online2/?center={{place.latitude}},{{place.longitude}}&icon=true&bg=dop" class="LP-Link"><span class="LP-Text">TIM Online</span></a></li>
|
||||||
|
<li class="LP-LinkList__Item"><a target="_blank" href="http://www.openstreetmap.org/?mlat={{place.latitude}}&mlon={{place.longitude}}&zoom=16" class="LP-Link"><span class="LP-Text">OSM</span></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class=" LP-Section">
|
||||||
<h1 class="LP-Headline">Photoalben</h1>
|
<h1 class="LP-Headline">Photoalben</h1>
|
||||||
<div class="LP-LinkList">
|
<div class="LP-LinkList">
|
||||||
<ul class="LP-LinkList__Container">
|
<ul class="LP-LinkList__Container">
|
||||||
@ -91,9 +112,7 @@
|
|||||||
<li class="LP-LinkList__Item">
|
<li class="LP-LinkList__Item">
|
||||||
<a href="{% url 'photo_album_create' place_id=place.id %}" class="LP-Link">
|
<a href="{% url 'photo_album_create' place_id=place.id %}" class="LP-Link">
|
||||||
<div class="RV-Iconized__Container RV-Iconized__Container--small">
|
<div class="RV-Iconized__Container RV-Iconized__Container--small">
|
||||||
<svg class="RV-Iconized__Icon" version="1.1" id="Capa_1"
|
<svg class="RV-Iconized__Icon" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512 512" xml:space="preserve">
|
||||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
x="0px" y="0px" viewBox="0 0 512 512" xml:space="preserve">
|
|
||||||
<g>
|
<g>
|
||||||
<path d="M492,236H276V20c0-11.046-8.954-20-20-20c-11.046,0-20,8.954-20,20v216H20c-11.046,0-20,8.954-20,20s8.954,20,20,20h216
|
<path d="M492,236H276V20c0-11.046-8.954-20-20-20c-11.046,0-20,8.954-20,20v216H20c-11.046,0-20,8.954-20,20s8.954,20,20,20h216
|
||||||
v216c0,11.046,8.954,20,20,20s20-8.954,20-20V276h216c11.046,0,20-8.954,20-20C512,244.954,503.046,236,492,236z" />
|
v216c0,11.046,8.954,20,20,20s20-8.954,20-20V276h216c11.046,0,20-8.954,20-20C512,244.954,503.046,236,492,236z" />
|
||||||
@ -113,8 +132,7 @@
|
|||||||
<ul class="LP-ImageGrid__Container">
|
<ul class="LP-ImageGrid__Container">
|
||||||
{% for place_image in place.images.all %}
|
{% for place_image in place.images.all %}
|
||||||
<li class="LP-ImageGrid__Item">
|
<li class="LP-ImageGrid__Item">
|
||||||
<a href="{{ place_image.filename.large.url }}" class="LP-Link"><img class="LP-Image"
|
<a href="{{ place_image.filename.large.url }}" class="LP-Link"><img class="LP-Image" src="{{ place_image.filename.thumbnail.url }}"></a>
|
||||||
src="{{ place_image.filename.thumbnail.url }}"></a>
|
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -8,7 +8,8 @@ from .views import (
|
|||||||
PlaceUpdateView,
|
PlaceUpdateView,
|
||||||
PlaceDeleteView,
|
PlaceDeleteView,
|
||||||
PhotoAlbumCreateView,
|
PhotoAlbumCreateView,
|
||||||
PhotoAlbumDeleteView
|
PhotoAlbumDeleteView,
|
||||||
|
PlaceTagSubmitView
|
||||||
)
|
)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@ -20,5 +21,6 @@ urlpatterns = [
|
|||||||
path('photo_album/delete/<int:pk>', PhotoAlbumDeleteView.as_view(), name='photo_album_delete'),
|
path('photo_album/delete/<int:pk>', PhotoAlbumDeleteView.as_view(), name='photo_album_delete'),
|
||||||
path('place/update/<int:pk>/', PlaceUpdateView.as_view(), name='place_edit'),
|
path('place/update/<int:pk>/', PlaceUpdateView.as_view(), name='place_edit'),
|
||||||
path('place/delete/<int:pk>/', PlaceDeleteView.as_view(), name='place_delete'),
|
path('place/delete/<int:pk>/', PlaceDeleteView.as_view(), name='place_delete'),
|
||||||
path('place/', PlaceListView.as_view(), name='place_list')
|
path('place/', PlaceListView.as_view(), name='place_list'),
|
||||||
|
path('place/tag/<int:place_id>', PlaceTagSubmitView.as_view(), name='place_tag_submit'),
|
||||||
]
|
]
|
||||||
|
@ -11,7 +11,7 @@ from django.urls import reverse_lazy
|
|||||||
|
|
||||||
from lostplaces_app.models import Place, PlaceImage
|
from lostplaces_app.models import Place, PlaceImage
|
||||||
from lostplaces_app.views import IsAuthenticated, IsPlaceSubmitter
|
from lostplaces_app.views import IsAuthenticated, IsPlaceSubmitter
|
||||||
from lostplaces_app.forms import PlaceForm, PlaceImageCreateForm
|
from lostplaces_app.forms import PlaceForm, PlaceImageCreateForm, TagSubmitForm
|
||||||
|
|
||||||
class PlaceListView(IsAuthenticated, ListView):
|
class PlaceListView(IsAuthenticated, ListView):
|
||||||
paginate_by = 5
|
paginate_by = 5
|
||||||
@ -30,7 +30,8 @@ class PlaceDetailView(IsAuthenticated, View):
|
|||||||
context = {
|
context = {
|
||||||
'place': place,
|
'place': place,
|
||||||
'place_list': [ place ],
|
'place_list': [ place ],
|
||||||
'place_map_center': [ place.latitude, place.longitude ]
|
'place_map_center': [ place.latitude, place.longitude ],
|
||||||
|
'tagging_form': TagSubmitForm()
|
||||||
}
|
}
|
||||||
return render(request, 'place/place_detail.html', context)
|
return render(request, 'place/place_detail.html', context)
|
||||||
|
|
||||||
|
@ -6,8 +6,9 @@ from django.contrib import messages
|
|||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
from django.shortcuts import render, redirect
|
from django.shortcuts import render, redirect
|
||||||
|
|
||||||
from lostplaces_app.forms import ExplorerCreationForm
|
from lostplaces_app.forms import ExplorerCreationForm, TagSubmitForm
|
||||||
from lostplaces_app.models import Place, PhotoAlbum
|
from lostplaces_app.models import Place, PhotoAlbum
|
||||||
|
from lostplaces_app.views.base_views import IsAuthenticated
|
||||||
|
|
||||||
from lostplaces_app.views.base_views import (
|
from lostplaces_app.views.base_views import (
|
||||||
PlaceAssetCreateView,
|
PlaceAssetCreateView,
|
||||||
@ -40,3 +41,18 @@ class PhotoAlbumDeleteView(PlaceAssetDeleteView):
|
|||||||
pk_url_kwarg = 'pk'
|
pk_url_kwarg = 'pk'
|
||||||
success_message = 'Photo Album deleted'
|
success_message = 'Photo Album deleted'
|
||||||
permission_denied_messsage = 'You do not have permissions to alter this photo album'
|
permission_denied_messsage = 'You do not have permissions to alter this photo album'
|
||||||
|
|
||||||
|
class PlaceTagSubmitView(IsAuthenticated, View):
|
||||||
|
def post(self, request, place_id, *args, **kwargs):
|
||||||
|
place = Place.objects.get(pk=place_id)
|
||||||
|
form = TagSubmitForm(request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
tag_list_raw = form.cleaned_data['tag_list']
|
||||||
|
tag_list_raw = tag_list_raw.strip().split(',')
|
||||||
|
tag_list = []
|
||||||
|
for tag in tag_list_raw:
|
||||||
|
tag_list.append(tag.strip())
|
||||||
|
place.tags.add(*tag_list)
|
||||||
|
place.save()
|
||||||
|
|
||||||
|
return redirect(reverse_lazy('place_detail', kwargs={'pk': place.id}))
|
||||||
|
Loading…
Reference in New Issue
Block a user