tum %!s(int64=11) %!d(string=před) měsíci
rodič
revize
8f2939cefe

+ 9 - 1
app/legacy/filters.py

@@ -5,10 +5,18 @@ from .models import Data, DataMs, TbFgPressinfoLotlist, LotSummary, DataRl, Data
5 5
 class DataFilter(django_filters.FilterSet):
6 6
     lot_no = django_filters.CharFilter(field_name='lot_no', lookup_expr='icontains')
7 7
     code = django_filters.CharFilter(field_name='code', lookup_expr='icontains')
8
+    r_type = django_filters.CharFilter(method='filter_r_type')
9
+
8 10
 
9 11
     class Meta:
10 12
         model = Data
11
-        fields = ['lot_no', 'code']  # Add fields you want to filter
13
+        fields = ['lot_no', 'code', 'r_type']  # Add fields you want to filter
14
+    
15
+    def filter_r_type(self, queryset, name, value):
16
+        # Split the comma-separated values into a list
17
+        r_type_list = [v.strip() for v in value.split(',') if v.strip()]
18
+        # Filter the queryset using the list
19
+        return queryset.filter(**{f"{name}__in": r_type_list})
12 20
 
13 21
 class DataMsFilter(django_filters.FilterSet):
14 22
     lot_no = django_filters.CharFilter(field_name='lot_no', lookup_expr='icontains')

+ 2 - 2
app/legacy/models.py

@@ -120,7 +120,7 @@ class Data(models.Model):
120 120
     row_no = models.IntegerField(blank=True, null=True)
121 121
     lot_no = models.CharField(max_length=50, db_collation='SQL_Latin1_General_CP1_CI_AS', blank=True, null=True)
122 122
     code = models.CharField(max_length=50, db_collation='SQL_Latin1_General_CP1_CI_AS', blank=True, null=True)
123
-    header = models.CharField(max_length=10, db_collation='SQL_Latin1_General_CP1_CI_AS', blank=True, null=True)
123
+    r_type = models.CharField(max_length=50, db_collation='SQL_Latin1_General_CP1_CI_AS', blank=True, null=True)
124 124
     p1 = models.FloatField(blank=True, null=True)
125 125
     p2 = models.FloatField(blank=True, null=True)
126 126
     p3 = models.FloatField(blank=True, null=True)
@@ -134,7 +134,7 @@ class Data(models.Model):
134 134
     avg = models.FloatField(blank=True, null=True)
135 135
     grade = models.CharField(max_length=50, db_collation='SQL_Latin1_General_CP1_CI_AS', blank=True, null=True)
136 136
     rgrade = models.CharField(max_length=50, db_collation='SQL_Latin1_General_CP1_CI_AS', blank=True, null=True)
137
-    r_type = models.CharField(max_length=50, db_collation='SQL_Latin1_General_CP1_CI_AS', blank=True, null=True)
137
+    header = models.CharField(max_length=10, db_collation='SQL_Latin1_General_CP1_CI_AS', blank=True, null=True)
138 138
     created_at = models.DateTimeField(blank=True, null=True)
139 139
     updated_at = models.DateTimeField(blank=True, null=True)
140 140
     ndata = models.IntegerField(blank=True, null=True)

+ 18 - 4
app/legacy/templates/legacy/data_list.html

@@ -78,12 +78,26 @@
78 78
         </div>
79 79
         <div class="space-x-2">
80 80
             {% if page_obj.has_previous %}
81
-                <a href="?page=1" class="text-blue-500 hover:underline">First</a>
82
-                <a href="?page={{ page_obj.previous_page_number }}" class="text-blue-500 hover:underline">Previous</a>
81
+                <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page=1" 
82
+                   class="text-blue-500 hover:underline">First</a>
83
+                <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_obj.previous_page_number }}" 
84
+                   class="text-blue-500 hover:underline">Previous</a>
83 85
             {% endif %}
86
+            {% for page_num in page_obj.paginator.page_range %}
87
+                {% if page_num == page_obj.number %}
88
+                    <span class="font-bold text-gray-700">{{ page_num }}</span>
89
+                {% elif page_num == 1 or page_num == page_obj.paginator.num_pages or page_num >= page_obj.number|add:"-2" and page_num <= page_obj.number|add:"2" %}
90
+                    <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_num }}" 
91
+                       class="text-blue-500 hover:underline">{{ page_num }}</a>
92
+                {% elif page_num == page_obj.number|add:-3 or page_num == page_obj.number|add:3 %}
93
+                    <span class="mx-1">...</span>
94
+                {% endif %}
95
+            {% endfor %}
84 96
             {% if page_obj.has_next %}
85
-                <a href="?page={{ page_obj.next_page_number }}" class="text-blue-500 hover:underline">Next</a>
86
-                <a href="?page={{ page_obj.paginator.num_pages }}" class="text-blue-500 hover:underline">Last</a>
97
+                <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_obj.next_page_number }}" 
98
+                   class="text-blue-500 hover:underline">Next</a>
99
+                <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_obj.paginator.num_pages }}" 
100
+                   class="text-blue-500 hover:underline">Last</a>
87 101
             {% endif %}
88 102
         </div>
89 103
     </div>

+ 10 - 0
app/legacy/templates/legacy/datacrud_list.html

@@ -81,6 +81,16 @@
81 81
                 <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_obj.previous_page_number }}" 
82 82
                    class="text-blue-500 hover:underline">Previous</a>
83 83
             {% endif %}
84
+            {% for page_num in page_obj.paginator.page_range %}
85
+                {% if page_num == page_obj.number %}
86
+                    <span class="font-bold text-gray-700">{{ page_num }}</span>
87
+                {% elif page_num == 1 or page_num == page_obj.paginator.num_pages or page_num >= page_obj.number|add:"-2" and page_num <= page_obj.number|add:"2" %}
88
+                    <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_num }}" 
89
+                       class="text-blue-500 hover:underline">{{ page_num }}</a>
90
+                {% elif page_num == page_obj.number|add:-3 or page_num == page_obj.number|add:3 %}
91
+                    <span class="mx-1">...</span>
92
+                {% endif %}
93
+            {% endfor %}
84 94
             {% if page_obj.has_next %}
85 95
                 <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_obj.next_page_number }}" 
86 96
                    class="text-blue-500 hover:underline">Next</a>

+ 9 - 2
app/legacy/templatetags/legacy_filters.py

@@ -32,8 +32,15 @@ def render_breadcrumbs(context, breadcrumbs):
32 32
 @register.filter
33 33
 def safe_floatformat(value, decimal_places):
34 34
     try:
35
-        # Attempt to convert the value to a float and format it
36
-        return floatformat(float(value), decimal_places)
35
+        # Attempt to convert the value to a float
36
+        value = float(value)
37
+        
38
+        # Check if the value is an integer
39
+        if value.is_integer():
40
+            return int(value)  # Return as an integer
41
+        
42
+        # Otherwise, format as a float with the specified decimal places
43
+        return floatformat(value, decimal_places)
37 44
     except (ValueError, TypeError):
38 45
         # If the value is not a number, return it as is
39 46
         return value

+ 2 - 1
app/legacy/views.py

@@ -25,8 +25,9 @@ from core.utils import ConfigurableCRUDView
25 25
 class DataListView(FilterView, ListView):
26 26
     model = Data
27 27
     template_name = 'legacy/data_list.html'
28
+    ordering = ['id', 'row_no']  # Order by id (ascending), then row_no (ascending)
28 29
     # context_object_name = 'data_list'
29
-    paginate_by = 10  # Enable pagination
30
+    paginate_by = 50  # Enable pagination
30 31
 
31 32
     # Specify the filter class
32 33
     filterset_class = DataFilter

+ 5 - 0
app/report/gen_report.py

@@ -234,6 +234,11 @@ def gen_xlsx(template_file, selected_sheets, prefix_filename, data):
234 234
                             cell.value = None  # Remove the placeholder text
235 235
                         else:
236 236
                             # Insert the text value directly
237
+                            # cell.value = value
238
+                            if isinstance(value, str) and "[" in value and "]" in value:
239
+                                # Extract the part before "[i:j]"
240
+                                value = value.split("[")[0]
241
+                            # Insert the cleaned value into the cell
237 242
                             cell.value = value
238 243
 
239 244
         for key, value in data.items():

+ 3 - 2
app/report/templates/report/coi.html

@@ -6,11 +6,12 @@
6 6
 <div class="container mx-auto px-4 py-8" x-data="COIReport">
7 7
 
8 8
   <h1 class="text-2xl font-bold text-gray-800">Export Center</h1>
9
+  {{ lot_no }}
9 10
   <form method='post'>
10 11
     {% csrf_token %}
11 12
     <div class="flex items-center gap-2 mb-4">
12 13
       <label for="lot-number" class="text-gray-700 font-medium">Lot No. :</label>
13
-      <input id="lot-number" type="text" class="border border-gray-300 rounded px-4 py-2 focus:outline-blue-500" placeholder="Enter Lot No." name='lot_no' required x-model="lot_no">
14
+      <input id="lot-number" type="text" class="border border-gray-300 rounded px-4 py-2 focus:outline-blue-500" placeholder="Enter Lot No." name='lot_no' required x-model="lot_no" value="{{ lot_no }}">
14 15
       <button class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600" type="submit" name="search_lot">
15 16
         🔍
16 17
       </button>
@@ -131,7 +132,7 @@
131 132
 <script type="text/javascript">
132 133
   function COIReport() {
133 134
     return {
134
-      lot_no: '', // Bind this to the input value
135
+      lot_no: '{{ lot_no }}', // Bind this to the input value
135 136
       exports: [],
136 137
       qa1: null,
137 138
       qa2: null,

+ 64 - 12
app/report/views.py

@@ -85,6 +85,19 @@ def convert_sheet_data(sheet_data):
85 85
 
86 86
     return converted_data
87 87
 
88
+def hide_con(placeholders, mark_value, hide_rows):
89
+    """
90
+    Updates the 'placeholders' dictionary with a mark value and hide rows range.
91
+
92
+    :param placeholders: The dictionary to update.
93
+    :param mark_value: The key to check or update in the placeholders.
94
+    :param hide_rows: The row range to append in the format '[start:end]'.
95
+    """
96
+    if mark_value in placeholders:
97
+        placeholders[mark_value] = f"{placeholders[mark_value]}[{hide_rows}]"
98
+    else:
99
+        placeholders[mark_value] = f"0[{hide_rows}]"
100
+
88 101
 def generate_hardness_out_values(lot_no):
89 102
     """
90 103
     Generate a dictionary of placeholder values for a given lot_no.
@@ -108,6 +121,44 @@ def generate_hardness_out_values(lot_no):
108 121
 
109 122
     return placeholders
110 123
 
124
+def generate_hardness_out_in_values(lot_no):
125
+    # Fetch records from the Data model
126
+    records = Data.objects.filter(lot_no=lot_no).order_by('row_no')
127
+    out_data = []
128
+    in_data = []
129
+
130
+    # Separate OUT and IN data
131
+    for record in records:
132
+        if record.r_type.upper() in ["OUT", "TOP", "FA1", "UPP", "UPPE", "RIM"]:
133
+            out_data.append(record)
134
+        elif record.r_type.upper() in ["IN", "UNDER", "UND", "FA2", "LOW", "LOWE", "BASE", "SOKO", "IN*"]:
135
+            in_data.append(record)
136
+
137
+    # Prepare placeholders
138
+    placeholders = {}
139
+    for idx, record in enumerate(out_data, start=1):
140
+        placeholders[f'v{idx}_1'] = record.p1
141
+        placeholders[f'v{idx}_2'] = record.p2
142
+        placeholders[f'v{idx}_3'] = record.p3
143
+        placeholders[f'v{idx}_4'] = record.avg
144
+        placeholders[f'v{idx}_5'] = record.rgrade
145
+
146
+    for idx, record in enumerate(in_data, start=1):
147
+        placeholders[f'v{len(out_data) + idx}_1'] = record.p1
148
+        placeholders[f'v{len(out_data) + idx}_2'] = record.p2
149
+        placeholders[f'v{len(out_data) + idx}_3'] = record.p3
150
+        placeholders[f'v{len(out_data) + idx}_4'] = record.avg
151
+        placeholders[f'v{len(out_data) + idx}_5'] = record.rgrade
152
+
153
+    # if "v3_1" in placeholders:
154
+        # placeholders["v3_1"] = f"{placeholders['v3_1']}[25:28]"
155
+    # else:
156
+        # placeholders[f"v3_1"] = "0[25:28]"
157
+
158
+    hide_con(placeholders, "v3_1", "25:28")
159
+    
160
+    return placeholders
161
+
111 162
 def merge_sheet_data_with_data(sheet_data, data):
112 163
     """
113 164
     Merge `sheet_data` with `data`.
@@ -132,8 +183,12 @@ def create_coi_file(lot_no, sheets, user, md):
132 183
     
133 184
     sheet_data = {}
134 185
     for sheet_name in sheets:
135
-        if sheet_name == 'hardness_out':
136
-            sheet_data[sheet_name] = generate_hardness_out_values(lot_no)
186
+        match sheet_name:
187
+            case 'hardness_out':
188
+                sheet_data[sheet_name] = generate_hardness_out_values(lot_no)
189
+            case 'hardness_out_in':
190
+                sheet_data[sheet_name] = generate_hardness_out_in_values(lot_no)
191
+    
137 192
     converted_data = convert_sheet_data(sheet_data)
138 193
 
139 194
     print(f"sheet_data \n {sheet_data}") 
@@ -156,10 +211,6 @@ def create_coi_file(lot_no, sheets, user, md):
156 211
         # "hardness_out.qa2": f"{qa2.first_name} {qa2.last_name}",
157 212
         "qa1": f"{qa1.first_name} {qa1.last_name}",
158 213
         "qa2": f"{qa2.first_name} {qa2.last_name}",
159
-        "dimension_app.d1_act": "33",
160
-        "dimension_app.d2_act": "0[26:32]",  # Hide rows 24 to 28 if the prefix is "0"
161
-        "dimension_app.acc": True,  # Hide rows 24 to 28 if the prefix is "0"
162
-        "dimension_app.spe_acc": True,  # Hide rows 24 to 28 if the prefix is "0"
163 214
         "sign1": qa1.profile.signed_picture,
164 215
         "sign2": qa2.profile.signed_picture,
165 216
         "pos1": qa1.profile.get_position_display(),
@@ -264,6 +315,7 @@ def coi_view(request):
264 315
                 return render(request, 'report/coi.html', {'result': first_result, 
265 316
                                                            'pcs':pcs, 
266 317
                                                            'size_str': size_str,
318
+                                                           'lot_no': lot_no,
267 319
                                                            'spec': spec, 'users': users, 'SHEET_NAMES': SHEET_NAMES})
268 320
 
269 321
         messages.success(request, "Request Sent")
@@ -275,7 +327,7 @@ def coi_view(request):
275 327
 @login_required
276 328
 def gen_report_view(request):
277 329
     if request.method == "POST":
278
-        try:
330
+        # try:
279 331
             # Parse JSON data from the request body
280 332
             data = json.loads(request.body)
281 333
             lot_no = data.get("lot_no").strip()
@@ -297,11 +349,11 @@ def gen_report_view(request):
297 349
                 "file_url": report.file.url if report.file else None,
298 350
             })
299 351
 
300
-        except json.JSONDecodeError:
301
-            return HttpResponseBadRequest("Invalid JSON data")
302
-        except Exception as e:
303
-            pprint(e)
304
-            return JsonResponse({"error": str(e)}, status=500)
352
+        # except json.JSONDecodeError:
353
+            # return HttpResponseBadRequest("Invalid JSON data")
354
+        # except Exception as e:
355
+            # pprint(e)
356
+            # return JsonResponse({"error": str(e)}, status=500)
305 357
     else:
306 358
         return HttpResponseBadRequest("Only POST requests are allowed")
307 359