From 4cf9e72c93a6b1fd1af3957c253aa43e134b62d8 Mon Sep 17 00:00:00 2001 From: Oliver Falk Date: Tue, 10 Jul 2018 13:18:11 +0200 Subject: [PATCH] Do allow importing photo from confirmed email --- .../templates/_import_photo_form.html | 29 ++++++++ .../templates/assign_photo_email.html | 7 +- .../templates/email_confirmed.html | 25 +------ .../ivataraccount/templates/import_photo.html | 14 ++++ ivatar/ivataraccount/views.py | 71 +++++++++++-------- 5 files changed, 92 insertions(+), 54 deletions(-) create mode 100644 ivatar/ivataraccount/templates/_import_photo_form.html create mode 100644 ivatar/ivataraccount/templates/import_photo.html diff --git a/ivatar/ivataraccount/templates/_import_photo_form.html b/ivatar/ivataraccount/templates/_import_photo_form.html new file mode 100644 index 0000000..ba3964c --- /dev/null +++ b/ivatar/ivataraccount/templates/_import_photo_form.html @@ -0,0 +1,29 @@ +{% load i18n %} +{% load bootstrap4 %} + +{% if not user.is_anonymous %} + {% if photos %} +

{% trans 'Would you like to import some of these externally hosted photos?' %}

+
{% csrf_token %} + + +

+ {% buttons %} + + {% endbuttons %} +

+
+ {% endif %} +{% endif %} diff --git a/ivatar/ivataraccount/templates/assign_photo_email.html b/ivatar/ivataraccount/templates/assign_photo_email.html index d5961e7..472adbb 100644 --- a/ivatar/ivataraccount/templates/assign_photo_email.html +++ b/ivatar/ivataraccount/templates/assign_photo_email.html @@ -37,7 +37,12 @@ -

{% blocktrans %}upload a new one{% endblocktrans %}

+

+
+ {% blocktrans %}Upload a new one{% endblocktrans %} +
+ {% blocktrans %}Import from other services{% endblocktrans %} +

{% endif %} diff --git a/ivatar/ivataraccount/templates/email_confirmed.html b/ivatar/ivataraccount/templates/email_confirmed.html index 2d54ec5..8f7aec7 100644 --- a/ivatar/ivataraccount/templates/email_confirmed.html +++ b/ivatar/ivataraccount/templates/email_confirmed.html @@ -9,31 +9,8 @@

{% trans 'Your email address was successfully confirmed!' %}

-{% if not user.is_anonymous %} -{% if photos %} - -

{% trans 'Would you like to import some of these externally hosted photos?' %}

-
{% csrf_token %} - - - -

-
-{% endif %} +{% include '_import_photo_form.html' %}

{% trans 'Back to your profile' %}

-{% endif %} {% endblock content %} diff --git a/ivatar/ivataraccount/templates/import_photo.html b/ivatar/ivataraccount/templates/import_photo.html new file mode 100644 index 0000000..60aa898 --- /dev/null +++ b/ivatar/ivataraccount/templates/import_photo.html @@ -0,0 +1,14 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block title %}{% trans 'Import photo' %} - Libravatar{% endblock title %} + +{% block content %} + +

{% trans 'Import photo' %}

+ +{% include '_import_photo_form.html' %} + +

{% trans 'Back to your profile' %}

+ +{% endblock content %} diff --git a/ivatar/ivataraccount/views.py b/ivatar/ivataraccount/views.py index 591aab5..879c778 100644 --- a/ivatar/ivataraccount/views.py +++ b/ivatar/ivataraccount/views.py @@ -1,6 +1,9 @@ ''' View classes for ivatar/ivataraccount/ ''' + +import io + from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.contrib.messages.views import SuccessMessageMixin @@ -14,23 +17,21 @@ from django.utils.translation import ugettext_lazy as _ from django.http import HttpResponseRedirect, HttpResponse from django.urls import reverse_lazy, reverse from django.shortcuts import render +from django_openid_auth.models import UserOpenID from openid import oidutil from openid.consumer import consumer +from ipware import get_client_ip + +from ivatar.settings import MAX_NUM_PHOTOS, MAX_PHOTO_SIZE + from .forms import AddEmailForm, UploadPhotoForm, AddOpenIDForm from .forms import UpdatePreferenceForm from .models import UnconfirmedEmail, ConfirmedEmail, Photo from .models import UnconfirmedOpenId, ConfirmedOpenId, DjangoOpenIDStore from .models import UserPreference - -from ivatar.settings import MAX_NUM_PHOTOS, MAX_PHOTO_SIZE - -import io - -from ipware import get_client_ip - -from django_openid_auth.models import UserOpenID +from .gravatar import get_photo as get_gravatar_photo def openid_logging(message, level=0): @@ -57,12 +58,12 @@ class CreateView(SuccessMessageMixin, FormView): password=form.cleaned_data['password1']) if user is not None: login(self.request, user) - pref = UserPreference.objects.create(user_id=user.pk) + pref = UserPreference.objects.create(user_id=user.pk) # pylint: disable=no-member pref.save() return HttpResponseRedirect(reverse_lazy('profile')) - else: - return HttpResponseRedirect( - reverse_lazy('login')) # pragma: no cover + + return HttpResponseRedirect( + reverse_lazy('login')) # pragma: no cover @method_decorator(login_required, name='dispatch') @@ -111,11 +112,11 @@ class RemoveUnconfirmedEmailView(SuccessMessageMixin, View): def post(self, request, *args, **kwargs): try: - email = UnconfirmedEmail.objects.get( + email = UnconfirmedEmail.objects.get( # pylint: disable=no-member user=request.user, id=kwargs['email_id']) email.delete() messages.success(request, _('Address removed')) - except UnconfirmedEmail.DoesNotExist: + except UnconfirmedEmail.DoesNotExist: # pylint: disable=no-member messages.error(request, _('Address does not exist')) return HttpResponseRedirect(reverse_lazy('profile')) @@ -136,8 +137,8 @@ class ConfirmEmailView(SuccessMessageMixin, TemplateView): return HttpResponseRedirect(reverse_lazy('profile')) try: - unconfirmed = UnconfirmedEmail.objects.get(verification_key=key) - except UnconfirmedEmail.DoesNotExist: + unconfirmed = UnconfirmedEmail.objects.get(verification_key=key) # pylint: disable=no-member + except UnconfirmedEmail.DoesNotExist: # pylint: disable=no-member messages.error(request, _('Verification key does not exist')) return HttpResponseRedirect(reverse_lazy('profile')) @@ -172,7 +173,7 @@ class RemoveConfirmedEmailView(SuccessMessageMixin, View): user=request.user, id=kwargs['email_id']) email.delete() messages.success(request, _('Address removed')) - except ConfirmedEmail.DoesNotExist: + except ConfirmedEmail.DoesNotExist: # pylint: disable=no-member messages.error(request, _('Address does not exist')) return HttpResponseRedirect(reverse_lazy('profile')) @@ -193,16 +194,16 @@ class AssignPhotoEmailView(SuccessMessageMixin, TemplateView): return HttpResponseRedirect(reverse_lazy('profile')) try: - photo = self.model.objects.get( + photo = self.model.objects.get( # pylint: disable=no-member id=request.POST['photo_id'], user=request.user) - except self.model.DoesNotExist: + except self.model.DoesNotExist: # pylint: disable=no-member messages.error(request, _('Photo does not exist')) return HttpResponseRedirect(reverse_lazy('profile')) try: email = ConfirmedEmail.objects.get( user=request.user, id=kwargs['email_id']) - except ConfirmedEmail.DoesNotExist: + except ConfirmedEmail.DoesNotExist: # pylint: disable=no-member messages.error(request, _('Invalid request')) return HttpResponseRedirect(reverse_lazy('profile')) @@ -234,16 +235,16 @@ class AssignPhotoOpenIDView(SuccessMessageMixin, TemplateView): return HttpResponseRedirect(reverse_lazy('profile')) try: - photo = self.model.objects.get( + photo = self.model.objects.get( # pylint: disable=no-member id=request.POST['photo_id'], user=request.user) - except self.model.DoesNotExist: + except self.model.DoesNotExist: # pylint: disable=no-member messages.error(request, _('Photo does not exist')) return HttpResponseRedirect(reverse_lazy('profile')) try: - openid = ConfirmedOpenId.objects.get( + openid = ConfirmedOpenId.objects.get( # pylint: disable=no-member user=request.user, id=kwargs['openid_id']) - except ConfirmedOpenId.DoesNotExist: + except ConfirmedOpenId.DoesNotExist: # pylint: disable=no-member messages.error(request, _('Invalid request')) return HttpResponseRedirect(reverse_lazy('profile')) @@ -255,22 +256,34 @@ class AssignPhotoOpenIDView(SuccessMessageMixin, TemplateView): def get_context_data(self, **kwargs): data = super().get_context_data(**kwargs) - data['openid'] = ConfirmedOpenId.objects.get(pk=kwargs['openid_id']) + data['openid'] = ConfirmedOpenId.objects.get(pk=kwargs['openid_id']) # pylint: disable=no-member return data @method_decorator(login_required, name='dispatch') -class ImportPhotoView(SuccessMessageMixin, View): +class ImportPhotoView(SuccessMessageMixin, TemplateView): ''' View class to import a photo from another service Currently only Gravatar is supported ''' + template_name = 'import_photo.html' - def post(self, request, *args, **kwargs): + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['photos'] = [] + gravatar = get_gravatar_photo(ConfirmedEmail.objects.get(pk=kwargs['email_id']).email) + if gravatar: + context['photos'].append(gravatar) + return context + + def post(self, request, *args, **kwargs): # pylint: disable=no-self-use,unused-argument + ''' + Handle post to photo import + ''' try: email = ConfirmedEmail.objects.get( id=kwargs['email_id'], user=request.user) - except Exception as e: + except ConfirmedEmail.DoesNotExist as e: # pylint: disable=no-member messages.error( request, _('Address does not exist')) @@ -301,7 +314,7 @@ class RawImageView(DetailView): model = Photo def get(self, request, *args, **kwargs): - photo = self.model.objects.get(pk=kwargs['pk']) + photo = self.model.objects.get(pk=kwargs['pk']) # pylint: disable=no-member return HttpResponse( io.BytesIO(photo.data), content_type='image/%s' % photo.format)