diff --git a/ivatar/ivataraccount/templates/assign_photo_openid.html b/ivatar/ivataraccount/templates/assign_photo_openid.html
new file mode 100644
index 0000000..cce8ee2
--- /dev/null
+++ b/ivatar/ivataraccount/templates/assign_photo_openid.html
@@ -0,0 +1,44 @@
+{% extends 'base.html' %}
+{% load i18n %}
+
+{% block title %}{% blocktrans with openid.openid as openid_address %}Choose a photo for {{ openid_address }}{% endblocktrans %} - ivatar{% endblock title %}
+
+{% block content %}
+
+
{% blocktrans with openid.openid as openid_address %}Choose a photo for {{ openid_address }}{% endblocktrans %}
+
+{% if not user.photo_set.count %}
+
+{% url 'upload_photo' as upload_url %}
+{% blocktrans %}You need to upload some photos first!{% endblocktrans %}
+
+{% trans 'Back to your profile' %}
+
+{% else %}
+
+{% trans 'Here are the pictures you have uploaded, click on the one you wish to associate with this openid address:' %}
+
+{% for photo in user.photo_set.all %}
+ -
+
+{% endfor %}
+ -
+
+
+
+{% blocktrans %}upload a new one{% endblocktrans %}
+
+{% endif %}
+
+{% endblock content %}
diff --git a/ivatar/ivataraccount/urls.py b/ivatar/ivataraccount/urls.py
index 5b69ce5..78e92ea 100644
--- a/ivatar/ivataraccount/urls.py
+++ b/ivatar/ivataraccount/urls.py
@@ -6,7 +6,8 @@ from . views import CreateView, PasswordSetView, AddEmailView
from . views import RemoveUnconfirmedEmailView, ConfirmEmailView
from . views import RemoveConfirmedEmailView, AssignPhotoEmailView
from . views import RemoveUnconfirmedOpenIDView, RemoveConfirmedOpenIDView
-from . views import ImportPhotoView, RawImageView, DeletePhotoView, UploadPhotoView
+from . views import ImportPhotoView, RawImageView, DeletePhotoView
+from . views import UploadPhotoView, AssignPhotoOpenIDView
from . views import AddOpenIDView, RedirectOpenIDView, ConfirmOpenIDView
from django.contrib.auth.views import login, logout, password_change, password_change_done
from django.urls import reverse_lazy
@@ -41,7 +42,7 @@ urlpatterns = [
url('remove_unconfirmed_email/(?P\d+)', RemoveUnconfirmedEmailView.as_view(), name='remove_unconfirmed_email'),
url('remove_confirmed_email/(?P\d+)', RemoveConfirmedEmailView.as_view(), name='remove_confirmed_email'),
url('assign_photo_email/(?P\d+)', AssignPhotoEmailView.as_view(), name='assign_photo_email'),
- url('assign_photo_openid/(?P\d+)', TemplateView.as_view(template_name='fixme.html'), name='assign_photo_openid'),
+ url('assign_photo_openid/(?P\d+)', AssignPhotoOpenIDView.as_view(), name='assign_photo_openid'),
url('import_photo/(?P\d+)', ImportPhotoView.as_view(), name='import_photo'),
url('delete_photo/(?P\d+)', DeletePhotoView.as_view(), name='delete_photo'),
url('raw_image/(?P\d+)', RawImageView.as_view(), name='raw_image'),
diff --git a/ivatar/ivataraccount/views.py b/ivatar/ivataraccount/views.py
index 2ffc293..b1a7045 100644
--- a/ivatar/ivataraccount/views.py
+++ b/ivatar/ivataraccount/views.py
@@ -210,6 +210,47 @@ class AssignPhotoEmailView(SuccessMessageMixin, TemplateView):
return data
+@method_decorator(login_required, name='dispatch')
+class AssignPhotoOpenIDView(SuccessMessageMixin, TemplateView):
+ '''
+ View class for assigning a photo to an openid address
+ '''
+ model = Photo
+ template_name = 'assign_photo_openid.html'
+
+ def post(self, *args, **kwargs):
+ photo = None
+ if 'photo_id' not in self.request.POST:
+ messages.error(self.request,
+ _('Invalid request [photo_id] missing'))
+ return HttpResponseRedirect(reverse_lazy('profile'))
+
+ try:
+ photo = self.model.objects.get(
+ id=self.request.POST['photo_id'], user=self.request.user)
+ except self.model.DoesNotExist:
+ messages.error(self.request, _('Photo does not exist'))
+ return HttpResponseRedirect(reverse_lazy('profile'))
+
+ try:
+ openid = ConfirmedOpenId.objects.get(
+ user=self.request.user, id=kwargs['openid_id'])
+ except ConfirmedOpenId.DoesNotExist:
+ messages.error(self.request, _('Invalid request'))
+ return HttpResponseRedirect(reverse_lazy('profile'))
+
+ openid.photo = photo
+ openid.save()
+
+ messages.success(self.request, _('Successfully changed photo'))
+ return HttpResponseRedirect(reverse_lazy('profile'))
+
+ def get_context_data(self, **kwargs):
+ data = super().get_context_data(**kwargs)
+ data['openid'] = ConfirmedOpenId.objects.get(pk=kwargs['openid_id'])
+ return data
+
+
@method_decorator(login_required, name='dispatch')
class ImportPhotoView(SuccessMessageMixin, View):
'''