예제 #1
0
def check_photo(photo_info):

    db_service = DbService()
    all = db_service.execute_script('SELECT count(have_photo) FROM resume')
    have_photo = db_service.execute_script(
        'SELECT count(have_photo) FROM resume WHERE have_photo = TRUE ')

    percentage = int(have_photo[0][0] / all[0][0] * 100) - 1

    if photo_info is None:
        return {
            'title':
            'Отсутствует фотография',
            'text':
            'Фотография в резюме всегда будет плюсом, даже если должность не предполагает общения с людьми.'
            ' Фото сделает резюме персонализированным: ее легче заметить, а отклик с фото сложнее пропустить'
            ' или удалить. Но выбирать портрет для резюме нужно критически: неудачное фото может все испортить.'
            ' Лучше всего подойдет профессиональное портретное фото, деловое и нейтральное.',
            'sub_text':
            f'На данный момент около {percentage}% всех резюме публикуются с фотографией!',
            'type':
            'warning'
        }
    face_cascade = cv2.CascadeClassifier(
        '..//workflow/haarcascade_frontalface_default.xml')

    req = requests.get(photo_info['medium'])
    arr = np.asarray(bytearray(req.content), dtype=np.uint8)
    img = cv2.imdecode(arr, -1)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    faces = face_cascade.detectMultiScale(gray, 1.1, 4)

    if len(faces) == 0:
        return {
            'title':
            'Не найдено лицо на фотографии',
            'text':
            'Мы не смогли распознать вас на фотографии. Убедитесь, что ваше лицо хорошо'
            ' различимо и не закрыто элементами одежды.',
            'type':
            'warning'
        }

    if len(faces) > 1:
        return {
            'title':
            'Более одного лица на фотографии',
            'text':
            'Нам удалось распознать несколько лиц на вашей фотографии. Групповые фото не подходят для '
            'резюме, убедитесь, что на фото изображены только вы.',
            'type':
            'danger'
        }

    return False
예제 #2
0
def get_vacancy_title_recommendation(title):

    title_tokens = re.sub('[^a-zа-я]', ' ', title.lower())
    title_tokens.replace('  ', ' ')
    title_tokens = title_tokens.split(' ')
    title_tokens = set([token for token in title_tokens if token != ''])

    script_text = "SELECT name, count(id) FROM vacancies WHERE "

    if len(title_tokens) == 0:
        return False
    for token in title_tokens:
        script_text += "lower(name) like %s and "
    script_text = script_text[:-4]
    script_text += "GROUP BY name ORDER BY count(id) DESC"

    db_service = DbService()
    vacancies = db_service.execute_script(
        script_text, tuple([f"%{token}%" for token in title_tokens]))

    i = 0
    relevant_titles = []
    for vacancy in vacancies:
        if i == 4:
            break
        vacancy_tokens = set(
            re.sub('[^a-zа-я]', ' ', vacancy[0].lower()).split(' '))
        if vacancy_tokens == title_tokens:
            continue
        i += 1
        relevant_titles.append(vacancy[0])

    if not relevant_titles:
        return False

    return {
        'title':
        'Рекомендации к желаемой должности',
        'text':
        f'При выборе названия для желаемой должности, рекомендуется ориентироваться на конкретную'
        f' интересующую именно вас вакансию определенной компании. Но в том случае если вы еще только в'
        f' поиске желаемой вакансии, то мы можем посоветовать вам следующие наименование должностей, которые'
        f' сейчас востребованы на рынке труда и похожи на желаемую вами должность:',
        'sub_list':
        relevant_titles,
        'type':
        'info'
    }
예제 #3
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,
        })
예제 #4
0
from services.db_service import DbService
from data_parsers.hhResumeParser import HhResumeParser

import threading
from tqdm import tqdm
import json

service = DbService()
data = service.execute_script(
    "SELECT id FROM specialization WHERE profarea_id = '1'")
specs = [item[0] for item in data]
del data

parser_1 = HhResumeParser()
parser_2 = HhResumeParser()
resumes_data = [[], []]
for i in tqdm(range(0, len(specs) - 1, 2)):
    thread_1 = threading.Thread(
        target=lambda s: resumes_data[0].extend(parser_1.get_resumes(s)),
        args=(specs[i], ))
    thread_2 = threading.Thread(
        target=lambda s: resumes_data[1].extend(parser_2.get_resumes(s)),
        args=(specs[i + 1], ))

    threads = [thread_1, thread_2]
    for t in threads:
        t.start()

    for t in threads:
        t.join()
예제 #5
0
from scipy.sparse import lil_matrix

from sklearn.preprocessing import normalize
from scipy.sparse import spdiags

from scipy.sparse import vstack
import numpy as np

import json

db_service = DbService()

# Получение вакансий
vacancies_id = db_service.execute_script("""
    SELECT v.id
    FROM vacancies as v INNER JOIN vacancy_skill as v_s ON v.id = v_s.vacancy_id
    GROUP BY v.id
    HAVING count(v_s.vacancy_id) > 2
""")
vacancy_to_col = {}
for col_id, (vacancy_id, ) in enumerate(vacancies_id):
    vacancy_to_col[vacancy_id] = col_id

# Получение ключевых навыков
skills = db_service.execute_script("""
    SELECT DISTINCT skill_name
    FROM vacancy_skill
    GROUP BY skill_name
    HAVING count(vacancy_id) > 25
""")
skill_to_row = {}
for col_id, (skill_name, ) in enumerate(skills):
예제 #6
0
    if upper_i > len(dates):
        upper_i = len(dates)

    for j in range(i, upper_i):
        threads.append(
            threading.Thread(target=load_vacancies, args=(dates[j], )))

    for t in threads:
        t.start()

    for t in threads:
        t.join()
    threads.clear()
    gc.collect()

employers = db_service.execute_script(
    'SELECT DISTINCT employer_id FROM vacancies WHERE employer_id is not NULL')


def load_employers(employer):
    employer_info = parser.get_employers_info(employer)
    db_service.save_employers(employer_info)


threads = []
size = int(len(employers) / 4)
threads.append(
    threading.Thread(target=load_employers, args=(employers[:size * 1], )))
threads.append(
    threading.Thread(target=load_employers,
                     args=(employers[size * 1:size * 2], )))
threads.append(
예제 #7
0
import json
from services.db_service import DbService
import re

with open('..//data/resume_data.json', 'r') as file:
    resume_list = json.load(file)

db_service = DbService()

db_specializations = db_service.execute_script(
    "SELECT id, name FROM specialization")

bd_schedules_orig = db_service.execute_script("SELECT id, name FROM schedule")
bd_schedules = {}
for sch in bd_schedules_orig:
    bd_schedules[sch[1].lower()] = sch[0]
del bd_schedules_orig

bd_employment_orig = db_service.execute_script(
    "SELECT id, name FROM employment")
bd_employment = {}
for emp in bd_employment_orig:
    bd_employment[emp[1].lower()] = emp[0]
del bd_employment_orig

id_regex = re.compile(r'e/(.+?)\?')
resume_copy = [resume for resume in resume_list]
for resume in resume_copy:

    # Резюме без ссылки и названия не рассматриваем
    if (resume['href'] is None) or (resume['title'] is None):