def load_lines(): """Загрузка линий""" for conclusion in JointConclusion.objects.all(): conclusion.delete() for welding_joint in WeldingJoint.objects.all(): welding_joint.delete() for joint in Joint.objects.all(): joint.delete() for line in Line.objects.all(): line.delete() for titul in Titul.objects.all(): titul.delete() subject = Subject.objects.all().first() titul = Titul.objects.create(name='У920', subject=subject) wb = open_wb('more_lines.xlsx') sheet = wb['Линии'] rows = sheet.rows for row in rows: value = row[2].value if not value: continue value = '%s' % value value = value.strip() line = Line.objects.filter(name=value, titul=titul).first() if not line: #logger.info('[ERROR]: line not found %s' % value) Line.objects.create(name=value, titul=titul)
def load_titul(): cur_titul = Titul.objects.filter(name='У920').first() if not cur_titul: logger.info('[ERROR]: titul У920 not found') return i = 0 wb = open_wb('920.xlsx') sheet = wb.active rows = sheet.rows for row in rows: if i < 2: i += 1 continue cell_values = [cell.value for cell in row] line_str = cell_values[0].strip() joint_str = '%s' % cell_values[1] joint_str = joint_str.strip() stigma = None if cell_values[2]: stigma = cell_values[2].strip() material = cell_values[3].strip() diameter = '%s' % cell_values[4] diameter = diameter.strip().replace(',', '.') side_thickness = '%s' % cell_values[5] side_thickness = side_thickness.strip().replace(',', '.') welding_date = '%s' % cell_values[6] welding_date = welding_date.strip() if welding_date.endswith('/20'): welding_date = '%s2020' % welding_date[:-2] welding_date = str_to_date(welding_date) welding_type = cell_values[7].strip() conn_view = cell_values[8].strip() el1 = cell_values[9].strip() el2 = cell_values[10].strip() line = Line.objects.filter(name=line_str).first() if line: joint = Joint.objects.filter(name=joint_str, line=line).first() if not joint: joint = Joint( line=line, name=joint_str, ) joint.diameter = diameter joint.side_thickness = side_thickness joint.welding_date = welding_date joint.material = search_choice(replace_eng2rus(material.upper()), MATERIALS) joint.welding_type = search_choice( replace_eng2rus(welding_type.upper()), WELDING_TYPES) joint.welding_conn_view = search_choice( replace_eng2rus(conn_view.upper()), Joint.welding_conn_view_choices) joint.join_type_from = search_choice(replace_eng2rus(el1.lower()), JOIN_TYPES) joint.join_type_to = search_choice(replace_eng2rus(el2.lower()), JOIN_TYPES) joint.save() else: print('линия не найдена %s стык %s' % (line_str, joint_str))
def promocode_by_email(request): """Промокод по емайлу из эксель файла :param request: HttpRequest """ context = {} method = request.GET if request.method == 'POST': method = request.POST search_email = check_email(method.get('email')) if not search_email: return JsonResponse(context, safe=False) wb = open_wb('promocodes.xlsx') sheet = wb.active i, row = search_header(sheet.rows, symbols='email') icode = None iemail = None j = 0 for cell in row: if cell.value == 'code': icode = j elif cell.value == 'email': iemail = j j += 1 for row in sheet.rows: code = row[icode].value email = row[iemail].value if not code and not email: break if email == search_email: context['code'] = code return JsonResponse(context, safe=False)
def analyze_conclusion(path: str, titul: str): """Разбираем ибучее заключение из эксель файла :param path: путь до эксельки заключения :param titul: экземпляр Titul """ if not path.endswith('.xlsx'): #logger.info('NOT XLSX file %s' % path) return wb = open_wb(path) sheet = None # ВИК есть всегда - ищем его, # по нему получим линию и мб еще что-то for item in wb: if item.title == 'ВИК': sheet = item #analyze_vik(sheet, titul, path) #exit() for item in wb: if item.title == 'РК': sheet = item analyze_rk(sheet, titul, path)
def more_lines_helper(path: str): """Загрузка дополнительных узлов в дополнительным линиям :param path: путь до эксельки """ subject = Subject.objects.all().first() wb = open_wb(path) sheet = wb.active rows = sheet.rows cur_titul = None for row in rows: cell_values = [cell.value for cell in row] # 1 - линия # 2 - стык # 3 - диаметр х тощина стенки # 4 - дата сварки # 5 - клеймо # 6 - вид сварного соединения # 7 - тип сварки # 12 - статус (новый/готов) digit = row[0].value if not digit: continue digit = str(digit) if 'Титул ' in digit: titul_str = digit.split('Титул ')[1] titul_str = titul_str.split(' ')[0] titul_str = titul_str.split('.')[0] titul = Titul.objects.filter(name=titul_str).first() if not titul: logger.info('[ERROR]: titul not found %s' % titul_str) cur_titul = Titul.objects.create(name=titul_str, subject=subject) else: cur_titul = titul #logger.info('TITUL %s' % cur_titul.name) diameter = side_thickness = date = stigma = welding_conn_view = welding_type = None joint_str = row[2].value size = row[3].value if size and ('х' in size or 'ъ' in size): size = str(size).strip() if 'ъ' in size: diameter, side_thickness = size.split('ъ') elif 'х' in size: diameter, side_thickness = size.split('х') elif 'x' in size: diameter, side_thickness = size.split('x') diameter = diameter.strip().replace(',', '.') side_thickness = side_thickness.strip().replace(',', '.') if '/' in side_thickness: side_thickness = side_thickness.split('/')[0] if row[4].value: date = str_to_date(str(row[4].value)) if row[5].value: stigma = str(row[5].value).strip() try: stigma = replace_rus2eng(stigma) except Exception as e: print('[ERROR]: %s' % e) stigma = None if row[6].value: welding_conn_view_str = replace_eng2rus(row[6].value) welding_conn_view = get_choice( welding_conn_view_str, WeldingJoint.welding_conn_view_choices) if row[7].value: welding_type = row[7].value.replace('+', ' - ') welding_type = replace_eng2rus(welding_type) welding_type = welding_type.replace(' ', ' ') welding_type = get_choice(welding_type, WELDING_TYPES) line_str = row[1].value if not line_str or not 'Линия ' in line_str: #print(digit, line_str) continue line_str = line_str.split('Линия ')[1] line_str = line_str.strip() try: line_str = replace_rus2eng(line_str) except Exception: print('Русские буквы даже после всех замен %s, стык %s' % (line_str, joint_str)) continue analogs = Line.objects.filter(name__startswith=line_str, titul=cur_titul) for item in analogs: if item.name.split('-')[0] == line_str: analogs = [item] break repair = None state = 1 state_str = row[12].value if state_str: if 'готов' in state_str: state = 3 elif 'ремонт' in state_str: repair = 1 #print(state_str) if not analogs: print('Линия не найдена %s в титуле %s, стык %s' % (line_str, cur_titul.name, joint_str)) continue elif len(analogs) > 1: print( 'Найдено больше 1 линии по "%s", это %s в титуле %s, стык %s' % (line_str, [item.name for item in analogs], cur_titul.name, joint_str)) pass else: line = analogs[0] #print('line %s' % line.name) #print(diameter, side_thickness, date, stigma, welding_conn_view, welding_type) joint = get_object(row, 2, Joint, {'line': line}) welding_joint_obj = { 'joint': joint, 'diameter': diameter, 'side_thickness': side_thickness, 'request_control_date': date, 'welding_conn_view': welding_conn_view, 'welding_type': welding_type, 'state': state, 'repair': repair, } #print(welding_joint_obj) # Ищем аналог analog = get_welding_joint_analog(joint, welding_joint_obj) if analog: continue welding_joint = WeldingJoint.objects.create(**welding_joint_obj) print(' --- добавлен в титул %s линию %s стык %s' % (cur_titul.name, line.name, joint.name)) if not stigma: continue welder = Welder.objects.filter(stigma__icontains=stigma).first() if not welder: ###print('welder not found %s' % stigma) continue JointWelder.objects.create(welding_joint=welding_joint, welder=welder, position=1)
def analyze_daily_report_weldings(): """Заполнение базы уникальными значениями из эксельки""" company = Company.objects.create( name='ООО "Транспромстрой"', customer='ООО "ИНК"', location='г. Усть-Кут', contractor='ООО "Транспромстрой"', fitter='ООО "Транспромстрой"', code='ТПС', ) subject = Subject.objects.create( name='Усть-Кутская газофракционирующая установка', code='ГФУ', company=company, ) wb = open_wb(daily_report_weldings) sheet = None for item in wb: if item.title in ('Отчет по стыкам ГФУ', ): sheet = item if not sheet: logger.info('[ERROR]: sheet not found') return rows = sheet.rows i, header = search_header(rows) if header is None: logger.info('[ERROR]: header not found') workshifts = [] control_types = [] conn_types_views = [] welding_types = [] categories = [] control_results = [] materials = [] join_types = [] for row in rows: # Продолжаем обход по генератору cell_values = [cell.value for cell in row] if not any(cell_values): logger.info('EOF reached') break # Титул это i+1 ячейка titul = get_object(row, i + 1, Titul, {'subject': subject}) if not titul: continue diameter = row[i + 7].value if row[i + 7].value else None if diameter: diameter = str(diameter).replace(',', '.') try: diameter = float(diameter) except ValueError: diameter = None logger.info('[ERROR]: diameter %s' % diameter) side_thickness = row[i + 8].value if row[i + 8].value else None if side_thickness: side_thickness = str(side_thickness).replace(',', '.') try: side_thickness = float(side_thickness) except ValueError: side_thickness = None logger.info('[ERROR]: side_thickness %s' % side_thickness) # Линия это i+2 ячейка line = get_object(row, i + 2, Line, {'titul': titul}) if not line: #logger.info('line is empty {}'.format(row)) continue # № стыка это i+3 ячейка joint = None joint_str = row[i + 3].value if line and joint_str: joint_str = '%s' % joint_str joint_str = joint_str.strip() if '*' in joint_str: continue joint = Joint.objects.filter(name=joint_str, line=line).first() if not joint: joint = Joint.objects.create(name=joint_str, line=line) # материал (сталь) это i+9 ячейка material_str = accumulate_data(row, i + 9, materials) # свариваемые элементы это i+10 ячейка #join_type = get_object(row, i+10, JoinType, {'line': line}) join_type = accumulate_data(row, i + 10, join_types) # смена это i+12 ячейка workshift_str = accumulate_data(row, i + 12, workshifts) # Сварщик welders = [] stigma = row[i + 14].value # клеймо сварщика это i+14 ячейка if stigma: stigma_arr = stigma.split('+') for stigma in stigma_arr: stigma = '%s' % stigma stigma = stigma.strip() welder = Welder.objects.filter(stigma=stigma).first() if welder: welders.append(welder) # контроль это i+17 ячейка control_type_str = accumulate_data(row, i + 17, control_types) # вид сварного соединения это i+18 ячейка conn_type_view_str = accumulate_data(row, i + 18, conn_types_views) # тип сварки это i+19 ячейка welding_type_str = accumulate_data(row, i + 19, welding_types) # категория это i+20 ячейка category_str = accumulate_data(row, i + 20, categories) # результат контроля это i+22 ячейка control_result_str = accumulate_data(row, i + 22, control_results) repair = 1 if row[i + 4].value else None if row[i + 5].value: repair = 2 welding_date = row[i + 11].value if row[i + 11].value else None if welding_date: welding_date = str_to_date(str(welding_date)) request_number = row[i + 15].value if row[i + 15].value else None request_control_date = row[i + 16].value if row[i + 16].value else None if request_control_date: request_control_date = str_to_date(str(request_control_date)) notice = row[i + 23].value if row[i + 23].value else None dinc = row[i + 24].value if row[i + 24].value else None if dinc: dinc = str(dinc).replace(',', '.') try: dinc = float(dinc) except ValueError: dinc = None logger.info('[ERROR]: dinc %s' % dinc) workshift = get_choice(workshift_str, WeldingJoint.workshift_choices) control_type = get_choice(control_type_str, WeldingJoint.control_choices) welding_conn_view = get_choice(conn_type_view_str, WeldingJoint.welding_conn_view_choices) welding_type = get_choice(welding_type_str, WELDING_TYPES) category = get_choice(category_str, WeldingJoint.category_choices) control_result = get_choice(control_result_str, CONCLUSION_STATES) material = get_choice(material_str, MATERIALS) join_type_from = None join_type_to = None if join_type: join_type_arr = join_type.split('/') if len(join_type_arr) == 2: for item in JOIN_TYPES: if item[1][:-1] in join_type_arr[0]: join_type_from = item[0] if item[1][:-1] in join_type_arr[1]: join_type_to = item[0] #print(join_type_from, join_type_to, join_type) state = 1 if repair: state = 4 welding_joint_obj = { 'joint': joint, 'repair': repair, 'material': material, 'welding_date': welding_date, 'workshift': workshift, 'request_number': request_number, 'request_control_date': request_control_date, 'control_type': control_type, 'welding_conn_view': welding_conn_view, 'welding_type': welding_type, 'category': category, 'control_result': control_result, 'notice': notice, 'join_type_from': join_type_from, 'join_type_to': join_type_to, 'diameter': diameter, 'side_thickness': side_thickness, 'state': state, } # Ищем аналог analog = get_welding_joint_analog(joint, welding_joint_obj) if analog: continue welding_joint = WeldingJoint.objects.create(**welding_joint_obj) for w, welder in enumerate(welders): JointWelder.objects.create( **{ 'welding_joint': welding_joint, 'welder': welder, 'position': w + 1, }) logger.info('Workshifts: %s' % workshifts) logger.info('ControlTypes: %s' % control_types) logger.info('ConnTypesViews: %s' % conn_types_views) logger.info('WeldingTypes: %s' % welding_types) logger.info('Categories: %s' % categories) logger.info('ControlResults: %s' % control_results) #logger.info('WeldingJoints: %s' % welding_joints) logger.info('JoinTypes: %s' % join_types)
def analyze_welders(): """Заполнение базы сварщиками из эксельки""" wb = open_wb(welders_xlsx) sheet = None for item in wb: if item.title in ('Актуальный список сварщиков', ): sheet = item if not sheet: logger.info('[ERROR]: sheet not found') return rows = sheet.rows i, header = search_header(rows) if header is None: logger.info('[ERROR]: header not found') holding_choices = [] spent_length_choices = [] prev_welder = None # для объединенных ячеек prev_holding_value = None # для объединенных ячеек prev_welding_type = None # для объединенных ячеек for row in rows: # Продолжаем обход по генератору cell_values = [cell.value for cell in row] if not any(cell_values): logger.info('EOF reached') break # Компания это i+23 ячейка company = None company_str = row[i + 23].value if company_str: company_str = str(company_str).strip() company = Company.objects.filter(name=company_str).first() if not company: company = Company.objects.create(name=company_str) # Примечание это i+24 ячейка notice = get_notice(row, i + 24) # Сварщик это i+3, клеймо i+4 ячейка welder = get_welder(row, i + 3, notice) if welder: prev_welder = welder else: welder = prev_welder # Гарантийные письма это i+1 ячейка letter_str = row[i + 1].value if letter_str: letter_str = str(letter_str).strip() letter = LetterOfGuarantee.objects.filter(name=letter_str).first() if not letter: letter = LetterOfGuarantee.objects.create(name=letter_str, welder=welder) # Акт ВИК номер это i+5, дата это i+6 ячейка vik = get_vik(row, i + 5, welder) # УЗК/РК номер это i+7, дата это i+8 ячейка controlk = get_controlk(row, i + 7, welder) # Проведение КСС типоразмер это i+9, марка стали это i+10 # ксс номер это i+11, ТТ/МК это i+13 ячейка holding_kss = get_holding_kss(row, i + 9, welder, holding_choices, spent_length_choices, holding_value=prev_holding_value, with_spent_len=False) if holding_kss: prev_holding_value = holding_kss.state # Мехиспытание номер это i+14, дата это i+15 ячейка mechtest = get_mechtest(row, i + 14, welder) # НАКС аттестат номер удостоверения это i+16, # способ сварки это i+17 ячейка, годен до это i+18 # НГДО/СК это i+19, место удостоверения это i+20, # полугодовая отметка это i+21 nax = get_nax(row, i + 16, welder, wrong_order=False) # Допускной лист номер это i+22 admission_sheet = get_admission_sheet(row, i + 22, welder, with_date=False)
def analyze_fired_welders(): """Заполнение базы уволенными сварщиками из эксельки""" wb = open_wb(welders_xlsx) sheet = None for item in wb: if item.title in ('Уволенные сварщики-перев.в монт', ): sheet = item if not sheet: logger.info('[ERROR]: sheet not found') return rows = sheet.rows i, header = search_header(rows) if header is None: logger.info('[ERROR]: header not found') prev_welder = None # для объединенных ячеек for row in rows: # Продолжаем обход по генератору cell_values = [cell.value for cell in row] if not any(cell_values): logger.info('EOF reached') break # Примечание это i+18 ячейка notice = get_notice(row, i + 18) # Сварщик это i+1, клеймо i+2 ячейка welder = get_welder(row, i + 1, notice, fired=True) if welder: prev_welder = welder else: welder = prev_welder # Акт ВИК номер это i+3, дата это i+6 ячейка vik = get_vik(row, i + 3, welder) # УЗК/РК номер это i+5, дата это i+6 ячейка controlk = get_controlk(row, i + 5, welder) # Проведение КСС типоразмер это i+7, марка стали это i+8 # ксс номер это i+10, # затрачиваемая длина 150мм*2 это i+9 ячейка holding_kss = get_holding_kss(row, i + 7, welder, holding_choices=None, spent_length_choices=None, holding_value=None, with_spent_len=True) # Мехиспытание номер это i+11, дата это i+12 ячейка mechtest = get_mechtest(row, i + 11, welder) # НАКС аттестат номер удостоверения это i+16, # способ сварки это i+17 ячейка, годен до это i+18 # НГДО/СК это i+19, место удостоверения это i+20, # полугодовая отметка это i+21 nax = get_nax(row, i + 15, welder, wrong_order=True) # Допускной лист номер это i+13 admission_sheet = get_admission_sheet(row, i + 13, welder, with_date=True)