Compare commits

..

38 Commits

Author SHA1 Message Date
8e80614eee Merge commit 'c5f6355f193df939ebb1b158be6b4dc2ba425a60' into develop 2020-12-25 16:51:49 +01:00
c5f6355f19 Updated translations (de). 2020-12-25 16:07:50 +01:00
dac63e99ba Added Edit button to profile page. 2020-12-25 16:00:29 +01:00
9f369456d5 Changed easy_thumbnails image/thumb deletion. Now working. 2020-12-25 15:42:02 +01:00
011a58f6b3 Use thumbnail in profile_update. 2020-12-25 14:29:38 +01:00
67ce6cb50b Added working explorer_profile_image upload. 2020-12-25 14:06:53 +01:00
86cc7f23fe description_fuckery. 2020-12-25 13:19:34 +01:00
3eaa186b66 Delete profile_image on user_deletion. 2020-12-25 12:53:52 +01:00
cc59254ba4 Added clean_username function to validate form. 2020-12-25 12:24:09 +01:00
67a6517716 Comment improved. 2020-12-25 11:14:54 +01:00
0f5474c2d3 half-working :P 2020-12-25 11:14:21 +01:00
17e71b71d4 Fix typo. 2020-12-25 08:04:35 +01:00
b1aa4473e9 Added failsafe, if there is no profile_image. 2020-12-25 02:11:02 +01:00
871acd1dce Improved class comment. 2020-12-25 01:41:09 +01:00
14ca45d111 Comments for customizations of UserChangeForm. 2020-12-25 01:36:14 +01:00
c71fe4cf2d Added new translations (de) 2020-12-25 01:31:43 +01:00
7359bf5fab ExplorerChangeForms, with deactivated username field. 2020-12-25 01:31:01 +01:00
4f0182fc3e Minor textual changes for consistency. 2020-12-25 01:28:23 +01:00
30f259fb4d WIP-commit of translations to test against fuzzy detection. 2020-12-24 23:51:40 +01:00
53f89caef5 Added a ModelForm to change profile details. 2020-12-24 20:31:52 +01:00
3855fb28d7 Rename ExplorerCreationForm to SignupVoucherForm. 2020-12-24 20:25:05 +01:00
3a20a60f05 Remove obsolete ExplorerChangeForm. 2020-12-24 20:22:33 +01:00
648264c9fc Remove obsoleted imports. 2020-12-24 20:13:06 +01:00
a7c8848fd6 Allow user to provide his first and last name on registration. 2020-12-24 19:36:41 +01:00
07ea2f164c Name and E-Mail is only shown when populated in profile. 2020-12-24 19:13:55 +01:00
b0396f5223 Added bio and email link to profile template. 2020-12-24 19:04:04 +01:00
88bffbef8e Added Explorer bio / description field. 2020-12-24 18:53:30 +01:00
2022a924c4 Added output of profile image to profile_page. 2020-12-24 18:30:29 +01:00
d5827b2006 Fixed filename generation. 2020-12-24 18:14:40 +01:00
a9013d9673 Pulled favorite_places out of explorer instance. 2020-12-24 18:03:31 +01:00
0c38ca9a15 Revert changes, as it was redundant. 2020-12-24 18:03:07 +01:00
734d09df90 Add favorite_places to user profile page. 2020-12-24 17:59:05 +01:00
e601b9bf6b Merge commit '6f6bd6376d1ef2410a728cff2e9b883560c7f5c1' into feature/30-user-profile-fields 2020-12-24 17:34:09 +01:00
35e0f912fe Add profile_pic 2020-12-24 17:24:02 +01:00
07fe1bc3ca Rename place_image_path function. 2020-12-24 17:23:20 +01:00
d04e986419 Added display of name and e-mail. 2020-12-24 15:33:46 +01:00
cbbda88850 Remove debug output. 2020-12-24 15:13:40 +01:00
981c440ce3 Fix voucher class description 2020-12-24 15:13:31 +01:00
13 changed files with 368 additions and 58 deletions

View File

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

View File

@ -8,12 +8,12 @@ from django.db import models
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.contrib.auth.models import User
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:
model = User
fields = ('username', 'email')
fields = ('username', 'email', 'first_name', 'last_name')
voucher = forms.CharField(
max_length=30,
help_text=_('The Voucher you got from an administrator')
@ -35,10 +35,33 @@ class ExplorerCreationForm(UserCreationForm):
fetched_voucher.delete()
return True
class ExplorerChangeForm(UserChangeForm):
class ExplorerUserChangeForm(UserChangeForm):
class Meta:
model = User
fields = ('username', 'email')
fields = [ 'username', 'first_name', 'last_name', 'email' ]
''' Hide password hint.'''
password = None
''' Display username, but display it non-editable and not required. '''
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'
def clean_username(self):
# As shown in the above answer.
instance = getattr(self, 'instance', None)
if instance:
return instance.username
else:
return self.cleaned_data.get('username', None)
class ExplorerChangeForm(forms.ModelForm):
class Meta:
model = Explorer
fields = '__all__'
exclude = ['user', 'favorite_places']
class PlaceForm(forms.ModelForm):
class Meta:

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-11 21:53+0200\n"
"POT-Creation-Date: 2020-12-25 16:04+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Commander1024 <commander@commander1024.de>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -30,7 +30,7 @@ msgstr "Ungültiger Voucher"
msgid "Expired voucher"
msgstr "Abgelaufener Voucher"
#: models/abstract_models.py:29
#: models/abstract_models.py:29 templates/explorer/profile.html:31
msgid "Name"
msgstr "Name"
@ -74,6 +74,22 @@ msgstr "Adresse (URL)"
msgid "link text"
msgstr "Linktext"
#: models/models.py:47
msgid "Biography"
msgstr "Beschreibung"
#: models/models.py:48
msgid "Describe yourself, your preferences, etc. in a few sentences."
msgstr "Beschreibe Dich selbst, Deine Vorlieben, usw. in ein paar Sätzen."
#: models/models.py:56
msgid "Profile image"
msgstr "Profilbild"
#: models/models.py:57
msgid "Optional profile image for display in Explorer profile"
msgstr "Optionales Profilbild zur Anzeige im Explorerprofil"
#: models/place.py:21
msgid "Location"
msgstr "Ort"
@ -110,38 +126,92 @@ msgstr "Du wirst in 5 Sekunden weitergeleitet"
msgid "Go Back"
msgstr "Zurück"
#: templates/explorer/profile.html:41
msgid "E-mail"
msgstr "E-Mail"
#: templates/explorer/profile.html:52
msgid "Joined"
msgstr "Beigetreten"
#: templates/explorer/profile.html:60
#, fuzzy
#| msgid "All Places"
msgid "Places"
msgstr "Alle Places"
#: templates/explorer/profile.html:68
msgid "Place assets"
msgstr ""
#: templates/explorer/profile.html:76
#, fuzzy
#| msgid "Edit Explorer profile"
msgid "Edit Profile"
msgstr "Explorerprofil bearbeiten"
#: templates/explorer/profile.html:87
msgid "Favorite places"
msgstr "Favoriten"
#: templates/explorer/profile.html:103
msgid "Places submitted by"
msgstr "Places hinzugefügt von"
#: templates/explorer/profile.html:118
msgid "Images submitted by"
msgstr "Bilder hinzugefügt von"
#: templates/explorer/profile.html:140
msgid "Photo albums submitted by"
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
msgid "Logout"
msgstr "Ausloggen"
#: templates/global.html:34
#: templates/global.html:33
msgid "Profile"
msgstr "Profil"
#: templates/global.html:35
msgid "Admin"
msgstr "Admin"
#: templates/global.html:39 templates/registration/login.html:4
#: templates/global.html:40 templates/registration/login.html:4
#: templates/registration/login.html:10 templates/registration/login.html:23
msgid "Login"
msgstr "Anmelden"
#: templates/global.html:40 templates/registration/login.html:29
#: templates/signup.html:6 templates/signup.html:12 templates/signup.html:41
#: templates/global.html:41 templates/registration/login.html:29
#: templates/signup.html:6 templates/signup.html:12 templates/signup.html:49
msgid "Sign up"
msgstr "Registrieren"
#: templates/global.html:50 templates/home.html:10
#: templates/global.html:51 templates/home.html:10
msgid "Home"
msgstr "Startseite"
#: templates/global.html:51
#: templates/global.html:52
msgid "UrBex Codex"
msgstr "UrBex Codex"
#: templates/global.html:56 templates/place/place_create.html:5
#: templates/global.html:57 templates/place/place_create.html:5
#: templates/place/place_create.html:10
msgid "Create place"
msgstr "Place erstellen"
#: templates/global.html:57
#: templates/global.html:58
msgid "All places"
msgstr "Alle Places"
@ -194,6 +264,14 @@ msgstr "Abschicken"
msgid "Cancel"
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
msgid "Made by"
msgstr "Erstellt von"
@ -318,10 +396,6 @@ msgstr "Alle Places"
msgid "Our lost places"
msgstr "Unsere Lost Places"
#: templates/place/place_update.html:42
msgid "Update"
msgstr "Aktualisieren"
#: templates/place_image/place_image_create.html:7
msgid "Submit images to a place"
msgstr "Bilder zu einem Place hinzufügen"
@ -334,6 +408,16 @@ msgstr "Noch kein Konto?"
msgid "Please login to proceed"
msgstr "Bitte log Dich ein um fortzufahren"
#: views/explorer_views.py:78
#, fuzzy
#| msgid "Successfully updated place"
msgid "Successfully updated Explorer profile"
msgstr "Place erfolgreich aktualisiert"
#: views/explorer_views.py:84 views/place_views.py:105
msgid "Please fill in all required fields."
msgstr "Bitte füll alle benötigten Felder aus."
#: views/place_image_views.py:26
msgid "Image(s) submitted successfully"
msgstr "Bild(er) erfolgreich hinzugefügt"
@ -358,10 +442,6 @@ msgstr "Du darfst diesen Place nicht bearbeiten"
msgid "Successfully created place"
msgstr "Place erfolgreich erstellt"
#: views/place_views.py:105
msgid "Please fill in all required fields."
msgstr "Bitte füll alle benötigten Felder aus."
#: views/place_views.py:112
msgid "Successfully deleted place"
msgstr "Place erfolgreich gelöscht"
@ -385,3 +465,8 @@ msgstr "Fotoalbum-Link gelöscht"
#: views/views.py:60
msgid "You are not allowed to edit this photo album link"
msgstr "Du darfst diesen Fotoalbum-Link nicht bearbeiten"
#, fuzzy
#~| msgid "Filename(s)"
#~ msgid "Filename"
#~ msgstr "Dateiname(n)"

View File

@ -6,20 +6,34 @@
database.
'''
import os
import uuid
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.db.models.signals import post_save, pre_save
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
def generate_profile_image_filename(instance, filename):
"""
Callback for generating filename for uploaded explorer profile images.
Returns filename as: explorer_pk-username.jpg
"""
return 'explorers/' + str(instance.user.pk) + '-' + str(instance.user.username) + '.' + filename.split('.')[-1]
class Explorer(models.Model):
"""
Profile that is linked to the a User.
Profile that is linked to the Django user.
Every user has a profile.
Provides additional attributes for user profile.
"""
user = models.OneToOneField(
@ -27,7 +41,21 @@ class Explorer(models.Model):
on_delete=models.CASCADE,
related_name='explorer'
)
bio = models.TextField(
blank=True,
null=True,
verbose_name=_('Biography / Description'),
help_text=_('Describe yourself, your preferences, etc. in a few sentences.')
)
profile_image = ThumbnailerImageField(
blank=True,
null=True,
upload_to=generate_profile_image_filename,
resize_source=dict(size=(400, 400),
sharpen=True),
verbose_name=_('Profile image'),
help_text=_('Optional profile image for display in Explorer profile')
)
favorite_places = models.ManyToManyField(
Place,
related_name='explorer_favorites',
@ -47,13 +75,34 @@ def create_user_profile(sender, instance, created, **kwargs):
def save_user_profile(sender, instance, **kwargs):
instance.explorer.save()
@receiver(pre_save, sender=Explorer)
def auto_delete_file_on_change(sender, instance, **kwargs):
"""
Deletes old file from filesystem
when corresponding `Explorer` object is updated
with new file.
"""
if not instance.pk:
return False
try:
old_file = Explorer.objects.get(pk=instance.pk).profile_image
except Explorer.DoesNotExist:
return False
print("Deleting:", old_file)
new_file = instance.profile_image
if not old_file == new_file:
old_file.delete(save=False)
class Voucher(Expireable):
"""
Vouchers are authorization to created_when = models.DateTimeField(auto_now_add=True)
expires_when = models.DateTimeField()kens to allow the registration of new users.
Vouchers are authorization tokens to allow the registration of new users.
A voucher has a code, a creation and a deletion date, which are all
positional. Creation date is being set automatically during voucher
creation.
created_when = models.DateTimeField(auto_now_add=True)
expires_when = models.DateTimeField()
"""
code = models.CharField(unique=True, max_length=30)
@ -64,4 +113,3 @@ class Voucher(Expireable):
def __str__(self):
return "Voucher " + str(self.code)

View File

@ -49,10 +49,10 @@ class Place(Submittable, Taggable, Mapable):
return self.name
def generate_image_upload_path(instance, filename):
def generate_place_image_filename(instance, filename):
"""
Callback for generating path for uploaded images.
Returns filename as: place_pk-placename{-rnd_string}.jpg
Callback for generating filename for uploaded place images.
Returns filename as: place_pk-placename{-number}.jpg
"""
return 'places/' + str(instance.place.pk) + '-' + str(instance.place.name) + '.' + filename.split('.')[-1]
@ -72,7 +72,7 @@ class PlaceAsset(Submittable):
null=True
)
class PlaceImage (PlaceAsset):
class PlaceImage(PlaceAsset):
"""
PlaceImage defines an image file object that points to a file in uploads/.
Intermediate image sizes are generated as defined in THUMBNAIL_ALIASES.
@ -84,7 +84,7 @@ class PlaceImage (PlaceAsset):
verbose_name=_('Description'),
)
filename = ThumbnailerImageField(
upload_to=generate_image_upload_path,
upload_to=generate_place_image_filename,
resize_source=dict(size=(2560, 2560),
sharpen=True),
verbose_name=_('Filename(s)'),
@ -104,7 +104,6 @@ class PlaceImage (PlaceAsset):
return 'Image ' + str(self.pk)
# These two auto-delete files from filesystem when they are unneeded:
@receiver(post_delete, sender=PlaceImage)
@ -118,7 +117,6 @@ def auto_delete_file_on_delete(sender, instance, **kwargs):
thumbmanager = get_thumbnailer(instance.filename)
thumbmanager.delete(save=False)
@receiver(pre_save, sender=PlaceImage)
def auto_delete_file_on_change(sender, instance, **kwargs):
"""
@ -137,5 +135,4 @@ def auto_delete_file_on_change(sender, instance, **kwargs):
# No need to delete thumbnails, as they will be overwritten on regeneration.
new_file = instance.filename
if not old_file == new_file:
if os.path.isfile(old_file.path):
os.remove(old_file.path)
old_file.delete(save=False)

View File

@ -7,13 +7,46 @@
{% block maincontent %}
<div class="LP-UserProfile">
<div class="LP-UserProfile__Bio">
<h2 class="LP-Headline">Bio</h2>
<p class="LP-Paragraph">{{explorer.bio}}</p>
</div>
<div class="LP-UserProfile__Info">
<div class="LP-UserInfo">
<div class="LP-UserInfo__UserName">
<h1 class="LP-Headline">{{explorer.user.username}}</h1>
</div>
<div class="LP-UserInfo__Meta">
<table>
<tr>
{% if explorer.profile_image %}
<figure class="LP-UserInfo__Image">
<img src="{{ explorer.profile_image.url }}" class="LP-Image" />
</figure>
{% endif %}
<tr>
{% if explorer.user.first_name %}
<td class="LP-UserInfo__Key">
<span class="LP-Paragraph">{% trans 'Name' %}</span>
</td>
<td class="LP-UserInfo__Value">
<span class="LP-Paragraph">{{explorer.user.first_name}} {{explorer.user.last_name}}</span>
</td>
{% endif %}
</tr>
<tr>
{% if explorer.user.email %}
<td class="LP-UserInfo__Key">
<span class="LP-Paragraph">{% trans 'E-mail' %}</span>
</td>
<td class="LP-UserInfo__Value">
<span class="LP-Paragraph">
<a href="{{explorer.user.email}}" class="LP-Link">{{explorer.user.email}}</a>
</span>
</td>
{% endif %}
</tr>
<tr>
<td class="LP-UserInfo__Key">
<span class="LP-Paragraph">{% trans 'Joined' %}</span>
@ -32,18 +65,39 @@
</tr>
<tr>
<td class="LP-UserInfo__Key">
<span class="LP-Paragraph">{% trans 'Place Assets'%}</span>
<span class="LP-Paragraph">{% trans 'Place assets'%}</span>
</td>
<td class="LP-UserInfo__Value">
<span class="LP-Paragraph">{{asset_count}}</span>
</td>
</tr>
<tr>
<td>
<a href="/explorer/update/"><button class="LP-Button LP-Button">{% trans 'Edit Profile' %}</button></a>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<section class="LP-Section">
<div class="LP-PlaceList">
<h1 class="LP-Headline">{% trans 'Favorite places' %}</h1>
<ul class="LP-PlaceList__List">
{% for place in explorer.favorite_places.all %}
<li class="LP-PlaceList__Item">
{% include 'partials/place_teaser.html' with place=place extended=True %}
</li>
{% endfor %}
</ul>
{% include 'partials/nav/pagination.html' %}
</div>
</section>
<section class="LP-Section">
<div class="LP-PlaceList">
<h1 class="LP-Headline">{% trans 'Places submitted by' %} {{explorer.user.username}}</h1>

View File

@ -0,0 +1,55 @@
{% extends 'global.html'%}
{% load i18n %}
{% load thumbnail %}
{% load widget_tweaks %}
# {% block title %}{% trans 'Edit Explorer profile' %}{% endblock %}
{% block maincontent %}
<form class="LP-Form" method="POST" enctype="multipart/form-data">
<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 %}
<div class="LP-Form__Field">
<img src="{% thumbnail explorer_image 200x200 %}"/>
</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

@ -19,6 +19,14 @@
{% include 'partials/form/inputField.html' with field=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=form.first_name %}
</div>
<div class="LP-Form__Field">
{% include 'partials/form/inputField.html' with field=form.last_name %}
</div>
</div>
<div class="LP-Form__Composition">
<div class="LP-Form__Field">

View File

@ -4,15 +4,15 @@ from django import forms
from django.utils import timezone
from lostplaces.tests.forms import FormTestCase
from lostplaces.forms import ExplorerCreationForm
from lostplaces.forms import SignupVoucherForm
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
to this project and are already tested by django
"""
form = ExplorerCreationForm
form = SignupVoucherForm
@classmethod
def setUpTestData(cls):
@ -37,7 +37,7 @@ class ExplorerCreationFormTestCase(FormTestCase):
)
def test_validation_valid(self):
form = ExplorerCreationForm(self.post_data)
form = SignupVoucherForm(self.post_data)
self.assertTrue(
form.is_valid(),
msg='Expecting the %s to validate' % (
@ -49,7 +49,7 @@ class ExplorerCreationFormTestCase(FormTestCase):
self.post_data = {
'voucher': 'Imanotacode123'
}
form = ExplorerCreationForm(self.post_data)
form = SignupVoucherForm(self.post_data)
self.assertFalse(
form.is_valid(),
msg='Expecting the %s to not validate' % (

View File

@ -19,6 +19,7 @@ from lostplaces.views import (
PlaceImageDeleteView,
FlatView,
ExplorerProfileView,
ExplorerProfileUpdateView,
OSMMapView
)
@ -40,10 +41,9 @@ urlpatterns = [
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/update/', ExplorerProfileUpdateView.as_view(), name='explorer_profile_update'),
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('osm/', OSMMapView.as_view(), name='osm')
]

View File

@ -7,11 +7,13 @@ from django.utils.translation import ugettext_lazy as _
from django.shortcuts import render, redirect, get_object_or_404
from django.urls import reverse_lazy
from django.contrib import messages
from lostplaces.common import get_all_subclasses
from lostplaces.views.base_views import IsAuthenticatedMixin
from lostplaces.models.models import Explorer
from lostplaces.models.place import Place, PlaceAsset
from lostplaces.forms import ExplorerChangeForm, ExplorerUserChangeForm
class ExplorerProfileView(IsAuthenticatedMixin, View):
def get(self, request, explorer_id):
@ -34,12 +36,52 @@ class ExplorerProfileView(IsAuthenticatedMixin, View):
context['asset_count'] = asset_count
print(context['assets'])
return render(
request=request,
template_name='explorer/profile.html',
context=context
)
class ExplorerProfileUpdateView(IsAuthenticatedMixin, View):
success_message = ''
permission_denied_message = ''
def get(self, request, *args, **kwargs):
context = {
'explorer_user_change_form': ExplorerUserChangeForm(instance=request.user),
'explorer_change_form': ExplorerChangeForm(instance=request.user.explorer)
}
if request.user.explorer.profile_image:
context['explorer_image'] = request.user.explorer.profile_image
return render(request, 'explorer/profile_update.html', context)
def post(self, request, *args, **kwargs):
print(request.POST)
explorer_user_change_form = ExplorerUserChangeForm(
request.POST,
instance=request.user
)
explorer_change_form = ExplorerChangeForm(
request.POST,
request.FILES,
instance=request.user.explorer
)
if explorer_change_form.is_valid() and explorer_user_change_form.is_valid():
explorer_user_change_form.save()
explorer_change_form.save()
print(explorer_change_form.cleaned_data)
messages.success(
self.request,
_('Successfully updated Explorer profile')
)
else:
# Usually the browser should have checked the form before sending.
messages.error(
self.request,
_('Please fill in all required fields.')
)
return redirect(reverse_lazy('explorer_profile_update'))

View File

@ -11,7 +11,7 @@ from django.shortcuts import render, redirect, get_object_or_404
from django.http import HttpResponseForbidden
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.views.base_views import IsAuthenticatedMixin
from lostplaces.common import redirect_referer_or
@ -24,7 +24,7 @@ from lostplaces.views.base_views import (
from taggit.models import Tag
class SignUpView(SuccessMessageMixin, CreateView):
form_class = ExplorerCreationForm
form_class = SignupVoucherForm
success_url = reverse_lazy('login')
template_name = 'signup.html'
success_message = _('User created')