| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041 |
- 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
- from core.forms import ReportForm
- from core.utils import ConfigurableCRUDView, queryFromMaster
- from .filters import ReportFilter
- 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
- 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):
- """
- 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
- for record_idx, record in enumerate(records, start=1):
- 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
- return placeholders
- def generate_hardness_out_in_values(lot_no):
- # 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)
- for idx, record in enumerate(out_data, start=1):
- 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", "25:28")
-
- return placeholders
- def generate_hardness_both_size_values(lot_no, ms):
- # 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
- for idx, record in enumerate(records, start=0):
- 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 = {}
- return placeholders
- # # Example usage:
- # placeholders_dict = clear_values(6, 3)
- # print(placeholders_dict)
- def generate_dimension_values(lot_no):
- """
- 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(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 manual_size_records:
- if m.size_name == "D":
- placeholders['v1_1'] = placeholders['v4_1'] = f'{m.std} +{m.tolup} {m.tolun}'
- if m.size_name == "T":
- placeholders['v2_1'] = placeholders['v5_1'] = f'{m.std} +{m.tolup} {m.tolun}'
- if m.size_name == "H":
- placeholders['v3_1'] = placeholders['v6_1'] = f'{m.std} +{m.tolup} {m.tolun}'
- # 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
-
- 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_1", "24:28")
- 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):
- """
- 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(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} +{m.tolup} {m.tolun}'
- if m.size_name == "T":
- placeholders['v2_1'] = placeholders['v6_1'] = f'{m.std} +{m.tolup} {m.tolun}'
- if m.size_name == "H":
- placeholders['v3_1'] = placeholders['v7_1'] = f'{m.std} +{m.tolup} {m.tolun}'
- # 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
- # 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", "26:32")
- return placeholders
- def generate_dimension_bal_weight_values(lot_no, ms):
- """
- 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:
- w = ms.PRO6
- placeholders['v4_1'] = placeholders['v9_1'] = w
- for m in manual_size_records:
- if m.size_name == "D":
- placeholders['v1_1'] = placeholders['v6_1'] = f'D{m.std} +{m.tolup} {m.tolun}'
- if m.size_name == "T":
- placeholders['v2_1'] = placeholders['v7_1'] = f'T{m.std} +{m.tolup} {m.tolun}'
- if m.size_name == "H":
- placeholders['v3_1'] = placeholders['v8_1'] = f'H{m.std} +{m.tolup} {m.tolun}'
- # 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
- # 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")
- return placeholders
- def generate_dim_bal_app_hard_values(lot_no, first_result):
- """
- 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})"
- 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['v18_0'] = placeholders['v16_0'] = in_limit
- pprint(placeholders)
- pprint(manual_size_records)
- if first_result:
- w = first_result.PRO6
- placeholders['v4_1'] = placeholders['v12_1'] = w
- for m in manual_size_records:
- if m.size_name == "D":
- placeholders['v1_1'] = placeholders['v9_1'] = f'D{m.std} +{m.tolup} {m.tolun}'
- if m.size_name == "T":
- placeholders['v2_1'] = placeholders['v10_1'] = f'T{m.std} +{m.tolup} {m.tolun}'
- if m.size_name == "H":
- placeholders['v3_1'] = placeholders['v11_1'] = f'H{m.std} +{m.tolup} {m.tolun}'
- # 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
- # 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")
- return placeholders
- def generate_dim_bal_app_rot_hard_values(lot_no, first_result):
- """
- 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})"
- 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:
- w = first_result.PRO6
- placeholders['v4_1'] = placeholders['v13_1'] = w
- for m in manual_size_records:
- if m.size_name == "D":
- placeholders['v1_1'] = placeholders['v10_1'] = f'D{m.std} +{m.tolup} {m.tolun}'
- if m.size_name == "T":
- placeholders['v2_1'] = placeholders['v11_1'] = f'T{m.std} +{m.tolup} {m.tolun}'
- if m.size_name == "H":
- placeholders['v3_1'] = placeholders['v12_1'] = f'H{m.std} +{m.tolup} {m.tolun}'
- # 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
- # 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")
- return placeholders
- def generate_centering_values(lot_no):
- """
- 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
- for i,r in enumerate(data_ms_records, start=1):
- placeholders[f'v{i}_2'] = r.censize
- placeholders[f'v{i}_3'] = r.censizeok
- return placeholders
- def generate_t8_values(lot_no):
- """
- 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}")
- for m in manual_size_records:
- if m.size_name == "Thickness":
- for i in range(1,9):
- placeholders[f'v{i}_1'] = f'{m.std} +{m.tolup} {m.tolun}'
- # 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
- for i,r in enumerate(data_ms_records, start=1):
- 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
- 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
-
- sheet_data = {}
- for sheet_name in sheets:
- if sheet_name == 'hardness_out':
- sheet_data[sheet_name] = generate_hardness_out_values(lot_no)
- elif sheet_name == 'hardness_out_in':
- sheet_data[sheet_name] = generate_hardness_out_in_values(lot_no)
- elif sheet_name == 'hardness_both_size':
- sheet_data[sheet_name] = generate_hardness_both_size_values(lot_no, first_result)
- elif sheet_name == 'dimension':
- sheet_data[sheet_name] = generate_dimension_values(lot_no)
- elif sheet_name == 'dimension_app':
- sheet_data[sheet_name] = generate_dimension_app_values(lot_no)
- elif sheet_name == 'dimension_bal_weight':
- sheet_data[sheet_name] = generate_dimension_bal_weight_values(lot_no, first_result)
- elif sheet_name == 'centering':
- sheet_data[sheet_name] = generate_centering_values(lot_no)
- elif sheet_name == 'thickness_8_point':
- sheet_data[sheet_name] = generate_t8_values(lot_no)
- elif sheet_name == 'dim_bal_app_hard':
- sheet_data[sheet_name] = generate_dim_bal_app_hard_values(lot_no, first_result)
- elif sheet_name == 'dim_bal_app_rot_hard':
- sheet_data[sheet_name] = generate_dim_bal_app_rot_hard_values(lot_no, first_result)
-
- 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
- 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}"
- else:
- size_str = ""
- spec = ""
- data = {
- "code": first_result.PRO1 if first_result else "-",
- "customer": first_result.PRO1C if first_result else "-",
- "inspect_date": "2025-01-15",
- "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"
- # "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
- SHEET_NAMES = {
- 'hardness_out': 'Hardness Out',
- 'hardness_out_in': 'Hardness Out/In',
- 'hardness_both_size': 'Hardness Both Size',
- 'dimension': 'Dimension',
- 'dimension_app': 'Dimension Appearance',
- 'dimension_bal_weight': 'Dimension Balance/Weight',
- 'dim_bal_app_hard': 'Dimension Balance/Appearance/Hardness',
- 'dim_bal_app_rot_hard': 'Dimension Balance/Appearance/Rotation/Hardness',
- 'thickness_8_point': 'Thickness 8 Points',
- 'centering': 'Centering',
- }
- 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
- 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
- try:
- pcs = int(first_result.PRO5) - int(first_result.PRO27)
- except:
- pcs = 0
- 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}"
- 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})
- 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")
|