tum 1 anno fa
parent
commit
fb825202cf

BIN
app/report/coi_templates.xlsx


+ 14 - 2
app/report/gen_report.py

@@ -8,6 +8,10 @@ from openpyxl.drawing.spreadsheet_drawing import AbsoluteAnchor
8 8
 from openpyxl.drawing.xdr import XDRPoint2D, XDRPositiveSize2D
9 9
 from openpyxl.utils.units import pixels_to_EMU
10 10
 from openpyxl.utils import get_column_letter
11
+from django.db import models
12
+import os
13
+from django.db.models.fields.files import ImageFieldFile
14
+from pprint import pprint
11 15
 
12 16
 def center_image_in_cell(ws, cell_address, img_path):
13 17
     """
@@ -98,9 +102,17 @@ def gen_xlsx(template_file, selected_sheets, prefix_filename, data):
98 102
                         value = data[sheet_specific_key]
99 103
                     elif placeholder in data:
100 104
                         value = data[placeholder]
101
-
105
+                        
102 106
                     if value is not None:
103
-                        if value is True:
107
+                        if isinstance(value, ImageFieldFile):
108
+                            pprint("ImageField")
109
+                            image_path = value.path
110
+                            if os.path.exists(image_path):
111
+                                img = Image(image_path)
112
+                                img.height = 40  # Adjust size as needed
113
+                                sheet.add_image(img, cell.coordinate)
114
+                                cell.value = None  # Clear placeholder
115
+                        elif value is True:
104 116
                             img = Image(checked_image_path)
105 117
                             img.width = img.height = 20
106 118
                             print(f"{cell.coordinate}")

+ 22 - 44
app/report/templates/report/coi.html

@@ -21,55 +21,31 @@
21 21
         🔍
22 22
       </button>
23 23
     </div>
24
-    <div class="flex items-center gap-4 mb-4">
25 24
       <button class="bg-blue-100 text-blue-700 px-4 py-2 rounded hover:bg-blue-200">
26 25
         Option for Export :
27 26
       </button>
28
-      <div class="flex items-center space-x-2">
27
+        <div class="grid grid-cols-4 gap-4">
28
+        {% for key,value in SHEET_NAMES.items %}
29 29
         <label class="flex items-center space-x-1">
30
-          <input type="checkbox" class="rounded" name='exports' value='size_dimension'>
31
-          <span>Size Dimension</span>
30
+          <input type="checkbox" class="rounded" name='exports' value='{{ key }}' x-model='exports'>
31
+          <span>{{ value }}</span>
32 32
         </label>
33
-        <label class="flex items-center space-x-1">
34
-          <input type="checkbox" class="rounded" name='exports' value='grade'>
35
-          <span>Grade</span>
36
-        </label>
37
-        <label class="flex items-center space-x-1">
38
-          <input type="checkbox" class="rounded" name='exports' value='wb'>
39
-          <span>WB</span>
40
-        </label>
41
-        <label class="flex items-center space-x-1">
42
-          <input type="checkbox" class="rounded" name='exports' value='fg_weight'>
43
-          <span>FG Weight</span>
44
-        </label>
45
-        <label class="flex items-center space-x-1">
46
-          <input type="checkbox" class="rounded" name='exports' value='centering'>
47
-          <span>Centering</span>
48
-        </label>
49
-        <label class="flex items-center space-x-1">
50
-          <input type="checkbox" class="rounded" name='exports' value='ring_test'>
51
-          <span>Ring Test</span>
52
-        </label>
53
-        <label class="flex items-center space-x-1">
54
-          <input type="checkbox" class="rounded" name='exports' value='rotate'>
55
-          <span>Rotate</span>
56
-        </label>
57
-        <label class="flex items-center space-x-1">
58
-          <input type="checkbox" class="rounded" name='exports' value='final_judge'>
59
-          <span>Final Judge</span>
60
-        </label>
61
-      </div>
62
-      <button  type='button' class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600" 
63
-        @click="exportCOI">
64
-        Export Excel
65
-      </button>
66
-      <!-- TODO: add download here -->
67
-      <div class=" text-center" x-show="downloadUrl">
68
-        <a :href="downloadUrl"  class="px-4 py-2 bg-green-600 text-white font-medium rounded-md hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-offset-2" download>
69
-          Download Report
70
-        </a>
71
-      </div>
72
-    </div>
33
+        {% endfor %}
34
+        </div>
35
+        <div class="flex justify-end my-3 space-x-4">
36
+          <div>
37
+            <button  type='button' class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600" 
38
+                                   @click="exportCOI">
39
+              Export Excel
40
+            </button>
41
+          </div>
42
+          <!-- TODO: add download here -->
43
+          <div class=" text-center" x-show="downloadUrl">
44
+            <a :href="downloadUrl"  class="block px-4 py-2 bg-green-600 text-white  rounded-md hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-offset-2" download>
45
+              Download Report
46
+            </a>
47
+          </div>
48
+        </div>
73 49
   </form>
74 50
   {{ result }}
75 51
   
@@ -142,6 +118,7 @@
142 118
   function COIReport() {
143 119
     return {
144 120
       lot_no: '', // Bind this to the input value
121
+      exports: [],
145 122
       gen_report_url: '{% url "report:gen_report" %}', 
146 123
       downloadUrl: null, // Stores the download link after export success
147 124
       init() {
@@ -157,6 +134,7 @@
157 134
                   // Make POST request using Axios
158 135
                   const response = await axios.post(this.gen_report_url, {
159 136
                       lot_no: this.lot_no,
137
+                      exports: this.exports,
160 138
                   });
161 139
 
162 140
                   if (response.status === 200) {

+ 24 - 7
app/report/views.py

@@ -65,7 +65,7 @@ class ReportCRUDView(ConfigurableCRUDView):
65 65
     # config_edit_fields = ["lot_no", "code"]
66 66
     ordering = ["-created_at", "-id",]
67 67
 
68
-def create_coi_file(lot_no, user):
68
+def create_coi_file(lot_no, sheets, user):
69 69
 
70 70
     data = {
71 71
         "customer": "Tum Coder",
@@ -92,10 +92,12 @@ def create_coi_file(lot_no, user):
92 92
         "dimension_app.d2_act": "0[26:32]",  # Hide rows 24 to 28 if the prefix is "0"
93 93
         "dimension_app.acc": True,  # Hide rows 24 to 28 if the prefix is "0"
94 94
         "dimension_app.spe_acc": True,  # Hide rows 24 to 28 if the prefix is "0"
95
+        "sign1": user.profile.signed_picture,
96
+        "sign2": user.profile.signed_picture,
95 97
     }
96 98
     output_file = gen_xlsx(
97 99
         template_file="/app/report/coi_templates.xlsx",
98
-        selected_sheets=["hardness_out", "dimension_app"],  # Replace with your actual sheet names
100
+        selected_sheets=sheets,  # Replace with your actual sheet names
99 101
         prefix_filename="/app/media/coi",
100 102
         data=data
101 103
     )
@@ -111,10 +113,25 @@ def create_coi_file(lot_no, user):
111 113
     pprint(f"outputfile = {output_file}")
112 114
     return report
113 115
 
116
+SHEET_NAMES = {
117
+    'hardness_out': 'Hardness Out',
118
+    'hardness_out_in': 'Hardness Out/In', 
119
+    'hardness_both_size': 'Hardness Both Size',
120
+    'dimension': 'Dimension',
121
+    'dimension_app': 'Dimension Appearance',
122
+    'dimension_bal_weight': 'Dimension Balance/Weight',
123
+    'dim_bal_app_hard': 'Dimension Balance/Appearance/Hardness',
124
+    'dim_bal_app_rot_hard': 'Dimension Balance/Appearance/Rotation/Hardness',
125
+    'thickness_8_point': 'Thickness 8 Points',
126
+    'centering': 'Centering',
127
+}
114 128
 def coi_view(request):
115 129
     pprint(f"xxxx method = xxx {request.method}")
116 130
     if request.method == "POST":
117 131
         pprint(request.POST)
132
+        exports = request.POST.getlist("exports")  # Retrieve the list of selected values
133
+        pprint(f"Selected Export Options: {exports}")
134
+        
118 135
         if 'export' in request.POST:
119 136
 
120 137
             data = {
@@ -137,7 +154,7 @@ def coi_view(request):
137 154
             }
138 155
             output_file = gen_xlsx(
139 156
                 template_file="/app/report/coi_templates.xlsx",
140
-                selected_sheets=["hardness_out", "dimension_app"],  # Replace with your actual sheet names
157
+                selected_sheets=exports,  # Replace with your actual sheet names
141 158
                 prefix_filename="/app/media/coi",
142 159
                 data=data
143 160
             )
@@ -168,11 +185,10 @@ def coi_view(request):
168 185
                                                            'size_str': size_str,
169 186
                                                            'spec': spec})
170 187
 
171
-        exports = request.POST.getlist("exports")  # Retrieve the list of selected values
172
-        pprint(f"Selected Export Options: {exports}")
173 188
         messages.success(request, "Request Sent")
174 189
         return redirect(request.path_info)
175
-    return render(request, 'report/coi.html')
190
+    return render(request, 'report/coi.html', {'SHEET_NAMES': SHEET_NAMES})
191
+
176 192
 
177 193
 @csrf_exempt  # Disable CSRF for API requests (ensure this is secure in production)
178 194
 @login_required
@@ -182,12 +198,13 @@ def gen_report_view(request):
182 198
             # Parse JSON data from the request body
183 199
             data = json.loads(request.body)
184 200
             lot_no = data.get("lot_no")
201
+            exports = data.get("exports")
185 202
 
186 203
             if not lot_no:
187 204
                 return HttpResponseBadRequest("Missing 'lot_no' in request data")
188 205
 
189 206
             # Call the `create_coi_file` function with the provided lot_no
190
-            report = create_coi_file(lot_no, request.user)
207
+            report = create_coi_file(lot_no, exports, request.user)
191 208
 
192 209
             # Return a success response with the report details
193 210
             return JsonResponse({

BIN
app/report/~$coi_templates.xlsx


BIN
~$hardness.xlsx