Compare commits

..

8 Commits

10 changed files with 156 additions and 54 deletions

View File

@ -9,8 +9,6 @@ from django.contrib.auth.admin import UserAdmin
from django.utils import timezone from django.utils import timezone
from lostplaces.models import * from lostplaces.models import *
from lostplaces.forms import ExplorerCreationForm, ExplorerChangeForm
# Register your models here. # Register your models here.
class VoucherAdmin(admin.ModelAdmin): class VoucherAdmin(admin.ModelAdmin):

View File

@ -8,9 +8,9 @@ from django.db import models
from django.contrib.auth.forms import UserCreationForm, UserChangeForm from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from lostplaces.models import Place, PlaceImage, Voucher from lostplaces.models import Place, PlaceImage, Voucher, Explorer
class ExplorerCreationForm(UserCreationForm): class SignupVoucherForm(UserCreationForm):
class Meta: class Meta:
model = User model = User
fields = ('username', 'email', 'first_name', 'last_name') fields = ('username', 'email', 'first_name', 'last_name')
@ -35,10 +35,23 @@ class ExplorerCreationForm(UserCreationForm):
fetched_voucher.delete() fetched_voucher.delete()
return True return True
class ExplorerChangeForm(UserChangeForm): class ExplorerUserChangeForm(UserChangeForm):
class Meta: class Meta:
model = User model = User
fields = ('username', 'email', 'first_name', 'last_name') fields = [ 'username', 'first_name', 'last_name', 'email' ]
password = None
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['username'].required = False
self.fields['username'].help_text = None
self.fields['username'].widget.attrs['disabled'] = 'disabled'
class ExplorerChangeForm(forms.ModelForm):
class Meta:
model = Explorer
fields = '__all__'
exclude = ['user', 'favorite_places']
class PlaceForm(forms.ModelForm): class PlaceForm(forms.ModelForm):
class Meta: class Meta:

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-24 16:29+0100\n" "POT-Creation-Date: 2020-12-25 01:22+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Commander1024 <commander@commander1024.de>\n" "Last-Translator: Commander1024 <commander@commander1024.de>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -30,7 +30,7 @@ msgstr "Ungültiger Voucher"
msgid "Expired voucher" msgid "Expired voucher"
msgstr "Abgelaufener Voucher" msgstr "Abgelaufener Voucher"
#: models/abstract_models.py:29 templates/explorer/profile.html:19 #: models/abstract_models.py:29 templates/explorer/profile.html:31
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
@ -75,14 +75,20 @@ msgid "link text"
msgstr "Linktext" msgstr "Linktext"
#: models/models.py:46 #: models/models.py:46
#, fuzzy msgid "Biography / Description"
#| msgid "Filename(s)" msgstr "Beschreibung"
msgid "Filename"
msgstr "Dateiname(n)"
#: models/models.py:47 #: models/models.py:47
msgid "Optional profile pic for display in explorer profile" msgid "Describe yourself, your preferences, etc. in a few sentences."
msgstr "" msgstr "Beschreibe Dich selbst, Deine Vorlieben, usw. in ein paar Sätzen."
#: models/models.py:55
msgid "Profile image"
msgstr "Profilbild"
#: models/models.py:56
msgid "Optional profile image for display in Explorer profile"
msgstr "Optionales Profilbind zur Anzeige im Explorerprofil"
#: models/place.py:21 #: models/place.py:21
msgid "Location" msgid "Location"
@ -120,41 +126,49 @@ msgstr "Du wirst in 5 Sekunden weitergeleitet"
msgid "Go Back" msgid "Go Back"
msgstr "Zurück" msgstr "Zurück"
#: templates/explorer/profile.html:27 #: templates/explorer/profile.html:41
msgid "E-Mail" msgid "E-mail"
msgstr "" msgstr "E-Mail"
#: templates/explorer/profile.html:35 #: templates/explorer/profile.html:52
msgid "Joined" msgid "Joined"
msgstr "" msgstr "Beigetreten"
#: templates/explorer/profile.html:43 #: templates/explorer/profile.html:60
#, fuzzy #, fuzzy
#| msgid "All Places" #| msgid "All Places"
msgid "Places" msgid "Places"
msgstr "Alle Places" msgstr "Alle Places"
#: templates/explorer/profile.html:51 #: templates/explorer/profile.html:68
msgid "Place Assets" msgid "Place assets"
msgstr "" msgstr ""
#: templates/explorer/profile.html:65
#, fuzzy
#| msgid "Image(s) submitted successfully"
msgid "Places submitted by"
msgstr "Bild(er) erfolgreich hinzugefügt"
#: templates/explorer/profile.html:82 #: templates/explorer/profile.html:82
#, fuzzy msgid "Favorite places"
#| msgid "Image(s) submitted successfully" msgstr "Favoriten-Places"
msgid "Images submitted by"
msgstr "Bild(er) erfolgreich hinzugefügt"
#: templates/explorer/profile.html:104 #: templates/explorer/profile.html:98
#, fuzzy msgid "Places submitted by"
#| msgid "Photo album link submitted" msgstr "Places hinzugefügt von"
#: templates/explorer/profile.html:113
msgid "Images submitted by"
msgstr "Bilder hinzugefügt von"
#: templates/explorer/profile.html:135
msgid "Photo albums submitted by" msgid "Photo albums submitted by"
msgstr "Fotoalbum-Link hinzugefügt" msgstr "Fotoalben hinzugefügt von"
#: templates/explorer/profile_update.html:6
#: templates/explorer/profile_update.html:12
msgid "Edit Explorer profile"
msgstr "Explorerprofil bearbeiten"
#: templates/explorer/profile_update.html:48
#: templates/place/place_update.html:42
msgid "Update"
msgstr "Aktualisieren"
#: templates/global.html:32 #: templates/global.html:32
msgid "Logout" msgid "Logout"
@ -174,7 +188,7 @@ msgid "Login"
msgstr "Anmelden" msgstr "Anmelden"
#: templates/global.html:41 templates/registration/login.html:29 #: templates/global.html:41 templates/registration/login.html:29
#: templates/signup.html:6 templates/signup.html:12 templates/signup.html:41 #: templates/signup.html:6 templates/signup.html:12 templates/signup.html:49
msgid "Sign up" msgid "Sign up"
msgstr "Registrieren" msgstr "Registrieren"
@ -244,6 +258,14 @@ msgstr "Abschicken"
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
#: templates/partials/icons/place_favorite.html:6
msgid "Remove from favorites"
msgstr "Aus den Favoriten entfernen"
#: templates/partials/icons/place_favorite.html:10
msgid "Save as favorite"
msgstr "In den Favoriten speichern"
#: templates/partials/nav/footer.html:64 #: templates/partials/nav/footer.html:64
msgid "Made by" msgid "Made by"
msgstr "Erstellt von" msgstr "Erstellt von"
@ -368,10 +390,6 @@ msgstr "Alle Places"
msgid "Our lost places" msgid "Our lost places"
msgstr "Unsere Lost Places" msgstr "Unsere Lost Places"
#: templates/place/place_update.html:42
msgid "Update"
msgstr "Aktualisieren"
#: templates/place_image/place_image_create.html:7 #: templates/place_image/place_image_create.html:7
msgid "Submit images to a place" msgid "Submit images to a place"
msgstr "Bilder zu einem Place hinzufügen" msgstr "Bilder zu einem Place hinzufügen"
@ -435,3 +453,8 @@ msgstr "Fotoalbum-Link gelöscht"
#: views/views.py:60 #: views/views.py:60
msgid "You are not allowed to edit this photo album link" msgid "You are not allowed to edit this photo album link"
msgstr "Du darfst diesen Fotoalbum-Link nicht bearbeiten" msgstr "Du darfst diesen Fotoalbum-Link nicht bearbeiten"
#, fuzzy
#~| msgid "Filename(s)"
#~ msgid "Filename"
#~ msgstr "Dateiname(n)"

View File

@ -53,7 +53,7 @@ class Explorer(models.Model):
resize_source=dict(size=(400, 400), resize_source=dict(size=(400, 400),
sharpen=True), sharpen=True),
verbose_name=_('Profile image'), verbose_name=_('Profile image'),
help_text=_('Optional profile pic for display in explorer profile') help_text=_('Optional profile image for display in Explorer profile')
) )
favorite_places = models.ManyToManyField( favorite_places = models.ManyToManyField(
Place, Place,

View File

@ -38,7 +38,7 @@
<tr> <tr>
{% if explorer.user.email %} {% if explorer.user.email %}
<td class="LP-UserInfo__Key"> <td class="LP-UserInfo__Key">
<span class="LP-Paragraph">{% trans 'E-Mail' %}</span> <span class="LP-Paragraph">{% trans 'E-mail' %}</span>
</td> </td>
<td class="LP-UserInfo__Value"> <td class="LP-UserInfo__Value">
<span class="LP-Paragraph"> <span class="LP-Paragraph">
@ -65,7 +65,7 @@
</tr> </tr>
<tr> <tr>
<td class="LP-UserInfo__Key"> <td class="LP-UserInfo__Key">
<span class="LP-Paragraph">{% trans 'Place Assets'%}</span> <span class="LP-Paragraph">{% trans 'Place assets'%}</span>
</td> </td>
<td class="LP-UserInfo__Value"> <td class="LP-UserInfo__Value">
<span class="LP-Paragraph">{{asset_count}}</span> <span class="LP-Paragraph">{{asset_count}}</span>

View File

@ -0,0 +1,55 @@
{% extends 'global.html'%}
{% load static %}
{% load i18n %}
{% load widget_tweaks %}
# {% block title %}{% trans 'Edit Explorer profile' %}{% endblock %}
{% block maincontent %}
<form class="LP-Form" method="POST">
<fieldset class="LP-Form__Fieldset">
<legend class="LP-Form__Legend">{% trans 'Edit Explorer profile' %}</legend>
{% csrf_token %}
<div class="LP-Form__Composition LP-Form__Composition--breakable">
<div class="LP-Form__Field">
{% include 'partials/form/inputField.html' with field=explorer_user_change_form.username %}
</div>
<div class="LP-Form__Field">
{% include 'partials/form/inputField.html' with field=explorer_user_change_form.email %}
</div>
</div>
<div class="LP-Form__Composition LP-Form__Composition--breakable">
<div class="LP-Form__Field">
{% include 'partials/form/inputField.html' with field=explorer_user_change_form.first_name %}
</div>
<div class="LP-Form__Field">
{% include 'partials/form/inputField.html' with field=explorer_user_change_form.last_name %}
</div>
</div>
<div class="LP-Form__Composition">
<div class="LP-Form__Field">
{% include 'partials/form/inputField.html' with field=explorer_change_form.bio %}
</div>
</div>
<div class="LP-Form__Composition">
{% if explorer_image_url %}
<div class="LP-Form__Field">
<img class="LP-Form__Field LP-Image" src="{{ explorer_image_url }}"/>
</div>
{% endif %}
<div class="LP-Form__Field">
{% include 'partials/form/inputField.html' with field=explorer_change_form.profile_image %}
</div>
</div>
{% trans 'Update' as action %}
<div class="LP-Form__Composition LP-Form__Composition--buttons">
{% include 'partials/form/submit.html' with referrer=request.META.HTTP_REFERER action=action %}
</div>
</fieldset>
</form>
{% endblock maincontent %}

View File

@ -4,15 +4,15 @@ from django import forms
from django.utils import timezone from django.utils import timezone
from lostplaces.tests.forms import FormTestCase from lostplaces.tests.forms import FormTestCase
from lostplaces.forms import ExplorerCreationForm from lostplaces.forms import SignupVoucherForm
from lostplaces.models.models import Voucher from lostplaces.models.models import Voucher
class ExplorerCreationFormTestCase(FormTestCase): class SignupVoucherFormTestCase(FormTestCase):
""" """
This test case only tests for the voucher since all other aspects don't realy matter This test case only tests for the voucher since all other aspects don't realy matter
to this project and are already tested by django to this project and are already tested by django
""" """
form = ExplorerCreationForm form = SignupVoucherForm
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
@ -37,7 +37,7 @@ class ExplorerCreationFormTestCase(FormTestCase):
) )
def test_validation_valid(self): def test_validation_valid(self):
form = ExplorerCreationForm(self.post_data) form = SignupVoucherForm(self.post_data)
self.assertTrue( self.assertTrue(
form.is_valid(), form.is_valid(),
msg='Expecting the %s to validate' % ( msg='Expecting the %s to validate' % (
@ -49,7 +49,7 @@ class ExplorerCreationFormTestCase(FormTestCase):
self.post_data = { self.post_data = {
'voucher': 'Imanotacode123' 'voucher': 'Imanotacode123'
} }
form = ExplorerCreationForm(self.post_data) form = SignupVoucherForm(self.post_data)
self.assertFalse( self.assertFalse(
form.is_valid(), form.is_valid(),
msg='Expecting the %s to not validate' % ( msg='Expecting the %s to not validate' % (

View File

@ -18,7 +18,8 @@ from lostplaces.views import (
PlaceImageCreateView, PlaceImageCreateView,
PlaceImageDeleteView, PlaceImageDeleteView,
FlatView, FlatView,
ExplorerProfileView ExplorerProfileView,
ExplorerProfileUpdateView
) )
urlpatterns = [ urlpatterns = [
@ -39,9 +40,8 @@ urlpatterns = [
path('place/tag/delete/<int:tagged_id>/<int:tag_id>', PlaceTagDeleteView.as_view(), name='place_tag_delete'), 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/update/', ExplorerProfileUpdateView.as_view(), name='explorer_profile_update'),
path('explorer/favorite/<int:place_id>/', PlaceFavoriteView.as_view(), name='place_favorite'), path('explorer/favorite/<int:place_id>/', PlaceFavoriteView.as_view(), name='place_favorite'),
path('explorer/unfavorite/<int:place_id>/', PlaceUnfavoriteView.as_view(), name='place_unfavorite') path('explorer/unfavorite/<int:place_id>/', PlaceUnfavoriteView.as_view(), name='place_unfavorite')
] ]

View File

@ -12,6 +12,7 @@ from lostplaces.common import get_all_subclasses
from lostplaces.views.base_views import IsAuthenticatedMixin from lostplaces.views.base_views import IsAuthenticatedMixin
from lostplaces.models.models import Explorer from lostplaces.models.models import Explorer
from lostplaces.models.place import Place, PlaceAsset from lostplaces.models.place import Place, PlaceAsset
from lostplaces.forms import ExplorerChangeForm, ExplorerUserChangeForm
class ExplorerProfileView(IsAuthenticatedMixin, View): class ExplorerProfileView(IsAuthenticatedMixin, View):
def get(self, request, explorer_id): def get(self, request, explorer_id):
@ -39,3 +40,15 @@ class ExplorerProfileView(IsAuthenticatedMixin, View):
template_name='explorer/profile.html', template_name='explorer/profile.html',
context=context context=context
) )
class ExplorerProfileUpdateView(IsAuthenticatedMixin, View):
success_message = ''
permission_denied_message = ''
def get(self, request, *args, **kwargs):
context = {
'explorer_image_url': request.user.explorer.profile_image.url,
'explorer_user_change_form': ExplorerUserChangeForm(instance=request.user),
'explorer_change_form': ExplorerChangeForm(instance=request.user.explorer)
}
return render(request, 'explorer/profile_update.html', context)

View File

@ -11,7 +11,7 @@ from django.shortcuts import render, redirect, get_object_or_404
from django.http import HttpResponseForbidden from django.http import HttpResponseForbidden
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from lostplaces.forms import ExplorerCreationForm, TagSubmitForm from lostplaces.forms import SignupVoucherForm, TagSubmitForm
from lostplaces.models import Place, PhotoAlbum from lostplaces.models import Place, PhotoAlbum
from lostplaces.views.base_views import IsAuthenticatedMixin from lostplaces.views.base_views import IsAuthenticatedMixin
@ -23,7 +23,7 @@ from lostplaces.views.base_views import (
from taggit.models import Tag from taggit.models import Tag
class SignUpView(SuccessMessageMixin, CreateView): class SignUpView(SuccessMessageMixin, CreateView):
form_class = ExplorerCreationForm form_class = SignupVoucherForm
success_url = reverse_lazy('login') success_url = reverse_lazy('login')
template_name = 'signup.html' template_name = 'signup.html'
success_message = _('User created') success_message = _('User created')