示例#1
0
def get_user_by_key(user_data):
    if user_data['key'] == 'user_details_id':
        user = UserDetails.get_user_details_by_id(user_data['value'])
    elif user_data['key'] == 'email':
        user = UserDetails.get_user_details_by_email(user_data['value'])
    elif user_data['key'] == 'api_key':
        user = UserDetails.get_user_details_by_api_key(user_data['value'])
    elif user_data['key'] == 'ldap_id':
        user = UserDetails.get_user_details_by_ldap_id(user_data['value'])
    else:
        raise ApplicationError('Incorrect key: {}'.format(user_data['key']),
                               'E101',
                               http_code=404)

    if user:
        user_details = user.as_dict()
        user_type = get_user_type(user_details['user_type_id'])
        user_details['user_type'] = user_type
        contact_preferences = _build_contact_preferences(
            _extract_rows(
                Contact.get_contact_preferences_for_user(
                    user_details['user_details_id'])))
        user_details['contact_preferences'] = contact_preferences
        user_dict = {
            'user_details': user_details,
            'datasets': _build_users_datasets(user_details['user_details_id'])
        }
        return user_dict
    else:
        raise ApplicationError(*errors.get('ulapd_api',
                                           'USER_NOT_FOUND',
                                           filler=user_data['value']),
                               http_code=404)
示例#2
0
def delete_user(user_id):
    try:
        UserTermsLink.delete_user_by_user_id(user_id)
        Activity.delete_user_by_user_id(user_id)
        Contact.delete_contact_preferences_for_user(user_id)

        user = UserDetails.get_user_details_by_id(user_id)
        if user:
            db.session.delete(user)
        else:
            app.logger.error("No user: {} found for deletion".format(user_id))
            db.session.rollback()
            db.session.close()
            raise ApplicationError(*errors.get('ulapd_api',
                                               'USER_NOT_FOUND',
                                               filler=user_id),
                                   http_code=404)
        db.session.commit()
        return {'user_id': user_id, 'message': 'user deleted'}
    except Exception as e:
        db.session.rollback()
        db.session.close()
        raise ApplicationError(*errors.get('ulapd_api',
                                           'DELETE_USER_ERROR',
                                           filler=e),
                               http_code=400)
示例#3
0
def create_new_user(user_data):
    try:
        account = AccountAPI()
        verification = VerificationAPI()
        app.logger.info('Creating user in ldap for {}'.format(
            user_data['email']))
        response = account.create(user_data)
        user_data['ldap_id'] = response['user_id']

        user_data = _process_new_user_data(user_data)
        app.logger.info('Adding user {} to the ulapd database...'.format(
            user_data['email']))
        new_user_details = UserDetails(user_data)
        db.session.add(new_user_details)
        db.session.commit()
        user_data['user_details_id'] = new_user_details.user_details_id

        if user_data['contactable']:
            app.logger.info(
                'Inserting the contact preferences for {}...'.format(
                    user_data['email']))
            for preference in user_data['contact_preferences']:
                contact = {
                    'user_details_id': user_data['user_details_id'],
                    'contact_type': preference
                }
                contact_preference = Contact(contact)
                db.session.add(contact_preference)
        db.session.commit()
        app.logger.info(
            'Finished adding user {} to the ulapd database...'.format(
                user_data['email']))

        # Add the user details to verification database for DST
        app.logger.info('Adding user {} to verification db...'.format(
            user_data['email']))
        verification.create(user_data)

        # Call to account-api to activate or acknowledge user
        is_uk_org = 'organisation-uk' in user_data['user_type']

        if is_uk_org:
            app.logger.info('Acknowledging user')
            account.acknowledge(user_data['ldap_id'])
        else:
            app.logger.info('Activating user')
            account.activate(user_data['ldap_id'])

        db.session.close()
        return user_data
    except Exception as e:
        app.logger.error('Failed to create user with error - {}'.format(
            str(e)))
        db.session.rollback()
        _delete_user_data(account, user_data)
        db.session.close()
        raise ApplicationError(*errors.get('ulapd_api',
                                           'CREATE_USER_ERROR',
                                           filler=e),
                               http_code=400)
示例#4
0
def insert_user_row(user_data):
    with app.app_context():
        user = UserDetails(user_data)
        db.session.add(user)
        db.session.commit()
        user_details_id = user.user_details_id
        db.session.close()
    return user_details_id
示例#5
0
def get_all_users():
    users = _extract_rows(UserDetails.get_user_details_all())
    user_list = []
    for user in users:
        user_type = get_user_type(user['user_type_id'])
        user_dict = {'user_details': user, 'user_type': user_type}
        user_list.append(user_dict)

    return user_list
示例#6
0
def get_dataset_activity(user_id):
    user = UserDetails.get_user_details_by_id(user_id)
    if user:
        return _build_user_dataset_activity(user_id)
    else:
        app.logger.error("No user found for id {}".format(user_id))
        raise ApplicationError(*errors.get('ulapd_api',
                                           'USER_NOT_FOUND',
                                           filler=user_id),
                               http_code=404)
示例#7
0
def get_user_details(user_id):
    user_details = UserDetails.get_user_details_by_id(user_id)
    if user_details:
        result = user_details.as_dict()
    else:
        app.logger.error("User '{}' not found".format(user_id))
        raise ApplicationError(*errors.get('ulapd_api',
                                           'USER_NOT_FOUND',
                                           filler=user_id),
                               http_code=404)

    return result
示例#8
0
def manage_licence_agreement(data):
    try:
        user = UserDetails.get_user_details_by_id(data['user_details_id'])
        if not user:
            app.logger.error("No user found for id {}".format(
                data['user_details_id']))
            raise ApplicationError(*errors.get('ulapd_api',
                                               'USER_NOT_FOUND',
                                               filler=data['user_details_id']),
                                   http_code=404)

        # check to see if user already has this type of licence
        ldap_update_needed = True
        licence_data = _extract_rows(
            Licence.get_licences_by_dataset_name(data['licence_id']))
        for rows in licence_data:
            user_licence = UserTermsLink.get_user_terms_by_licence_name(
                user.user_details_id, rows['licence_id'])
            if user_licence:
                app.logger.info(
                    'User {} already has the role {} so not updating ldap...'.
                    format(user.user_details_id, data['licence_id']))
                ldap_update_needed = False

        stored_licence_id = data['licence_id']
        if _check_freemium(data['licence_id']):
            data['licence_id'] += '_direct'
        licence = UserTermsLink(data)
        db.session.add(licence)

        if ldap_update_needed:
            app.logger.info(
                'User {} does not have the role {} so update ldap...'.format(
                    user.user_details_id, stored_licence_id))
            _handle_ldap_group(stored_licence_id, user.ldap_id, True)

        db.session.commit()
        data['link_id'] = licence.user_terms_link_id
        return data
    except Exception as e:
        app.logger.error(
            'Failed to manage licence for user {} with error - {}'.format(
                data['user_details_id'], str(e)))
        db.session.rollback()
        db.session.close()
        raise ApplicationError(*errors.get('ulapd_api',
                                           'LICENCE_AGREE_ERROR',
                                           filler=e),
                               http_code=400)
示例#9
0
def get_users_dataset_access(user_id):
    user = UserDetails.get_user_details_by_id(user_id)
    if user:
        datasets = Dataset.get_all()
        dataset_access = []

        for row in datasets:
            if row.type != 'open':
                dataset_dict = {
                    'id': row.dataset_id,
                    'name': row.name,
                    'title': row.title,
                    'type': row.type
                }
                licence_names = _extract_rows(
                    Licence.get_licences_by_dataset_name(row.name))

                licence_dict = {}
                for licence_rows in licence_names:
                    licence = get_licence_agreement(user_id,
                                                    licence_rows['licence_id'])
                    licence_dict[licence_rows['licence_id']] = {
                        'title': licence_rows['title'],
                        'agreed': licence['valid_licence']
                    }

                dataset_dict['licences'] = licence_dict
                dataset_access.append(dataset_dict)

        dataset_access = _sort_out_sample(dataset_access)

        licenced_datasets = [
            d for d in dataset_access if d['type'] == 'licenced'
        ]
        non_licenced_datasets = [
            d for d in dataset_access if d['type'] != 'licenced'
        ]

        full_access = non_licenced_datasets
        full_access.append(_sort_out_licenced_datasets(licenced_datasets))
        return full_access
    else:
        app.logger.error("No user found for id {}".format(user_id))
        raise ApplicationError(*errors.get('ulapd_api',
                                           'USER_NOT_FOUND',
                                           filler=user_id),
                               http_code=404)
示例#10
0
def update_api_key(user_id):
    try:
        user = UserDetails.get_user_details_by_id(user_id)
        if user:
            user.api_key = _create_api_key()
            db.session.commit()
            return get_user_details(user_id)
        else:
            raise ApplicationError(*errors.get('ulapd_api',
                                               'USER_NOT_FOUND',
                                               filler=user_id),
                                   http_code=404)

    except Exception as e:
        raise ApplicationError(*errors.get('ulapd_api',
                                           'RESET_API_KEY_ERROR',
                                           filler=e),
                               http_code=400)
示例#11
0
def update_contact_preference(user_data):
    user = UserDetails.get_user_details_by_id(user_data['user_id'])
    if user:
        app.logger.info('Deleting contact preferences for user {}'.format(
            user_data['user_id']))

        Contact.delete_contact_preferences_for_user(user_data['user_id'])
        for contacts in user_data['contact_preferences']:
            contact = {
                'user_details_id': user_data['user_id'],
                'contact_type': contacts
            }
            contact_preference = Contact(contact)
            db.session.add(contact_preference)

        user.contactable = user_data['contactable']
        db.session.commit()
        user_details = user.as_dict()
        user_details['contact_preferences'] = user_data['contact_preferences']
        return user_details
    else:
        raise ApplicationError(*errors.get('ulapd_api', 'USER_NOT_FOUND',
                                           user_data['user_id']),
                               http_code=404)
示例#12
0
def manage_multi_licence_agreement(data):
    try:
        user = UserDetails.get_user_details_by_id(data['user_details_id'])
        if not user:
            app.logger.error("No user found for id {}".format(
                data['user_details_id']))
            raise ApplicationError(*errors.get('ulapd_api',
                                               'USER_NOT_FOUND',
                                               filler=data['user_details_id']),
                                   http_code=404)

        current_licences = _extract_rows(
            UserTermsLink.get_user_terms_by_user_id(data['user_details_id']))
        current_list = [d['licence_id'] for d in current_licences]

        all_licences = Licence.get_all_licences()
        licence_dict = {}
        for rows in all_licences:
            licence_dict[rows.licence_name] = rows.dataset_name

        groups = {}
        for row in data['licences']:
            if row['licence_id'] not in current_list and row['agreed']:
                app.logger.info('Adding licence {} to db and ldap'.format(
                    row['licence_id']))
                role = licence_dict[row['licence_id']]
                groups[role] = row['agreed']
                new_user_licence = UserTermsLink({
                    'user_details_id':
                    user.user_details_id,
                    'licence_id':
                    row['licence_id']
                })
                db.session.add(new_user_licence)
            elif row['licence_id'] in current_list and not row['agreed']:
                app.logger.info('Removing licence {} from db and ldap'.format(
                    row['licence_id']))
                role = licence_dict[row['licence_id']]
                groups[role] = row['agreed']
                UserTermsLink.delete_user_licence_agreement(
                    user.user_details_id, row['licence_id'])
            else:
                app.logger.info('There is no change for licence {}'.format(
                    row['licence_id']))

        # sort out freemium
        res_covs = [
            d for d in data['licences'] if 'res_cov' in d['licence_id']
        ]
        groups = _handle_ldap_freemium_updates('res_cov', res_covs, groups,
                                               current_list)

        if bool(groups):
            app.logger.info(
                'Sending these groups - {}, for ldap update for user {}'.
                format(groups, user.user_details_id))
            update_groups_for_ldap(user.ldap_id, groups)
        else:
            app.logger.info('No groups to update in ldap for user {}'.format(
                user.user_details_id))

        db.session.commit()
        return groups
    except Exception as e:
        app.logger.error(
            'Failed to manage multi licences for user {} with error - {}'.
            format(data['user_details_id'], str(e)))
        db.session.rollback()
        db.session.close()
        raise ApplicationError(*errors.get('ulapd_api',
                                           'LICENCE_AGREE_ERROR',
                                           filler=e),
                               http_code=400)