Merge photo_import

This commit is contained in:
Oliver Falk
2018-07-11 11:02:55 +02:00
10 changed files with 154 additions and 48 deletions

View File

@@ -24,6 +24,8 @@ from openid.association import Association as OIDAssociation
from openid.store import nonce as oidnonce
from openid.store.interface import OpenIDStore
from libravatar import libravatar_url
from ivatar.settings import MAX_LENGTH_EMAIL, logger
from ivatar.settings import MAX_PIXELS, AVATAR_MAX_SIZE, JPEG_QUALITY
from ivatar.settings import MAX_LENGTH_URL
@@ -128,6 +130,9 @@ class Photo(BaseAccountModel):
if gravatar:
image_url = gravatar['image_url']
if service_name == 'Libravatar':
image_url = libravatar_url(email_address)
if not image_url:
return False # pragma: no cover
try:

View File

@@ -0,0 +1,37 @@
{% 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>
{% if email_id %}
<form action="{% url 'import_photo' email_id %}" method="post">{% csrf_token %}
<input type="hidden" name="email_id" value="{{ email_id }}">
{% else %}
<form action="{% url 'import_photo' %}" method="post">{% csrf_token %}
<input type="hidden" name="email_addr" value="{{ email_addr }}">
{% endif %}
<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 %}

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -0,0 +1,33 @@
{% extends 'base.html' %}
{% load i18n %}
{% load bootstrap4 %}
{% block title %}{% trans 'Import photo' %} - Libravatar{% endblock title %}
{% block content %}
<h1>{% trans 'Import photo' %}</h1>
{% include '_import_photo_form.html' %}
{% if not email_id %}
<form action="{% url 'import_photo' %}" method="get" id="check_mail_form">
<label for="check_email_addr">{% trans 'Email Address' %}</label>
<input type="text" name="check_email_addr" value="{{ email_addr }}">
{% buttons %}
<button type="submit" class="btn btn-primary">{% trans 'Check' %}</button>
{% endbuttons %}
</form>
<script>
document.getElementById('check_mail_form').onsubmit =
function(self) {
window.location.href = "{% url 'import_photo' %}" + document.getElementsByName('check_email_addr')[0].value;
return false;
};
</script>
{% endif %}
<p><a href="{% url 'profile' %}">{% trans 'Back to your profile' %}</a></p>
{% endblock content %}

View File

@@ -79,7 +79,11 @@
{% endif %}
{% if not max_photos %}
<p><a href="{% url 'upload_photo' %}">{% trans 'Upload a new photo' %}</a></p>
<p>
<br/>
<a href="{% url 'upload_photo' %}">{% trans 'Upload a new photo' %}</a><br/>
<a href="{% url 'import_photo' %}">{% trans 'Import photo from other services' %}</a>
</p>
{% endif %}
<h2>{% trans 'Account settings' %}</h2>

View File

@@ -333,7 +333,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods
'unable to import photo from Gravatar?')
self.assertEqual(
str(list(response.context[0]['messages'])[0]),
'Image successfully imported',
'Gravatar image successfully imported',
'Importing gravatar photo did not work?')
self.assertIsInstance(
self.user.photo_set.first(),
@@ -1162,8 +1162,6 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods
)
url = '%s?%s' % (urlobj.path, urlobj.query)
response = self.client.get(url, follow=False)
print(response)
print(response.content)
self.assertRedirects(
response=response,
expected_url=default,

View File

@@ -69,6 +69,12 @@ urlpatterns = [ # pylint: disable=invalid-name
url(
r'assign_photo_openid/(?P<openid_id>\d+)',
AssignPhotoOpenIDView.as_view(), name='assign_photo_openid'),
url(
r'import_photo/$',
ImportPhotoView.as_view(), name='import_photo'),
url(
r'import_photo/(?P<email_addr>[\w.]+@[\w.]+.[\w.]+)',
ImportPhotoView.as_view(), name='import_photo'),
url(
r'import_photo/(?P<email_id>\d+)',
ImportPhotoView.as_view(), name='import_photo'),

View File

@@ -2,6 +2,7 @@
View classes for ivatar/ivataraccount/
'''
import io
from urllib.request import urlopen
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
@@ -16,6 +17,7 @@ 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 django_openid_auth.models import UserOpenID
from openid import oidutil
@@ -23,6 +25,9 @@ from openid.consumer import consumer
from ipware import get_client_ip
from libravatar import libravatar_url
from .gravatar import get_photo as get_gravatar_photo
from ivatar.settings import MAX_NUM_PHOTOS, MAX_PHOTO_SIZE
from .forms import AddEmailForm, UploadPhotoForm, AddOpenIDForm
@@ -272,39 +277,71 @@ class AssignPhotoOpenIDView(SuccessMessageMixin, TemplateView):
@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'
@staticmethod
def post(request, *args, **kwargs): # pylint: disable=unused-argument
def post(request, *args, **kwargs): # pylint: disable=no-self-use,unused-argument
'''
Handle post - import photo
Handle post to photo import
'''
try:
email = ConfirmedEmail.objects.get(
id=kwargs['email_id'], user=request.user)
except Exception: # pylint: disable=broad-except
messages.error(
request,
_('Address does not exist'))
return HttpResponseRedirect(reverse_lazy('profile'))
addr = None
email_id = None
imported = None
if 'email_id' in kwargs:
email_id = kwargs['email_id']
if 'email_id' in request.POST:
email_id = request.POST['email_id']
if 'email_addr' in kwargs:
addr = kwargs['email_addr']
if 'email_addr' in request.POST:
addr = request.POST['email_addr']
if email_id:
email = ConfirmedEmail.objects.filter(
id=email_id, user=request.user)
if email.count() > 0:
addr = email.first().email
else:
messages.error(
request,
_('Address does not exist'))
return HttpResponseRedirect(reverse_lazy('profile'))
if 'photo_Gravatar' in request.POST:
photo = Photo()
photo.user = request.user
photo.ip_address = get_client_ip(request)[0]
if photo.import_image('Gravatar', email.email):
photo.ip_address = get_client_ip(request)
if photo.import_image('Gravatar', addr):
messages.success(request,
_('Image successfully imported'))
_('Gravatar image successfully imported'))
else:
# Honestly, I'm not sure how to test this...
messages.error(
request,
_('Image import not successful')) # pragma: no cover
else:
_('Gravatar image import not successful')) # pragma: no cover
imported = True
if 'photo_Libravatar' in request.POST:
photo = Photo()
photo.user = request.user
photo.ip_address = get_client_ip(request)
if photo.import_image('Libravatar', addr):
messages.success(request,
_('Libravatar image successfully imported'))
else:
# Honestly, I'm not sure how to test this...
messages.error(
request,
_('Libravatar image import not successful')) # pragma: no cover
imported = True
if not imported:
messages.warning(request, _('Nothing importable'))
return HttpResponseRedirect(reverse_lazy('profile'))

View File

@@ -5,8 +5,10 @@ from io import BytesIO
from os import path
from PIL import Image
from django.views.generic.base import TemplateView
from django.http import HttpResponse, HttpResponseRedirect
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotFound
from django.core.exceptions import ObjectDoesNotExist
from django.utils.translation import ugettext_lazy as _
from ivatar.settings import AVATAR_MAX_SIZE, JPEG_QUALITY
from . ivataraccount.models import ConfirmedEmail, ConfirmedOpenId
from . ivataraccount.models import pil_format
@@ -58,10 +60,12 @@ class AvatarImageView(TemplateView):
# If that mail/openid doesn't exist, or has no photo linked to it
if not obj or not obj.photo:
# Return the default URL, as specified
# Return the default URL, as specified, or 404 Not Found, if default=404
if default:
if str(default) == str(404):
return HttpResponseNotFound(_('<h1>Image not found</h1>'))
return HttpResponseRedirect(default)
# Return our default URl
# Return our default URL
else:
static_img = path.join('static', 'img', 'mm', '%s%s' % (str(size), '.png'))
if not path.isfile(static_img):