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
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' }
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, })
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()
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):
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(
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):