"""This file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license.
|
"""
|
import os
|
import uuid
|
from time import time
|
|
from core.utils.common import load_func
|
from django import forms
|
from django.conf import settings
|
from django.contrib import auth
|
from django.core.files.images import get_image_dimensions
|
from django.shortcuts import redirect
|
from django.urls import reverse
|
from organizations.models import Organization
|
|
|
def hash_upload(instance, filename):
|
filename = str(uuid.uuid4())[0:8] + '-' + filename
|
return settings.AVATAR_PATH + '/' + filename
|
|
|
def check_avatar(files):
|
images = list(files.items())
|
if not images:
|
return None
|
|
_, avatar = list(files.items())[0] # get first file
|
w, h = get_image_dimensions(avatar)
|
if not w or not h:
|
raise forms.ValidationError("Can't read image, try another one")
|
|
# validate dimensions
|
max_width = max_height = 1200
|
if w > max_width or h > max_height:
|
raise forms.ValidationError('Please use an image that is %s x %s pixels or smaller.' % (max_width, max_height))
|
|
valid_extensions = ['jpeg', 'jpg', 'gif', 'png']
|
|
filename = avatar.name
|
# check file extension
|
ext = os.path.splitext(filename)[1].lstrip('.').lower()
|
if ext not in valid_extensions:
|
raise forms.ValidationError('Please upload a valid image file with extensions: JPEG, JPG, GIF, or PNG.')
|
|
# validate content type
|
main, sub = avatar.content_type.split('/')
|
if not (main == 'image' and sub.lower() in valid_extensions):
|
raise forms.ValidationError('Please use a JPEG, GIF or PNG image.')
|
|
# validate file size
|
max_size = 1024 * 1024
|
if len(avatar) > max_size:
|
raise forms.ValidationError('Avatar file size may not exceed ' + str(max_size / 1024) + ' kb')
|
|
return avatar
|
|
|
def save_user(request, next_page, user_form):
|
"""Save user instance to DB"""
|
user = user_form.save()
|
user.username = user.email.split('@')[0]
|
user.save()
|
|
if Organization.objects.exists():
|
org = Organization.objects.first()
|
org.add_user(user)
|
else:
|
org = Organization.create_organization(created_by=user, title='Label Studio')
|
user.active_organization = org
|
user.save(update_fields=['active_organization'])
|
|
request.advanced_json = {
|
'email': user.email,
|
'allow_newsletters': user.allow_newsletters,
|
'update-notifications': 1,
|
'new-user': 1,
|
'how_find_us': user_form.cleaned_data.get('how_find_us', ''),
|
}
|
if user_form.cleaned_data.get('how_find_us', '') == 'Other':
|
request.advanced_json['elaborate'] = user_form.cleaned_data.get('elaborate', '')
|
|
redirect_url = next_page if next_page else reverse('projects:project-index')
|
login(request, user, backend='django.contrib.auth.backends.ModelBackend')
|
return redirect(redirect_url)
|
|
|
def proceed_registration(request, user_form, organization_form, next_page):
|
"""Register a new user for POST user_signup"""
|
# save user to db
|
save_user = load_func(settings.SAVE_USER)
|
response = save_user(request, next_page, user_form)
|
|
return response
|
|
|
def login(request, *args, **kwargs):
|
request.session['last_login'] = time()
|
return auth.login(request, *args, **kwargs)
|