Adding tags is now possible
This commit is contained in:
		
							
								
								
									
										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}))
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user