| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430 |
- from django.shortcuts import render, redirect, get_object_or_404
- from django.core.paginator import Paginator
- from django.contrib import messages
- from core.models import Report, AllProductDimensionForInsProcess, CustomerTemplateMapping, \
- ProductDrawing, MksCodeMap
- from core.forms import ReportForm, CustomerTemplateMappingForm, ProductDrawingForm
- from core.utils import ConfigurableCRUDView, queryFromMaster, SHEET_NAMES
- from .filters import ReportFilter, CustomerTemplateFilter, ProductDrawingFilter, MksCodeMapFilter
- from .forms import ExportOptionsForm
- from pprint import pprint
- from legacy.models import Data, DataMs, DataRl, DataWb, LotSummary, LotSummaryRl, LotSummaryWb, PressCal, RotateData, TbFgPressinfoLotlist,\
- Manualsize
- from .gen_report import gen_xlsx
- from django.core.files.base import File
- from pathlib import Path
- from django.views.decorators.csrf import csrf_exempt
- from django.http import JsonResponse, HttpResponseBadRequest
- import json
- from django.contrib.auth.decorators import login_required
- from django.contrib.auth.models import User
- from legacy.models import Data
- from django.conf import settings
- from itertools import chain
- from django_filters.views import FilterView
- from django.db.models import Q, Func, Value, F
- from django.views.generic import (
- ListView,)
- def index(request):
- reports = Report.objects.all()
- report_filter = ReportFilter(request.GET, queryset=reports)
-
- # Paginate the filtered queryset
- paginator = Paginator(report_filter.qs, 10) # Show 10 reports per page
- page_number = request.GET.get('page')
- page_obj = paginator.get_page(page_number)
-
- context = {
- 'filter': report_filter,
- 'page_obj': page_obj,
- }
- return render(request, 'report/index.html', context)
- def report_create_view(request):
- if request.method == "POST":
- form = ReportForm(request.POST)
- if form.is_valid():
- form.save()
- messages.success(request, "Report created successfully!")
- return redirect("report:report_index") # Adjust with your report list view name
- else:
- form = ReportForm()
- return render(request, "report/create.html", {"form": form})
- class ReportCRUDView(ConfigurableCRUDView):
- model = Report
- list_template_name = 'legacy/datacrud_list.html'
- detail_template_name = 'legacy/datacrud_detail.html'
- form_template_name = 'report/report_form.html'
- confirm_delete_template_name = 'legacy/datacrud_confirm_delete.html'
- filterset_class = ReportFilter
- page_title = "Reports"
- # URL name mappings
- list_url_name = 'report:report-list'
- create_url_name = 'report:report-create'
- update_url_name = 'report:report-update'
- delete_url_name = 'report:report-delete'
- config_fields = ["name", "file", "created_by", "created_at"]
- config_field_orders = ["id", "name", "created_by"]
- # config_readonly_fields = ["lot_no"]
- # config_edit_fields = ["lot_no", "code"]
- ordering = ["-created_at", "-id",]
- def convert_sheet_data(sheet_data):
- """
- Convert sheet_data to the required form with prefixed keys.
-
- :param sheet_data: Dictionary with sheet names as keys and their data as values.
- :return: Dictionary in the required key-value format.
- """
- converted_data = {}
- for sheet_name, data in sheet_data.items():
- for key, value in data.items():
- # Prefix each key with the sheet name
- converted_key = f"{sheet_name}.{key}"
- converted_data[converted_key] = value
- return converted_data
- def hide_con(placeholders, mark_value, hide_rows):
- """
- Updates the 'placeholders' dictionary with a mark value and hide rows range.
- :param placeholders: The dictionary to update.
- :param mark_value: The key to check or update in the placeholders.
- :param hide_rows: The row range to append in the format '[start:end]'.
- """
- if mark_value in placeholders:
- placeholders[mark_value] = f"{placeholders[mark_value]}[{hide_rows}]"
- else:
- placeholders[mark_value] = f"0[{hide_rows}]"
- def clear_values(n, m):
- placeholders = {}
- for i in range(1, n + 1):
- for j in range(1, m + 1):
- placeholders[f'v{i}_{j}'] = " "
- return placeholders
- def generate_hardness_out_values(lot_no, code):
- """
- Generate a dictionary of placeholder values for a given lot_no.
- :param lot_no: The lot number to query data for.
- :return: A dictionary with placeholders (e.g., v1_1, v1_2, ...) as keys and their respective values.
- """
- # Query the Data model for records matching the given lot_no
- # records = Data.objects.filter(lot_no=lot_no).order_by('row_no')
- data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no'))
- data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no'))
- records = list(chain(data_h1, data_h2))
-
- # print(f"records {lot_no} = {records.values()}")
- # Initialize an empty dictionary to store placeholder values
- placeholders = clear_values(2,5)
- # Iterate over the records to populate placeholder values
- inspect_date = None
- for record_idx, record in enumerate(records, start=1):
- if record_idx == 1:
- inspect_date = record.created_at
- placeholders[f'v{record_idx}_1'] = record.p1 # Checkpoint 1 value
- placeholders[f'v{record_idx}_2'] = record.p2 # Checkpoint 2 value
- placeholders[f'v{record_idx}_3'] = record.p3 # Checkpoint 3 value
- placeholders[f'v{record_idx}_4'] = record.avg # Average value
- placeholders[f'v{record_idx}_5'] = record.rgrade # Judgment value
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- def generate_hardness_out_in_values(lot_no, code):
- # Fetch records from the Data model
- # records = Data.objects.filter(lot_no=lot_no).order_by('row_no')
- data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no'))
- data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no'))
- records = list(chain(data_h1, data_h2))
- out_data = []
- in_data = []
- # Separate OUT and IN data
- for record in records:
- if record.r_type.upper() in ["OUT", "TOP", "FA1", "UPP", "UPPE", "RIM"]:
- out_data.append(record)
- elif record.r_type.upper() in ["IN", "UNDER", "UND", "FA2", "LOW", "LOWE", "BASE", "SOKO", "IN*"]:
- in_data.append(record)
- # Prepare placeholders
- # placeholders = {}
- placeholders = clear_values(4,5)
- inspect_date = None
- for idx, record in enumerate(out_data, start=1):
- if idx == 1:
- inspect_date = record.created_at
- placeholders[f'v{idx}_1'] = record.p1
- placeholders[f'v{idx}_2'] = record.p2
- placeholders[f'v{idx}_3'] = record.p3
- placeholders[f'v{idx}_4'] = record.avg
- placeholders[f'v{idx}_5'] = record.rgrade
- for idx, record in enumerate(in_data, start=1):
- placeholders[f'v{len(out_data) + idx}_1'] = record.p1
- placeholders[f'v{len(out_data) + idx}_2'] = record.p2
- placeholders[f'v{len(out_data) + idx}_3'] = record.p3
- placeholders[f'v{len(out_data) + idx}_4'] = record.avg
- placeholders[f'v{len(out_data) + idx}_5'] = record.rgrade
- # if "v3_1" in placeholders:
- # placeholders["v3_1"] = f"{placeholders['v3_1']}[25:28]"
- # else:
- # placeholders[f"v3_1"] = "0[25:28]"
- hide_con(placeholders, "v3_1", "26:29")
-
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- def generate_hardness_both_size_values(lot_no, ms,code):
- # Fetch records from the Data model
- # records = Data.objects.filter(lot_no=lot_no).order_by('row_no')
- data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no', 'sub_order'))
- data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no', 'sub_order'))
- records = list(chain(data_h1, data_h2))
- out_data = []
- in_data = []
- placeholders = clear_values(20,5)
- # Separate OUT and IN data
- inspect_date = None
- for idx, record in enumerate(records, start=0):
- if idx == 1:
- inspect_date = record.created_at
- if record.sub_order == 1:
- for i,v in enumerate(["p1", "p2", "p3", "avg", "rgrade"],start=1):
- placeholders[f"v{idx*2+1}_{i}"] = getattr(record,v)
- if record.sub_order == 2:
- for i,v in enumerate(["p1", "p2", "p3", "avg", "rgrade"],start=1):
- placeholders[f"v{idx*2+2}_{i}"] = getattr(record,v)
- # Prepare placeholders
- # placeholders = {}
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- # # Example usage:
- # placeholders_dict = clear_values(6, 3)
- # print(placeholders_dict)
- def generate_dimension_values(lot_no, code):
- """
- Fetch dimension records from manualSize and DataMs models
- and generate placeholder values for Standard, Actual, and Judgement.
- Supports two row_no entries per lot.
- """
- # Fetch standard values from manualSize (limit to 2 rows)
- manual_size_records = Manualsize.objects.filter(lotno=lot_no)
- dimens = AllProductDimensionForInsProcess.objects.filter(ProductCode=code)
- # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
- data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
- # Prepare placeholders
- # placeholders = {}
- placeholders = clear_values(7,4)
- # for i in range(1,7):
- # for j in range(1,4):
- # placeholders[f'v{i}_{j}'] = 0
-
- pprint(placeholders)
- pprint(manual_size_records)
- for m in dimens:
- if m.Size_Name == "D":
- placeholders['v1_1'] = placeholders['v4_1'] = f'D{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "T":
- placeholders['v2_1'] = placeholders['v5_1'] = f'T{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "H":
- placeholders['v3_1'] = placeholders['v6_1'] = f'H{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- # Ensure that we map each manualSize entry to a corresponding DataMs entry
- inspect_date = None
- for r in data_ms_records:
- if r.row_no == 1:
- placeholders[f'v1_2'] = r.dsize
- placeholders[f'v1_3'] = r.dsizeok
-
- placeholders[f'v2_2'] = r.tsize
- placeholders[f'v2_3'] = r.tsizeok
-
- placeholders[f'v3_2'] = r.hsize
- placeholders[f'v3_3'] = r.hsizeok
- inspect_date = r.created_at
-
- if r.row_no == 2:
- placeholders[f'v4_2'] = r.dsize
- placeholders[f'v4_3'] = r.dsizeok
-
- placeholders[f'v5_2'] = r.tsize
- placeholders[f'v5_3'] = r.tsizeok
-
- placeholders[f'v6_2'] = r.hsize
- placeholders[f'v6_3'] = r.hsizeok
- hide_con(placeholders, "v4_2", "25:29")
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- def generate_dimension_weight_warp_values(lot_no, code):
- """
- Fetch dimension records from manualSize and DataMs models
- and generate placeholder values for Standard, Actual, and Judgement.
- Supports two row_no entries per lot.
- """
- # Fetch standard values from manualSize (limit to 2 rows)
- manual_size_records = Manualsize.objects.filter(lotno=lot_no)
- dimens = AllProductDimensionForInsProcess.objects.filter(ProductCode=code)
- # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
- data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
- data_wb = DataWb.objects.filter(lot_no=lot_no).order_by('row_no')
- # Prepare placeholders
- # placeholders = {}
- placeholders = clear_values(7,4)
- # for i in range(1,7):
- # for j in range(1,4):
- # placeholders[f'v{i}_{j}'] = 0
-
- pprint(placeholders)
- pprint(manual_size_records)
- for m in dimens:
- if m.Size_Name == "D":
- placeholders['v1_1'] = placeholders['v4_1'] = f'D{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "T":
- placeholders['v2_1'] = placeholders['v5_1'] = f'T{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "H":
- placeholders['v3_1'] = placeholders['v6_1'] = f'H{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- # Ensure that we map each manualSize entry to a corresponding DataMs entry
- inspect_date = None
- for r in data_ms_records:
- if r.row_no == 1:
- placeholders[f'v1_2'] = r.dsize
- placeholders[f'v1_3'] = r.dsizeok
-
- placeholders[f'v2_2'] = r.tsize
- placeholders[f'v2_3'] = r.tsizeok
-
- placeholders[f'v3_2'] = r.hsize
- placeholders[f'v3_3'] = r.hsizeok
- inspect_date = r.created_at
-
- if r.row_no == 2:
- placeholders[f'v4_2'] = r.dsize
- placeholders[f'v4_3'] = r.dsizeok
-
- placeholders[f'v5_2'] = r.tsize
- placeholders[f'v5_3'] = r.tsizeok
-
- placeholders[f'v6_2'] = r.hsize
- placeholders[f'v6_3'] = r.hsizeok
- for r in data_wb:
- if r.row_no == 1:
- placeholders["v7_1"] = r.weight
- placeholders["v7_2"] = r.judgement
- if r.row_no == 2:
- placeholders["v8_1"] = r.weight
- placeholders["v8_2"] = r.judgement
-
- hide_con(placeholders, "v4_2", "29:37")
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- def is_ok(instance):
- fields_and_values = {}
- for field in instance._meta.get_fields():
- field_name = field.name
- if field_name.endswith('ok'):
- v = getattr(instance, field_name)
- if v is not None and v != "OK":
- return False
- return True
- def generate_dimension_app_values(lot_no, code):
- """
- Fetch dimension records from manualSize and DataMs models
- and generate placeholder values for Standard, Actual, and Judgement.
- Supports two row_no entries per lot.
- """
- # Fetch standard values from manualSize (limit to 2 rows)
- manual_size_records = Manualsize.objects.filter(lotno=lot_no)
- dimens = AllProductDimensionForInsProcess.objects.filter(ProductCode=code)
- # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
- data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
- # Prepare placeholders
- # placeholders = {}
- placeholders = clear_values(8,3)
- # for i in range(1,7):
- # for j in range(1,4):
- # placeholders[f'v{i}_{j}'] = 0
-
- pprint(placeholders)
- pprint(manual_size_records)
- # for m in manual_size_records:
- # if m.size_name == "D":
- # placeholders['v1_1'] = placeholders['v5_1'] = f'{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- # if m.size_name == "T":
- # placeholders['v2_1'] = placeholders['v6_1'] = f'{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- # if m.size_name == "H":
- # placeholders['v3_1'] = placeholders['v7_1'] = f'{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- for m in dimens: # Changed from manual_size_records to dimens
- if m.Size_Name == "D":
- placeholders['v1_1'] = placeholders['v5_1'] = f'D{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "T":
- placeholders['v2_1'] = placeholders['v6_1'] = f'T{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "H":
- placeholders['v3_1'] = placeholders['v7_1'] = f'H{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- # Ensure that we map each manualSize entry to a corresponding DataMs entry
- inspect_date = None
- for r in data_ms_records:
- if r.row_no == 1:
- placeholders[f'v1_2'] = r.dsize
- placeholders[f'v1_3'] = r.dsizeok
-
- placeholders[f'v2_2'] = r.tsize
- placeholders[f'v2_3'] = r.tsizeok
-
- placeholders[f'v3_2'] = r.hsize
- placeholders[f'v3_3'] = r.hsizeok
- inspect_date = r.created_at
- # if is_ok(r):
- # placeholders[f'v4_1'] = 'OK'
- # placeholders[f'v4_2'] = 'OK'
- # else:
- # placeholders[f'v4_1'] = 'NG'
- # placeholders[f'v4_2'] = 'OK'
-
- if r.row_no == 2:
- placeholders[f'v5_2'] = r.dsize
- placeholders[f'v5_3'] = r.dsizeok
-
- placeholders[f'v6_2'] = r.tsize
- placeholders[f'v6_3'] = r.tsizeok
-
- placeholders[f'v7_2'] = r.hsize
- placeholders[f'v7_3'] = r.hsizeok
- # if is_ok(r):
- # placeholders[f'v8_1'] = 'OK'
- # placeholders[f'v8_2'] = 'OK'
- # else:
- # placeholders[f'v8_1'] = 'NG'
- # placeholders[f'v8_2'] = 'NG'
- hide_con(placeholders, "v5_1", "29:37")
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- def safe_strip(val):
- """Remove '-' or return '' if None."""
- return val.replace('-', '') if val else ''
- def generate_dimension_app_drawing_values(lot_no, code):
- """
- Fetch dimension records from manualSize and DataMs models
- and generate placeholder values for Standard, Actual, and Judgement.
- Supports two row_no entries per lot.
- """
- # Fetch standard values from manualSize (limit to 2 rows)
- manual_size_records = Manualsize.objects.filter(lotno=lot_no)
- dimens = AllProductDimensionForInsProcess.objects.filter(ProductCode=code)
- # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
- data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
- # Prepare placeholders
- # placeholders = {}
- placeholders = clear_values(8,3)
- # for i in range(1,7):
- # for j in range(1,4):
- # placeholders[f'v{i}_{j}'] = 0
-
- pprint(placeholders)
- pprint(manual_size_records)
- # for m in manual_size_records:
- # if m.size_name == "D":
- # placeholders['v1_1'] = placeholders['v5_1'] = f'{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- # if m.size_name == "T":
- # placeholders['v2_1'] = placeholders['v6_1'] = f'{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- # if m.size_name == "H":
- # placeholders['v3_1'] = placeholders['v7_1'] = f'{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- for m in dimens: # Changed from manual_size_records to dimens
- if m.Size_Name == "D":
- placeholders['v1_1'] = placeholders['v5_1'] = f'D{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "T":
- placeholders['v2_1'] = placeholders['v6_1'] = f'T{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "H":
- placeholders['v3_1'] = placeholders['v7_1'] = f'H{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- # Ensure that we map each manualSize entry to a corresponding DataMs entry
- inspect_date = None
- for r in data_ms_records:
- if r.row_no == 1:
- placeholders[f'v1_2'] = r.dsize
- placeholders[f'v1_3'] = r.dsizeok
-
- placeholders[f'v2_2'] = r.tsize
- placeholders[f'v2_3'] = r.tsizeok
-
- placeholders[f'v3_2'] = r.hsize
- placeholders[f'v3_3'] = r.hsizeok
- inspect_date = r.created_at
- # if is_ok(r):
- # placeholders[f'v4_1'] = 'OK'
- # placeholders[f'v4_2'] = 'OK'
- # else:
- # placeholders[f'v4_1'] = 'NG'
- # placeholders[f'v4_2'] = 'OK'
-
- if r.row_no == 2:
- placeholders[f'v5_2'] = r.dsize
- placeholders[f'v5_3'] = r.dsizeok
-
- placeholders[f'v6_2'] = r.tsize
- placeholders[f'v6_3'] = r.tsizeok
-
- placeholders[f'v7_2'] = r.hsize
- placeholders[f'v7_3'] = r.hsizeok
- # if is_ok(r):
- # placeholders[f'v8_1'] = 'OK'
- # placeholders[f'v8_2'] = 'OK'
- # else:
- # placeholders[f'v8_1'] = 'NG'
- # placeholders[f'v8_2'] = 'NG'
- hide_con(placeholders, "v5_1", "27:33")
-
- norm_lot_no = safe_strip(lot_no)
- norm_code = safe_strip(code)
-
- drawing_qs = ProductDrawing.objects.annotate(
- norm_lot_no=Func(F('lot_no'), Value('-'), Value(''), function='replace'),
- norm_code_no=Func(F('code_no'), Value('-'), Value(''), function='replace')
- )
- query = Q()
- if norm_lot_no:
- query |= Q(norm_lot_no=norm_lot_no)
- if norm_code:
- query |= Q(norm_code_no=norm_code)
- drawing_data = drawing_qs.filter(query).first()
-
- pprint(f"1.1 = {drawing_data}")
- pprint(f"1.2 = {lot_no} {code}")
- if drawing_data:
- placeholders["drawing"] = drawing_data.drawing if drawing_data.drawing else "-"
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- def generate_dimension_bal_weight_values(lot_no, ms, code):
- """
- Fetch dimension records from manualSize and DataMs models
- and generate placeholder values for Standard, Actual, and Judgement.
- Supports two row_no entries per lot.
- """
- # Fetch standard values from manualSize (limit to 2 rows)
- manual_size_records = Manualsize.objects.filter(lotno=lot_no)
- # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
- data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
- data_wb = DataWb.objects.filter(lot_no=lot_no).order_by('row_no')
-
- data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no'))
- data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no'))
- data_ho = list(chain(data_h1, data_h2))
- # Prepare placeholders
- # placeholders = {}
- placeholders = clear_values(10,3)
- # for i in range(1,7):
- # for j in range(1,4):
- # placeholders[f'v{i}_{j}'] = 0
-
- pprint(placeholders)
- pprint(manual_size_records)
-
- if ms:
- try:
- w = ms.PRO6
- placeholders['v4_1'] = placeholders['v9_1'] = w
- except:
- print("no PRO6")
- dimens = AllProductDimensionForInsProcess.objects.filter(ProductCode=code)
- for m in dimens: # Changed from manual_size_records to dimens
- if m.Size_Name == "D":
- placeholders['v1_1'] = placeholders['v6_1'] = f'D{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "T":
- placeholders['v2_1'] = placeholders['v7_1'] = f'T{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "H":
- placeholders['v3_1'] = placeholders['v8_1'] = f'H{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- inspect_date = None
- # Ensure that we map each manualSize entry to a corresponding DataMs entry
- for r in data_ms_records:
- if r.row_no == 1:
- placeholders[f'v1_2'] = r.dsize
- placeholders[f'v1_3'] = r.dsizeok
-
- placeholders[f'v2_2'] = r.tsize
- placeholders[f'v2_3'] = r.tsizeok
-
- placeholders[f'v3_2'] = r.hsize
- placeholders[f'v3_3'] = r.hsizeok
- inspect_date = r.created_at
- # if is_ok(r):
- # placeholders[f'v4_1'] = 'OK'
- # placeholders[f'v4_2'] = 'OK'
- # else:
- # placeholders[f'v4_1'] = 'NG'
- # placeholders[f'v4_2'] = 'OK'
-
- if r.row_no == 2:
- placeholders[f'v6_2'] = r.dsize
- placeholders[f'v6_3'] = r.dsizeok
-
- placeholders[f'v7_2'] = r.tsize
- placeholders[f'v7_3'] = r.tsizeok
-
- placeholders[f'v8_2'] = r.hsize
- placeholders[f'v8_3'] = r.hsizeok
- # if is_ok(r):
- # placeholders[f'v8_1'] = 'OK'
- # placeholders[f'v8_2'] = 'OK'
- # else:
- # placeholders[f'v8_1'] = 'NG'
- # placeholders[f'v8_2'] = 'NG'
- for r in data_wb:
- if r.row_no == 1:
- placeholders["v4_2"] = r.result
- placeholders["v4_3"] = r.judgement
- placeholders["v5_2"] = r.weight
- placeholders["v5_3"] = r.judgement
- if r.row_no == 2:
- placeholders["v9_2"] = r.result
- placeholders["v9_3"] = r.judgement
- placeholders["v10_2"] = r.weight
- placeholders["v10_3"] = r.judgement
- # hide_con(placeholders, "v5_1", "26:32")
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- def generate_dim_bal_app_hard_values(lot_no, first_result, code):
- """
- Fetch dimension records from manualSize and DataMs models
- and generate placeholder values for Standard, Actual, and Judgement.
- Supports two row_no entries per lot.
- """
- # Fetch standard values from manualSize (limit to 2 rows)
- manual_size_records = Manualsize.objects.filter(lotno=lot_no)
- # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
- data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
- data_wb = DataWb.objects.filter(lot_no=lot_no).order_by('row_no')
-
- data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no'))
- data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no'))
- data_ho = list(chain(data_h1, data_h2))
- if first_result:
- # out_limit = f"Out 外 ({first_result.MI18} - {first_result.MI19})"
- # in_limit = f"In 内 ({first_result.MI22} - {first_result.MI23})"
- try:
- out_limit = f"Out 外 ({float(first_result.MI18):.2f} - {float(first_result.MI19):.2f})"
- except (TypeError, ValueError):
- out_limit = "Out 外"
- try:
- in_limit = f"In 内 ({float(first_result.MI22):.2f} - {float(first_result.MI23):.2f})"
- except (TypeError, ValueError):
- in_limit = "In 内"
- mid_limit = f"Middle 中 -"
- else:
- out_limit = f"Out 外"
- in_limit = f"In 内"
- mid_limit = f"Middle 中"
-
-
- # Prepare placeholders
- # placeholders = {}
- placeholders = clear_values(16,5)
- # for i in range(1,7):
- # for j in range(1,4):
- # placeholders[f'v{i}_{j}'] = 0
- placeholders['v6_0'] = placeholders['v14_0'] = out_limit
- placeholders['v7_0'] = placeholders['v15_0'] = mid_limit
- placeholders['v8_0'] = placeholders['v16_0'] = in_limit
- pprint(placeholders)
- pprint(manual_size_records)
- if first_result:
- try:
- w = first_result.PRO6
- placeholders['v4_1'] = placeholders['v12_1'] = w
- except:
- print("No PRO6")
- dimens = AllProductDimensionForInsProcess.objects.filter(ProductCode=code)
- for m in dimens: # Changed from manual_size_records to dimens
- if m.Size_Name == "D":
- placeholders['v1_1'] = placeholders['v9_1'] = f'D{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "T":
- placeholders['v2_1'] = placeholders['v10_1'] = f'T{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "H":
- placeholders['v3_1'] = placeholders['v11_1'] = f'H{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- inspect_date = None
- # Ensure that we map each manualSize entry to a corresponding DataMs entry
- for r in data_ms_records:
- if r.row_no == 1:
- placeholders[f'v1_2'] = r.dsize
- placeholders[f'v1_3'] = r.dsizeok
-
- placeholders[f'v2_2'] = r.tsize
- placeholders[f'v2_3'] = r.tsizeok
-
- placeholders[f'v3_2'] = r.hsize
- placeholders[f'v3_3'] = r.hsizeok
- inspect_date = r.created_at
- # if is_ok(r):
- # placeholders[f'v4_1'] = 'OK'
- # placeholders[f'v4_2'] = 'OK'
- # else:
- # placeholders[f'v4_1'] = 'NG'
- # placeholders[f'v4_2'] = 'OK'
-
- if r.row_no == 2:
- placeholders[f'v9_2'] = r.dsize
- placeholders[f'v9_3'] = r.dsizeok
-
- placeholders[f'v10_2'] = r.tsize
- placeholders[f'v10_3'] = r.tsizeok
-
- placeholders[f'v11_2'] = r.hsize
- placeholders[f'v11_3'] = r.hsizeok
- # if is_ok(r):
- # placeholders[f'v8_1'] = 'OK'
- # placeholders[f'v8_2'] = 'OK'
- # else:
- # placeholders[f'v8_1'] = 'NG'
- # placeholders[f'v8_2'] = 'NG'
- for r in data_wb:
- if r.row_no == 1:
- placeholders["v4_2"] = r.weight
- placeholders["v4_3"] = r.judgement
- if r.row_no == 2:
- placeholders["v12_2"] = r.weight
- placeholders["v12_3"] = r.judgement
- for r in data_ho:
- if r.row_no == 1:
- rmap = {'OUT': 6, 'MID': 7, 'IN': 8}
- for index, v in enumerate(["p1", "p2", "p3", "avg", "rgrade"], start=1):
- idx = rmap.get(r.r_type, None)
- if idx:
- placeholders[f'v{idx}_{index}'] = getattr(r, v, "-")
- if r.row_no == 2:
- rmap = {'OUT': 14, 'MID': 15, 'IN': 16}
- for index, v in enumerate(["p1", "p2", "p3", "avg", "rgrade"], start=1):
- idx = rmap.get(r.r_type, None)
- if idx:
- placeholders[f'v{idx}_{index}'] = getattr(r, v, "-")
- # hide_con(placeholders, "v5_1", "26:32")
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- def generate_dim_bal_app_rot_hard_values(lot_no, first_result, code):
- """
- Fetch dimension records from manualSize and DataMs models
- and generate placeholder values for Standard, Actual, and Judgement.
- Supports two row_no entries per lot.
- """
- # Fetch standard values from manualSize (limit to 2 rows)
- manual_size_records = Manualsize.objects.filter(lotno=lot_no)
- # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
- data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
- data_wb = DataWb.objects.filter(lot_no=lot_no).order_by('row_no')
-
- data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no'))
- data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no'))
- data_ho = list(chain(data_h1, data_h2))
- rotates = RotateData.objects.filter(lot_no=lot_no).order_by('row_no')
- if first_result:
- # out_limit = f"Out 外 ({first_result.MI18} - {first_result.MI19})"
- # in_limit = f"In 内 ({first_result.MI22} - {first_result.MI23})"
- try:
- out_limit = f"Out 外 ({float(first_result.MI18):.2f} - {float(first_result.MI19):.2f})"
- except (TypeError, ValueError):
- out_limit = "Out 外"
- try:
- in_limit = f"In 内 ({float(first_result.MI22):.2f} - {float(first_result.MI23):.2f})"
- except (TypeError, ValueError):
- in_limit = "In 内"
- mid_limit = f"Middle 中 -"
- else:
- out_limit = f"Out 外"
- in_limit = f"In 内"
- mid_limit = f"Middle 中"
-
-
- # Prepare placeholders
- # placeholders = {}
- placeholders = clear_values(18,5)
- # for i in range(1,7):
- # for j in range(1,4):
- # placeholders[f'v{i}_{j}'] = 0
- placeholders['v6_0'] = placeholders['v14_0'] = out_limit
- placeholders['v7_0'] = placeholders['v15_0'] = mid_limit
- placeholders['v18_0'] = placeholders['v16_0'] = in_limit
- pprint(placeholders)
- pprint(manual_size_records)
- if first_result:
- try:
- w = first_result.PRO6
- placeholders['v4_1'] = placeholders['v13_1'] = w
- except:
- print("no PRO6")
- dimens = AllProductDimensionForInsProcess.objects.filter(ProductCode=code)
- for m in dimens: # Changed from manual_size_records to dimens
- if m.Size_Name == "D":
- placeholders['v1_1'] = placeholders['v10_1'] = f'D{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "T":
- placeholders['v2_1'] = placeholders['v11_1'] = f'T{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- if m.Size_Name == "H":
- placeholders['v3_1'] = placeholders['v12_1'] = f'H{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- # Ensure that we map each manualSize entry to a corresponding DataMs entry
- inspect_date = None
- for r in data_ms_records:
- if r.row_no == 1:
- placeholders[f'v1_2'] = r.dsize
- placeholders[f'v1_3'] = r.dsizeok
-
- placeholders[f'v2_2'] = r.tsize
- placeholders[f'v2_3'] = r.tsizeok
-
- placeholders[f'v3_2'] = r.hsize
- placeholders[f'v3_3'] = r.hsizeok
- inspect_date = r.created_at
- # if is_ok(r):
- # placeholders[f'v4_1'] = 'OK'
- # placeholders[f'v4_2'] = 'OK'
- # else:
- # placeholders[f'v4_1'] = 'NG'
- # placeholders[f'v4_2'] = 'OK'
-
- if r.row_no == 2:
- placeholders[f'v10_2'] = r.dsize
- placeholders[f'v10_3'] = r.dsizeok
-
- placeholders[f'v11_2'] = r.tsize
- placeholders[f'v11_3'] = r.tsizeok
-
- placeholders[f'v12_2'] = r.hsize
- placeholders[f'v12_3'] = r.hsizeok
- # if is_ok(r):
- # placeholders[f'v8_1'] = 'OK'
- # placeholders[f'v8_2'] = 'OK'
- # else:
- # placeholders[f'v8_1'] = 'NG'
- # placeholders[f'v8_2'] = 'NG'
- for r in data_wb:
- if r.row_no == 1:
- placeholders["v4_2"] = r.weight
- placeholders["v4_3"] = r.judgement
- if r.row_no == 2:
- placeholders["v13_2"] = r.weight
- placeholders["v13_3"] = r.judgement
- for r in data_ho:
- if r.row_no == 1:
- rmap = {'OUT': 7, 'MID': 8, 'IN': 9}
- for index, v in enumerate(["p1", "p2", "p3", "avg", "rgrade"], start=1):
- idx = rmap.get(r.r_type, None)
- if idx:
- placeholders[f'v{idx}_{index}'] = getattr(r, v)
- if r.row_no == 2:
- rmap = {'OUT': 16, 'MID': 17, 'IN': 18}
- for index, v in enumerate(["p1", "p2", "p3", "avg", "rgrade"], start=1):
- idx = rmap.get(r.r_type, None)
- if idx:
- placeholders[f'v{idx}_{index}'] = getattr(r, v)
- for r in rotates:
- if r.row_no == 1:
- placeholders["v6_1"] = r.speed_spec
- placeholders["v6_2"] = r.speed_test
- placeholders["v6_3"] = r.speedok
- if r.row_no == 2:
- placeholders["v15_1"] = r.speed_spec
- placeholders["v15_2"] = r.speed_test
- placeholders["v15_3"] = r.speedok
- # hide_con(placeholders, "v5_1", "26:32")
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- def generate_centering_values(lot_no, code):
- """
- Fetch dimension records from manualSize and DataMs models
- and generate placeholder values for Standard, Actual, and Judgement.
- Supports two row_no entries per lot.
- """
- # Fetch standard values from manualSize (limit to 2 rows)
- manual_size_records = Manualsize.objects.filter(lotno=lot_no)
- # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
- data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
- # Prepare placeholders
- # placeholders = {}
- placeholders = clear_values(10,3)
- # for i in range(1,7):
- # for j in range(1,4):
- # placeholders[f'v{i}_{j}'] = 0
-
- pprint(placeholders)
- pprint(manual_size_records)
- # Ensure that we map each manualSize entry to a corresponding DataMs entry
- inspect_date = None
- for i,r in enumerate(data_ms_records, start=1):
- if i == 1:
- inspect_date = r.created_at
- placeholders[f'v{i}_2'] = r.censize
- placeholders[f'v{i}_3'] = r.censizeok
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- def generate_t8_values(lot_no, code):
- """
- Fetch dimension records from manualSize and DataMs models
- and generate placeholder values for Standard, Actual, and Judgement.
- Supports two row_no entries per lot.
- """
- # Fetch standard values from manualSize (limit to 2 rows)
- placeholders = clear_values(8,10)
-
- manual_size_records = Manualsize.objects.filter(lotno=lot_no)
- # pprint(f"manual_size = {manual_size_records}")
- dimens = AllProductDimensionForInsProcess.objects.filter(ProductCode=code)
- for m in dimens: # Changed from manual_size_records to dimens
- if m.Size_Name == "Thickness":
- for i in range(1, 9):
- placeholders[f'v{i}_1'] = f'{m.Std:.2f} +{m.TolUp:.2f} {m.TolUn:.2f}'
- # pprint("set std")
- # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
- data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
- # Prepare placeholders
- # placeholders = {}
- # for i in range(1,7):
- # for j in range(1,4):
- # placeholders[f'v{i}_{j}'] = 0
-
- # Ensure that we map each manualSize entry to a corresponding DataMs entry
- inspect_date = None
- for i,r in enumerate(data_ms_records, start=1):
- if i == 1:
- inspect_date = r.created_at
- placeholders[f'v{i}_2'] = r.tpoint1
- placeholders[f'v{i}_3'] = r.tpoint2
- placeholders[f'v{i}_4'] = r.tpoint3
- placeholders[f'v{i}_5'] = r.tpoint4
- placeholders[f'v{i}_10'] = r.tdiff
- placeholders['inspect_date'] = inspect_date.strftime('%Y/%m/%d') if inspect_date else "-"
- return placeholders
- def merge_sheet_data_with_data(sheet_data, data):
- """
- Merge `sheet_data` with `data`.
- :param sheet_data: Dictionary containing the sheet-specific data.
- :param data: Dictionary containing general data.
- :return: A merged dictionary combining both `sheet_data` and `data`.
- """
- # Merge dictionaries using unpacking
- merged_data = {**data, **sheet_data}
- return merged_data
- def create_coi_file(lot_no, sheets, user, md):
- pprint("---- create_coi_file ---")
- pprint(md)
- qa1 = User.objects.get(pk=md['qa1'])
- qa2 = User.objects.get(pk=md['qa2'])
- accept = specialAccept = False
- if md['acceptStatus'] == "accepted":
- accept = True
- if md['acceptStatus'] == "special_accepted":
- specialAccept = True
- pprint(qa1)
- pprint(qa2)
-
- results = queryFromMaster(lot_no)
- first_result = results[0] if results else None
- code = first_result.PRO1 if first_result else None
- sheet_data = {}
- for sheet_name in sheets:
- if sheet_name == 'hardness_out':
- sheet_data[sheet_name] = generate_hardness_out_values(lot_no, code)
- elif sheet_name == 'hardness_out_in':
- sheet_data[sheet_name] = generate_hardness_out_in_values(lot_no, code)
- elif sheet_name == 'hardness_both_size':
- sheet_data[sheet_name] = generate_hardness_both_size_values(lot_no, first_result, code)
- elif sheet_name == 'dimension':
- sheet_data[sheet_name] = generate_dimension_values(lot_no, code)
- elif sheet_name == 'dimension_weight_warp':
- sheet_data[sheet_name] = generate_dimension_weight_warp_values(lot_no, code)
- elif sheet_name == 'dimension_app':
- sheet_data[sheet_name] = generate_dimension_app_values(lot_no, code)
- elif sheet_name == 'dimension_app_drawing':
- sheet_data[sheet_name] = generate_dimension_app_drawing_values(lot_no, code)
- elif sheet_name == 'dimension_bal_weight':
- sheet_data[sheet_name] = generate_dimension_bal_weight_values(lot_no, first_result, code)
- elif sheet_name == 'centering':
- sheet_data[sheet_name] = generate_centering_values(lot_no, code)
- elif sheet_name == 'thickness_8_point':
- sheet_data[sheet_name] = generate_t8_values(lot_no, code)
- elif sheet_name == 'dim_bal_app_hard':
- sheet_data[sheet_name] = generate_dim_bal_app_hard_values(lot_no, first_result, code)
- elif sheet_name == 'dim_bal_app_hard_stamp':
- sheet_data[sheet_name] = generate_dim_bal_app_hard_values(lot_no, first_result, code)
- elif sheet_name == 'dim_bal_app_rot_hard':
- sheet_data[sheet_name] = generate_dim_bal_app_rot_hard_values(lot_no, first_result, code)
-
- converted_data = convert_sheet_data(sheet_data)
- print(f"sheet_data \n {sheet_data}")
- print(f"converted_data \n {converted_data}")
- # results = queryFromMaster(lot_no)
- # first_result = results[0] if results else None
- try:
- pcs = int(first_result.PRO5) - int(first_result.PRO27)
- except:
- pcs = 0
-
- # first_result.PRO10 = 12321.1232
- # first_result.PRO11 = 1.5
- # first_result.PRO12 = 3.5
- if first_result:
- # size_str = f"{first_result.PRO10}x{first_result.PRO11}x{first_result.PRO12}";
- try:
- size_str = f"{float(first_result.PRO10):.2f}x{float(first_result.PRO11):.2f}x{float(first_result.PRO12):.2f}"
- except (ValueError, TypeError):
- size_str = "-"
-
- spec = f"{first_result.PRO13} {first_result.PRO14} {first_result.PRO15} {first_result.PRO16} {first_result.PRO17} {first_result.PRO18}"
- else:
- size_str = ""
- spec = ""
- mgt_code = first_result.PRO1 if first_result else "-"
- mks_map = MksCodeMap.objects.filter(mgt_code=mgt_code).first()
- if mks_map:
- code = f"{mks_map.mks_code}(MKSコード) {mgt_code}(参照)"
- else:
- code = f"{mgt_code}(参照)" or "-"
- # first_result.PRO_TOOL = None
- data = {
- # "code": first_result.PRO1 if first_result else "-",
- "code": code,
- "customer": first_result.PRO1C if first_result else "-",
- # "inspect_date": inspect_date.strftime('%Y/%m/%d') if inspect_date else "-",
- "lot_no": lot_no,
- "size": size_str,
- "lot_size": pcs,
- "spec": spec,
- # "hardness_out.acc": True, # Hide rows 24 to 28 if the prefix is "0"
- # "hardness_out.spe_acc": False, # Hide rows 24 to 28 if the prefix is "0"
- "acc": accept, # Hide rows 24 to 28 if the prefix is "0"
- "spe_acc": specialAccept, # Hide rows 24 to 28 if the prefix is "0"
- "tool": first_result.PRO_TOOL if first_result and first_result.PRO_TOOL else "-",
- # "hardness_out.qa1": f"{qa1.first_name} {qa1.last_name}",
- # "hardness_out.qa2": f"{qa2.first_name} {qa2.last_name}",
- "qa1": f"{qa1.first_name} {qa1.last_name}",
- "qa2": f"{qa2.first_name} {qa2.last_name}",
- "sign1": qa1.profile.signed_picture,
- "sign2": qa2.profile.signed_picture,
- "pos1": qa1.profile.get_position_display(),
- "pos2": qa2.profile.get_position_display()
- }
- merged_data = merge_sheet_data_with_data(converted_data, data)
- pprint(f"---- merged_data ---")
- pprint(merged_data)
- output_file = gen_xlsx(
- template_file=f"{settings.BASE_DIR}/report/coi_templates.xlsx",
- selected_sheets=sheets, # Replace with your actual sheet names
- prefix_filename=f"{settings.BASE_DIR}/media/coi_{lot_no}_",
- data=merged_data
- )
- report = Report.objects.create(
- name=lot_no,
- created_by=user,
- file=None # Leave this as None or assign a file if required
- )
- output_file_path = Path(output_file) # Convert to a Path object for convenience
- with open(output_file_path, "rb") as f:
- report.file.save(output_file_path.name, File(f), save=True)
- pprint(f"outputfile = {output_file}")
- return report
- def get_fields(model):
- # model_fields = {f.name: f for f in model._meta.get_fields()}
- # fields = list(model_fields.values())
- # return fields
- fields = [f for f in model._meta.get_fields() if not f.auto_created]
- return fields
- def filter_by_lot_no(lot_no):
- models = [Data, DataMs, DataRl, DataWb, LotSummary, LotSummaryRl, LotSummaryWb, PressCal, RotateData ] # List of models to process
- results = {}
- fields = {}
- for model in models:
- model_fields = [f.name for f in model._meta.get_fields()]
- # Check if "id" and "row_no" are in the model's fields
- order_fields = []
- if "id" in model_fields:
- order_fields.append("id")
- if "row_no" in model_fields:
- order_fields.append("row_no")
- # Dynamically filter and order results
- model_name = model.__name__
- if order_fields:
- results[model_name] = model.objects.filter(lot_no=lot_no).order_by(*order_fields)
- else:
- results[model_name] = model.objects.filter(lot_no=lot_no) # No
-
- fields[model_name] = get_fields(model)
- return results, fields
- @login_required
- def coi_view(request):
- pprint(f"xxxx method = xxx {request.method}")
- users = User.objects.all()
- if request.method == "POST":
- pprint(request.POST)
- exports = request.POST.getlist("exports") # Retrieve the list of selected values
- pprint(f"Selected Export Options: {exports}")
-
- if 'export' in request.POST:
- data = {
- "customer": "Tum Coder",
- "inspect_date": "2025-01-15",
- "lot_no": "12345",
- "staff_name": "Tum 8888",
- "man_name": "Tum 999",
- "size": "Large",
- "lot_size": "10 pcs",
- "spec": "Spec-A",
- "hardness_out.d1_act": "10",
- "hardness_out.d2_act": "0[24:28]", # Hide rows 24 to 28 if the prefix is "0"
- "hardness_out.acc": True, # Hide rows 24 to 28 if the prefix is "0"
- "hardness_out.spe_acc": False, # Hide rows 24 to 28 if the prefix is "0"
- "dimension_app.d1_act": "33",
- "dimension_app.d2_act": "0[26:32]", # Hide rows 24 to 28 if the prefix is "0"
- "dimension_app.acc": True, # Hide rows 24 to 28 if the prefix is "0"
- "dimension_app.spe_acc": True, # Hide rows 24 to 28 if the prefix is "0"
- }
- output_file = gen_xlsx(
- template_file="/app/report/coi_templates.xlsx",
- selected_sheets=exports, # Replace with your actual sheet names
- prefix_filename="/app/media/coi",
- data=data
- )
- report = Report.objects.create(
- name=request.POST.get('lot_no','Untitled'),
- created_by=request.user,
- file=None # Leave this as None or assign a file if required
- )
- output_file_path = Path(output_file) # Convert to a Path object for convenience
- with open(output_file_path, "rb") as f:
- report.file.save(output_file_path.name, File(f), save=True)
- pprint(f"outputfile = {output_file}")
- if 'search_lot' in request.POST:
- lot_no = request.POST.get('lot_no', None)
- lot_no = lot_no.strip()
- if lot_no:
- results = queryFromMaster(lot_no)
- first_result = results[0] if results else None
- selected_templates = None
- try:
- pcs = int(first_result.PRO5) - int(first_result.PRO27)
- except:
- pcs = 0
- code = "-"
- if first_result:
- size_str = f"{first_result.PRO10}x{first_result.PRO11}x{first_result.PRO12}";
- spec = f"{first_result.PRO13} {first_result.PRO14} {first_result.PRO15} {first_result.PRO16} {first_result.PRO17} {first_result.PRO18}"
- #first_result.PRO1C = "TUM"
- #selected_templates = CustomerTemplateMapping.objects.filter(customer_name=first_result.PRO1C).first().template_names
- # first_result.PRO1C = 'OSAKA SEIMITSU'
- mapping = CustomerTemplateMapping.objects.filter(customer_name__icontains=first_result.PRO1C).first()
- selected_templates = mapping.template_names if mapping else []
- mgt_code = first_result.PRO1 if first_result else "-"
- mks_map = MksCodeMap.objects.filter(mgt_code=mgt_code).first()
- if mks_map:
- code = f"{mks_map.mks_code}(MKSコード) {mgt_code}(参照)"
- else:
- code = f"{mgt_code}(参照)" or "-"
- else:
- size_str = ""
- spec = ""
- results, fields = filter_by_lot_no(lot_no)
- # results1 = Data.objects.filter(lot_no=lot_no).order_by("id", "row_no")
- # fields1 = get_fields(Data)
- # results2 = DataMs.objects.filter(lot_no=lot_no).order_by("id", "row_no")
- # fields2 = get_fields(DataMs)
- return render(request, 'report/coi.html', {'result': first_result,
- 'pcs':pcs,
- 'size_str': size_str,
- 'lot_no': lot_no,
- 'spec': spec, 'users': users, 'SHEET_NAMES': SHEET_NAMES,
- 'results': results, 'fields': fields, 'selected_templates': selected_templates, 'code': code})
- messages.success(request, "Request Sent")
- return redirect(request.path_info)
- return render(request, 'report/coi.html', {'SHEET_NAMES': SHEET_NAMES, 'users': users})
- @csrf_exempt # Disable CSRF for API requests (ensure this is secure in production)
- @login_required
- def gen_report_view(request):
- if request.method == "POST":
- # try:
- # Parse JSON data from the request body
- data = json.loads(request.body)
- lot_no = data.get("lot_no").strip()
- exports = data.get("exports")
- qa1 = data.get('qa1')
- qa2 = data.get('qa2')
- print(f"data = {data}")
- if not lot_no:
- return HttpResponseBadRequest("Missing 'lot_no' in request data")
- # Call the `create_coi_file` function with the provided lot_no
- report = create_coi_file(lot_no, exports, request.user, {'qa1': qa1, 'qa2': qa2, \
- 'acceptStatus': data.get('acceptStatus')})
- # Return a success response with the report details
- return JsonResponse({
- "message": "Report generated successfully",
- "report_id": report.id,
- "file_url": report.file.url if report.file else None,
- })
- # except json.JSONDecodeError:
- # return HttpResponseBadRequest("Invalid JSON data")
- # except Exception as e:
- # pprint(e)
- # return JsonResponse({"error": str(e)}, status=500)
- else:
- return HttpResponseBadRequest("Only POST requests are allowed")
- class CustomerTemplateCRUDView(ConfigurableCRUDView):
- model = CustomerTemplateMapping
- list_template_name = 'report/customer_template_list.html'
- detail_template_name = 'legacy/datacrud_detail.html'
- form_template_name = 'report/customer_template_form.html'
- confirm_delete_template_name = 'legacy/datacrud_confirm_delete.html'
- filterset_class = CustomerTemplateFilter
- page_title = "Customer Template Mapping"
- # URL name mappings
- list_url_name = 'report:customer_templates-list'
- create_url_name = 'report:customer_templates-create'
- update_url_name = 'report:customer_templates-update'
- delete_url_name = 'report:customer_templates-delete'
- config_fields = ["id", "customer_name", "template_names", "created_at"]
- config_field_orders = ["id", "customer_name", "template_names", "created_at", "created_by"]
- # config_readonly_fields = ["lot_no"]
- config_edit_fields = None
- ordering = ["-created_at", "-id",]
- form_class = CustomerTemplateMappingForm
- def get_list_view(self):
- class ListViewClass(FilterView, ListView):
- model = self.model
- template_name = self.list_template_name
- paginate_by = self.paginate_by
- filterset_class = self.filterset_class
- ordering = self.ordering
- def get_context_data(inner_self, **kwargs):
- context = super().get_context_data(**kwargs)
- fields = self.get_fields()
- context.update({
- 'fields': [f for f in fields],
- 'sheet_names': SHEET_NAMES,
- # 'fields': [field for field in self.model._meta.get_fields()],
- 'page_title': self.page_title,
- 'list_url': self.list_url_name,
- 'create_url': self.create_url_name,
- 'update_url': self.update_url_name,
- 'delete_url': self.delete_url_name,
- 'bs': self.get_breadcrumbs('list'),
- })
- return context
- return ListViewClass
- class ProductDrawingCRUDView(ConfigurableCRUDView):
- model = ProductDrawing
- list_template_name = 'legacy/datacrud_list.html'
- detail_template_name = 'legacy/datacrud_detail.html'
- form_template_name = 'report/productdrawing_form.html'
- confirm_delete_template_name = 'legacy/datacrud_confirm_delete.html'
- filterset_class = ProductDrawingFilter
- page_title = "Product Drawing"
- # URL name mappings
- list_url_name = 'report:product_drawings-list'
- create_url_name = 'report:product_drawings-create'
- update_url_name = 'report:product_drawings-update'
- delete_url_name = 'report:product_drawings-delete'
- config_fields = ["id", "code_no", "code_no_mks", "lot_no", "drawing", "description", "created_at"]
- #config_field_orders = ["id", "customer_name", "template_names", "created_at", "created_by"]
- # config_readonly_fields = ["lot_no"]
- config_edit_fields = None
- ordering = ["-created_at", "-id",]
- form_class = ProductDrawingForm
- class MksCodeMapCRUDView(ConfigurableCRUDView):
- model = MksCodeMap
- page_title = "MKS Code Mapping"
- filterset_class = MksCodeMapFilter
- list_template_name = "legacy/datacrud_list.html"
- detail_template_name = "legacy/datacrud_detail.html"
- form_template_name = 'legacy/datacrud_form.html'
- confirm_delete_template_name = "legacy/datacrud_confirm_delete.html"
- config_fields = ["id", "mgt_code", "mks_code", "created_at"]
- config_edit_fields = ["mgt_code", "mks_code"]
- list_url_name = "report:code_maps-list"
- create_url_name = "report:code_maps-create"
- update_url_name = "report:code_maps-update"
- delete_url_name = "report:code_maps-delete"
- ordering = ["-created_at", "-id"]
|