Merge commit '6f6bd6376d1ef2410a728cff2e9b883560c7f5c1' into feature/30-user-profile-fields
This commit is contained in:
		@@ -0,0 +1,22 @@
 | 
			
		||||
# Generated by Django 3.1.1 on 2020-10-04 19:37
 | 
			
		||||
# Edited by reverend
 | 
			
		||||
 | 
			
		||||
import datetime
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
import django.utils.timezone
 | 
			
		||||
from django.utils.timezone import utc
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('lostplaces', '0001_initial'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.DeleteModel(
 | 
			
		||||
            name='Voucher'
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.DeleteModel(
 | 
			
		||||
            name='Expireable'
 | 
			
		||||
        )
 | 
			
		||||
    ]
 | 
			
		||||
@@ -6,7 +6,7 @@ from django.db import migrations, models
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('lostplaces', '0002_reomve_vouchers'),
 | 
			
		||||
        ('lostplaces', '0002_remove_vouchers'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ from django.dispatch import receiver
 | 
			
		||||
from django.utils.translation import ugettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from lostplaces.models.abstract_models import Expireable
 | 
			
		||||
from lostplaces.models.place import Place
 | 
			
		||||
 | 
			
		||||
from easy_thumbnails.fields import ThumbnailerImageField
 | 
			
		||||
from easy_thumbnails.files import get_thumbnailer
 | 
			
		||||
@@ -49,6 +50,13 @@ class Explorer(models.Model):
 | 
			
		||||
        help_text=_('Optional profile pic for display in explorer profile')
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    favorite_places = models.ManyToManyField(
 | 
			
		||||
        Place,
 | 
			
		||||
        related_name='favorite_places',
 | 
			
		||||
        verbose_name='Explorers favorite places',
 | 
			
		||||
        blank=True
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return self.user.username
 | 
			
		||||
        
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										163
									
								
								django_lostplaces/lostplaces/static/icons/favourite_filled.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								django_lostplaces/lostplaces/static/icons/favourite_filled.svg
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
		 After Width: | Height: | Size: 108 KiB  | 
@@ -61,65 +61,63 @@
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<section class="LP-Section">
 | 
			
		||||
	<div class="LP-PlaceList">
 | 
			
		||||
		<h1 class="LP-Headline">{% trans 'Places submitted by' %} {{explorer.user.username}}</h1>
 | 
			
		||||
		<ul class="LP-PlaceList__List">
 | 
			
		||||
			{% for place in place_list %}
 | 
			
		||||
			<li class="LP-PlaceList__Item">
 | 
			
		||||
				<a href="{% url 'place_detail' pk=place.pk %}" class="LP-Link">
 | 
			
		||||
					{% include 'partials/place_teaser.html' with place=place extended=True %}
 | 
			
		||||
				</a>
 | 
			
		||||
			</li>
 | 
			
		||||
			{% endfor %}
 | 
			
		||||
		</ul>
 | 
			
		||||
    <div class="LP-PlaceList">
 | 
			
		||||
        <h1 class="LP-Headline">{% trans 'Places submitted by' %} {{explorer.user.username}}</h1>
 | 
			
		||||
        <ul class="LP-PlaceList__List">
 | 
			
		||||
            {% for place in place_list %}
 | 
			
		||||
            <li class="LP-PlaceList__Item">
 | 
			
		||||
                {% include 'partials/place_teaser.html' with place=place extended=True %}
 | 
			
		||||
            </li>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </ul>
 | 
			
		||||
 | 
			
		||||
		{% include 'partials/nav/pagination.html' %}
 | 
			
		||||
        {% include 'partials/nav/pagination.html' %}
 | 
			
		||||
 | 
			
		||||
	</div>
 | 
			
		||||
    </div>
 | 
			
		||||
</section>
 | 
			
		||||
 | 
			
		||||
<section class="LP-Section">
 | 
			
		||||
	<h1 class="LP-Headline">{% trans 'Images submitted by' %} {{explorer.user.username}}</h1>
 | 
			
		||||
	<div class="LP-ImageGrid">
 | 
			
		||||
		<ul class="LP-ImageGrid__Container">
 | 
			
		||||
			{% for place_image in assets.placeimages.all %}
 | 
			
		||||
			<li class="LP-ImageGrid__Item">
 | 
			
		||||
				<a href="{{ place_image.filename.large.url }}" class="LP-Link">
 | 
			
		||||
					<img class="LP-Image" src="{{ place_image.filename.thumbnail.url }}">
 | 
			
		||||
				</a>
 | 
			
		||||
				{% if user.explorer == place_image.submitted_by%}
 | 
			
		||||
				<span class="LP-ImageGrid__DeleteItem" title="Bild löschen">
 | 
			
		||||
					<a href="{% url 'place_image_delete' pk=place_image.id %}" class="LP-Link">
 | 
			
		||||
						<img class="LP-Icon" src="{% static 'icons/cancel.svg' %}" />
 | 
			
		||||
					</a>
 | 
			
		||||
				</span>
 | 
			
		||||
				{% endif %}
 | 
			
		||||
			</li>
 | 
			
		||||
			{% endfor %}
 | 
			
		||||
		</ul>
 | 
			
		||||
	</div>
 | 
			
		||||
    <h1 class="LP-Headline">{% trans 'Images submitted by' %} {{explorer.user.username}}</h1>
 | 
			
		||||
    <div class="LP-ImageGrid">
 | 
			
		||||
        <ul class="LP-ImageGrid__Container">
 | 
			
		||||
            {% for place_image in assets.placeimages.all %}
 | 
			
		||||
            <li class="LP-ImageGrid__Item">
 | 
			
		||||
                <a href="{{ place_image.filename.large.url }}" class="LP-Link">
 | 
			
		||||
                    <img class="LP-Image" src="{{ place_image.filename.thumbnail.url }}">
 | 
			
		||||
                </a>
 | 
			
		||||
                {% if user.explorer == place_image.submitted_by%}
 | 
			
		||||
                <span class="LP-ImageGrid__DeleteItem" title="Bild löschen">
 | 
			
		||||
                    <a href="{% url 'place_image_delete' pk=place_image.id %}" class="LP-Link">
 | 
			
		||||
                        <img class="LP-Icon" src="{% static 'icons/cancel.svg' %}" />
 | 
			
		||||
                    </a>
 | 
			
		||||
                </span>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </li>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </ul>
 | 
			
		||||
    </div>
 | 
			
		||||
</section>
 | 
			
		||||
 | 
			
		||||
<section class=" LP-Section">
 | 
			
		||||
	<h1 class="LP-Headline">{% trans 'Photo albums submitted by' %} {{explorer.user.username}}</h1>
 | 
			
		||||
	<div class="LP-LinkList">
 | 
			
		||||
		<ul class="LP-LinkList__Container">
 | 
			
		||||
			{% for photo_album in assets.photoalbums.all %}
 | 
			
		||||
			<li class="LP-LinkList__Item">
 | 
			
		||||
				<a target="_blank" href="{{photo_album.url}}" class="LP-Link">
 | 
			
		||||
					<span class="LP-Text">{{photo_album.label}}</span>
 | 
			
		||||
				</a>
 | 
			
		||||
				{% if user.explorer == photo_album.submitted_by%}
 | 
			
		||||
				<a href="{% url 'photo_album_delete' pk=photo_album.pk%}" class="LP-Link LP-LinkList__ItemHover" title="Delete Photo Album">
 | 
			
		||||
					<div class="RV-Iconized__Container RV-Iconized__Container--small">
 | 
			
		||||
						{% icon 'trash' className="RV-Iconized__Icon" %}
 | 
			
		||||
					</div>
 | 
			
		||||
				</a>
 | 
			
		||||
				{% endif %}
 | 
			
		||||
			</li>
 | 
			
		||||
			{% endfor %}
 | 
			
		||||
		</ul>
 | 
			
		||||
	</div>
 | 
			
		||||
    <h1 class="LP-Headline">{% trans 'Photo albums submitted by' %} {{explorer.user.username}}</h1>
 | 
			
		||||
    <div class="LP-LinkList">
 | 
			
		||||
        <ul class="LP-LinkList__Container">
 | 
			
		||||
            {% for photo_album in assets.photoalbums.all %}
 | 
			
		||||
            <li class="LP-LinkList__Item">
 | 
			
		||||
                <a target="_blank" href="{{photo_album.url}}" class="LP-Link">
 | 
			
		||||
                    <span class="LP-Text">{{photo_album.label}}</span>
 | 
			
		||||
                </a>
 | 
			
		||||
                {% if user.explorer == photo_album.submitted_by%}
 | 
			
		||||
                <a href="{% url 'photo_album_delete' pk=photo_album.pk%}" class="LP-Link LP-LinkList__ItemHover" title="Delete Photo Album">
 | 
			
		||||
                    <div class="RV-Iconized__Container RV-Iconized__Container--small">
 | 
			
		||||
                        {% icon 'trash' className="RV-Iconized__Icon" %}
 | 
			
		||||
                    </div>
 | 
			
		||||
                </a>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </li>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </ul>
 | 
			
		||||
    </div>
 | 
			
		||||
</section>
 | 
			
		||||
 | 
			
		||||
{% endblock maincontent %}
 | 
			
		||||
@@ -21,9 +21,7 @@
 | 
			
		||||
    <ul class="LP-PlaceGrid__Grid">
 | 
			
		||||
        {% for place in place_list %}
 | 
			
		||||
        <li class="LP-PlaceGrid__Item">
 | 
			
		||||
            <a href="{% url 'place_detail' pk=place.pk %}" class="LP-Link">
 | 
			
		||||
                {% include 'partials/place_teaser.html' with place=place%}
 | 
			
		||||
            </a>
 | 
			
		||||
            {% include 'partials/place_teaser.html' with place=place%}
 | 
			
		||||
        </li>
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
    </ul>
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
{%load static %}
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
 | 
			
		||||
{% if request.user %}
 | 
			
		||||
{% if place in request.user.explorer.favorite_places.all %}
 | 
			
		||||
<a href="{% url 'place_unfavorite' place_id=place.id %}" class="LP-Link" title="{% trans 'Remove from favorites' %}">
 | 
			
		||||
    <img class="LP-Icon" src="{% static '/icons/favourite_filled.svg' %}" />
 | 
			
		||||
</a>
 | 
			
		||||
{%else%}
 | 
			
		||||
<a href="{% url 'place_favorite' place_id=place.id %}" class="LP-Link" title="{% trans 'Save as favorite' %}">
 | 
			
		||||
    <img class="LP-Icon" src="{% static '/icons/favourite.svg' %}" />
 | 
			
		||||
</a>
 | 
			
		||||
{% endif %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
@@ -1,13 +1,15 @@
 | 
			
		||||
{%load static %}
 | 
			
		||||
 | 
			
		||||
<article class="LP-PlaceTeaser {% if extended %} LP-PlaceTeaser--extended{% endif %}">
 | 
			
		||||
    <div class="LP-PlaceTeaser__Image">
 | 
			
		||||
        {% if place.placeimages.all|length > 0 %}
 | 
			
		||||
    <a href="{% url 'place_detail' pk=place.pk %}" class="LP-Link">
 | 
			
		||||
        <div class="LP-PlaceTeaser__Image">
 | 
			
		||||
            {% if place.placeimages.all|length > 0 %}
 | 
			
		||||
            <img class="LP-Image" src="{{ place.placeimages.first.filename.thumbnail.url}}" />
 | 
			
		||||
        {% else %}
 | 
			
		||||
            {% else %}
 | 
			
		||||
            <img class="LP-Image" src="{% static 'images/missing_image.png' %}" />
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    </div>
 | 
			
		||||
            {% endif %}
 | 
			
		||||
        </div>
 | 
			
		||||
    </a>
 | 
			
		||||
    <div class="LP-PlaceTeaser__Meta">
 | 
			
		||||
        <div class="LP-PlaceTeaser__Info">
 | 
			
		||||
            <span class="LP-PlaceTeaser__Title">
 | 
			
		||||
@@ -20,15 +22,15 @@
 | 
			
		||||
        <div class="LP-PlaceTeaser__Description">
 | 
			
		||||
            <p class="LP-Paragraph">
 | 
			
		||||
                {% if place.description|length > 210 %}
 | 
			
		||||
                    {{place.description|truncatechars:210|truncatewords:-1}}
 | 
			
		||||
                {{place.description|truncatechars:210|truncatewords:-1}}
 | 
			
		||||
                {% else %}
 | 
			
		||||
                    {{place.description}}
 | 
			
		||||
                {{place.description}}
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </p>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="LP-PlaceTeaser__Icons">
 | 
			
		||||
            <ul class="LP-Icon__List">
 | 
			
		||||
                <li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/favourite.svg' %}" /></li>
 | 
			
		||||
                <li class="LP-Icon__Item">{% include 'partials/icons/place_favorite.html' with place=place%}</li>
 | 
			
		||||
                <li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/location.svg' %}" /></li>
 | 
			
		||||
                <li class="LP-Icon__Item"><img class="LP-Icon" src="{% static '/icons/flag.svg' %}" /></li>
 | 
			
		||||
            </ul>
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@
 | 
			
		||||
<article class="LP-PlaceDetail">
 | 
			
		||||
 | 
			
		||||
    <header class="LP-PlaceDetail__Header">
 | 
			
		||||
        <h1 class="LP-Headline">{{ place.name }}</h1>
 | 
			
		||||
        <h1 class="LP-Headline">{{ place.name }} {% include 'partials/icons/place_favorite.html' %}</h1>
 | 
			
		||||
        {% if place.placeimages.first.filename.hero.url %}
 | 
			
		||||
        <figure class="LP-PlaceDetail__Image">
 | 
			
		||||
            <img src="{{ place.placeimages.first.filename.hero.url }}" class="LP-Image" />
 | 
			
		||||
 
 | 
			
		||||
@@ -17,9 +17,7 @@
 | 
			
		||||
    <ul class="LP-PlaceList__List">
 | 
			
		||||
        {% for place in place_list %}
 | 
			
		||||
        <li class="LP-PlaceList__Item">
 | 
			
		||||
            <a href="{% url 'place_detail' pk=place.pk %}" class="LP-Link">
 | 
			
		||||
                {% include 'partials/place_teaser.html' with place=place extended=True %}
 | 
			
		||||
            </a>
 | 
			
		||||
            {% include 'partials/place_teaser.html' with place=place extended=True %}
 | 
			
		||||
        </li>
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
    </ul>
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,8 @@ from lostplaces.views import (
 | 
			
		||||
    PlaceDeleteView,
 | 
			
		||||
    PlaceTagDeleteView,
 | 
			
		||||
	PlaceTagSubmitView,
 | 
			
		||||
    PlaceFavoriteView,
 | 
			
		||||
    PlaceUnfavoriteView,
 | 
			
		||||
	PhotoAlbumCreateView,
 | 
			
		||||
	PhotoAlbumDeleteView,
 | 
			
		||||
    PlaceImageCreateView,
 | 
			
		||||
@@ -36,5 +38,10 @@ urlpatterns = [
 | 
			
		||||
	path('place/tag/<int:tagged_id>', PlaceTagSubmitView.as_view(), name='place_tag_submit'),
 | 
			
		||||
    path('place/tag/delete/<int:tagged_id>/<int:tag_id>', PlaceTagDeleteView.as_view(), name='place_tag_delete'),
 | 
			
		||||
    
 | 
			
		||||
    path('explorer/<int:explorer_id>/', ExplorerProfileView.as_view(), name='explorer_profile')
 | 
			
		||||
    path('explorer/<int:explorer_id>/', ExplorerProfileView.as_view(), name='explorer_profile'),
 | 
			
		||||
    
 | 
			
		||||
    path('explorer/favorite/<int:place_id>/', PlaceFavoriteView.as_view(), name='place_favorite'),
 | 
			
		||||
    path('explorer/unfavorite/<int:place_id>/', PlaceUnfavoriteView.as_view(), name='place_unfavorite')
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
]
 | 
			
		||||
 
 | 
			
		||||
@@ -119,3 +119,35 @@ class PlaceDeleteView(IsAuthenticatedMixin, IsPlaceSubmitterMixin, DeleteView):
 | 
			
		||||
 | 
			
		||||
    def get_place(self):
 | 
			
		||||
        return self.get_object()
 | 
			
		||||
 | 
			
		||||
class PlaceFavoriteView(IsAuthenticatedMixin, View):
 | 
			
		||||
    
 | 
			
		||||
    def get(self, request, place_id):
 | 
			
		||||
        place = get_object_or_404(Place, id=place_id)
 | 
			
		||||
        if request.user is not None:
 | 
			
		||||
            request.user.explorer.favorite_places.add(place)
 | 
			
		||||
            request.user.explorer.save()
 | 
			
		||||
            
 | 
			
		||||
        referer = request.META.get('HTTP_REFERER') 
 | 
			
		||||
        if referer is not None:
 | 
			
		||||
            return redirect(referer)
 | 
			
		||||
        else:
 | 
			
		||||
            return redirect(
 | 
			
		||||
                reverse_lazy('place_detail', kwargs={'pk': place.pk})
 | 
			
		||||
            )
 | 
			
		||||
            
 | 
			
		||||
class PlaceUnfavoriteView(IsAuthenticatedMixin, View):
 | 
			
		||||
    
 | 
			
		||||
    def get(self, request, place_id):
 | 
			
		||||
        place = get_object_or_404(Place, id=place_id)
 | 
			
		||||
        if request.user is not None:
 | 
			
		||||
            request.user.explorer.favorite_places.remove(place)
 | 
			
		||||
            request.user.explorer.save()
 | 
			
		||||
            
 | 
			
		||||
        referer = request.META.get('HTTP_REFERER')  
 | 
			
		||||
        if referer is not None:
 | 
			
		||||
            return redirect(referer)
 | 
			
		||||
        else:
 | 
			
		||||
            return redirect(
 | 
			
		||||
                reverse_lazy('place_detail', kwargs={'pk': place.pk})
 | 
			
		||||
            )            
 | 
			
		||||
		Reference in New Issue
	
	Block a user