Esempio n. 1
0
    def get_or_post(self, wsgi_request, method):
        """
        """
        errors = []

        authorities = getAuthorities(wsgi_request, admin = True)

        #authority_hrn = None
        ## REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2
        #authorities_query = Query.get('authority').select('name', 'authority_hrn')
        #authorities = execute_admin_query(wsgi_request, authorities_query)
        #if authorities is not None:
        #    # Remove the root authority from the list
        #    matching = [s for s in authorities if "." in s['authority_hrn']]
        #    authorities = sorted(matching, key=lambda k: k['authority_hrn'])
        #    authorities = sorted(matching, key=lambda k: k['name'])
        
        logger.debug("############ BREAKPOINT 1 #################")
        # Page rendering
        page = Page(wsgi_request)

        page.add_css_files ( [ "https://code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css" ] )

        page.add_js_files  ( [ "js/jquery.validate.js", "js/my_account.register.js", "js/jquery.qtip.min.js","js/jquery-ui.js","js/jquery-ui-combobox.js" ] )

        page.add_css_files ( [ "css/onelab.css", "css/registration.css", "css/jquery.qtip.min.css", "css/jquery.ui.combobox.css" ] )
        page.expose_js_metadata()
        logger.debug("############ BREAKPOINT 2 #################")
        if method == 'POST':
            reg_form = {}
Esempio n. 2
0
    def get_context_data(self, **kwargs):
        page = Page(self.request)
        page.add_js_files([
            "js/jquery.validate.js", "js/my_account.register.js",
            "js/my_account.edit_profile.js"
        ])
        page.add_css_files(["css/plugin.css"])

        usera = UserAccessProfile(self.request)

        c_user = usera.user_obj  #get_user_by_email(the_user(self.request))
        history_list_omf = Reservation.objects.filter(
            user_ref=c_user, username=usera.session_username)
        history_list_sim = SimReservation.objects.filter(
            user_ref=c_user, username=usera.session_username)
        context = super(SliceHistoryView, self).get_context_data(**kwargs)
        context['history_list_omf'] = history_list_omf
        context['history_list_sim'] = history_list_sim
        context['time_now'] = timezone.now
        context['title'] = 'Request Log'
        context['sim_enable'] = SIM_RESERVATION
        # the menu items on the top
        context['topmenu_items'] = topmenu_items(
            'Request Log', page.request)  # @qursaan change from _live
        # so we can sho who is logged
        context['username'] = usera.username  #the_user(self.request)
        prelude_env = page.prelude_env()
        context.update(prelude_env)
        return context
Esempio n. 3
0
    def get_context_data(self, **kwargs):
        page = Page(self.request)
        page.add_js_files([
            "js/jquery.validate.js", "js/my_account.register.js",
            "js/my_account.edit_profile.js"
        ])
        page.add_css_files(["css/plugin.css"])
        usera = UserAccessProfile(self.request)
        c_user = usera.user_obj  # get_user_by_email(the_user(self.request))
        get_count_active_slice(c_user=c_user, username=usera.session_username)
        pending_list_1 = Reservation.objects.filter(
            user_ref=c_user,
            username=usera.session_username,
            status=ReservationStatus.get_pending())
        active_list_1 = Reservation.objects.filter(
            user_ref=c_user,
            username=usera.session_username,
            status=ReservationStatus.get_active())
        pending_list_2 = SimReservation.objects.filter(
            user_ref=c_user,
            username=usera.session_username,
            status=ReservationStatus.get_pending())
        active_list_2 = SimReservation.objects.filter(
            user_ref=c_user,
            username=usera.session_username,
            status=ReservationStatus.get_active())

        context = super(SliceCurrentView, self).get_context_data(**kwargs)
        context['current_list_1'] = pending_list_1
        context['active_list_1'] = active_list_1
        context['current_list_2'] = pending_list_2
        context['active_list_2'] = active_list_2

        context['time_now'] = timezone.now()
        # XXX This is repeated in all pages
        # more general variables expected in the template
        context['title'] = 'Reservation Panel'
        # the menu items on the top
        # context['topmenu_items'] = topmenu_items('Reservation Status', page.request)  # @qursaan change from _live
        # so we can sho who is logged
        context['username'] = usera.username  # the_user(self.request)
        # context ['firstname'] = config['firstname']
        prelude_env = page.prelude_env()
        context.update(prelude_env)
        return context
Esempio n. 4
0
    def get_or_post(self, request, method, slicename):
        """
        """
        # Page rendering
        page = Page(request)
        page.add_js_files(["js/jquery-ui.js"])
        page.add_css_files(["css/jquery-ui.css"])

        errors = []
        slice_name = ''
        template_env = {
            'theme': self.theme,
            'section': "Slice request",
            'slicename': slicename,
            'request': request,
        }
        template_env.update(page.prelude_env())

        return render_to_response(self.template,
                                  template_env,
                                  context_instance=RequestContext(request))
Esempio n. 5
0
    def get_context_data(self, **kwargs):

        page = Page(self.request)
        page.add_js_files([
            "js/jquery.validate.js", "js/my_account.register.js",
            "js/my_account.edit_profile.js", "js/jquery-ui.js"
        ])
        page.add_css_files([
            "css/onelab.css", "css/account_view.css", "css/plugin.css",
            "css/jquery-ui.css"
        ])

        for key, value in kwargs.iteritems():
            if key == "email":
                selected_email = value

        user_query = Query().get('local:user').filter_by(
            'email', '==', selected_email).select('user_id', 'config', 'email',
                                                  'status')
        user_details = execute_admin_query(self.request, user_query)

        # not always found in user_details...
        config = {}
        for user_detail in user_details:
            user_id = user_detail['user_id']
            user_email = user_detail['email']
            # different significations of user_status
            if user_detail['status'] == 0:
                user_status = 'Disabled'
            elif user_detail['status'] == 1:
                user_status = 'Validation Pending'
            elif user_detail['status'] == 2:
                user_status = 'Enabled'
            else:
                user_status = 'N/A'
            #email = user_detail['email']
            if user_detail['config']:
                config = json.loads(user_detail['config'])
                authority_hrn = config.get('authority', 'Unknown Authority')

        platform_query = Query().get('local:platform').select(
            'platform_id', 'platform', 'gateway_type', 'disabled')
        account_query = Query().get('local:account').filter_by(
            'user_id', '==', user_id).select('user_id', 'platform_id',
                                             'auth_type', 'config')
        platform_details = execute_query(self.request, platform_query)
        account_details = execute_admin_query(self.request, account_query)

        # initial assignment needed for users having account.config = {}
        platform_name = ''
        account_type = ''
        account_usr_hrn = ''
        account_pub_key = ''
        account_priv_key = ''
        account_reference = ''
        my_users = ''
        my_slices = ''
        my_auths = ''
        ref_acc_list = ''
        principal_acc_list = ''
        user_status_list = []
        platform_name_list = []
        platform_name_secondary_list = []
        platform_access_list = []
        platform_no_access_list = []
        total_platform_list = []
        account_type_list = []
        account_type_secondary_list = []
        account_reference_list = []
        delegation_type_list = []
        user_cred_exp_list = []
        slice_list = []
        auth_list = []
        slice_cred_exp_list = []
        auth_cred_exp_list = []
        usr_hrn_list = []
        pub_key_list = []

        for platform_detail in platform_details:
            if 'sfa' in platform_detail['gateway_type']:
                total_platform = platform_detail['platform']
                total_platform_list.append(total_platform)

            for account_detail in account_details:
                if platform_detail['platform_id'] == account_detail[
                        'platform_id']:
                    platform_name = platform_detail['platform']
                    if 'config' in account_detail and account_detail[
                            'config'] is not '':
                        account_config = json.loads(account_detail['config'])
                        account_usr_hrn = account_config.get('user_hrn', 'N/A')
                        account_pub_key = account_config.get(
                            'user_public_key', 'N/A')
                        account_reference = account_config.get(
                            'reference_platform', 'N/A')

                    # credentials of myslice platform
                    if 'myslice' in platform_detail['platform']:
                        acc_user_cred = account_config.get(
                            'delegated_user_credential', 'N/A')
                        acc_slice_cred = account_config.get(
                            'delegated_slice_credentials', 'N/A')
                        acc_auth_cred = account_config.get(
                            'delegated_authority_credentials', 'N/A')
                        #usr_hrn of myslice platform. used to check pi or no
                        account_usr_hrn_myslice = account_config.get(
                            'user_hrn', 'N/A')

                        if 'N/A' not in acc_user_cred:
                            exp_date = re.search('<expires>(.*)</expires>',
                                                 acc_user_cred)
                            if exp_date:
                                user_exp_date = exp_date.group(1)
                                user_cred_exp_list.append(user_exp_date)

                            my_users = [{
                                'cred_exp': t[0]
                            } for t in zip(user_cred_exp_list)]

                        if 'N/A' not in acc_slice_cred:
                            for key, value in acc_slice_cred.iteritems():
                                slice_list.append(key)
                                # get cred_exp date
                                exp_date = re.search('<expires>(.*)</expires>',
                                                     value)
                                if exp_date:
                                    exp_date = exp_date.group(1)
                                    slice_cred_exp_list.append(exp_date)

                            my_slices = [{
                                'slice_name': t[0],
                                'cred_exp': t[1]
                            } for t in zip(slice_list, slice_cred_exp_list)]

                        if 'N/A' not in acc_auth_cred:
                            for key, value in acc_auth_cred.iteritems():
                                auth_list.append(key)
                                #get cred_exp date
                                exp_date = re.search('<expires>(.*)</expires>',
                                                     value)
                                if exp_date:
                                    exp_date = exp_date.group(1)
                                    auth_cred_exp_list.append(exp_date)

                            my_auths = [{
                                'auth_name': t[0],
                                'cred_exp': t[1]
                            } for t in zip(auth_list, auth_cred_exp_list)]

                    # for reference accounts
                    if 'reference' in account_detail['auth_type']:
                        account_type = 'Reference'
                        delegation = 'N/A'
                        platform_name_secondary_list.append(platform_name)
                        account_type_secondary_list.append(account_type)
                        account_reference_list.append(account_reference)
                        ref_acc_list = [{
                            'platform_name': t[0],
                            'account_type': t[1],
                            'account_reference': t[2]
                        } for t in zip(platform_name_secondary_list,
                                       account_type_secondary_list,
                                       account_reference_list)]

                    elif 'managed' in account_detail['auth_type']:
                        account_type = 'Principal'
                        delegation = 'Automatic'
                    else:
                        account_type = 'Principal'
                        delegation = 'Manual'
                    # for principal (auth_type=user/managed) accounts
                    if 'reference' not in account_detail['auth_type']:
                        platform_name_list.append(platform_name)
                        account_type_list.append(account_type)
                        delegation_type_list.append(delegation)
                        usr_hrn_list.append(account_usr_hrn)
                        pub_key_list.append(account_pub_key)
                        user_status_list.append(user_status)
                        # combining 5 lists into 1 [to render in the template]
                        principal_acc_list = [{
                            'platform_name': t[0],
                            'account_type': t[1],
                            'delegation_type': t[2],
                            'usr_hrn': t[3],
                            'usr_pubkey': t[4],
                            'user_status': t[5],
                        } for t in zip(platform_name_list, account_type_list,
                                       delegation_type_list, usr_hrn_list,
                                       pub_key_list, user_status_list)]
                    # to hide private key row if it doesn't exist
                    if 'myslice' in platform_detail['platform']:
                        account_config = json.loads(account_detail['config'])
                        account_priv_key = account_config.get(
                            'user_private_key', 'N/A')
                    if 'sfa' in platform_detail['gateway_type']:
                        platform_access = platform_detail['platform']
                        platform_access_list.append(platform_access)

        # Removing the platform which already has access
        for platform in platform_access_list:
            total_platform_list.remove(platform)
        # we could use zip. this one is used if columns have unequal rows
        platform_list = [{
            'platform_no_access': t[0]
        } for t in itertools.izip_longest(total_platform_list)]

        ## check pi or no
        pi_status = self.request.session['user']['pi']

        context = super(UserView, self).get_context_data(**kwargs)
        context['principal_acc'] = principal_acc_list
        context['ref_acc'] = ref_acc_list
        context['platform_list'] = platform_list
        context['my_users'] = my_users
        context['my_slices'] = my_slices
        context['my_auths'] = my_auths
        context['user_status'] = user_status
        context['user_email'] = user_email
        context['firstname'] = config.get('firstname', "?")
        context['lastname'] = config.get('lastname', "?")
        context['fullname'] = context['firstname'] + ' ' + context['lastname']
        context['authority'] = config.get('authority', "Unknown Authority")
        context['user_private_key'] = account_priv_key
        context['pi'] = pi_status

        # XXX This is repeated in all pages
        # more general variables expected in the template
        context['title'] = 'Platforms connected to MySlice'
        # the menu items on the top
        context['topmenu_items'] = topmenu_items_live('My Account', page)
        # so we can sho who is logged
        context['username'] = the_user(self.request)
        context['theme'] = self.theme
        #        context ['firstname'] = config['firstname']
        prelude_env = page.prelude_env()
        context.update(prelude_env)
        return context
Esempio n. 6
0
    def get(self, request, slicename=tmp_default_slice):
        page = Page(request)
        page.add_css_files('css/slice-view.css')
        page.add_js_files(["js/common.functions.js"])
        page.add_js_chunks(
            '$(function() { messages.debug("sliceview: jQuery version " + $.fn.jquery); });'
        )
        page.add_js_chunks(
            '$(function() { messages.debug("sliceview: users turned %s"); });'
            % ("on" if do_query_users else "off"))
        page.add_js_chunks(
            '$(function() { messages.debug("sliceview: leases turned %s"); });'
            % ("on" if do_query_leases else "off"))
        page.add_js_chunks(
            '$(function() { messages.debug("manifold URL %s"); });' %
            (ConfigEngine().manifold_url()))

        #        metadata = page.get_metadata()
        #        resource_md = metadata.details_by_object('resource')
        #        resource_fields = [column['name'] for column in resource_md['column']]

        #        user_md = metadata.details_by_object('user')
        #        user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]

        # TODO The query to run is embedded in the URL
        main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
        main_query.select(
            'slice_hrn',
            # 'resource.hrn', 'resource.urn',
            'resource.hostname',
            'resource.type',
            'resource.network_hrn',
            'lease.urn',
            'user.user_hrn',
            # 'application.measurement_point.counter'
        )
        # for internal use in the querytable plugin;
        # needs to be a unique column present for each returned record
        main_query_init_key = 'hostname'

        # variables that will get passed to the view-unfold1.html template
        template_env = {}

        # define 'unfold_main' to the template engine - the main contents
        #        template_env [ 'unfold_main' ] = main_stack.render(request)

        # more general variables expected in the template
        template_env['title'] = '%(slicename)s' % locals()
        # the menu items on the top
        template_env['topmenu_items'] = topmenu_items('Slice', page.request)
        # so we can sho who is logged
        template_env['username'] = UserAccessProfile(request).username

        # don't forget to run the requests
        #        page.expose_js_metadata()
        # the prelude object in page contains a summary of the requirements() for all plugins
        # define {js,css}_{files,chunks}
        template_env.update(page.prelude_env())

        return render_to_response('view-unfold1.html',
                                  template_env,
                                  context_instance=RequestContext(request))
    def get_or_post  (self, request, method):
        errors = []

        # Using cache manifold-tables to get the list of authorities faster
        authorities_query = Query.get('authority').select('name', 'authority_hrn')
        
        #onelab_enabled_query = Query.get('local:platform').filter_by('platform', '==', 'ple').filter_by('disabled', '==', 'False')
        #onelab_enabled = not not execute_admin_query(request, onelab_enabled_query)
        #if onelab_enabled:
        if True:
            print "ONELAB ENABLED"
            #authorities_query = Query.get('ple:authority').select('name', 'authority_hrn').filter_by('authority_hrn', 'included', ['ple.inria', 'ple.upmc', 'ple.ibbtple', 'ple.nitos'])
            # Now using Cache 
        else:
            print "FIREXP ENABLED"

        authorities = execute_admin_query(request, authorities_query)
        if authorities is not None:
            authorities = sorted(authorities)
        # xxx tocheck - if authorities is empty, it's no use anyway
        # (users won't be able to validate the form anyway)

        page = Page(request)
        page.add_js_files  ( [ "js/jquery.validate.js", "js/my_account.register.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" ] )

        print 'registration view, method',method

        user_query  = Query().get('local:user').select('user_id','email')
        user_details = execute_admin_query(self.request, user_query)

        if method == 'POST':
            # We shall use a form here

            #get_email = PendingUser.objects.get(email)
            reg_fname  = request.POST.get('firstname', '')
            reg_lname  = request.POST.get('lastname', '')
            #reg_aff   = request.POST.get('affiliation','')
            reg_auth   = request.POST.get('authority_hrn', '')
            #reg_login  = request.POST.get('login', '')
            reg_email  = request.POST.get('email','').lower()
            #prepare user_hrn 
            split_email = reg_email.split("@")[0] 
            split_email = split_email.replace(".", "_")
            user_hrn = reg_auth + '.' + split_email+ str(randint(1,1000000))
            
            UserModel = get_user_model()

            #POST value validation  
            if (re.search(r'^[\w+\s.@+-]+$', reg_fname)==None):
                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.')
            # 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 UserModel._default_manager.filter(email__iexact=reg_email): 
                errors.append('This email is not usable. Please contact the administrator or try with another email.')
            for user_detail in user_details:
                if user_detail['email']==reg_email:
                    errors.append('Email already registered in Manifold. Please provide a new email address.')

# XXX TODO: Factorize with portal/accountview.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'))

#                # Generate public and private keys using SFA Library
#                from sfa.trust.certificate  import Keypair
#                k = Keypair(create=True)
#                public_key = k.get_pubkey_string()
#                private_key = k.as_pem()
#                private_key = ''.join(private_key.split())
#                public_key = "ssh-rsa " + public_key
                # Saving to DB
                account_config = '{"user_public_key":'+ public_key + ', "user_private_key":'+ private_key + ', "user_hrn":"'+ user_hrn + '"}'
                auth_type = 'managed'
                #keypair = re.sub("\r", "", keypair)
                #keypair = re.sub("\n", "\\n", keypair)
                #keypair = keypair.rstrip('\r\n')
                #keypair = ''.join(keypair.split())
                #for sending email: removing existing double qoute 
                public_key = public_key.replace('"', '');
            else: 
                up_file = request.FILES['user_public_key']
                file_content =  up_file.read()
                file_name = up_file.name
                file_extension = os.path.splitext(file_name)[1]
                allowed_extension =  ['.pub','.txt']
                if file_extension in allowed_extension and re.search(r'ssh-rsa',file_content):
                    account_config = '{"user_public_key":"'+ file_content + '", "user_hrn":"'+ user_hrn +'"}'
                    account_config = re.sub("\r", "", account_config)
                    account_config = re.sub("\n", "\\n",account_config)
                    account_config = ''.join(account_config.split())
                    auth_type = 'user'
                    # for sending email
                    public_key = file_content
                    public_key = ''.join(public_key.split()) 
                else:
                    errors.append('Please upload a valid RSA public key.')

            #b = PendingUser(first_name=reg_fname, last_name=reg_lname, affiliation=reg_aff, 
            #                email=reg_email, password=request.POST['password'], keypair=keypair)
            #b.save()
            #saving to django db 'portal_pendinguser' table
            if not errors:
                b = PendingUser(
                    first_name    = reg_fname, 
                    last_name     = reg_lname, 
                    #affiliation  = reg_aff,
                    authority_hrn = reg_auth,
                    #login         = reg_login,
                    email         = reg_email, 
                    password      = request.POST['password'],
                    keypair       = account_config,
                    pi            = '',
                )
                b.save()
                # saves the user to django auth_user table [needed for password reset]
                user = User.objects.create_user(reg_email, reg_email, request.POST['password'])
                #creating user to manifold local:user
                user_config = '{"firstname":"'+ reg_fname + '", "lastname":"'+ reg_lname + '", "authority":"'+ reg_auth + '"}'
                user_params = {'email': reg_email, 'password': request.POST['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)
 
                # Send email
                ctx = {
                    'first_name'    : reg_fname, 
                    'last_name'     : reg_lname, 
                    'authority_hrn' : reg_auth,
                    'email'         : reg_email,
                    'user_hrn'      : user_hrn,
                    'public_key'    : public_key,
                    }
                recipients = authority_get_pi_emails(request,reg_auth)
                # backup email: if authority_get_pi_emails fails
                recipients.append('*****@*****.**')
                
                msg = render_to_string('user_request_email.txt', ctx)
                send_mail("Onelab New User request for %s submitted"%reg_email, msg, '*****@*****.**', recipients)
                return render(request, 'user_register_complete.html') 

        template_env = {
          'topmenu_items': topmenu_items_live('Register', page),
          'errors': errors,
          'firstname': request.POST.get('firstname', ''),
          'lastname': request.POST.get('lastname', ''),
          #'affiliation': request.POST.get('affiliation', ''),
          'authority_hrn': request.POST.get('authority_hrn', ''),
          'email': request.POST.get('email', ''),
          'password': request.POST.get('password', ''),           
          'authorities': authorities,
          }
        template_env.update(page.prelude_env ())
        return render(request, 'registration_view.html',template_env)
Esempio n. 8
0
    def get(self, request, slicename=tmp_default_slice):

        page = Page(request)
        page.add_css_files('css/slice-view.css')
        page.add_js_files(["js/common.functions.js"])
        page.add_js_chunks(
            '$(function() { messages.debug("sliceview: jQuery version " + $.fn.jquery); });'
        )
        page.add_js_chunks(
            '$(function() { messages.debug("sliceview: users turned %s"); });'
            % ("on" if do_query_users else "off"))
        page.add_js_chunks(
            '$(function() { messages.debug("sliceview: leases turned %s"); });'
            % ("on" if do_query_leases else "off"))
        page.add_js_chunks(
            '$(function() { messages.debug("manifold URL %s"); });' %
            (ConfigEngine().manifold_url()))

        metadata = page.get_metadata()
        resource_md = metadata.details_by_object('resource')
        resource_fields = [column['name'] for column in resource_md['column']]

        user_md = metadata.details_by_object('user')
        user_fields = ['user_hrn'
                       ]  # [column['name'] for column in user_md['column']]

        # TODO The query to run is embedded in the URL
        main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
        main_query.select(
            'slice_hrn',
            #'resource.hrn', 'resource.urn',
            'resource.hostname',
            'resource.type',
            'resource.network_hrn',
            'lease.urn',
            'user.user_hrn',
            #'application.measurement_point.counter'
        )
        # for internal use in the querytable plugin;
        # needs to be a unique column present for each returned record
        main_query_init_key = 'hostname'

        query_resource_all = Query.get('resource').select(resource_fields)

        aq = AnalyzedQuery(main_query, metadata=metadata)
        page.enqueue_query(main_query, analyzed_query=aq)
        page.enqueue_query(query_resource_all)
        if do_query_users:
            # Required: the user must have an authority in its user.config
            # XXX Temporary solution
            user_query = Query().get('local:user').select('config', 'email')
            user_details = execute_query(self.request, user_query)

            # not always found in user_details...
            config = {}
            #            for user_detail in user_details:
            #                #email = user_detail['email']
            #                if user_detail['config']:
            #                    config = json.loads(user_detail['config'])
            #            user_detail['authority'] = config.get('authority',"Unknown Authority")
            #
            #            if user_detail['authority'] is not None:
            #                sub_authority = user_detail['authority'].split('.')
            #                root_authority = sub_authority[0]
            #                query_user_all = Query.get(root_authority+':user').select(user_fields)
            #
            #                # XXX TODO this filter doesn't work - to be improved in Manifold
            #                #.filter_by('authority.authority_hrn', '=', user_detail['authority'])
            #
            #                page.enqueue_query(query_user_all)
            #            else:
            #                print "authority of the user is not in local:user db"
            query_user_all = Query.get('user').select(user_fields)
            #    query_user_all = None

        # ... and for the relations
        # XXX Let's hardcode resources for now
        sq_resource = aq.subquery('resource')
        sq_user = aq.subquery('user')
        sq_lease = aq.subquery('lease')
        sq_measurement = aq.subquery('measurement')

        # Prepare the display according to all metadata
        # (some parts will be pending, others can be triggered by users).
        #
        # For example slice measurements will not be requested by default...

        # Create the base layout (Stack)...
        main_stack = Stack(
            page=page,
            title="Slice %s" % slicename,
            sons=[],
        )

        # ... responsible for the slice properties...

        # a nice header
        main_stack.insert(
            Raw(page=page,
                togglable=False,
                toggled=True,
                html="<h2 class='well well-lg'> Slice %s</h2>" % slicename))

        # --------------------------------------------------------------------------
        #DEPRECATED|        # QueryUpdater (Pending Operations)
        #DEPRECATED|
        #DEPRECATED|        main_stack.insert(QueryUpdater(
        #DEPRECATED|            page                = page,
        #DEPRECATED|            title               = 'Pending operations',
        #DEPRECATED|            query               = main_query,
        #DEPRECATED|            togglable           = True,
        #DEPRECATED|            # start turned off, it will open up itself when stuff comes in
        #DEPRECATED|            toggled             = False,
        #DEPRECATED|            domid               = 'pending',
        #DEPRECATED|            outline_complete    = True,
        #DEPRECATED|        ))

        # --------------------------------------------------------------------------
        # Filter Resources

        # turn off for now -- see above
        filter_query_editor = QueryEditor(
            page=page,
            query=sq_resource,
            query_all=query_resource_all,
            title="Select Columns",
            domid='select-columns',
        )
        filter_active_filters = ActiveFilters(
            page=page,
            query=sq_resource,
            title="Active Filters",
        )
        filters_area = Stack(
            page=page,
            title='Filter Resources',
            domid='filters',
            sons=[filter_query_editor, filter_active_filters],
            togglable=True,
            toggled='persistent',
            outline_complete=True,
        )
        main_stack.insert(filters_area)

        # --------------------------------------------------------------------------
        # RESOURCES
        # the resources part is made of a Tabs (Geographic, List),

        resources_as_gmap = GoogleMap(
            page=page,
            title='Geographic view',
            domid='resources-map',
            # tab's sons preferably turn this off
            togglable=False,
            query=sq_resource,
            query_all=query_resource_all,
            # this key is the one issued by google
            googlemap_api_key=ConfigEngine().googlemap_api_key(),
            # the key to use at init-time
            init_key=main_query_init_key,
            checkboxes=True,
            # center on Paris
            latitude=49.,
            longitude=9,
            zoom=4,
        )

        resources_as_3dmap = SensLabMap(
            page=page,
            title='3D Map',
            domid='senslabmap',
            query=sq_resource,
            query_all=query_resource_all,
        )

        resources_as_list = QueryTable(
            page=page,
            domid='resources-list',
            title='List view',
            # this is the query at the core of the slice list
            query=sq_resource,
            query_all=query_resource_all,
            init_key=main_query_init_key,
            checkboxes=True,
            datatables_options={
                'iDisplayLength': 25,
                'bLengthChange': True,
                'bAutoWidth': True,
            },
        )

        if insert_grid:
            resources_as_grid = QueryGrid(
                page=page,
                domid='resources-grid',
                title='Grid view',
                # this is the query at the core of the slice list
                query=sq_resource,
                query_all=query_resource_all,
                init_key=main_query_init_key,
                checkboxes=True,
            )

        if do_query_leases:
            resources_as_scheduler = Scheduler(
                page=page,
                title='Scheduler',
                domid='scheduler',
                query=sq_resource,
                query_all_resources=query_resource_all,
                query_lease=sq_lease,
            )

    # with the new 'Filter' stuff on top, no need for anything but the querytable
        resources_as_list_area = resources_as_list

        resources_sons = [
            resources_as_gmap,
            resources_as_3dmap,
            resources_as_scheduler,
            resources_as_list_area,
        ] if do_query_leases else [
            resources_as_gmap,
            resources_as_3dmap,
            resources_as_list_area,
        ]
        if insert_grid:
            resources_sons.append(resources_as_grid)

        resources_area = Tabs(
            page=page,
            domid="resources",
            togglable=True,
            title="Resources",
            outline_complete=True,
            sons=resources_sons,
            active_domid='resources-map',
            persistent_active=True,
        )
        main_stack.insert(resources_area)

        # --------------------------------------------------------------------------
        # USERS

        if do_query_users and query_user_all is not None:
            tab_users = Tabs(
                page=page,
                domid='users',
                outline_complete=True,
                togglable=True,
                title='Users',
                active_domid='users-list',
            )
            main_stack.insert(tab_users)

            tab_users.insert(
                QueryTable(
                    page=page,
                    title='Users List',
                    domid='users-list',
                    # tab's sons preferably turn this off
                    togglable=False,
                    # this is the query at the core of the slice list
                    query=sq_user,
                    query_all=query_user_all,
                    checkboxes=True,
                    datatables_options={
                        'iDisplayLength': 25,
                        'bLengthChange': True,
                        'bAutoWidth': True,
                    },
                ))

# DEMO
# --------------------------------------------------------------------------
# MEASUREMENTS
        measurements_stats_cpu = SliceStat(title="CPU Usage",
                                           domid='resources-stats-cpu',
                                           page=page,
                                           stats='slice',
                                           key='hrn',
                                           query='none',
                                           slicename=slicename,
                                           o='cpu')

        measurements_stats_mem = SliceStat(title="Memory Usage",
                                           domid='resources-stats-mem',
                                           page=page,
                                           stats='slice',
                                           key='hrn',
                                           query='none',
                                           slicename=slicename,
                                           o='mem')

        measurements_stats_asb = SliceStat(title="Traffic Sent",
                                           domid='resources-stats-asb',
                                           page=page,
                                           stats='slice',
                                           key='hrn',
                                           query='none',
                                           slicename=slicename,
                                           o='asb')

        measurements_stats_arb = SliceStat(title="Traffic Received",
                                           domid='resources-stats-arb',
                                           page=page,
                                           stats='slice',
                                           key='hrn',
                                           query='none',
                                           slicename=slicename,
                                           o='arb')

        tab_measurements = Tabs(
            page=page,
            domid="measurements",
            togglable=True,
            toggled='persistent',
            title="Measurements",
            outline_complete=True,
            sons=[
                measurements_stats_cpu, measurements_stats_mem,
                measurements_stats_asb, measurements_stats_arb
            ],
            active_domid='resources-stats-cpu',
            persistent_active=True,
        )
        main_stack.insert(tab_measurements)

        #        tab_measurements = Tabs (
        #            page                = page,
        #            active_domid        = 'measurements-list',
        #            outline_complete    = True,
        #            togglable           = True,
        #            title               = 'Measurements',
        #            domid               = 'measurements',
        #        )
        #        main_stack.insert(tab_measurements)
        #
        #        tab_measurements.insert(QueryTable(
        #            page        = page,
        #            title       = 'Measurements',
        #            domid       = 'measurements-list',
        #            # tab's sons preferably turn this off
        #            togglable   = False,
        #            # this is the query at the core of the slice list
        #            query       = sq_measurement,
        #            # do NOT set checkboxes to False
        #            # this table being otherwise empty, it just does not fly with dataTables
        #            checkboxes  = True,
        #            datatables_options = {
        #                'iDisplayLength' : 25,
        #                'bLengthChange'  : True,
        #                'bAutoWidth'     : True,
        #            },
        #        ))
        #
        #        # --------------------------------------------------------------------------
        #        # MESSAGES (we use transient=False for now)
        if insert_messages:
            main_stack.insert(
                Messages(
                    page=page,
                    title="Runtime messages for slice %s" % slicename,
                    domid="msgs-pre",
                    levels="ALL",
                    # plain messages are probably less nice for production but more reliable for development for now
                    transient=False,
                    # these make sense only in non-transient mode..
                    togglable=True,
                    toggled='persistent',
                    outline_complete=True,
                ))

        # variables that will get passed to the view-unfold1.html template
        template_env = {}

        # define 'unfold_main' to the template engine - the main contents
        template_env['unfold_main'] = main_stack.render(request)

        # more general variables expected in the template
        template_env['title'] = '%(slicename)s' % locals()
        # the menu items on the top
        template_env['topmenu_items'] = topmenu_items_live('Slice', page)
        # so we can sho who is logged
        template_env['username'] = the_user(request)

        template_env['theme'] = self.theme

        # don't forget to run the requests
        page.expose_js_metadata()
        # the prelude object in page contains a summary of the requirements() for all plugins
        # define {js,css}_{files,chunks}
        template_env.update(page.prelude_env())

        return render_to_response('view-unfold1.html',
                                  template_env,
                                  context_instance=RequestContext(request))
Esempio n. 9
0
    def get_or_post(self, request, method):
        template_name = "slice-control-view.html"
        page = Page(self.request)

        page.add_js_files([
            "js/jquery-1.11.1.js", "js/my_account.register.js",
            "js/my_account.edit_profile.js"
        ])
        page.add_css_files(["css/plugin.css"])  # "css/onelab.css"

        image_list = None
        current_slice = None
        user_image_list = []
        node_list = []
        freq_list = []
        allow_ssh = True
        allow_crt = True
        allow_img = True
        supp_file = None
        show_lab = False
        lab_ref = None
        lab_param_list = []
        # vnc_link_access = None
        # vnc = False
        usera = UserAccessProfile(self.request)
        user = usera.user_obj  # get_user_by_email(the_user(self.request))
        if usera.access_all is False:
            user_image_list = UserImage.objects.filter(
                user_ref=user, username=usera.session_username).all()
        elif user:
            user_image_list = UserImage.objects.filter(user_ref=user).all()

        user_type = usera.user_type  # get_user_type(user)

        slice_id = page.request.session.get('slice_id', None)
        stype = page.request.session.get('stype', None)
        t = ''

        if not slice_id or not slice_on_time(page.request, stype):
            # messages.error(page.request, 'Error: You have not permission to access this page.')
            return HttpResponseRedirect("/portal/lab/current/")

        if slice_id:
            if stype == "omf":
                current_slice = Reservation.objects.get(id=slice_id)
                node_list = ReservationDetail.objects.filter(
                    reservation_ref=current_slice)
                freq_list = ReservationFrequency.objects.filter(
                    reservation_ref=current_slice)
                image_list = TestbedImage.objects.all()
                t = 'Testbeds Remote Control Panel'
            elif stype == "sim":
                current_slice = SimReservation.objects.get(id=slice_id)
                node_list = SimReservation.objects.filter(
                    id=slice_id)  # current_slice.vm_ref
                image_list = SimulationImage.objects.all()
                t = 'Simulation Remote Control Panel'
        # active_page = page.request.session.get('active_page','0')

        if not current_slice:
            return HttpResponseRedirect("/portal/lab/current/")

        if user_type == 3:
            allow_crt, allow_img, allow_ssh, supp_file, lab_ref, lab_param_list = get_control_options(
                stype, current_slice)
            if lab_ref:
                show_lab = True

        output_script = ''

        template_env = {
            'topmenu_items': topmenu_items('Control Panel', page.request),
            # 'errors': errors,
            'image_list': image_list,
            'slice_id': slice_id,
            'deadline': current_slice.end_time,
            'user_image_list': user_image_list,
            'node_list': node_list,
            'freq_list': freq_list,
            'output': output_script,
            'username': usera.username,  # the_user(self.request),
            'user_id': user.id,
            'title': t,
            'stype': stype,
            'allow_ssh': allow_ssh,
            'allow_crt': allow_crt,
            'allow_img': allow_img,
            'supp_file': supp_file,
            'show_lab': show_lab,
            'lab_ref': lab_ref,
            'lab_param_list': lab_param_list,
            'vnc_link_access': "http://" + BACKENDIP + ":6080/vnc.html",
            'terminal_ip': "https://" + BACKENDIP + ":4200/"
            # 'vnc' :vnc,
        }
        template_env.update(page.prelude_env())
        return render(request, template_name, template_env)
Esempio n. 10
0
    def get (self,request, slicename=tmp_default_slice):
    
        page = Page(request)
        page.add_css_files ('css/slice-view.css')
        page.add_js_files  ( [ "js/common.functions.js" ] )
        page.add_js_chunks ('$(function() { messages.debug("sliceview: jQuery version " + $.fn.jquery); });')
        page.add_js_chunks ('$(function() { messages.debug("sliceview: users turned %s"); });'%("on" if do_query_users else "off"))
        page.add_js_chunks ('$(function() { messages.debug("sliceview: leases turned %s"); });'%("on" if do_query_leases else "off"))
        page.add_js_chunks ('$(function() { messages.debug("manifold URL %s"); });'%(ConfigEngine().manifold_url()))

        metadata = page.get_metadata()
        resource_md = metadata.details_by_object('resource')
        resource_fields = [column['name'] for column in resource_md['column']]
    
        user_md = metadata.details_by_object('user')
        user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
    
        # TODO The query to run is embedded in the URL
        main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
        main_query.select(
                'slice_hrn',
                #'resource.hrn', 'resource.urn', 
                'resource.hostname', 'resource.type', 
                'resource.network_hrn',
                'lease.urn',
                'user.user_hrn',
                #'application.measurement_point.counter'
        )
        # for internal use in the querytable plugin;
        # needs to be a unique column present for each returned record
        main_query_init_key = 'hostname'
    
        query_resource_all = Query.get('resource').select(resource_fields)

        aq = AnalyzedQuery(main_query, metadata=metadata)
        page.enqueue_query(main_query, analyzed_query=aq)
        page.enqueue_query(query_resource_all)
        if do_query_users:
            # Required: the user must have an authority in its user.config
            # XXX Temporary solution
            user_query  = Query().get('local:user').select('config','email')
            user_details = execute_query(self.request, user_query)
            
            # not always found in user_details...
            config={}
#            for user_detail in user_details:
#                #email = user_detail['email']
#                if user_detail['config']:
#                    config = json.loads(user_detail['config'])
#            user_detail['authority'] = config.get('authority',"Unknown Authority")
#
#            if user_detail['authority'] is not None:
#                sub_authority = user_detail['authority'].split('.')
#                root_authority = sub_authority[0]
#                query_user_all = Query.get(root_authority+':user').select(user_fields)
#
#                # XXX TODO this filter doesn't work - to be improved in Manifold
#                #.filter_by('authority.authority_hrn', '=', user_detail['authority'])
#
#                page.enqueue_query(query_user_all)
#            else:
#                print "authority of the user is not in local:user db"
            query_user_all = Query.get('user').select(user_fields)
            #    query_user_all = None
    
        # ... and for the relations
        # XXX Let's hardcode resources for now
        sq_resource    = aq.subquery('resource')
        sq_user        = aq.subquery('user')
        sq_lease       = aq.subquery('lease')
        sq_measurement = aq.subquery('measurement')
        
    
        # Prepare the display according to all metadata
        # (some parts will be pending, others can be triggered by users).
        # 
        # For example slice measurements will not be requested by default...
    
        # Create the base layout (Stack)...
        main_stack = Stack (
            page=page,
            title="Slice %s"%slicename,
            sons=[],
        )
    
        # ... responsible for the slice properties...
    
        # a nice header
        main_stack.insert (
            Raw (page=page,
                 togglable=False, 
                 toggled=True,
                 html="<h2 class='well well-lg'> Slice %s</h2>"%slicename)
        )
    
        # --------------------------------------------------------------------------
        # QueryUpdater (Pending Operations)

        main_stack.insert(QueryUpdater(
            page                = page,
            title               = 'Pending operations',
            query               = main_query,
            togglable           = True,
            # start turned off, it will open up itself when stuff comes in
            toggled             = False, 
            domid               = 'pending',
            outline_complete    = True,
        ))

        # --------------------------------------------------------------------------
        # Filter Resources
       
# turn off for now -- see above
        filter_query_editor = QueryEditor(
            page  = page,
            query = sq_resource, 
            query_all = query_resource_all,
            title = "Select Columns",
            domid = 'select-columns',
            )
        filter_active_filters = ActiveFilters(
            page  = page,
            query = sq_resource,
            title = "Active Filters",
            )
        filters_area = Stack(
            page                = page,
            title               = 'Filter Resources',
            domid               = 'filters',
            sons                = [filter_query_editor, 
                                   filter_active_filters],
            togglable           = True,
            toggled             = 'persistent',
            outline_complete    = True, 
        )
        main_stack.insert (filters_area)

        # --------------------------------------------------------------------------
        # RESOURCES
        # the resources part is made of a Tabs (Geographic, List), 

        resources_as_gmap = GoogleMap(
            page       = page,
            title      = 'Geographic view',
            domid      = 'resources-map',
            # tab's sons preferably turn this off
            togglable  = False,
            query      = sq_resource,
            query_all  = query_resource_all,
            # this key is the one issued by google
            googlemap_api_key = ConfigEngine().googlemap_api_key(),
            # the key to use at init-time
            init_key   = main_query_init_key,
            checkboxes = True,
            # center on Paris
            latitude   = 49.,
            longitude  = 9,
            zoom       = 4,
        )

        resources_as_3dmap = SensLabMap(
            page       = page,
            title      = '3D Map',
            domid      = 'senslabmap',
            query      = sq_resource,
            query_all  = query_resource_all,
        )

        resources_as_list = QueryTable( 
            page       = page,
            domid      = 'resources-list',
            title      = 'List view',
            # this is the query at the core of the slice list
            query      = sq_resource,
            query_all  = query_resource_all,
            init_key     = main_query_init_key,
            checkboxes = True,
            datatables_options = { 
                'iDisplayLength': 25,
                'bLengthChange' : True,
                'bAutoWidth'    : True,
                },
            )

        if insert_grid:
            resources_as_grid = QueryGrid( 
                page       = page,
                domid      = 'resources-grid',
                title      = 'Grid view',
                # this is the query at the core of the slice list
                query      = sq_resource,
                query_all  = query_resource_all,
                init_key     = main_query_init_key,
                checkboxes = True,
                )

        

        #if do_query_leases:
        #    resources_as_scheduler = Scheduler(

        #        page        = page,
        #        title       = 'Scheduler',
        #        domid       = 'scheduler',
        #        query       = sq_resource,
        #        query_all_resources = query_resource_all,
        #        query_lease = sq_lease,

        #        )

        resources_as_scheduler2 = Scheduler2( 
            page       = page,
            domid      = 'scheduler',
            title      = 'Scheduler',
            # this is the query at the core of the slice list
            query = sq_resource,
            query_all_resources = query_resource_all,
            query_lease = sq_lease,
            )

       # with the new 'Filter' stuff on top, no need for anything but the querytable
        resources_as_list_area = resources_as_list 

        resources_sons = [
            resources_as_gmap, 
            resources_as_3dmap,
            resources_as_scheduler2,
            resources_as_list_area,
            ] if do_query_leases else [
            resources_as_gmap, 
            resources_as_3dmap,
            resources_as_list_area,
            resources_as_scheduler2,
            ]
        if insert_grid:
            resources_sons.append(resources_as_grid)

        resources_area = Tabs ( page=page, 
                                domid="resources",
                                togglable=True,
                                title="Resources",
                                outline_complete=True,
                                sons= resources_sons,

                                active_domid = 'scheduler',
                                persistent_active=True,
                                )
        main_stack.insert (resources_area)

        # --------------------------------------------------------------------------
        # USERS
    
        if do_query_users and query_user_all is not None:
            tab_users = Tabs(
                page                = page,
                domid               = 'users',
                outline_complete    = True,
                togglable           = True,
                title               = 'Users',
                active_domid        = 'users-list',
                )
            main_stack.insert(tab_users)
    
            tab_users.insert(QueryTable( 
                page        = page,
                title       = 'Users List',
                domid       = 'users-list',
                # tab's sons preferably turn this off
                togglable   = False,
                # this is the query at the core of the slice list
                query       = sq_user,
                query_all  = query_user_all,
                checkboxes  = True,
                datatables_options = { 
                    'iDisplayLength' : 25,
                    'bLengthChange'  : True,
                    'bAutoWidth'     : True,
                },
            ))

# DEMO    
        # --------------------------------------------------------------------------
        # MEASUREMENTS
        measurements_stats_cpu = SliceStat(
            title = "CPU Usage",
            domid = 'resources-stats-cpu',
            page  = page,
            stats = 'slice',
            key   = 'hrn',
            query = 'none',
            slicename = slicename,
            o = 'cpu'
        )
        
        measurements_stats_mem = SliceStat(
            title = "Memory Usage",
            domid = 'resources-stats-mem',
            page  = page,
            stats = 'slice',
            key   = 'hrn',
            query = 'none',
            slicename = slicename,
            o = 'mem'
        )
        
        measurements_stats_asb = SliceStat(
            title = "Traffic Sent",
            domid = 'resources-stats-asb',
            page  = page,
            stats = 'slice',
            key   = 'hrn',
            query = 'none',
            slicename = slicename,
            o = 'asb'
        )
        
        measurements_stats_arb = SliceStat(
            title = "Traffic Received",
            domid = 'resources-stats-arb',
            page  = page,
            stats = 'slice',
            key   = 'hrn',
            query = 'none',
            slicename = slicename,
            o = 'arb'
        )

        tab_measurements = Tabs ( page=page,
                                domid = "measurements",
                                togglable = True,
                                toggled = 'persistent',
                                title = "Measurements",
                                outline_complete=True,
                                sons = [ measurements_stats_cpu, measurements_stats_mem, measurements_stats_asb, measurements_stats_arb ],
                                active_domid = 'resources-stats-cpu',
                                persistent_active = True,
                                )
        main_stack.insert (tab_measurements)
        
#        tab_measurements = Tabs (
#            page                = page,
#            active_domid        = 'measurements-list',
#            outline_complete    = True,
#            togglable           = True,
#            title               = 'Measurements',
#            domid               = 'measurements',
#        )
#        main_stack.insert(tab_measurements)
#    
#        tab_measurements.insert(QueryTable( 
#            page        = page,
#            title       = 'Measurements',
#            domid       = 'measurements-list',
#            # tab's sons preferably turn this off
#            togglable   = False,
#            # this is the query at the core of the slice list
#            query       = sq_measurement,
#            # do NOT set checkboxes to False
#            # this table being otherwise empty, it just does not fly with dataTables
#            checkboxes  = True,
#            datatables_options = { 
#                'iDisplayLength' : 25,
#                'bLengthChange'  : True,
#                'bAutoWidth'     : True,
#            },
#        ))
#    
#        # --------------------------------------------------------------------------
#        # MESSAGES (we use transient=False for now)
        if insert_messages:
            main_stack.insert(Messages(
                    page   = page,
                    title  = "Runtime messages for slice %s"%slicename,
                    domid  = "msgs-pre",
                    levels = "ALL",
                    # plain messages are probably less nice for production but more reliable for development for now
                    transient = False,
                    # these make sense only in non-transient mode..
                    togglable = True,
                    toggled = 'persistent',
                    outline_complete = True,
                    ))
    
        # variables that will get passed to the view-unfold1.html template
        template_env = {}
        
        # define 'unfold_main' to the template engine - the main contents
        template_env [ 'unfold_main' ] = main_stack.render(request)
    
        # more general variables expected in the template
        template_env [ 'title' ] = '%(slicename)s'%locals()
        # the menu items on the top
        template_env [ 'topmenu_items' ] = topmenu_items_live('Slice', page) 
        # so we can sho who is logged
        template_env [ 'username' ] = the_user (request) 
    
        # don't forget to run the requests
        page.expose_js_metadata()
        # the prelude object in page contains a summary of the requirements() for all plugins
        # define {js,css}_{files,chunks}
        template_env.update(page.prelude_env())

        return render_to_response ('view-unfold1.html',template_env,
                                   context_instance=RequestContext(request))
Esempio n. 11
0
    
        #user_query  = Query().get('user').select('user_hrn').filter_by('user_hrn','==','$user_hrn')
        #user_hrn = execute_query(self.request, user_query)
        #self.user_hrn = user_hrn[0].get('user_hrn')
        
        
=======
        #                acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')

        pi = request.session['user']['pi']

        # Page rendering
>>>>>>> onelab
        page = Page(request)
        page.add_js_files  ( [ "js/jquery.validate.js", "js/jquery-ui.js" ] )
        page.add_css_files ( [ "css/jquery-ui.css" ] )
        page.expose_js_metadata()

        if method == 'POST':
            # The form has been submitted

            if request.is_secure():
                current_site = 'https://'
            else:
                current_site = 'http://'
            current_site += request.META['HTTP_HOST']

            #if theme.theme != 'fed4fire' or  self.theme != 'onelab':
                # getting the authority_hrn from the selected organization
            #    for authority in authorities:
             #       if authority['name'] == request.POST.get('org_name', ''):
Esempio n. 12
0
    def get_context_data(self, **kwargs):

        page = Page(self.request)
        page.add_js_files([
            "js/jquery.validate.js", "js/my_account.register.js",
            "js/my_account.edit_profile.js"
        ])
        page.add_css_files(["css/account_view.css", "css/plugin.css"])

        # @qursaan
        # user_details = MyUser.objects.filter(email=the_user(self.request))
        # user_query  = Query().get('local:user').select('config','email','status')
        # user_details = execute_query(self.request, user_query)
        usera = UserAccessProfile(self.request)
        user_detail = usera.user_obj  # get_user_by_email(the_user(self.request))

        # not always found in user_details...
        config = {}
        user_status = 'N/A'
        user_fname = '?'
        user_lname = '?'
        user_authu = 'Unknown Authority'

        # for user_detail in user_details:
        if user_detail:
            # different significations of user_status
            if user_detail.status == 0:
                user_status = 'Disabled'
            elif user_detail.status == 1:
                user_status = 'Validation Pending'
            elif user_detail.status == 2:
                user_status = 'Enabled'
            else:
                user_status = 'N/A'

            user_fname = user_detail.first_name
            user_lname = user_detail.last_name
            user_authu = user_detail.authority_hrn

        context = super(AccountView, self).get_context_data(**kwargs)
        # context['principal_acc'] = principal_acc_list
        # context['ref_acc'] = ref_acc_list
        # context['platform_list'] = platform_list
        # context['my_users'] = my_users
        # context['my_slices'] = my_slices
        # context['my_auths'] = my_auths
        context['user_status'] = user_status
        context['person'] = self.request.user
        context['firstname'] = user_fname  # config.get('firstname',"?")
        context['lastname'] = user_lname  # config.get('lastname',"?")
        context['fullname'] = context['firstname'] + ' ' + context['lastname']
        context[
            'authority'] = user_authu  # config.get('authority',"Unknown Authority")
        # context['user_private_key'] = account_priv_key
        # XXX This is repeated in all pages
        # more general variables expected in the template
        context['title'] = 'Account Information'
        # the menu items on the top
        context['topmenu_items'] = topmenu_items(
            'My Account', page.request)  # @qursaan change from _live
        # so we can sho who is logged
        context['username'] = usera.username
        prelude_env = page.prelude_env()
        context.update(prelude_env)
        return context
Esempio n. 13
0
    def get_or_post(self, request, method):
        errors = []
        # List authorities already in the Registry in order to avoid duplicates
        # Using cache manifold-tables to get the list of authorities faster
        authorities_query = Query.get("authority").select("name", "authority_hrn")
        authorities = execute_admin_query(request, authorities_query)
        if authorities is not None:
            authorities = sorted(authorities)
        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"])

        if method == "POST":
            # xxx tocheck - if authorities is empty, it's no use anyway
            # (users won't be able to validate the form anyway)

            # List local users in Manifold DB in order ot avoid duplicates
            user_query = Query().get("local:user").select("user_id", "email")
            list_users = execute_admin_query(self.request, user_query)

            reg_root_authority_hrn = request.POST.get("root_authority_hrn", "").lower()

            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_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_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))

            UserModel = get_user_model()

            reg_address_line1 = request.POST.get("address_line1", "")
            reg_address_line2 = request.POST.get("address_line2", "")
            reg_address_line3 = request.POST.get("address_line3", "")
            reg_address_city = request.POST.get("address_city", "")
            reg_address_postalcode = request.POST.get("address_postalcode", "")
            reg_address_state = request.POST.get("address_state", "")
            reg_address_country = request.POST.get("address_country", "")

            # POST value validation
            if re.search(r"^[\w+\s.@+-]+$", reg_fname) == None:
                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.")
            # 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):
                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.")
            for user_detail in list_users:
                if user_detail["email"] == reg_email:
                    errors.append("Email already registered in Manifold. Please provide a new email address.")

            # XXX TODO: Factorize with portal/accountview.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"))

            # 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_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,
                    authority_hrn=reg_root_authority_hrn,
                )
                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()

                # saves the user to django auth_user table [needed for password reset]
                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)
                # 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)

                # Send email
                ctx = {
                    "first_name": reg_fname,
                    "last_name": reg_lname,
                    "authority_hrn": reg_auth,
                    "email": reg_email,
                    "user_hrn": user_hrn,
                    "public_key": public_key,
                }
                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'])

                msg = render_to_string("user_request_email.txt", ctx)
                send_mail(
                    "Onelab New Authority request for %s submitted" % reg_email, msg, "*****@*****.**", recipients
                )
                return render(request, "user_register_complete.html")

        template_env = {
            "topmenu_items": topmenu_items_live("join", page),
            "errors": errors,
            "pi_first_name": request.POST.get("pi_first_name", ""),
            "pi_last_name": request.POST.get("pi_last_name", ""),
            "pi_email": request.POST.get("pi_email", ""),
            "pi_phone": request.POST.get("pi_phone", ""),
            "pi_password": request.POST.get("pi_password", ""),
            "site_name": request.POST.get("site_name", ""),
            "site_authority": request.POST.get("site_authority", "").lower(),
            "site_abbreviated_name": request.POST.get("site_abbreviated_name", ""),
            "site_url": request.POST.get("site_url", ""),
            "site_latitude": request.POST.get("site_latitude", ""),
            "site_longitude": request.POST.get("site_longitude", ""),
            "address_line1": request.POST.get("address_line1", ""),
            "address_line2": request.POST.get("address_line2", ""),
            "address_line3": request.POST.get("address_line3", ""),
            "address_city": request.POST.get("address_city", ""),
            "address_postalcode": request.POST.get("address_postalcode", ""),
            "address_state": request.POST.get("address_state", ""),
            "address_country": request.POST.get("address_country", ""),
            "root_authority_hrn": request.POST.get("root_authority_hrn", "").lower(),
            "root_authorities": root_authorities,
            "authorities": authorities,
        }
        template_env.update(page.prelude_env())
        return render(request, "join_view.html", template_env)
Esempio n. 14
0
    def get_or_post  (self, request, method):
        # Using cache manifold-tables to get the list of authorities faster
        authorities_query = Query.get('authority').select('name', 'authority_hrn')
        authorities = execute_admin_query(request, authorities_query)
        if authorities is not None:
            authorities = sorted(authorities)

        user_query  = Query().get('local:user').select('email')
        user_email = execute_query(self.request, user_query)
        self.user_email = user_email[0].get('email')


        account_query  = Query().get('local:account').select('user_id','platform_id','auth_type','config')
        account_details = execute_query(self.request, account_query)

        platform_query  = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
        platform_details = execute_query(self.request, platform_query)

        # getting user_hrn from local:account
        for account_detail in account_details:
            for platform_detail in platform_details:
                if platform_detail['platform_id'] == account_detail['platform_id']:
                    # taking user_hrn only from myslice account
                    # NOTE: we should later handle accounts filter_by auth_type= managed OR user
                    if 'myslice' in platform_detail['platform']:
                        account_config = json.loads(account_detail['config'])
                        user_hrn = account_config.get('user_hrn','N/A')
    
        #user_query  = Query().get('user').select('user_hrn').filter_by('user_hrn','==','$user_hrn')
        #user_hrn = execute_query(self.request, user_query)
        #self.user_hrn = user_hrn[0].get('user_hrn')
        
        
        page = Page(request)
        page.add_css_files ( [ "http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" ] )

        if method == 'POST':
            self.errors = []
    
            # The form has been submitted
            slice_name = request.POST.get('slice_name', '')
            authority_hrn = request.POST.get('authority_hrn', '')
            number_of_nodes = request.POST.get('number_of_nodes', '')
            purpose = request.POST.get('purpose', '')
            email = self.user_email
            #user_hrn = user_hrn
            cc_myself = True
            
            if (authority_hrn is None or authority_hrn == ''):
                self.errors.append('Please, select an authority')
            # What kind of slice name is valid?
            if (slice_name is None or slice_name == ''):
                self.errors.append('Slice Name is mandatory')
    
            if (purpose is None or purpose == ''):
                self.errors.append('Purpose is mandatory')
    
            if not self.errors:
                ctx = {
                    'email': email,
                    'slice_name': slice_name,
                    'authority_hrn': authority_hrn,
                    'number_of_nodes': number_of_nodes,
                    'purpose': purpose,
                }            
                s = PendingSlice(
                    slice_name      = slice_name,
                    user_hrn        = user_hrn,
                    authority_hrn   = authority_hrn,
                    number_of_nodes = number_of_nodes,
                    purpose         = purpose
                )
                s.save()
    
                # The recipients are the PI of the authority
                recipients = authority_get_pi_emails(request, authority_hrn)
    
                #if cc_myself:
                recipients.append('*****@*****.**')
                msg = render_to_string('slice-request-email.txt', ctx)
                #print "email, msg, email, recipients", email , msg, email, recipients 
                send_mail("Onelab user %s requested a slice"%email , msg, email, recipients)
    
                return render(request,'slice-request-ack-view.html') # Redirect after POST
     
        template_env = {
          'topmenu_items': topmenu_items_live('Request a slice', page),
          'errors': self.errors,
          'slice_name': request.POST.get('slice_name', ''),
          'authority_hrn': request.POST.get('authority_hrn', ''),
          'number_of_nodes': request.POST.get('number_of_nodes', ''),
          'purpose': request.POST.get('purpose', ''),
          'email': self.user_email,
          'user_hrn': user_hrn,
          'cc_myself': True,
          'authorities': authorities,
        }
        template_env.update(page.prelude_env ())
        return render(request, 'slicerequest_view.html',template_env)
Esempio n. 15
0
    def get_or_post(self, request, method):
        errors = []

        # @qursaan: get authorities from db
        authorities = Authority.objects.all()
        if authorities is not None:
            authorities = sorted(authorities)

        # get all supervisors
        supervisors = MyUser.objects.filter(user_type=2)

        # get all quotas
        quotas = Quota.objects.all()

        # @qursaan: change to user table
        # user_details = User.objects.all()  # execute_admin_query(self.request, user_query)

        page = Page(request)
        page.add_js_files([
            "js/jquery-1.11.1.js",
            "js/my_account.register.js",
        ])
        page.add_css_files([
            "css/registration.css",
        ])

        if method == 'POST':
            # @qursaan: get post values
            # get_email = PendingUser.objects.get(email)
            reg_fname = request.POST.get('firstname', '')
            reg_lname = request.POST.get('lastname', '')
            reg_auth = request.POST.get('authority_hrn', '')
            reg_username = request.POST.get('username', '').lower()
            reg_email = request.POST.get('email', '').lower()
            reg_password = request.POST.get('password',
                                            '')  # request.POST['password']
            reg_usertype = request.POST.get('usertype', '')
            reg_supervisor = request.POST.get('supervisor', '')
            reg_quota = request.POST.get('quota', '')

            form = CaptchaTestForm(request.POST)
            if not form.is_valid():
                errors.append('Invalid Captcha')

            if not errors:
                errors = UserModules.create_user_account(
                    errors, reg_email, reg_username, reg_password, reg_fname,
                    reg_lname, reg_auth, reg_usertype, reg_supervisor,
                    reg_quota)

            if not errors:
                return render(request, 'user_register_complete.html')
        ###################################################################

        # Error or Get
        template_env = {
            #'topmenu_items': topmenu_items('Register', page.request),
            'errors': errors,
            'firstname': request.POST.get('firstname', ''),
            'lastname': request.POST.get('lastname', ''),
            'username': request.POST.get('username', ''),
            'authority_hrn': request.POST.get('authority_hrn', ''),
            'email': request.POST.get('email', ''),
            'password': request.POST.get('password', ''),
            'usertype': request.POST.get('usertype', ''),
            'authorities': authorities,
            'supervisors': supervisors,
            'quotas': quotas,
            'title': 'Registration',
            'form': CaptchaTestForm(),
        }
        template_env.update(page.prelude_env())
        return render(request, 'registration-view.html', template_env)
Esempio n. 16
0
    def get_context_data(self, **kwargs):

        page = Page(self.request)
        page.add_js_files  ( [ "js/jquery.validate.js", "js/my_account.register.js", "js/my_account.edit_profile.js" ] )
        page.add_css_files ( [ "css/onelab.css", "css/account_view.css","css/plugin.css" ] )


        user_query  = Query().get('local:user').select('config','email','status')
        user_details = execute_query(self.request, user_query)
        
        # not always found in user_details...
        config={}
        for user_detail in user_details:
            # different significations of user_status
            if user_detail['status'] == 0: 
                user_status = 'Disabled'
            elif user_detail['status'] == 1:
                user_status = 'Validation Pending'
            elif user_detail['status'] == 2:
                user_status = 'Enabled'
            else:
                user_status = 'N/A'
            #email = user_detail['email']
            if user_detail['config']:
                config = json.loads(user_detail['config'])

        platform_query  = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
        account_query  = Query().get('local:account').select('user_id','platform_id','auth_type','config')
        platform_details = execute_query(self.request, platform_query)
        account_details = execute_query(self.request, account_query)
       
        # initial assignment needed for users having account.config = {} 
        platform_name = ''
        account_type = ''
        account_usr_hrn = ''
        account_pub_key = ''
        account_priv_key = ''
        account_reference = ''
        my_users = ''
        my_slices = ''
        my_auths = ''
        ref_acc_list = ''
        principal_acc_list = ''
        user_status_list = []
        platform_name_list = []
        platform_name_secondary_list = []
        platform_access_list = []
        platform_no_access_list = []
        total_platform_list = []
        account_type_list = []
        account_type_secondary_list = []
        account_reference_list = []
        delegation_type_list = []
        user_cred_exp_list = []
        slice_list = []
        auth_list = []
        slice_cred_exp_list = []
        auth_cred_exp_list = []
        usr_hrn_list = []
        pub_key_list = []
          
        for platform_detail in platform_details:
            if 'sfa' in platform_detail['gateway_type']:
                total_platform = platform_detail['platform']
                total_platform_list.append(total_platform)
                
            for account_detail in account_details:
                if platform_detail['platform_id'] == account_detail['platform_id']:
                    platform_name = platform_detail['platform']
                    account_config = json.loads(account_detail['config'])
                    account_usr_hrn = account_config.get('user_hrn','N/A')
                    account_pub_key = account_config.get('user_public_key','N/A')
                    account_reference = account_config.get ('reference_platform','N/A')
                    # credentials of myslice platform
                    if 'myslice' in platform_detail['platform']:
                        acc_user_cred = account_config.get('delegated_user_credential','N/A')
                        acc_slice_cred = account_config.get('delegated_slice_credentials','N/A')
                        acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')

                        if 'N/A' not in acc_user_cred:
                            exp_date = re.search('<expires>(.*)</expires>', acc_user_cred)
                            if exp_date:
                                user_exp_date = exp_date.group(1)
                                user_cred_exp_list.append(user_exp_date)

                            my_users = [{'cred_exp': t[0]}
                                for t in zip(user_cred_exp_list)]
                       

                        if 'N/A' not in acc_slice_cred:
                            for key, value in acc_slice_cred.iteritems():
                                slice_list.append(key)
                                # get cred_exp date
                                exp_date = re.search('<expires>(.*)</expires>', value)
                                if exp_date:
                                    exp_date = exp_date.group(1)
                                    slice_cred_exp_list.append(exp_date)

                            my_slices = [{'slice_name': t[0], 'cred_exp': t[1]}
                                for t in zip(slice_list, slice_cred_exp_list)]

                        if 'N/A' not in acc_auth_cred:
                            for key, value in acc_auth_cred.iteritems():
                                auth_list.append(key)
                                #get cred_exp date
                                exp_date = re.search('<expires>(.*)</expires>', value)
                                if exp_date:
                                    exp_date = exp_date.group(1)
                                    auth_cred_exp_list.append(exp_date)

                            my_auths = [{'auth_name': t[0], 'cred_exp': t[1]}
                                for t in zip(auth_list, auth_cred_exp_list)]


                    # for reference accounts
                    if 'reference' in account_detail['auth_type']:
                        account_type = 'Reference'
                        delegation = 'N/A'
                        platform_name_secondary_list.append(platform_name)
                        account_type_secondary_list.append(account_type)
                        account_reference_list.append(account_reference)
                        ref_acc_list = [{'platform_name': t[0], 'account_type': t[1], 'account_reference': t[2]} 
                            for t in zip(platform_name_secondary_list, account_type_secondary_list, account_reference_list)]
                       
                    elif 'managed' in account_detail['auth_type']:
                        account_type = 'Principal'
                        delegation = 'Automatic'
                    else:
                        account_type = 'Principal'
                        delegation = 'Manual'
                    # for principal (auth_type=user/managed) accounts
                    if 'reference' not in account_detail['auth_type']:
                        platform_name_list.append(platform_name)
                        account_type_list.append(account_type)
                        delegation_type_list.append(delegation)
                        usr_hrn_list.append(account_usr_hrn)
                        pub_key_list.append(account_pub_key)
                        user_status_list.append(user_status)
                        # combining 5 lists into 1 [to render in the template] 
                        principal_acc_list = [{'platform_name': t[0], 'account_type': t[1], 'delegation_type': t[2], 'usr_hrn':t[3], 'usr_pubkey':t[4], 'user_status':t[5],} 
                            for t in zip(platform_name_list, account_type_list, delegation_type_list, usr_hrn_list, pub_key_list, user_status_list)]
                    # to hide private key row if it doesn't exist    
                    if 'myslice' in platform_detail['platform']:
                        account_config = json.loads(account_detail['config'])
                        account_priv_key = account_config.get('user_private_key','N/A')
                    if 'sfa' in platform_detail['gateway_type']:
                        platform_access = platform_detail['platform']
                        platform_access_list.append(platform_access)
       
        # Removing the platform which already has access
        for platform in platform_access_list:
            total_platform_list.remove(platform)
        # we could use zip. this one is used if columns have unequal rows 
        platform_list = [{'platform_no_access': t[0]}
            for t in itertools.izip_longest(total_platform_list)]

        context = super(AccountView, self).get_context_data(**kwargs)
        context['principal_acc'] = principal_acc_list
        context['ref_acc'] = ref_acc_list
        context['platform_list'] = platform_list
        context['my_users'] = my_users
        context['my_slices'] = my_slices
        context['my_auths'] = my_auths
        context['user_status'] = user_status
        context['person']   = self.request.user
        context['firstname'] = config.get('firstname',"?")
        context['lastname'] = config.get('lastname',"?")
        context['fullname'] = context['firstname'] +' '+ context['lastname']
        context['authority'] = config.get('authority',"Unknown Authority")
        context['user_private_key'] = account_priv_key
        
        # XXX This is repeated in all pages
        # more general variables expected in the template
        context['title'] = 'Platforms connected to MySlice'
        # the menu items on the top
        context['topmenu_items'] = topmenu_items_live('My Account', page)
        # so we can sho who is logged
        context['username'] = the_user(self.request)
#        context ['firstname'] = config['firstname']
        prelude_env = page.prelude_env()
        context.update(prelude_env)
        return context
Esempio n. 17
0
    def get_or_post(self, request, method):
        errors = []
        # List authorities already in the Registry in order to avoid duplicates
        # Using cache manifold-tables to get the list of authorities faster
        authorities_query = Query.get('authority').select(
            'name', 'authority_hrn')
        authorities = execute_admin_query(request, authorities_query)
        if authorities is not None:
            authorities = sorted(authorities)
        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", "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
            # (users won't be able to validate the form anyway)

            # List local users in Manifold DB in order ot avoid duplicates
            user_query = Query().get('local:user').select('user_id', 'email')
            list_users = execute_admin_query(self.request, user_query)

            reg_root_authority_hrn = request.POST.get('root_authority_hrn',
                                                      '').lower()

            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', '').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 = '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(".", "_")
            # 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()

            reg_address_line1 = request.POST.get('address_line1', '')
            reg_address_line2 = request.POST.get('address_line2', '')
            reg_address_line3 = request.POST.get('address_line3', '')
            reg_address_city = request.POST.get('address_city', '')
            reg_address_postalcode = request.POST.get('address_postalcode', '')
            reg_address_state = request.POST.get('address_state', '')
            reg_address_country = request.POST.get('address_country', '')

            #POST value validation
            if (re.search(r'^[\w+\s.@+-]+$', reg_fname) == None):
                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 !!
            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_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.'
                )
            for user_detail in list_users:
                if user_detail['email'] == reg_email:
                    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 = private.exportKey()
            public_key = private.publickey().exportKey(format='OpenSSH')
            # Saving to DB
            auth_type = 'managed'

            if not errors:
                reg_password = request.POST['pi_password']
                a = PendingAuthority(
                    site_name=reg_site_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_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,
                    address_postalcode=reg_address_postalcode,
                    address_state=reg_address_state,
                    address_country=reg_address_country,
                    authority_hrn=reg_root_authority_hrn,
                )
                a.save()

                reg_password = request.POST['pi_password']
                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)

                #creating user to manifold local:user
                #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)

                # Send email
                try:
                    ctx = {
                        'site_name': reg_site_name,
                        'authority_hrn':
                        reg_root_authority_hrn + '.' + reg_site_authority,
                        'site_abbreviated_name': reg_site_abbreviated_name,
                        'site_url': reg_site_url,
                        'address_city': reg_address_city,
                        'address_country': reg_address_country,
                        'first_name': reg_fname,
                        'last_name': reg_lname,
                        'authority_hrn': reg_auth,
                        'email': reg_email,
                        'user_hrn': user_hrn,
                        'public_key': public_key,
                    }

                    #recipients = authority_get_pi_emails(request,reg_auth)

                    self.template_name = 'authority_request_email.html'
                    html_content = render_to_string(self.template, ctx)

                    self.template_name = 'authority_request_email.txt'
                    text_content = render_to_string(self.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', '')
                    sender = reg_email

                    msg = EmailMultiAlternatives(subject, text_content, sender,
                                                 ['*****@*****.**'])
                    msg.attach_alternative(html_content, "text/html")
                    msg.send()

                except Exception, e:
                    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})
Esempio n. 18
0
    def get (self,request, slicename=tmp_default_slice):
    
        page = Page(request)
        page.add_css_files ('css/slice-view.css')
        page.add_js_files  ( [ "js/common.functions.js" ] )
        page.add_js_chunks ('$(function() { messages.debug("sliceview: jQuery version " + $.fn.jquery); });')
        page.add_js_chunks ('$(function() { messages.debug("sliceview: users turned %s"); });'%("on" if do_query_users else "off"))
        page.add_js_chunks ('$(function() { messages.debug("sliceview: leases turned %s"); });'%("on" if do_query_leases else "off"))
        page.add_js_chunks ('$(function() { messages.debug("manifold URL %s"); });'%(ConfigEngine().manifold_url()))

        metadata = page.get_metadata()
        resource_md = metadata.details_by_object('resource')
        resource_fields = [column['name'] for column in resource_md['column']]
    
        user_md = metadata.details_by_object('user')
        user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
    
        # TODO The query to run is embedded in the URL
        main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
        main_query.select(
                'slice_hrn',
                #'resource.hrn', 'resource.urn', 
                'resource.hostname', 'resource.type', 
                'resource.network_hrn',
                'lease.urn',
                'user.user_hrn',
                #'application.measurement_point.counter'
        )
        # for internal use in the querytable plugin;
        # needs to be a unique column present for each returned record
        main_query_init_key = 'hostname'
    
        query_resource_all = Query.get('resource').select(resource_fields)

        aq = AnalyzedQuery(main_query, metadata=metadata)
        page.enqueue_query(main_query, analyzed_query=aq)
        page.enqueue_query(query_resource_all)
        if do_query_users:
            # Required: the user must have an authority in its user.config
            # XXX Temporary solution
            user_query  = Query().get('local:user').select('config','email')
            user_details = execute_query(self.request, user_query)
            
            # not always found in user_details...
            config={}
#            for user_detail in user_details:
#                #email = user_detail['email']
#                if user_detail['config']:
#                    config = json.loads(user_detail['config'])
#            user_detail['authority'] = config.get('authority',"Unknown Authority")
#
#            if user_detail['authority'] is not None:
#                sub_authority = user_detail['authority'].split('.')
#                root_authority = sub_authority[0]
#                query_user_all = Query.get(root_authority+':user').select(user_fields)
#
#                # XXX TODO this filter doesn't work - to be improved in Manifold
#                #.filter_by('authority.authority_hrn', '=', user_detail['authority'])
#
#                page.enqueue_query(query_user_all)
#            else:
#                print "authority of the user is not in local:user db"
            query_user_all = Query.get('user').select(user_fields)
            #    query_user_all = None
    
        # ... and for the relations
        # XXX Let's hardcode resources for now
        sq_resource    = aq.subquery('resource')
        sq_user        = aq.subquery('user')
        sq_lease       = aq.subquery('lease')
        sq_measurement = aq.subquery('measurement')
        
    
        # Prepare the display according to all metadata
        # (some parts will be pending, others can be triggered by users).
        # 
        # For example slice measurements will not be requested by default...
    
        # Create the base layout (Stack)...
        main_stack = Stack (
            page=page,
            title="Slice %s"%slicename,
            sons=[],
        )
    
        # ... responsible for the slice properties...
    
        # a nice header
        main_stack.insert (
            Raw (page=page,
                 togglable=False, 
                 toggled=True,
                 html="<h2 class='well well-lg'> Slice %s</h2>"%slicename)
        )
    
        # --------------------------------------------------------------------------
        # QueryUpdater (Pending Operations)

        main_stack.insert(QueryUpdater(
            page                = page,
            title               = 'Pending operations',
            query               = main_query,
            togglable           = True,
            # start turned off, it will open up itself when stuff comes in
            toggled             = False, 
            domid               = 'pending',
            outline_complete    = True,
        ))

        # --------------------------------------------------------------------------
        # Filter Resources
       
# turn off for now -- see above
        filter_query_editor = QueryEditor(
            page  = page,
            query = sq_resource, 
            query_all = query_resource_all,
            title = "Select Columns",
            domid = 'select-columns',
            )
        filter_active_filters = ActiveFilters(
            page  = page,
            query = sq_resource,
            title = "Active Filters",
            )
        filters_area = Stack(
            page                = page,
            title               = 'Filter Resources',
            domid               = 'filters',
            sons                = [filter_query_editor, 
                                   filter_active_filters],
            togglable           = True,
            toggled             = 'persistent',
            outline_complete    = True, 
        )
        main_stack.insert (filters_area)

        # --------------------------------------------------------------------------
        # RESOURCES
        # the resources part is made of a Tabs (Geographic, List), 

        resources_as_gmap = GoogleMap(
            page       = page,
            title      = 'Geographic view',
            domid      = 'resources-map',
            # tab's sons preferably turn this off
            togglable  = False,
            query      = sq_resource,
            query_all  = query_resource_all,
            # this key is the one issued by google
            googlemap_api_key = ConfigEngine().googlemap_api_key(),
            # the key to use at init-time
            init_key   = main_query_init_key,
            checkboxes = True,
            # center on Paris
            latitude   = 49.,
            longitude  = 9,
            zoom       = 4,
        )

        resources_as_3dmap = SensLabMap(
            page       = page,
            title      = '3D Map',
            domid      = 'senslabmap',
            query      = sq_resource,
            query_all  = query_resource_all,
        )

        resources_as_list = QueryTable( 
            page       = page,
            domid      = 'resources-list',
            title      = 'List view',
            # this is the query at the core of the slice list
            query      = sq_resource,
            query_all  = query_resource_all,
            init_key     = main_query_init_key,
            checkboxes = True,
            datatables_options = { 
                'iDisplayLength': 25,
                'bLengthChange' : True,
                'bAutoWidth'    : True,
                },
            )

        if insert_grid:
            resources_as_grid = QueryGrid( 
                page       = page,
                domid      = 'resources-grid',
                title      = 'Grid view',
                # this is the query at the core of the slice list
                query      = sq_resource,
                query_all  = query_resource_all,
                init_key     = main_query_init_key,
                checkboxes = True,
                )

        

        #if do_query_leases:
        #    resources_as_scheduler = Scheduler(

        #        page        = page,
        #        title       = 'Scheduler',
        #        domid       = 'scheduler',
        #        query       = sq_resource,
        #        query_all_resources = query_resource_all,
        #        query_lease = sq_lease,

        #        )

        resources_as_scheduler2 = Scheduler2( 
            page       = page,
            domid      = 'scheduler',
            title      = 'Scheduler',
            # this is the query at the core of the slice list
            query = sq_resource,
            query_all_resources = query_resource_all,
            query_lease = sq_lease,
            )