mirror of
https://git.linux-kernel.at/oliver/ivatar.git
synced 2025-11-17 13:38:03 +00:00
Only a happy pylint is a good pylint
This commit is contained in:
@@ -1 +1,4 @@
|
|||||||
app_label = __name__
|
'''
|
||||||
|
Module init
|
||||||
|
'''
|
||||||
|
app_label = __name__ # pylint: disable=invalid-name
|
||||||
|
|||||||
@@ -1 +1,4 @@
|
|||||||
app_label = __name__
|
'''
|
||||||
|
Module init
|
||||||
|
'''
|
||||||
|
app_label = __name__ # pylint: disable=invalid-name
|
||||||
|
|||||||
@@ -60,16 +60,16 @@ class AddEmailForm(forms.Form):
|
|||||||
if UnconfirmedEmail.objects.filter( # pylint: disable=no-member
|
if UnconfirmedEmail.objects.filter( # pylint: disable=no-member
|
||||||
user=user, email=self.cleaned_data['email']).exists():
|
user=user, email=self.cleaned_data['email']).exists():
|
||||||
self.add_error(
|
self.add_error(
|
||||||
'email',
|
'email',
|
||||||
_('Address already added, currently unconfirmed'))
|
_('Address already added, currently unconfirmed'))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Check whether or not the email is already confirmed by someone
|
# Check whether or not the email is already confirmed by someone
|
||||||
if ConfirmedEmail.objects.filter(
|
if ConfirmedEmail.objects.filter(
|
||||||
email=self.cleaned_data['email']).exists():
|
email=self.cleaned_data['email']).exists():
|
||||||
self.add_error(
|
self.add_error(
|
||||||
'email',
|
'email',
|
||||||
_('Address already confirmed (by someone else)'))
|
_('Address already confirmed (by someone else)'))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
unconfirmed = UnconfirmedEmail()
|
unconfirmed = UnconfirmedEmail()
|
||||||
@@ -171,8 +171,8 @@ class AddOpenIDForm(forms.Form):
|
|||||||
if UnconfirmedOpenId.objects.filter( # pylint: disable=no-member
|
if UnconfirmedOpenId.objects.filter( # pylint: disable=no-member
|
||||||
openid=self.cleaned_data['openid']).exists():
|
openid=self.cleaned_data['openid']).exists():
|
||||||
self.add_error(
|
self.add_error(
|
||||||
'openid',
|
'openid',
|
||||||
_('OpenID already added, but not confirmed yet!'))
|
_('OpenID already added, but not confirmed yet!'))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
unconfirmed = UnconfirmedOpenId()
|
unconfirmed = UnconfirmedOpenId()
|
||||||
@@ -187,10 +187,9 @@ class UpdatePreferenceForm(forms.ModelForm):
|
|||||||
Form for updating user preferences
|
Form for updating user preferences
|
||||||
'''
|
'''
|
||||||
|
|
||||||
class Meta:
|
class Meta: # pylint: disable=too-few-public-methods
|
||||||
'''
|
'''
|
||||||
Meta class for UpdatePreferenceForm
|
Meta class for UpdatePreferenceForm
|
||||||
'''
|
'''
|
||||||
model = UserPreference
|
model = UserPreference
|
||||||
fields = ['theme']
|
fields = ['theme']
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ from openid.store.interface import OpenIDStore
|
|||||||
|
|
||||||
from ivatar.settings import MAX_LENGTH_EMAIL, logger
|
from ivatar.settings import MAX_LENGTH_EMAIL, logger
|
||||||
from ivatar.settings import MAX_PIXELS, AVATAR_MAX_SIZE, JPEG_QUALITY
|
from ivatar.settings import MAX_PIXELS, AVATAR_MAX_SIZE, JPEG_QUALITY
|
||||||
from ivatar.settings import MIN_LENGTH_URL, MAX_LENGTH_URL
|
from ivatar.settings import MAX_LENGTH_URL
|
||||||
from .gravatar import get_photo as get_gravatar_photo
|
from .gravatar import get_photo as get_gravatar_photo
|
||||||
|
|
||||||
|
|
||||||
@@ -42,6 +42,7 @@ def file_format(image_type):
|
|||||||
return 'gif'
|
return 'gif'
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def pil_format(image_type):
|
def pil_format(image_type):
|
||||||
'''
|
'''
|
||||||
Helper method returning the 'encoder name' for PIL
|
Helper method returning the 'encoder name' for PIL
|
||||||
@@ -132,12 +133,14 @@ class Photo(BaseAccountModel):
|
|||||||
try:
|
try:
|
||||||
image = urlopen(image_url)
|
image = urlopen(image_url)
|
||||||
# No idea how to test this
|
# No idea how to test this
|
||||||
except HTTPError as e: # pragma: no cover # pylint: disable=invalid-name
|
# pragma: no cover # pylint: disable=invalid-name
|
||||||
|
except HTTPError as e:
|
||||||
print('%s import failed with an HTTP error: %s' %
|
print('%s import failed with an HTTP error: %s' %
|
||||||
(service_name, e.code))
|
(service_name, e.code))
|
||||||
return False
|
return False
|
||||||
# No idea how to test this
|
# No idea how to test this
|
||||||
except URLError as e: # pragma: no cover # pylint: disable=invalid-name
|
# pragma: no cover
|
||||||
|
except URLError as e: # pylint: disable=invalid-name
|
||||||
print('%s import failed: %s' % (service_name, e.reason))
|
print('%s import failed: %s' % (service_name, e.reason))
|
||||||
return False
|
return False
|
||||||
data = image.read()
|
data = image.read()
|
||||||
@@ -203,7 +206,8 @@ class Photo(BaseAccountModel):
|
|||||||
img = Image.open(BytesIO(self.data))
|
img = Image.open(BytesIO(self.data))
|
||||||
|
|
||||||
# This should be anyway checked during save...
|
# This should be anyway checked during save...
|
||||||
dimensions['a'], dimensions['b'] = img.size # pylint: disable=invalid-name
|
dimensions['a'], \
|
||||||
|
dimensions['b'] = img.size # pylint: disable=invalid-name
|
||||||
if dimensions['a'] > MAX_PIXELS or dimensions['b'] > MAX_PIXELS:
|
if dimensions['a'] > MAX_PIXELS or dimensions['b'] > MAX_PIXELS:
|
||||||
messages.error(
|
messages.error(
|
||||||
request,
|
request,
|
||||||
@@ -215,11 +219,14 @@ class Photo(BaseAccountModel):
|
|||||||
dimensions['w'], dimensions['h'] = dimensions['a'], dimensions['b']
|
dimensions['w'], dimensions['h'] = dimensions['a'], dimensions['b']
|
||||||
min_from_w_h = min(dimensions['w'], dimensions['h'])
|
min_from_w_h = min(dimensions['w'], dimensions['h'])
|
||||||
dimensions['w'], dimensions['h'] = min_from_w_h, min_from_w_h
|
dimensions['w'], dimensions['h'] = min_from_w_h, min_from_w_h
|
||||||
elif dimensions['w'] < 0 or \
|
elif dimensions['w'] < 0 or (
|
||||||
(dimensions['x'] + dimensions['w']) > dimensions['a'] or \
|
dimensions['x'] + dimensions['w']
|
||||||
dimensions['h'] < 0 or \
|
) > dimensions['a'] or dimensions['h'] < 0 or (
|
||||||
(dimensions['y'] + dimensions['h']) > dimensions['b']:
|
dimensions['y'] + dimensions['h']
|
||||||
messages.error(request, _('Crop outside of original image bounding box'))
|
) > dimensions['b']:
|
||||||
|
messages.error(
|
||||||
|
request,
|
||||||
|
_('Crop outside of original image bounding box'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
cropped = img.crop((
|
cropped = img.crop((
|
||||||
@@ -248,7 +255,8 @@ class Photo(BaseAccountModel):
|
|||||||
return '%s (%i) from %s' % (self.format, self.pk, self.user)
|
return '%s (%i) from %s' % (self.format, self.pk, self.user)
|
||||||
|
|
||||||
|
|
||||||
class ConfirmedEmailManager(models.Manager): # pylint: disable=too-few-public-methods
|
# pylint: disable=too-few-public-methods
|
||||||
|
class ConfirmedEmailManager(models.Manager):
|
||||||
'''
|
'''
|
||||||
Manager for our confirmed email addresses model
|
Manager for our confirmed email addresses model
|
||||||
'''
|
'''
|
||||||
@@ -312,7 +320,9 @@ class ConfirmedEmail(BaseAccountModel):
|
|||||||
self.digest = hashlib.md5(
|
self.digest = hashlib.md5(
|
||||||
self.email.strip().lower().encode('utf-8')
|
self.email.strip().lower().encode('utf-8')
|
||||||
).hexdigest()
|
).hexdigest()
|
||||||
self.digest_sha256 = hashlib.sha256(self.email.strip().lower().encode('utf-8')).hexdigest()
|
self.digest_sha256 = hashlib.sha256(
|
||||||
|
self.email.strip().lower().encode('utf-8')
|
||||||
|
).hexdigest()
|
||||||
return super().save(force_insert, force_update, using, update_fields)
|
return super().save(force_insert, force_update, using, update_fields)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
@@ -336,9 +346,15 @@ class UnconfirmedEmail(BaseAccountModel):
|
|||||||
def save(self, force_insert=False, force_update=False, using=None,
|
def save(self, force_insert=False, force_update=False, using=None,
|
||||||
update_fields=None):
|
update_fields=None):
|
||||||
hash_object = hashlib.new('sha256')
|
hash_object = hashlib.new('sha256')
|
||||||
hash_object.update(urandom(1024) + self.user.username.encode('utf-8')) # pylint: disable=no-member
|
hash_object.update(
|
||||||
|
urandom(1024) + self.user.username.encode('utf-8') # pylint: disable=no-member
|
||||||
|
) # pylint: disable=no-member
|
||||||
self.verification_key = hash_object.hexdigest()
|
self.verification_key = hash_object.hexdigest()
|
||||||
super(UnconfirmedEmail, self).save(force_insert, force_update, using, update_fields)
|
super(UnconfirmedEmail, self).save(
|
||||||
|
force_insert,
|
||||||
|
force_update,
|
||||||
|
using,
|
||||||
|
update_fields)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '%s (%i) from %s' % (self.email, self.pk, self.user)
|
return '%s (%i) from %s' % (self.email, self.pk, self.user)
|
||||||
@@ -421,7 +437,10 @@ class OpenIDNonce(models.Model):
|
|||||||
salt = models.CharField(max_length=128)
|
salt = models.CharField(max_length=128)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '%s (%i) (timestamp: %i)' % (self.server_url, self.pk, self.timestamp)
|
return '%s (%i) (timestamp: %i)' % (
|
||||||
|
self.server_url,
|
||||||
|
self.pk,
|
||||||
|
self.timestamp)
|
||||||
|
|
||||||
|
|
||||||
class OpenIDAssociation(models.Model):
|
class OpenIDAssociation(models.Model):
|
||||||
@@ -436,7 +455,11 @@ class OpenIDAssociation(models.Model):
|
|||||||
assoc_type = models.TextField(max_length=64)
|
assoc_type = models.TextField(max_length=64)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '%s (%i) (%s, lifetime: %i)' % (self.server_url, self.pk, self.assoc_type, self.lifetime)
|
return '%s (%i) (%s, lifetime: %i)' % (
|
||||||
|
self.server_url,
|
||||||
|
self.pk,
|
||||||
|
self.assoc_type,
|
||||||
|
self.lifetime)
|
||||||
|
|
||||||
|
|
||||||
class DjangoOpenIDStore(OpenIDStore):
|
class DjangoOpenIDStore(OpenIDStore):
|
||||||
@@ -466,9 +489,11 @@ class DjangoOpenIDStore(OpenIDStore):
|
|||||||
assocs = []
|
assocs = []
|
||||||
if handle is not None:
|
if handle is not None:
|
||||||
assocs = OpenIDAssociation.objects.filter( # pylint: disable=no-member
|
assocs = OpenIDAssociation.objects.filter( # pylint: disable=no-member
|
||||||
server_url=server_url, handle=handle)
|
server_url=server_url,
|
||||||
|
handle=handle)
|
||||||
else:
|
else:
|
||||||
assocs = OpenIDAssociation.objects.filter(server_url=server_url) # pylint: disable=no-member
|
assocs = OpenIDAssociation.objects.filter( # pylint: disable=no-member
|
||||||
|
server_url=server_url)
|
||||||
if not assocs:
|
if not assocs:
|
||||||
return None
|
return None
|
||||||
associations = []
|
associations = []
|
||||||
@@ -482,8 +507,10 @@ class DjangoOpenIDStore(OpenIDStore):
|
|||||||
assoc.assoc_type)
|
assoc.assoc_type)
|
||||||
expires = 0
|
expires = 0
|
||||||
try:
|
try:
|
||||||
expires = association.getExpiresIn() # pylint: disable=no-member
|
# pylint: disable=no-member
|
||||||
except Exception as e: # pylint: disable=invalid-name,broad-except,unused-variable
|
expires = association.getExpiresIn()
|
||||||
|
# pylint: disable=invalid-name,broad-except,unused-variable
|
||||||
|
except Exception as e:
|
||||||
expires = association.expiresIn
|
expires = association.expiresIn
|
||||||
if expires == 0:
|
if expires == 0:
|
||||||
self.removeAssociation(server_url, assoc.handle)
|
self.removeAssociation(server_url, assoc.handle)
|
||||||
@@ -493,7 +520,6 @@ class DjangoOpenIDStore(OpenIDStore):
|
|||||||
return None
|
return None
|
||||||
return associations[-1][1]
|
return associations[-1][1]
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def removeAssociation(server_url, handle): # pragma: no cover
|
def removeAssociation(server_url, handle): # pragma: no cover
|
||||||
'''
|
'''
|
||||||
@@ -533,7 +559,8 @@ class DjangoOpenIDStore(OpenIDStore):
|
|||||||
Helper method to cleanup nonces
|
Helper method to cleanup nonces
|
||||||
'''
|
'''
|
||||||
timestamp = int(time.time()) - oidnonce.SKEW
|
timestamp = int(time.time()) - oidnonce.SKEW
|
||||||
OpenIDNonce.objects.filter(timestamp__lt=timestamp).delete() # pylint: disable=no-member
|
# pylint: disable=no-member
|
||||||
|
OpenIDNonce.objects.filter(timestamp__lt=timestamp).delete()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def cleanupAssociations(): # pragma: no cover
|
def cleanupAssociations(): # pragma: no cover
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
'''
|
||||||
|
URLs for ivatar.ivataraccount
|
||||||
|
'''
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from django.conf.urls import url
|
from django.conf.urls import url
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
'''
|
'''
|
||||||
View classes for ivatar/ivataraccount/
|
View classes for ivatar/ivataraccount/
|
||||||
'''
|
'''
|
||||||
|
import io
|
||||||
|
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.contrib.messages.views import SuccessMessageMixin
|
from django.contrib.messages.views import SuccessMessageMixin
|
||||||
@@ -15,23 +17,20 @@ from django.http import HttpResponseRedirect, HttpResponse
|
|||||||
from django.urls import reverse_lazy, reverse
|
from django.urls import reverse_lazy, reverse
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
from django_openid_auth.models import UserOpenID
|
||||||
from openid import oidutil
|
from openid import oidutil
|
||||||
from openid.consumer import consumer
|
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 AddEmailForm, UploadPhotoForm, AddOpenIDForm
|
||||||
from .forms import UpdatePreferenceForm
|
from .forms import UpdatePreferenceForm
|
||||||
from .models import UnconfirmedEmail, ConfirmedEmail, Photo
|
from .models import UnconfirmedEmail, ConfirmedEmail, Photo
|
||||||
from .models import UnconfirmedOpenId, ConfirmedOpenId, DjangoOpenIDStore
|
from .models import UnconfirmedOpenId, ConfirmedOpenId, DjangoOpenIDStore
|
||||||
from .models import UserPreference
|
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
|
|
||||||
|
|
||||||
|
|
||||||
def openid_logging(message, level=0):
|
def openid_logging(message, level=0):
|
||||||
'''
|
'''
|
||||||
@@ -57,12 +56,11 @@ class CreateView(SuccessMessageMixin, FormView):
|
|||||||
password=form.cleaned_data['password1'])
|
password=form.cleaned_data['password1'])
|
||||||
if user is not None:
|
if user is not None:
|
||||||
login(self.request, user)
|
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()
|
pref.save()
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
else:
|
return HttpResponseRedirect(
|
||||||
return HttpResponseRedirect(
|
reverse_lazy('login')) # pragma: no cover
|
||||||
reverse_lazy('login')) # pragma: no cover
|
|
||||||
|
|
||||||
|
|
||||||
@method_decorator(login_required, name='dispatch')
|
@method_decorator(login_required, name='dispatch')
|
||||||
@@ -109,13 +107,17 @@ class RemoveUnconfirmedEmailView(SuccessMessageMixin, View):
|
|||||||
View class for removing a unconfirmed email address
|
View class for removing a unconfirmed email address
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
@staticmethod
|
||||||
|
def post(request, *args, **kwargs): # pylint: disable=unused-argument
|
||||||
|
'''
|
||||||
|
Handle post request - removing unconfirmed email
|
||||||
|
'''
|
||||||
try:
|
try:
|
||||||
email = UnconfirmedEmail.objects.get(
|
email = UnconfirmedEmail.objects.get( # pylint: disable=no-member
|
||||||
user=request.user, id=kwargs['email_id'])
|
user=request.user, id=kwargs['email_id'])
|
||||||
email.delete()
|
email.delete()
|
||||||
messages.success(request, _('Address removed'))
|
messages.success(request, _('Address removed'))
|
||||||
except UnconfirmedEmail.DoesNotExist:
|
except UnconfirmedEmail.DoesNotExist: # pylint: disable=no-member
|
||||||
messages.error(request, _('Address does not exist'))
|
messages.error(request, _('Address does not exist'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
@@ -136,8 +138,8 @@ class ConfirmEmailView(SuccessMessageMixin, TemplateView):
|
|||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
unconfirmed = UnconfirmedEmail.objects.get(verification_key=key)
|
unconfirmed = UnconfirmedEmail.objects.get(verification_key=key) # pylint: disable=no-member
|
||||||
except UnconfirmedEmail.DoesNotExist:
|
except UnconfirmedEmail.DoesNotExist: # pylint: disable=no-member
|
||||||
messages.error(request, _('Verification key does not exist'))
|
messages.error(request, _('Verification key does not exist'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
@@ -166,13 +168,17 @@ class RemoveConfirmedEmailView(SuccessMessageMixin, View):
|
|||||||
View class for removing a confirmed email address
|
View class for removing a confirmed email address
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
@staticmethod
|
||||||
|
def post(request, *args, **kwargs): # pylint: disable=unused-argument
|
||||||
|
'''
|
||||||
|
Handle post request - removing confirmed email
|
||||||
|
'''
|
||||||
try:
|
try:
|
||||||
email = ConfirmedEmail.objects.get(
|
email = ConfirmedEmail.objects.get(
|
||||||
user=request.user, id=kwargs['email_id'])
|
user=request.user, id=kwargs['email_id'])
|
||||||
email.delete()
|
email.delete()
|
||||||
messages.success(request, _('Address removed'))
|
messages.success(request, _('Address removed'))
|
||||||
except ConfirmedEmail.DoesNotExist:
|
except ConfirmedEmail.DoesNotExist: # pylint: disable=no-member
|
||||||
messages.error(request, _('Address does not exist'))
|
messages.error(request, _('Address does not exist'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
@@ -185,7 +191,10 @@ class AssignPhotoEmailView(SuccessMessageMixin, TemplateView):
|
|||||||
model = Photo
|
model = Photo
|
||||||
template_name = 'assign_photo_email.html'
|
template_name = 'assign_photo_email.html'
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs): # pylint: disable=unused-argument
|
||||||
|
'''
|
||||||
|
Handle post request - assign photo to email
|
||||||
|
'''
|
||||||
photo = None
|
photo = None
|
||||||
if 'photo_id' not in request.POST:
|
if 'photo_id' not in request.POST:
|
||||||
messages.error(request,
|
messages.error(request,
|
||||||
@@ -193,16 +202,16 @@ class AssignPhotoEmailView(SuccessMessageMixin, TemplateView):
|
|||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
photo = self.model.objects.get(
|
photo = self.model.objects.get( # pylint: disable=no-member
|
||||||
id=request.POST['photo_id'], user=request.user)
|
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'))
|
messages.error(request, _('Photo does not exist'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
email = ConfirmedEmail.objects.get(
|
email = ConfirmedEmail.objects.get(
|
||||||
user=request.user, id=kwargs['email_id'])
|
user=request.user, id=kwargs['email_id'])
|
||||||
except ConfirmedEmail.DoesNotExist:
|
except ConfirmedEmail.DoesNotExist: # pylint: disable=no-member
|
||||||
messages.error(request, _('Invalid request'))
|
messages.error(request, _('Invalid request'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
@@ -226,7 +235,10 @@ class AssignPhotoOpenIDView(SuccessMessageMixin, TemplateView):
|
|||||||
model = Photo
|
model = Photo
|
||||||
template_name = 'assign_photo_openid.html'
|
template_name = 'assign_photo_openid.html'
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs): # pylint: disable=unused-argument
|
||||||
|
'''
|
||||||
|
Handle post - assign photo to openid
|
||||||
|
'''
|
||||||
photo = None
|
photo = None
|
||||||
if 'photo_id' not in request.POST:
|
if 'photo_id' not in request.POST:
|
||||||
messages.error(request,
|
messages.error(request,
|
||||||
@@ -234,16 +246,16 @@ class AssignPhotoOpenIDView(SuccessMessageMixin, TemplateView):
|
|||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
photo = self.model.objects.get(
|
photo = self.model.objects.get( # pylint: disable=no-member
|
||||||
id=request.POST['photo_id'], user=request.user)
|
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'))
|
messages.error(request, _('Photo does not exist'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
openid = ConfirmedOpenId.objects.get(
|
openid = ConfirmedOpenId.objects.get( # pylint: disable=no-member
|
||||||
user=request.user, id=kwargs['openid_id'])
|
user=request.user, id=kwargs['openid_id'])
|
||||||
except ConfirmedOpenId.DoesNotExist:
|
except ConfirmedOpenId.DoesNotExist: # pylint: disable=no-member
|
||||||
messages.error(request, _('Invalid request'))
|
messages.error(request, _('Invalid request'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
@@ -255,7 +267,7 @@ class AssignPhotoOpenIDView(SuccessMessageMixin, TemplateView):
|
|||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
data = super().get_context_data(**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
|
return data
|
||||||
|
|
||||||
|
|
||||||
@@ -266,11 +278,15 @@ class ImportPhotoView(SuccessMessageMixin, View):
|
|||||||
Currently only Gravatar is supported
|
Currently only Gravatar is supported
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
@staticmethod
|
||||||
|
def post(request, *args, **kwargs): # pylint: disable=unused-argument
|
||||||
|
'''
|
||||||
|
Handle post - import photo
|
||||||
|
'''
|
||||||
try:
|
try:
|
||||||
email = ConfirmedEmail.objects.get(
|
email = ConfirmedEmail.objects.get(
|
||||||
id=kwargs['email_id'], user=request.user)
|
id=kwargs['email_id'], user=request.user)
|
||||||
except Exception as e:
|
except Exception: # pylint: disable=broad-except
|
||||||
messages.error(
|
messages.error(
|
||||||
request,
|
request,
|
||||||
_('Address does not exist'))
|
_('Address does not exist'))
|
||||||
@@ -301,7 +317,7 @@ class RawImageView(DetailView):
|
|||||||
model = Photo
|
model = Photo
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
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(
|
return HttpResponse(
|
||||||
io.BytesIO(photo.data), content_type='image/%s' % photo.format)
|
io.BytesIO(photo.data), content_type='image/%s' % photo.format)
|
||||||
|
|
||||||
@@ -313,12 +329,15 @@ class DeletePhotoView(SuccessMessageMixin, View):
|
|||||||
'''
|
'''
|
||||||
model = Photo
|
model = Photo
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs): # pylint: disable=unused-argument
|
||||||
|
'''
|
||||||
|
Handle get - delete photo
|
||||||
|
'''
|
||||||
try:
|
try:
|
||||||
photo = self.model.objects.get(
|
photo = self.model.objects.get( # pylint: disable=no-member
|
||||||
pk=kwargs['pk'], user=request.user)
|
pk=kwargs['pk'], user=request.user)
|
||||||
photo.delete()
|
photo.delete()
|
||||||
except Exception as e:
|
except Exception: # pylint: disable=broad-except
|
||||||
messages.error(
|
messages.error(
|
||||||
request,
|
request,
|
||||||
_('No such image or no permission to delete it'))
|
_('No such image or no permission to delete it'))
|
||||||
@@ -347,7 +366,7 @@ class UploadPhotoView(SuccessMessageMixin, FormView):
|
|||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
return super().post(request, *args, **kwargs)
|
return super().post(request, *args, **kwargs)
|
||||||
|
|
||||||
def form_valid(self, form, *args, **kwargs):
|
def form_valid(self, form):
|
||||||
photo_data = self.request.FILES['photo']
|
photo_data = self.request.FILES['photo']
|
||||||
if photo_data.size > MAX_PHOTO_SIZE:
|
if photo_data.size > MAX_PHOTO_SIZE:
|
||||||
messages.error(self.request, _('Image too big'))
|
messages.error(self.request, _('Image too big'))
|
||||||
@@ -361,7 +380,7 @@ class UploadPhotoView(SuccessMessageMixin, FormView):
|
|||||||
|
|
||||||
# Override success URL -> Redirect to crop page.
|
# Override success URL -> Redirect to crop page.
|
||||||
self.success_url = reverse_lazy('crop_photo', args=[photo.pk])
|
self.success_url = reverse_lazy('crop_photo', args=[photo.pk])
|
||||||
return super().form_valid(form, *args, **kwargs)
|
return super().form_valid(form)
|
||||||
|
|
||||||
|
|
||||||
@method_decorator(login_required, name='dispatch')
|
@method_decorator(login_required, name='dispatch')
|
||||||
@@ -377,14 +396,12 @@ class AddOpenIDView(SuccessMessageMixin, FormView):
|
|||||||
openid_id = form.save(self.request.user)
|
openid_id = form.save(self.request.user)
|
||||||
if not openid_id:
|
if not openid_id:
|
||||||
return render(self.request, self.template_name, {'form': form})
|
return render(self.request, self.template_name, {'form': form})
|
||||||
else:
|
|
||||||
# At this point we have an unconfirmed OpenID, but
|
|
||||||
# we do not add the message, that we successfully added it,
|
|
||||||
# since this is misleading
|
|
||||||
return HttpResponseRedirect(
|
|
||||||
reverse_lazy('openid_redirection', args=[openid_id]))
|
|
||||||
|
|
||||||
return super().form_valid(form)
|
# At this point we have an unconfirmed OpenID, but
|
||||||
|
# we do not add the message, that we successfully added it,
|
||||||
|
# since this is misleading
|
||||||
|
return HttpResponseRedirect(
|
||||||
|
reverse_lazy('openid_redirection', args=[openid_id]))
|
||||||
|
|
||||||
|
|
||||||
@method_decorator(login_required, name='dispatch')
|
@method_decorator(login_required, name='dispatch')
|
||||||
@@ -394,13 +411,16 @@ class RemoveUnconfirmedOpenIDView(View):
|
|||||||
'''
|
'''
|
||||||
model = UnconfirmedOpenId
|
model = UnconfirmedOpenId
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs): # pylint: disable=unused-argument
|
||||||
|
'''
|
||||||
|
Handle post - remove unconfirmed openid
|
||||||
|
'''
|
||||||
try:
|
try:
|
||||||
openid = self.model.objects.get(
|
openid = self.model.objects.get( # pylint: disable=no-member
|
||||||
user=request.user, id=kwargs['openid_id'])
|
user=request.user, id=kwargs['openid_id'])
|
||||||
openid.delete()
|
openid.delete()
|
||||||
messages.success(request, _('ID removed'))
|
messages.success(request, _('ID removed'))
|
||||||
except self.model.DoesNotExist: # pragma: no cover
|
except self.model.DoesNotExist: # pragma: no cover # pylint: disable=no-member
|
||||||
messages.error(request, _('ID does not exist'))
|
messages.error(request, _('ID does not exist'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
@@ -412,26 +432,35 @@ class RemoveConfirmedOpenIDView(View):
|
|||||||
'''
|
'''
|
||||||
model = ConfirmedOpenId
|
model = ConfirmedOpenId
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs): # pylint: disable=unused-argument
|
||||||
|
'''
|
||||||
|
Handle post - remove confirmed openid
|
||||||
|
'''
|
||||||
try:
|
try:
|
||||||
openid = self.model.objects.get(
|
openid = self.model.objects.get( # pylint: disable=no-member
|
||||||
user=request.user, id=kwargs['openid_id'])
|
user=request.user, id=kwargs['openid_id'])
|
||||||
openid.delete()
|
openid.delete()
|
||||||
messages.success(request, _('ID removed'))
|
messages.success(request, _('ID removed'))
|
||||||
except self.model.DoesNotExist:
|
except self.model.DoesNotExist: # pylint: disable=no-member
|
||||||
messages.error(request, _('ID does not exist'))
|
messages.error(request, _('ID does not exist'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
|
|
||||||
@method_decorator(login_required, name='dispatch')
|
@method_decorator(login_required, name='dispatch')
|
||||||
class RedirectOpenIDView(View):
|
class RedirectOpenIDView(View):
|
||||||
|
'''
|
||||||
|
Redirect view for OpenID
|
||||||
|
'''
|
||||||
model = UnconfirmedOpenId
|
model = UnconfirmedOpenId
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs): # pylint: disable=unused-argument
|
||||||
|
'''
|
||||||
|
Handle get for OpenID redirect view
|
||||||
|
'''
|
||||||
try:
|
try:
|
||||||
unconfirmed = self.model.objects.get(
|
unconfirmed = self.model.objects.get( # pylint: disable=no-member
|
||||||
user=request.user, id=kwargs['openid_id'])
|
user=request.user, id=kwargs['openid_id'])
|
||||||
except self.model.DoesNotExist: # pragma: no cover
|
except self.model.DoesNotExist: # pragma: no cover # pylint: disable=no-member
|
||||||
messages.error(request, _('ID does not exist'))
|
messages.error(request, _('ID does not exist'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
@@ -443,10 +472,10 @@ class RedirectOpenIDView(View):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
auth_request = openid_consumer.begin(user_url)
|
auth_request = openid_consumer.begin(user_url)
|
||||||
except consumer.DiscoveryFailure as e:
|
except consumer.DiscoveryFailure as e: # pylint: disable=invalid-name
|
||||||
messages.error(request, _('OpenID discovery failed: %s' % e))
|
messages.error(request, _('OpenID discovery failed: %s' % e))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
except UnicodeDecodeError as e: # pragma: no cover
|
except UnicodeDecodeError as e: # pragma: no cover pylint: disable=invalid-name
|
||||||
msg = _('OpenID discovery failed (userid=%s) for %s: %s' %
|
msg = _('OpenID discovery failed (userid=%s) for %s: %s' %
|
||||||
(request.user.id, user_url.encode('utf-8'), e))
|
(request.user.id, user_url.encode('utf-8'), e))
|
||||||
print(msg)
|
print(msg)
|
||||||
@@ -465,10 +494,16 @@ class RedirectOpenIDView(View):
|
|||||||
|
|
||||||
@method_decorator(login_required, name='dispatch')
|
@method_decorator(login_required, name='dispatch')
|
||||||
class ConfirmOpenIDView(View): # pragma: no cover
|
class ConfirmOpenIDView(View): # pragma: no cover
|
||||||
|
'''
|
||||||
|
Confirm OpenID view
|
||||||
|
'''
|
||||||
model = UnconfirmedOpenId
|
model = UnconfirmedOpenId
|
||||||
model_confirmed = ConfirmedOpenId
|
model_confirmed = ConfirmedOpenId
|
||||||
|
|
||||||
def do_request(self, data, *args, **kwargs):
|
def do_request(self, data, *args, **kwargs): # pylint: disable=unused-argument
|
||||||
|
'''
|
||||||
|
Handle request, called by get() or post()
|
||||||
|
'''
|
||||||
session = {'id': self.request.session.session_key}
|
session = {'id': self.request.session.session_key}
|
||||||
current_url = self.request.build_absolute_uri('/')[:-1] + \
|
current_url = self.request.build_absolute_uri('/')[:-1] + \
|
||||||
self.request.path
|
self.request.path
|
||||||
@@ -487,9 +522,9 @@ class ConfirmOpenIDView(View): # pragma: no cover
|
|||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
unconfirmed = self.model.objects.get(
|
unconfirmed = self.model.objects.get( # pylint: disable=no-member
|
||||||
user=self.request.user, id=kwargs['openid_id'])
|
user=self.request.user, id=kwargs['openid_id'])
|
||||||
except self.model.DoesNotExist:
|
except self.model.DoesNotExist: # pylint: disable=no-member
|
||||||
messages.error(self.request, _('ID does not exist'))
|
messages.error(self.request, _('ID does not exist'))
|
||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
@@ -508,7 +543,7 @@ class ConfirmOpenIDView(View): # pragma: no cover
|
|||||||
confirmed.set_photo(self.request.user.photo_set.first())
|
confirmed.set_photo(self.request.user.photo_set.first())
|
||||||
|
|
||||||
# Also allow user to login using this OPenID (if not already taken)
|
# Also allow user to login using this OPenID (if not already taken)
|
||||||
if not UserOpenID.objects.filter(claimed_id=confirmed.openid).exists():
|
if not UserOpenID.objects.filter(claimed_id=confirmed.openid).exists(): # pylint: disable=no-member
|
||||||
user_openid = UserOpenID()
|
user_openid = UserOpenID()
|
||||||
user_openid.user = self.request.user
|
user_openid.user = self.request.user
|
||||||
user_openid.claimed_id = confirmed.openid
|
user_openid.claimed_id = confirmed.openid
|
||||||
@@ -517,9 +552,15 @@ class ConfirmOpenIDView(View): # pragma: no cover
|
|||||||
return HttpResponseRedirect(reverse_lazy('profile'))
|
return HttpResponseRedirect(reverse_lazy('profile'))
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
|
'''
|
||||||
|
Handle get - confirm openid
|
||||||
|
'''
|
||||||
return self.do_request(request.GET, *args, **kwargs)
|
return self.do_request(request.GET, *args, **kwargs)
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
|
'''
|
||||||
|
Handle post - confirm openid
|
||||||
|
'''
|
||||||
return self.do_request(request.POST, *args, **kwargs)
|
return self.do_request(request.POST, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
@@ -542,7 +583,10 @@ class CropPhotoView(TemplateView):
|
|||||||
'openid': openid,
|
'openid': openid,
|
||||||
})
|
})
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs): # pylint: disable=unused-argument
|
||||||
|
'''
|
||||||
|
Handle post - crop photo
|
||||||
|
'''
|
||||||
photo = self.model.objects.get(pk=kwargs['pk'], user=request.user) # pylint: disable=no-member
|
photo = self.model.objects.get(pk=kwargs['pk'], user=request.user) # pylint: disable=no-member
|
||||||
dimensions = {
|
dimensions = {
|
||||||
'x': int(request.POST['x']),
|
'x': int(request.POST['x']),
|
||||||
@@ -554,19 +598,19 @@ class CropPhotoView(TemplateView):
|
|||||||
if 'email' in request.POST:
|
if 'email' in request.POST:
|
||||||
try:
|
try:
|
||||||
email = ConfirmedEmail.objects.get(email=request.POST['email'])
|
email = ConfirmedEmail.objects.get(email=request.POST['email'])
|
||||||
except Exception:
|
except Exception: # pylint: disable=broad-except
|
||||||
pass # Ignore automatic assignment
|
pass # Ignore automatic assignment
|
||||||
|
|
||||||
if 'openid' in request.POST:
|
if 'openid' in request.POST:
|
||||||
try:
|
try:
|
||||||
openid = ConfirmedOpenId.objects.get(
|
openid = ConfirmedOpenId.objects.get( # pylint: disable=no-member
|
||||||
openid=request.POST['openid'])
|
openid=request.POST['openid'])
|
||||||
except Exception:
|
except Exception: # pylint: disable=broad-except
|
||||||
pass # Ignore automatic assignment
|
pass # Ignore automatic assignment
|
||||||
|
|
||||||
return photo.perform_crop(request, dimensions, email, openid)
|
return photo.perform_crop(request, dimensions, email, openid)
|
||||||
|
|
||||||
@method_decorator(login_required, name='dispatch')
|
@method_decorator(login_required, name='dispatch') # pylint: disable=too-many-ancestors
|
||||||
class UserPreferenceView(FormView, UpdateView):
|
class UserPreferenceView(FormView, UpdateView):
|
||||||
'''
|
'''
|
||||||
View class for user preferences view/update
|
View class for user preferences view/update
|
||||||
@@ -576,5 +620,5 @@ class UserPreferenceView(FormView, UpdateView):
|
|||||||
form_class = UpdatePreferenceForm
|
form_class = UpdatePreferenceForm
|
||||||
success_url = reverse_lazy('user_preference')
|
success_url = reverse_lazy('user_preference')
|
||||||
|
|
||||||
def get_object(self):
|
def get_object(self, queryset=None):
|
||||||
return self.request.user.userpreference
|
return self.request.user.userpreference
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class AvatarImageView(TemplateView):
|
|||||||
'''
|
'''
|
||||||
# TODO: Do cache resize images!! Memcached?
|
# TODO: Do cache resize images!! Memcached?
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs): # pylint: disable=too-many-branches
|
||||||
'''
|
'''
|
||||||
Override get from parent class
|
Override get from parent class
|
||||||
'''
|
'''
|
||||||
|
|||||||
Reference in New Issue
Block a user