X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=portal%2Fjoinview.py;h=d4e4af5a249e2028491220b86a650a28b453f456;hb=refs%2Fheads%2Fonelab;hp=5dd04c22b7d63b150f438d0c2b77fbbe51105eaf;hpb=3aae671a1ca0cef870a268b88ddcde8d520d7621;p=myslice.git diff --git a/portal/joinview.py b/portal/joinview.py index 5dd04c22..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 @@ -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,6 +95,16 @@ 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'^[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 !! @@ -106,29 +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('"', ''); - private_key = private_key.replace('"', ''); if not errors: reg_password = request.POST['pi_password'] a = PendingAuthority( site_name = reg_site_name, - site_authority = 'onelab.' + reg_site_abbreviated_name, + 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, @@ -140,23 +153,36 @@ 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, - public_key = public_key, - private_key = private_key, - user_hrn = user_hrn, - pi = reg_auth, - email_hash = '', - status = 'True', - ) - 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 = '{"first_name":"'+ reg_fname + '", "last_name":"'+ reg_lname + '", "authority_hrn":"'+ reg_auth + '"}' @@ -174,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, @@ -190,34 +209,36 @@ 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()) + 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') @@ -248,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)