Merge branch 'pylint' into 'master'

Only a happy pylint is a good pylint

See merge request oliver/ivatar!39
This commit is contained in:
Oliver Falk
2018-07-11 10:47:44 +02:00
7 changed files with 177 additions and 98 deletions

View File

@@ -1 +1,4 @@
app_label = __name__ '''
Module init
'''
app_label = __name__ # pylint: disable=invalid-name

View File

@@ -1 +1,4 @@
app_label = __name__ '''
Module init
'''
app_label = __name__ # pylint: disable=invalid-name

View File

@@ -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']

View File

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

View File

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

View File

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

View File

@@ -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
''' '''