X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=portal%2Fjoinview.py;h=832055bdfc76230e8fe90ecffd8675bc73cafc7b;hb=bff32abff469690c249af3b4f1cbb6905bd70e0d;hp=65d8351fc7ca53d6a0fef2f230f97cc644bf6ac6;hpb=ba476841726dc818c0efd3ed25e42955a39fc504;p=myslice.git diff --git a/portal/joinview.py b/portal/joinview.py index 65d8351f..832055bd 100644 --- a/portal/joinview.py +++ b/portal/joinview.py @@ -2,12 +2,14 @@ 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 from django.template.loader import render_to_string from django.shortcuts import render from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site from unfold.page import Page from unfold.loginrequired import FreeAccessView @@ -17,10 +19,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 +import activity.institution + # since we inherit from FreeAccessView we cannot redefine 'dispatch' # so let's override 'get' and 'post' instead # @@ -43,8 +47,8 @@ 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_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': @@ -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,24 +122,21 @@ 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, @@ -140,23 +153,33 @@ 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) + # get the domain url + current_site = Site.objects.get_current() + current_site = current_site.domain + 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': 'http://' + 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 + '"}' @@ -216,8 +239,12 @@ class JoinView (FreeAccessView, ThemeView): except Exception, e: print "Failed to send email, please check the mail templates and the SMTP configuration of your server" - - 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), @@ -246,4 +273,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)