mirror of
https://git.linux-kernel.at/oliver/ivatar.git
synced 2025-11-17 05:28:03 +00:00
Do allow importing photo from confirmed email
This commit is contained in:
29
ivatar/ivataraccount/templates/_import_photo_form.html
Normal file
29
ivatar/ivataraccount/templates/_import_photo_form.html
Normal file
@@ -0,0 +1,29 @@
|
||||
{% load i18n %}
|
||||
{% load bootstrap4 %}
|
||||
|
||||
{% if not user.is_anonymous %}
|
||||
{% if photos %}
|
||||
<p>{% trans 'Would you like to import some of these externally hosted photos?' %}</p>
|
||||
<form action="{% url 'import_photo' email_id %}" method="post">{% csrf_token %}
|
||||
<input type="hidden" name="email_id" value="{{ email_id }}">
|
||||
<ul class="horizontal-list imported-list centered">
|
||||
{% for photo in photos %}
|
||||
<li><input type="checkbox" name="photo_{{photo.service_name}}" id="photo_{{photo.service_name}}" checked="checked">
|
||||
<br/><label for="photo_{{photo.service_name}}"><img src="{{ photo.thumbnail_url }}" class="thumbnail" alt="{{photo.service_name}} image"></label>
|
||||
<br/>
|
||||
{% if photo.service_url %}
|
||||
<a href="{{ photo.service_url }}">{{ photo.service_name }}</a>
|
||||
{% else %} {# pragma: no cover #}
|
||||
{{ photo.service_name }} {# pragma: no cover #}
|
||||
{% endif %} {# pragma: no cover #}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<p>
|
||||
{% buttons %}
|
||||
<button type="submit" class="btn btn-primary">{% trans 'Import' %}</button>
|
||||
{% endbuttons %}
|
||||
</p>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
@@ -37,7 +37,12 @@
|
||||
</form></li>
|
||||
</ul>
|
||||
|
||||
<p><a href="{% url 'upload_photo' %}">{% blocktrans %}upload a new one{% endblocktrans %}</a></p>
|
||||
<p>
|
||||
<br/>
|
||||
<a href="{% url 'upload_photo' %}">{% blocktrans %}Upload a new one{% endblocktrans %}</a>
|
||||
<br/>
|
||||
<a href="{% url 'import_photo' email.pk %}">{% blocktrans %}Import from other services{% endblocktrans %}</a>
|
||||
</p>
|
||||
|
||||
{% endif %}
|
||||
|
||||
|
||||
@@ -9,31 +9,8 @@
|
||||
|
||||
<p><b>{% trans 'Your email address was successfully confirmed!' %}</b></p>
|
||||
|
||||
{% if not user.is_anonymous %}
|
||||
{% if photos %}
|
||||
|
||||
<p>{% trans 'Would you like to import some of these externally hosted photos?' %}</p>
|
||||
<form action="{% url 'import_photo' email_id %}" method="post">{% csrf_token %}
|
||||
<input type="hidden" name="email_id" value="{{ email_id }}">
|
||||
<ul class="horizontal-list imported-list centered">
|
||||
{% for photo in photos %}
|
||||
<li><input type="checkbox" name="photo_{{photo.service_name}}" id="photo_{{photo.service_name}}" checked="checked">
|
||||
<br/><label for="photo_{{photo.service_name}}"><img src="{{ photo.thumbnail_url }}" class="thumbnail" alt="{{photo.service_name}} image"></label>
|
||||
<br/>
|
||||
{% if photo.service_url %}
|
||||
<a href="{{ photo.service_url }}">{{ photo.service_name }}</a>
|
||||
{% else %} {# pragma: no cover #}
|
||||
{{ photo.service_name }} {# pragma: no cover #}
|
||||
{% endif %} {# pragma: no cover #}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<p><input type="submit" value="{% trans 'Import' %}"></p>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% include '_import_photo_form.html' %}
|
||||
|
||||
<p><a href="{% url 'profile' %}">{% trans 'Back to your profile' %}</a></p>
|
||||
{% endif %}
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
14
ivatar/ivataraccount/templates/import_photo.html
Normal file
14
ivatar/ivataraccount/templates/import_photo.html
Normal file
@@ -0,0 +1,14 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{% trans 'Import photo' %} - Libravatar{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>{% trans 'Import photo' %}</h1>
|
||||
|
||||
{% include '_import_photo_form.html' %}
|
||||
|
||||
<p><a href="{% url 'profile' %}">{% trans 'Back to your profile' %}</a></p>
|
||||
|
||||
{% endblock content %}
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user