Add file_format helper function, fix tz, add import_image

This commit is contained in:
Oliver Falk
2018-05-08 13:51:18 +02:00
parent bd9dc09127
commit 2cfa25c659

View File

@@ -2,26 +2,46 @@ from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from PIL import Image
from io import BytesIO
import base64
from . gravatar import get_photo as get_gravatar_photo from . gravatar import get_photo as get_gravatar_photo
from openid.store.interface import OpenIDStore from openid.store.interface import OpenIDStore
from openid.store import nonce as oidnonce from openid.store import nonce as oidnonce
from openid.association import Association as OIDAssociation from openid.association import Association as OIDAssociation
import datetime from urllib.request import urlopen
def utcnow():
return datetime.datetime.utcnow
MAX_LENGTH_EMAIL = 254 # http://stackoverflow.com/questions/386294 import hashlib
from os import urandom
from django.utils import timezone
from ivatar.settings import MAX_LENGTH_EMAIL
MAX_LENGTH_URL = 255 # MySQL can't handle more than that (LP: 1018682) MAX_LENGTH_URL = 255 # MySQL can't handle more than that (LP: 1018682)
def file_format(image_type):
if image_type == 'JPEG':
return 'jpg'
elif image_type == 'PNG':
return 'png'
elif image_type == 'GIF':
return 'gif'
print('Unsupported file format: %s' % image_type)
return None
class BaseAccountModel(models.Model): class BaseAccountModel(models.Model):
user = models.ForeignKey( user = models.ForeignKey(
User, User,
on_delete=models.deletion.CASCADE, on_delete=models.deletion.CASCADE,
) )
ip_address = models.GenericIPAddressField(unpack_ipv4=True) ip_address = models.GenericIPAddressField(unpack_ipv4=True, null=True)
add_date = models.DateTimeField(default=utcnow) add_date = models.DateTimeField(default=timezone.now)
class Meta: class Meta:
abstract = True abstract = True
@@ -36,6 +56,40 @@ class Photo(BaseAccountModel):
verbose_name = _('photo') verbose_name = _('photo')
verbose_name_plural = _('photos') verbose_name_plural = _('photos')
#def md5(self):
# return hashlib.md5(self.data)
def import_image(self, service_name, email_address):
image_url = False
if service_name == 'Gravatar':
gravatar = get_gravatar_photo(email_address)
if gravatar:
image_url = gravatar['image_url']
if not image_url:
return False
try:
image = urlopen(image_url)
except HTTPError as e:
print('%s import failed with an HTTP error: %s' % (service_name, e.code))
return False
except URLError as e:
print('%s import failed: %s' % (service_name, e.reason))
return False
data = image.read()
try:
img = Image.open(BytesIO(data))
except ValueError:
return False
self.format = file_format(img.format)
if not self.format:
return False
self.data = data
super().save()
return True
class ConfirmedEmailManager(models.Manager): class ConfirmedEmailManager(models.Manager):
def create_confirmed_email(self, user, email_address, is_logged_in): def create_confirmed_email(self, user, email_address, is_logged_in):
@@ -51,7 +105,7 @@ class ConfirmedEmailManager(models.Manager):
if gravatar: if gravatar:
external_photos.append(gravatar) external_photos.append(gravatar)
return external_photos return (confirmed.id, external_photos)
class ConfirmedEmail(BaseAccountModel): class ConfirmedEmail(BaseAccountModel):
@@ -69,6 +123,10 @@ class ConfirmedEmail(BaseAccountModel):
verbose_name = _('confirmed email') verbose_name = _('confirmed email')
verbose_name_plural = _('confirmed emails') verbose_name_plural = _('confirmed emails')
def set_photo(self, photo):
self.photo = photo
self.save()
class UnconfirmedEmail(BaseAccountModel): class UnconfirmedEmail(BaseAccountModel):
email = models.EmailField(max_length=MAX_LENGTH_EMAIL) email = models.EmailField(max_length=MAX_LENGTH_EMAIL)
@@ -80,9 +138,8 @@ class UnconfirmedEmail(BaseAccountModel):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
hash_object = hashlib.new('sha256') hash_object = hashlib.new('sha256')
hash_object.update(urandom(1024) + self.user.username) hash_object.update(urandom(1024) + self.user.username.encode('utf-8'))
self.verification_key = hash_object.hexdigest() self.verification_key = hash_object.hexdigest()
super(UnconfirmedEmail, self).save(*args, **kwargs) super(UnconfirmedEmail, self).save(*args, **kwargs)
@@ -108,6 +165,9 @@ class ConfirmedOpenId(BaseAccountModel):
verbose_name = _('confirmed OpenID') verbose_name = _('confirmed OpenID')
verbose_name_plural = _('confirmed OpenIDs') verbose_name_plural = _('confirmed OpenIDs')
# Classes related to the OpenID Store (from https://github.com/edx/django-openid-auth/) # Classes related to the OpenID Store (from https://github.com/edx/django-openid-auth/)
class OpenIDNonce(models.Model): class OpenIDNonce(models.Model):
server_url = models.CharField(max_length=255) server_url = models.CharField(max_length=255)