Example #1
0
def get_top_resumes(request):
    parser = HhApiParser()
    resumes = parser.get_applicant_resumes(
        HhUser.objects.get(user_id=request.user.id).access_token)
    top_resumes = [
        r for r in resumes['items'] if r['status']['id'] == 'published'
    ]
    return top_resumes[:3]
Example #2
0
def check_salary(salary, resume_id, access_token):

    parser = HhApiParser()
    vacancies = parser.get_vacancies_similar_to_resume(resume_id, access_token)
    salaries = [
        vacancy['salary']['from'] for vacancy in vacancies
        if vacancy['salary'] is not None
        and vacancy['salary']['currency'] == 'RUR'
    ]
    salaries = np.array(list(filter(lambda x: x is not None, salaries)))
    salary_median = int(np.median(salaries))

    if len(salaries) < 20:
        if salary is None:
            return {
                'title':
                'Не указана желаемая зарплата',
                'text':
                'Статистика HeadHunter показывает, что если в резюме отсутствуют зарплатные ожидания, то количество'
                ' приглашений снижается. Это связано с тем, что работодатель склонен минимизировать время на'
                ' подбор:он в первую очередь приглашает тех, чье резюме дает исчерпывающую информацию — как о'
                ' профессиональном уровне, так и о зарплатных ожиданиях. И только потом приступает к рассмотрению'
                ' других кандидатов.',
                'type':
                'danger'
            }
        else:
            return False
    if salary is None:
        return {
            'title':
            'Не указана желаемая зарплата',
            'text':
            'Статистика HeadHunter показывает, что если в резюме отсутствуют зарплатные ожидания, то количество'
            ' приглашений снижается. Это связано с тем, что работодатель склонен минимизировать время на'
            ' подбор:он в первую очередь приглашает тех, чье резюме дает исчерпывающую информацию — как о'
            ' профессиональном уровне, так и о зарплатных ожиданиях. И только потом приступает к рассмотрению'
            ' других кандидатов.',
            'sub_text':
            f'Наиболее распространенное значение заработной платы, среди опубликованных вакансий,'
            f' похожих на ваше резюме:',
            'sub_list': [f'{salary_median} руб'],
            'type':
            'danger'
        }

    return {
        'title':
        'Информация о среднем значении ЗП',
        'sub_text':
        f'Наиболее распространенное значение заработной платы, среди опубликованных вакансий,'
        f' похожих на ваше резюме:',
        'sub_list': [f'{salary_median} руб'],
        'type':
        'info'
    }
Example #3
0
def get_all_resumes(request):
    parser = HhApiParser()
    resumes = parser.get_applicant_resumes(
        HhUser.objects.get(user_id=request.user.id).access_token)['items']
    access_token = HhUser.objects.get(user_id=request.user.id).access_token

    resumes_full_info = [
        parser.get_applicant_resume_data(item['id'], access_token)
        for item in resumes if item['status']['id'] == 'published'
    ]

    return resumes_full_info
Example #4
0
def resume_save(request):

    resume_id = request.GET.get('id', '')

    change_params = {
        'last_name': request.GET.get('last_name', ''),
        'first_name': request.GET.get('first_name', ''),
        'title': request.GET.get('title', ''),
        'birth_date': request.GET.get('birth_date', ''),
    }
    salary_amount = request.GET.get('salary_amount', 0)
    salary_currency = request.GET.get('salary_currency', 'RUR')
    middle_name = request.GET.get('middle_name', '')
    skills = request.GET.get('skills', '')

    if salary_amount != "":
        if salary_currency != 'Валюта':
            change_params['salary'] = {
                'amount': salary_amount,
                'currency': salary_currency
            }
        else:
            change_params['salary'] = {
                'amount': salary_amount,
                'currency': 'RUR'
            }
    else:
        change_params['salary'] = {'amount': 0, 'currency': 'RUR'}

    if middle_name == '':
        middle_name = None
    change_params['middle_name'] = middle_name
    if skills == '':
        skills = None
    change_params['skills'] = skills

    parser = HhApiParser()
    access_token = HhUser.objects.get(user_id=request.user.id).access_token
    parser.change_user_resume_data(resume_id, change_params, access_token)

    return redirect(f'http://127.0.0.1:8000/app/resume?resume_id={resume_id}')
Example #5
0
def login_catch_user_code(request):
    user_code = request.GET.get("code", None)
    if user_code is None:
        return redirect('login', {'error': 'Отказано в доступе'})
    req_args = {
        'grant_type': 'authorization_code',
        'client_id': CLIENT_ID,
        'client_secret': CLIENT_SECRET,
        'redirect_uri': REDIRECT_URI,
        'code': user_code,
    }
    response = requests.post('https://hh.ru/oauth/token', req_args)
    token_data = response.json()

    access_token = token_data.get('access_token')
    refresh_token = token_data.get('refresh_token')
    parser = HhApiParser()
    account_data = parser.get_auth_info(access_token)

    if not HhUser.objects.filter(hh_id=account_data.get('id')):
        user = User(first_name=account_data.get('first_name'),
                    last_name=account_data.get('last_name'),
                    email=account_data.get('email'))
        user.save()
        hh_user = HhUser(middle_name=account_data.get('middle_name'),
                         hh_id=account_data.get('id'),
                         access_token=access_token,
                         refresh_token=refresh_token,
                         user=user)
        hh_user.save()
    else:
        hh_user = HhUser.objects.get(hh_id=account_data.get('id'))
        hh_user.access_token = access_token
        hh_user.refresh_token = refresh_token
        hh_user.save()
        user = User.objects.get(id=hh_user.user.id)
    login(request, user)
    request.session.set_expiry(token_data.get('expires_in') - 30)

    return redirect('home')
Example #6
0
def resume(request):
    parser = HhApiParser()
    access_token = HhUser.objects.get(user_id=request.user.id).access_token

    username = get_user_name(request)
    resume_id = request.GET.get("resume_id", "")
    top_resumes = get_top_resumes(request)

    info = parser.get_applicant_resume_data(resume_id, access_token)

    db_service = DbService()
    currencies_db = db_service.execute_script('select code from currency')
    currencies = [cur[0] for cur in currencies_db]

    # Получить рекомендации по резюме
    warnings = get_recommendations(info, request)
    warnings.sort(key=operator.itemgetter('type'))

    # Обработать дату
    for exp in info['experience']:
        start = datetime.datetime.fromisoformat(exp['start'])
        exp['start'] = start.strftime(f'{MONTH_LIST[start.month-1]} %Y')

        if exp['end'] is not None:
            end = datetime.datetime.fromisoformat(exp['end'])
            exp['end'] = end.strftime(f'{MONTH_LIST[end.month - 1]} %Y')

    return render(
        request, 'main/resume_edit.html', {
            'active_el': resume_id,
            'user': username,
            'resume': info,
            'warnings': warnings,
            'top_resumes': top_resumes,
            'currencies': currencies,
        })
Example #7
0
from datetime import datetime, timedelta
from tqdm import tqdm
import threading
import gc

from data_parsers.hhApiParser import HhApiParser
from services.db_service import DbService

parser = HhApiParser()
cur_date = {'from': (datetime.now() - timedelta(days=1)), 'to': datetime.now()}
req_param = {
    'specialization': 1,
    'per_page': 0,
    'date_from': cur_date['from'].strftime('%Y-%m-%dT%H:%M:%S'),
    'date_to': cur_date['to'].strftime('%Y-%m-%dT%H:%M:%S')
}
data = parser.execute_request(req_param=req_param)
dates = []
total_vacancies_number = 0
while data['found'] != 0:
    while data['found'] > 2000:
        cur_date['from'] += timedelta(hours=1)
        req_param['date_from'] = cur_date['from'].strftime('%Y-%m-%dT%H:%M:%S')
        data = parser.execute_request(req_param=req_param)

    total_vacancies_number += data['found']
    dates.append([
        cur_date['from'].strftime('%Y-%m-%dT%H:%M:%S'),
        cur_date['to'].strftime('%Y-%m-%dT%H:%M:%S')
    ])
Example #8
0
from data_parsers.hhApiParser import HhApiParser
from services.db_service import DbService

# Получение данных справочника dictionaries и занесение их в
parser = HhApiParser()
db_service = DbService()

data = parser.get_dictionaries()
db_service.add_to_schedule_table(data.get('schedule'))
db_service.add_to_experience_table(data.get('experience'))
db_service.add_to_currency_table(data.get('currency'))
db_service.add_to_employment_table(data.get('employment'))
db_service.add_to_employer_type_table(data.get('employer_type'))

# Получение данных из справочника specializations и занесение их в БД
data = parser.get_specializations_dict()
db_service.add_to_specialization_table(data)

# Удаление использованных данных
del parser
del db_service
del data