Ejemplo n.º 1
0
    def handle(self, request, data):

        is_new_project = str(data['project_mapping']) == '0'
        project = None

        #Keystone connection
        ks = get_admin_ksclient()

        # handle project mapping
        if is_new_project:
            # create new project first
            '''
            project = keystone.tenant_create(
                request,
                data.get('project_name'),
                description=data.get('description'),
                enabled=True,
                domain=data.get('domain_id')
            )
            '''
            project = create_project(request,
                                     data.get('project_name'),
                                     description=data.get('description'),
                                     enabled=True,
                                     domain=data.get('domain_id'))

        else:
            # fetch project
            #project = keystone.tenant_get(request, data.get('project_id'))
            project = get_project(request, data.get('project_id'))

        # map project to billing account
        extra_fields = dict([(f, data[f]) for f in ACCOUNT_EXTRA_FIELDS])
        try:
            success = bool(
                create_billing_type_mapping(
                    request, {
                        "user": project.id,
                        "billing_type": data.get('billing_type') or 1,
                        "extra_fields": json.dumps(extra_fields)
                    }))
            if not success:
                raise exceptions.HorizonException(
                    'Unable to create billing type mapping.')
        except:
            # clean up created project in case of error
            if is_new_project:
                #FIXME: Need to check V3 related issues
                #keystone.tenant_delete(request, project.id)
                ks.tenants.delete(project.id)
            raise

        # create user (in case of new project)
        user = None
        try:
            if is_new_project:
                '''
                user = keystone.user_create(
                    request,
                    name=data.get('username'),
                    password=data.get('password'),
                    email=data.get('authorized_officer_email'),
                    enabled=True,
                    description='General user of project `%s`' % project.name,
                    project=project.id,
                    domain=data.get('domain_id')
                )
                '''
                user = create_user(request,
                                   name=data.get('username'),
                                   password=data.get('password'),
                                   email=data.get('authorized_officer_email'),
                                   enabled=True,
                                   description='General user of project `%s`' %
                                   project.name,
                                   project=project.id,
                                   domain=data.get('domain_id'))

        except:
            # clean up created project in case of error
            if is_new_project:
                #keystone.tenant_delete(request, project.id)
                #FIXME: Need to check V3 related issues
                ks.tenants.delete(project.id)
            raise

        # do networking deployment
        if is_new_project and getattr(
                local_settings, 'ASTUDE_CONFIGURE_ACCOUNT_NETWORKING', True):
            try:
                self._configure_networking(request, project)
            except Exception as e:
                print "Exception while adding network"
                print e
                pass

        self.name = project.name

        # send welcome email
        if not getattr(local_settings, 'ASTUTE_ENABLE_WELCOME_EMAIL', True):
            return True

        # send welcome email
        subj = getattr(settings, 'ASTUTE_WELCOME_EMAIL_SUBJ',
                       'Your new M1 Cloud Application Service')
        sender = getattr(settings, 'ASTUTE_WELCOME_EMAIL_FROM',
                         '*****@*****.**')
        host = getattr(settings, 'ASTUTE_SMTP_HOST', 'localhost')
        port = getattr(settings, 'ASTUTE_SMTP_PORT', 25)
        user = getattr(settings, 'ASTUTE_SMTP_USER', None)
        pswd = getattr(settings, 'ASTUTE_SMTP_PASS', None)
        html = render_to_string(WELCOME_EMAIL_TEMPLATE, data)

        # save the email content for the project user
        try:
            success = bool(
                create_user_letter(request, {
                    "user": project.id,
                    "content": encrypt(CIPHER_KEY, html),
                }))

        except Exception as e:
            print '*******mail*****'
            print e
            pass

        try:
            send_mail(subject=subj,
                      sender=sender,
                      to=data.get('authorized_officer_email'),
                      body=None,
                      html=html,
                      smtp_host=host,
                      smtp_port=port,
                      username=user,
                      password=pswd)
        except Exception as e:
            print e
            #raise exceptions.RecoverableError("Account has been created but error ocured on sending welcome email")
            pass

        return True
Ejemplo n.º 2
0
    def clean(self):
        cleaned_data = super(CreateAccountGenericAction, self).clean()

        if str(cleaned_data.get('project_mapping')) == '0':
            # validate new project fields

            msg_field_is_required = 'This field is required.'

            cleaned_data['project_name'] = (cleaned_data.get('project_name')
                                            or '').strip()
            project_name = cleaned_data['project_name']
            if project_name == '':
                self.add_error('project_name', msg_field_is_required)
            else:
                # check if specified project is already exists
                #if len([p for p in keystone.tenant_list(self.request)[0] if p.name == project_name]) > 0:
                if len([
                        p for p in get_projects(self.request)
                        if p.name == project_name
                ]) > 0:
                    self.add_error(
                        'project_name',
                        'Project `%s` already exists.' % project_name)

            cleaned_data['username'] = (cleaned_data.get('username')
                                        or cleaned_data.get('project_name')
                                        or '').strip()
            username = cleaned_data['username']
            if username != '':
                # check if specified user is already exists
                #if len([u for u in keystone.user_list(self.request) if u.name == username]) > 0:
                ks = get_admin_ksclient()
                if len(
                    [u for u in get_users(self.request) if u.name == username
                     ]) > 0:
                    self.add_error('username',
                                   'User `%s` already exists.' % username)

            password = cleaned_data.get('password')
            if not password:
                self.add_error('password', msg_field_is_required)


#            else:
#                # check password strength
#                if not (
#                    any(c.isupper() for c in password) and \
#                    any(c.islower() for c in password) and \
#                    any(c.isdigit() for c in password) and \
#                    len(password) >= 8
#                ):
#                    self.add_error('password', 'Password is too weak: %s.' % password_requirement_str)

            confirm = cleaned_data.get('confirm_password')
            if not confirm:
                self.add_error('confirm_password', msg_field_is_required)

            if password and confirm and password != confirm:
                self.add_error('confirm_password',
                               'Confirmation does not match password.')

            return cleaned_data