Coverage for src/backend/InvenTree/order/migrations/0118_transferorder.py: 100%

15 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 17:47 +0000

1# Generated by Django 5.2.11 on 2026-02-27 22:00 

2 

3import InvenTree.fields 

4import InvenTree.models 

5import django.core.validators 

6import django.db.models.deletion 

7import generic.states.fields 

8import generic.states.states 

9import generic.states.transition 

10import generic.states.validators 

11import order.status_codes 

12import order.validators 

13from django.conf import settings 

14from django.db import migrations, models 

15 

16 

17class Migration(migrations.Migration): 

18 

19 dependencies = [ 

20 ("common", "0041_auto_20251203_1244"), 

21 ("company", "0077_delete_manufacturerpartparameter"), 

22 ("order", "0117_purchaseorderextraline_line_int_and_more"), 

23 ("part", "0146_auto_20251203_1241"), 

24 ("stock", "0116_alter_stockitem_link"), 

25 ("users", "0005_owner_model"), 

26 migrations.swappable_dependency(settings.AUTH_USER_MODEL), 

27 ] 

28 

29 operations = [ 

30 migrations.CreateModel( 

31 name="TransferOrder", 

32 fields=[ 

33 ( 

34 "id", 

35 models.AutoField( 

36 auto_created=True, 

37 primary_key=True, 

38 serialize=False, 

39 verbose_name="ID", 

40 ), 

41 ), 

42 ( 

43 "metadata", 

44 models.JSONField( 

45 blank=True, 

46 help_text="JSON metadata field, for use by external plugins", 

47 null=True, 

48 verbose_name="Plugin Metadata", 

49 ), 

50 ), 

51 ("reference_int", models.BigIntegerField(default=0)), 

52 ( 

53 "notes", 

54 InvenTree.fields.InvenTreeNotesField( 

55 blank=True, 

56 help_text="Markdown notes (optional)", 

57 max_length=50000, 

58 null=True, 

59 verbose_name="Notes", 

60 ), 

61 ), 

62 ( 

63 "barcode_data", 

64 models.CharField( 

65 blank=True, 

66 help_text="Third party barcode data", 

67 max_length=500, 

68 verbose_name="Barcode Data", 

69 ), 

70 ), 

71 ( 

72 "barcode_hash", 

73 models.CharField( 

74 blank=True, 

75 help_text="Unique hash of barcode data", 

76 max_length=128, 

77 verbose_name="Barcode Hash", 

78 ), 

79 ), 

80 ( 

81 "description", 

82 models.CharField( 

83 blank=True, 

84 help_text="Order description (optional)", 

85 max_length=250, 

86 verbose_name="Description", 

87 ), 

88 ), 

89 ( 

90 "link", 

91 InvenTree.fields.InvenTreeURLField( 

92 blank=True, 

93 help_text="Link to external page", 

94 max_length=2000, 

95 verbose_name="Link", 

96 ), 

97 ), 

98 ( 

99 "start_date", 

100 models.DateField( 

101 blank=True, 

102 help_text="Scheduled start date for this order", 

103 null=True, 

104 verbose_name="Start date", 

105 ), 

106 ), 

107 ( 

108 "target_date", 

109 models.DateField( 

110 blank=True, 

111 help_text="Expected date for order delivery. Order will be overdue after this date.", 

112 null=True, 

113 verbose_name="Target Date", 

114 ), 

115 ), 

116 ( 

117 "creation_date", 

118 models.DateField( 

119 blank=True, null=True, verbose_name="Creation Date" 

120 ), 

121 ), 

122 ( 

123 "issue_date", 

124 models.DateField( 

125 blank=True, 

126 help_text="Date order was issued", 

127 null=True, 

128 verbose_name="Issue Date", 

129 ), 

130 ), 

131 ( 

132 "reference", 

133 models.CharField( 

134 default=order.validators.generate_next_transfer_order_reference, 

135 help_text="Transfer Order Reference", 

136 max_length=64, 

137 unique=True, 

138 validators=[order.validators.validate_transfer_order_reference], 

139 verbose_name="Reference", 

140 ), 

141 ), 

142 ( 

143 "consume", 

144 models.BooleanField( 

145 default=False, 

146 help_text='Rather than transfer the stock to the destination, "consume" it, by removing transferred quantity from the allocated stock item', 

147 verbose_name="Consume Stock", 

148 ), 

149 ), 

150 ( 

151 "complete_date", 

152 models.DateField( 

153 blank=True, 

154 help_text="Date order was completed", 

155 null=True, 

156 verbose_name="Completion Date", 

157 ), 

158 ), 

159 ( 

160 "status_custom_key", 

161 generic.states.fields.ExtraInvenTreeCustomStatusModelField( 

162 blank=True, 

163 default=None, 

164 help_text="Additional status information for this item", 

165 null=True, 

166 validators=[ 

167 generic.states.validators.CustomStatusCodeValidator( 

168 status_class=order.status_codes.TransferOrderStatus 

169 ) 

170 ], 

171 verbose_name="Custom status key", 

172 ), 

173 ), 

174 ( 

175 "status", 

176 generic.states.fields.InvenTreeCustomStatusModelField( 

177 choices=[ 

178 (10, "Pending"), 

179 (20, "Issued"), 

180 (25, "On Hold"), 

181 (30, "Complete"), 

182 (40, "Cancelled"), 

183 ], 

184 default=10, 

185 help_text="Transfer order status", 

186 validators=[ 

187 generic.states.validators.CustomStatusCodeValidator( 

188 status_class=order.status_codes.TransferOrderStatus 

189 ) 

190 ], 

191 verbose_name="Status", 

192 ), 

193 ), 

194 ( 

195 "address", 

196 models.ForeignKey( 

197 blank=True, 

198 help_text="Company address for this order", 

199 null=True, 

200 on_delete=django.db.models.deletion.SET_NULL, 

201 related_name="+", 

202 to="company.address", 

203 verbose_name="Address", 

204 ), 

205 ), 

206 ( 

207 "contact", 

208 models.ForeignKey( 

209 blank=True, 

210 help_text="Point of contact for this order", 

211 null=True, 

212 on_delete=django.db.models.deletion.SET_NULL, 

213 related_name="+", 

214 to="company.contact", 

215 verbose_name="Contact", 

216 ), 

217 ), 

218 ( 

219 "created_by", 

220 models.ForeignKey( 

221 blank=True, 

222 null=True, 

223 on_delete=django.db.models.deletion.SET_NULL, 

224 related_name="+", 

225 to=settings.AUTH_USER_MODEL, 

226 verbose_name="Created By", 

227 ), 

228 ), 

229 ( 

230 "destination", 

231 models.ForeignKey( 

232 blank=True, 

233 help_text="Destination for transferred items", 

234 null=True, 

235 on_delete=django.db.models.deletion.SET_NULL, 

236 related_name="incoming_transfers", 

237 to="stock.stocklocation", 

238 verbose_name="Destination Location", 

239 ), 

240 ), 

241 ( 

242 "project_code", 

243 models.ForeignKey( 

244 blank=True, 

245 help_text="Select project code for this order", 

246 null=True, 

247 on_delete=django.db.models.deletion.SET_NULL, 

248 to="common.projectcode", 

249 verbose_name="Project Code", 

250 ), 

251 ), 

252 ( 

253 "responsible", 

254 models.ForeignKey( 

255 blank=True, 

256 help_text="User or group responsible for this order", 

257 null=True, 

258 on_delete=django.db.models.deletion.SET_NULL, 

259 related_name="+", 

260 to="users.owner", 

261 verbose_name="Responsible", 

262 ), 

263 ), 

264 ( 

265 "take_from", 

266 models.ForeignKey( 

267 blank=True, 

268 help_text="Source for transferred items", 

269 null=True, 

270 on_delete=django.db.models.deletion.SET_NULL, 

271 related_name="sourcing_transfers", 

272 to="stock.stocklocation", 

273 verbose_name="Source Location", 

274 ), 

275 ), 

276 ( 

277 "updated_at", 

278 models.DateTimeField( 

279 blank=True, 

280 help_text="Timestamp of last update", 

281 null=True, 

282 verbose_name="Updated At", 

283 ), 

284 ) 

285 ], 

286 options={ 

287 "verbose_name": "Transfer Order", 

288 }, 

289 bases=( 

290 generic.states.states.StatusCodeMixin, 

291 generic.states.transition.StateTransitionMixin, 

292 InvenTree.models.InvenTreeAttachmentMixin, 

293 InvenTree.models.InvenTreePermissionCheckMixin, 

294 InvenTree.models.ContentTypeMixin, 

295 InvenTree.models.PluginValidationMixin, 

296 models.Model, 

297 ), 

298 ), 

299 migrations.CreateModel( 

300 name="TransferOrderLineItem", 

301 fields=[ 

302 ( 

303 "id", 

304 models.AutoField( 

305 auto_created=True, 

306 primary_key=True, 

307 serialize=False, 

308 verbose_name="ID", 

309 ), 

310 ), 

311 ( 

312 "metadata", 

313 models.JSONField( 

314 blank=True, 

315 help_text="JSON metadata field, for use by external plugins", 

316 null=True, 

317 verbose_name="Plugin Metadata", 

318 ), 

319 ), 

320 ( 

321 "quantity", 

322 InvenTree.fields.RoundingDecimalField( 

323 decimal_places=5, 

324 default=1, 

325 help_text="Item quantity", 

326 max_digits=15, 

327 validators=[django.core.validators.MinValueValidator(0)], 

328 verbose_name="Quantity", 

329 ), 

330 ), 

331 ( 

332 "reference", 

333 models.CharField( 

334 blank=True, 

335 help_text="Line item reference", 

336 max_length=100, 

337 verbose_name="Reference", 

338 ), 

339 ), 

340 ( 

341 "notes", 

342 models.CharField( 

343 blank=True, 

344 help_text="Line item notes", 

345 max_length=500, 

346 verbose_name="Notes", 

347 ), 

348 ), 

349 ( 

350 "link", 

351 InvenTree.fields.InvenTreeURLField( 

352 blank=True, 

353 help_text="Link to external page", 

354 max_length=2000, 

355 verbose_name="Link", 

356 ), 

357 ), 

358 ( 

359 "target_date", 

360 models.DateField( 

361 blank=True, 

362 help_text="Target date for this line item (leave blank to use the target date from the order)", 

363 null=True, 

364 verbose_name="Target Date", 

365 ), 

366 ), 

367 ( 

368 "order", 

369 models.ForeignKey( 

370 help_text="Transfer Order", 

371 on_delete=django.db.models.deletion.CASCADE, 

372 related_name="lines", 

373 to="order.transferorder", 

374 verbose_name="Order", 

375 ), 

376 ), 

377 ( 

378 "part", 

379 models.ForeignKey( 

380 help_text="Part", 

381 null=True, 

382 on_delete=django.db.models.deletion.SET_NULL, 

383 related_name="transfer_order_line_items", 

384 to="part.part", 

385 verbose_name="Part", 

386 ), 

387 ), 

388 ( 

389 "project_code", 

390 models.ForeignKey( 

391 blank=True, 

392 help_text="Select project code for this order", 

393 null=True, 

394 on_delete=django.db.models.deletion.SET_NULL, 

395 to="common.projectcode", 

396 verbose_name="Project Code", 

397 ), 

398 ), 

399 ( 

400 "transferred", 

401 InvenTree.fields.RoundingDecimalField( 

402 decimal_places=5, 

403 default=0, 

404 help_text="transferred quantity", 

405 max_digits=15, 

406 validators=[django.core.validators.MinValueValidator(0)], 

407 verbose_name="transferred", 

408 ), 

409 ), 

410 ( 

411 "line", 

412 models.CharField( 

413 blank=True, 

414 default="", 

415 help_text="Line number for this item (optional)", 

416 max_length=20, 

417 verbose_name="Line Number", 

418 ), 

419 ) 

420 ], 

421 options={ 

422 "verbose_name": "Transfer Order Line Item", 

423 }, 

424 bases=( 

425 InvenTree.models.ContentTypeMixin, 

426 InvenTree.models.PluginValidationMixin, 

427 models.Model, 

428 ), 

429 ), 

430 migrations.CreateModel( 

431 name="TransferOrderAllocation", 

432 fields=[ 

433 ( 

434 "id", 

435 models.AutoField( 

436 auto_created=True, 

437 primary_key=True, 

438 serialize=False, 

439 verbose_name="ID", 

440 ), 

441 ), 

442 ( 

443 "quantity", 

444 InvenTree.fields.RoundingDecimalField( 

445 decimal_places=5, 

446 default=1, 

447 help_text="Enter stock allocation quantity", 

448 max_digits=15, 

449 validators=[django.core.validators.MinValueValidator(0)], 

450 verbose_name="Quantity", 

451 ), 

452 ), 

453 ( 

454 "item", 

455 models.ForeignKey( 

456 help_text="Select stock item to allocate", 

457 limit_choices_to={ 

458 "belongs_to": None, 

459 "part__virtual": False, 

460 "sales_order": None, 

461 }, 

462 on_delete=django.db.models.deletion.CASCADE, 

463 related_name="transfer_order_allocations", 

464 to="stock.stockitem", 

465 verbose_name="Item", 

466 ), 

467 ), 

468 ( 

469 "line", 

470 models.ForeignKey( 

471 on_delete=django.db.models.deletion.CASCADE, 

472 related_name="allocations", 

473 to="order.transferorderlineitem", 

474 verbose_name="Line", 

475 ), 

476 ), 

477 ], 

478 options={ 

479 "verbose_name": "Transfer Order Allocation", 

480 }, 

481 ), 

482 ]