X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=portal%2Fjoinview.py;h=d4e4af5a249e2028491220b86a650a28b453f456;hb=refs%2Fheads%2Fonelab;hp=c128db3b68bf2477ee8967e08c7b94e08b3dbf0b;hpb=31b87e762d7430afeb81cf45f0b8c086cda91095;p=myslice.git diff --git a/portal/joinview.py b/portal/joinview.py index c128db3b..d4e4af5a 100644 --- a/portal/joinview.py +++ b/portal/joinview.py @@ -2,6 +2,7 @@ import os.path, re import json from random import randint +from hashlib import md5 from django.core.mail import EmailMultiAlternatives from django.contrib.auth.models import User from django.views.generic import View @@ -17,9 +18,12 @@ from manifoldapi.manifoldapi import execute_admin_query from manifold.core.query import Query from portal.models import PendingUser,PendingAuthority -from portal.actions import authority_get_pi_emails, manifold_add_user,manifold_add_account +from portal.actions import authority_get_pi_emails, manifold_add_user,manifold_add_account, create_pending_user from myslice.theme import ThemeView +from myslice.settings import logger + +import activity.institution # since we inherit from FreeAccessView we cannot redefine 'dispatch' # so let's override 'get' and 'post' instead @@ -43,9 +47,9 @@ class JoinView (FreeAccessView, ThemeView): root_authorities = sorted([a for a in authorities if '.' not in a['authority_hrn']]) page = Page(request) - page.add_js_files ( [ "js/jquery.validate.js", "js/join.js" ] ) - page.add_css_files ( [ "css/onelab.css", "css/registration.css" ] ) - page.add_css_files ( [ "http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" ] ) + page.add_js_files ( [ "js/jquery.validate.js", "js/join.js", "js/jquery.qtip.min.js" ] ) + page.add_css_files ( [ "css/onelab.css", "css/registration.css", "css/jquery.qtip.min.css" ] ) + page.add_css_files ( [ "https://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" ] ) if method == 'POST': # xxx tocheck - if authorities is empty, it's no use anyway @@ -59,20 +63,22 @@ class JoinView (FreeAccessView, ThemeView): reg_site_name = request.POST.get('site_name', '') reg_site_authority = request.POST.get('site_authority', '').lower() - reg_site_abbreviated_name = request.POST.get('site_abbreviated_name', '') + reg_site_abbreviated_name = request.POST.get('site_abbreviated_name', '').lower() reg_site_url = request.POST.get('site_url', '') reg_site_latitude = request.POST.get('site_latitude', '') reg_site_longitude = request.POST.get('site_longitude', '') reg_fname = request.POST.get('pi_first_name', '') reg_lname = request.POST.get('pi_last_name', '') - reg_auth = reg_root_authority_hrn + "." + reg_site_authority + reg_auth = 'onelab.' + reg_site_abbreviated_name reg_email = request.POST.get('pi_email','').lower() reg_phone = request.POST.get('pi_phone','') #prepare user_hrn split_email = reg_email.split("@")[0] split_email = split_email.replace(".", "_") - user_hrn = reg_auth + '.' + split_email+ str(randint(1,1000000)) + # Replace + by _ => more convenient for testing and validate with a real email + split_email = split_email.replace("+", "_") + user_hrn = reg_auth + '.' + split_email UserModel = get_user_model() @@ -89,15 +95,25 @@ class JoinView (FreeAccessView, ThemeView): errors.append('First Name may contain only letters, numbers, spaces and @/./+/-/_ characters.') if (re.search(r'^[\w+\s.@+-]+$', reg_lname) == None): errors.append('Last Name may contain only letters, numbers, spaces and @/./+/-/_ characters.') - if (re.search(r'^\w+$', reg_site_authority) == None): - errors.append('Site Authority may contain only letters or numbers.') + if (re.search(r'^[A-Za-z0-9_ ]*$', reg_site_name) == None): + errors.append('Name of organization may contain only letters, numbers, and underscore.') + if (re.search(r'^[A-Za-z ]*$', reg_address_city) == None): + errors.append('City may contain only letters.') + if (re.search(r'^[A-Za-z ]*$', reg_address_country) == None): + errors.append('Country may contain only letters.') + if (re.search(r'^[A-Za-z0-9]*$', reg_site_abbreviated_name) == None): + errors.append('Shortname may contain only letters and numbers') + if (re.search(r'^[0-9]*$', reg_phone) == None): + errors.append('Phone number may contain only numbers.') + #if (re.search(r'^\w+$', reg_site_authority) == None): + # errors.append('Site Authority may contain only letters or numbers.') # checking in django_db !! if PendingUser.objects.filter(email__iexact=reg_email): errors.append('Email is pending for validation. Please provide a new email address.') - if PendingAuthority.objects.filter(site_authority__iexact=reg_auth): - errors.append('This site is pending for validation.') - if PendingAuthority.objects.filter(site_name__iexact=reg_site_name): + if PendingAuthority.objects.filter(site_abbreviated_name__iexact=reg_site_abbreviated_name): errors.append('This site is pending for validation.') + #if PendingAuthority.objects.filter(site_name__iexact=reg_site_name): + # errors.append('This site is pending for validation.') if UserModel._default_manager.filter(email__iexact=reg_email): errors.append('This email is not usable. Please contact the administrator or try with another email.') @@ -106,28 +122,26 @@ class JoinView (FreeAccessView, ThemeView): errors.append('Email already registered in Manifold. Please provide a new email address.') # XXX TODO: Factorize with portal/accountview.py +# XXX TODO: Factorize with portal/registrationview.py +# XXX TODO: Factorize with portal/joinview.py # if 'generate' in request.POST['question']: from Crypto.PublicKey import RSA private = RSA.generate(1024) - private_key = json.dumps(private.exportKey()) - public = private.publickey() - public_key = json.dumps(public.exportKey(format='OpenSSH')) - + private_key = private.exportKey() + public_key = private.publickey().exportKey(format='OpenSSH') # Saving to DB - account_config = '{"user_public_key":'+ public_key + ', "user_private_key":'+ private_key + ', "user_hrn":"'+ user_hrn + '"}' auth_type = 'managed' - public_key = public_key.replace('"', ''); if not errors: reg_password = request.POST['pi_password'] a = PendingAuthority( site_name = reg_site_name, - site_authority = reg_root_authority_hrn + '.' + reg_site_authority, + site_authority = reg_auth, site_abbreviated_name = reg_site_abbreviated_name, site_url = reg_site_url, site_latitude = reg_site_latitude, site_longitude = reg_site_longitude, - address_line1 = reg_address_line1, + address_line1 = reg_email, # XXX field name must be renamed. Email needed 4 rejection email. address_line2 = reg_address_line2, address_line3 = reg_address_line3, address_city = reg_address_city, @@ -139,28 +153,45 @@ class JoinView (FreeAccessView, ThemeView): a.save() reg_password = request.POST['pi_password'] - b = PendingUser( - first_name = reg_fname, - last_name = reg_lname, - authority_hrn = reg_auth, - email = reg_email, - password = reg_password, - keypair = account_config, - pi = reg_auth, - ) - b.save() + salt = randint(1,100000) + + if request.is_secure(): + current_site = 'https://' + else: + current_site = 'http://' + current_site += request.META['HTTP_HOST'] + email_hash = md5(str(salt)+reg_email).hexdigest() + user_request = { + 'first_name' : reg_fname, + 'last_name' : reg_lname, + 'organization' : reg_site_name, + 'authority_hrn' : reg_auth, + 'email' : reg_email, + 'password' : reg_password, + 'public_key' : public_key, + 'private_key' : private_key, + 'current_site' : current_site, + 'email_hash' : email_hash, + 'user_hrn' : user_hrn, + 'pi' : [reg_auth], + 'auth_type' : 'managed', + 'validation_link': current_site + '/portal/email_activation/'+ email_hash + } + + + create_pending_user(request, user_request, user_detail) # saves the user to django auth_user table [needed for password reset] - user = User.objects.create_user(reg_email, reg_email, reg_password) + #user = User.objects.create_user(reg_email, reg_email, reg_password) #creating user to manifold local:user - user_config = '{"firstname":"'+ reg_fname + '", "lastname":"'+ reg_lname + '", "authority":"'+ reg_auth + '"}' - user_params = {'email': reg_email, 'password': reg_password, 'config': user_config, 'status': 1} - manifold_add_user(request,user_params) + #user_config = '{"first_name":"'+ reg_fname + '", "last_name":"'+ reg_lname + '", "authority_hrn":"'+ reg_auth + '"}' + #user_params = {'email': reg_email, 'password': reg_password, 'config': user_config, 'status': 1} + #manifold_add_user(request,user_params) #creating local:account in manifold - user_id = user_detail['user_id']+1 # the user_id for the newly created user in local:user - account_params = {'platform_id': 5, 'user_id': user_id, 'auth_type': auth_type, 'config': account_config} - manifold_add_account(request,account_params) + #user_id = user_detail['user_id']+1 # the user_id for the newly created user in local:user + #account_params = {'platform_id': 5, 'user_id': user_id, 'auth_type': auth_type, 'config': account_config} + #manifold_add_account(request,account_params) # Send email try: @@ -169,14 +200,7 @@ class JoinView (FreeAccessView, ThemeView): 'authority_hrn' : reg_root_authority_hrn + '.' + reg_site_authority, 'site_abbreviated_name' : reg_site_abbreviated_name, 'site_url' : reg_site_url, - 'site_latitude' : reg_site_latitude, - 'site_longitude' : reg_site_longitude, - 'address_line1' : reg_address_line1, - 'address_line2' : reg_address_line2, - 'address_line3' : reg_address_line3, 'address_city' : reg_address_city, - 'address_postalcode' : reg_address_postalcode, - 'address_state' : reg_address_state, 'address_country' : reg_address_country, 'first_name' : reg_fname, 'last_name' : reg_lname, @@ -185,34 +209,38 @@ class JoinView (FreeAccessView, ThemeView): 'user_hrn' : user_hrn, 'public_key' : public_key, } - recipients = authority_get_pi_emails(request,reg_auth) + + #recipients = authority_get_pi_emails(request,reg_auth) - # We don't need to send this email to user. - # it's for the PI only - #if ctx['cc_myself']: - # recipients.append(ctx['email']) - theme.template_name = 'authority_request_email.html' - html_content = render_to_string(theme.template, ctx) + self.template_name = 'authority_request_email.html' + html_content = render_to_string(self.template, ctx) - theme.template_name = 'authority_request_email.txt' - text_content = render_to_string(theme.template, ctx) + self.template_name = 'authority_request_email.txt' + text_content = render_to_string(self.template, ctx) - theme.template_name = 'authority_request_email_subject.txt' - subject = render_to_string(theme.template, ctx) + self.template_name = 'authority_request_email_subject.txt' + subject = render_to_string(self.template, ctx) subject = subject.replace('\n', '') - theme.template_name = 'email_default_sender.txt' - sender = render_to_string(theme.template, ctx) - sender = sender.replace('\n', '') - - msg = EmailMultiAlternatives(subject, text_content, sender, recipients) + #theme.template_name = 'email_default_sender.txt' + #sender = render_to_string(theme.template, ctx) + #sender = sender.replace('\n', '') + sender = reg_email + + msg = EmailMultiAlternatives(subject, text_content, sender, ['support@onelab.eu']) msg.attach_alternative(html_content, "text/html") msg.send() except Exception, e: - print "Failed to send email, please check the mail templates and the SMTP configuration of your server" + logger.error("Failed to send email, please check the mail templates and the SMTP configuration of your server") + import traceback + logger.error(traceback.format_exc()) - return render(request, 'user_register_complete.html') + self.template_name = 'join_complete.html' + # log institution activity + activity.institution.joined(self.request) + return render(request, self.template, {'theme': self.theme}) + #return render(request, 'user_register_complete.html') template_env = { 'topmenu_items': topmenu_items_live('join', page), @@ -241,4 +269,6 @@ class JoinView (FreeAccessView, ThemeView): 'theme': self.theme } template_env.update(page.prelude_env ()) + # log institution activity + activity.institution.join(self.request) return render(request, 'join_view.html',template_env)