mirror of
https://git.linux-kernel.at/oliver/ivatar.git
synced 2025-11-17 05:28:03 +00:00
Merge photo_import
This commit is contained in:
@@ -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:
|
||||
|
||||
37
ivatar/ivataraccount/templates/_import_photo_form.html
Normal file
37
ivatar/ivataraccount/templates/_import_photo_form.html
Normal 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 %}
|
||||
@@ -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 %}
|
||||
|
||||
33
ivatar/ivataraccount/templates/import_photo.html
Normal file
33
ivatar/ivataraccount/templates/import_photo.html
Normal 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 %}
|
||||
@@ -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>
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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'))
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user