mirror of
https://github.com/HendrikRauh/inventree-app.git
synced 2026-01-13 03:26:24 +00:00
Attachments refactor (#737)
* refactor attachment code into its own file * Add getters * Remove custom models for each type of attachment * Refactor existing widgets * Fix double camera open bug * Remove dead code * Remove unused imports * Refactor common code * format * Update release notes
This commit is contained in:
parent
bb10117f01
commit
346b1a150f
15 changed files with 381 additions and 519 deletions
|
|
@ -1,5 +1,4 @@
|
|||
import "dart:async";
|
||||
import "dart:io";
|
||||
|
||||
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
|
||||
import "package:flutter/material.dart";
|
||||
|
|
@ -15,7 +14,6 @@ import "package:inventree/helpers.dart";
|
|||
import "package:inventree/inventree/sentry.dart";
|
||||
|
||||
import "package:inventree/widget/dialogs.dart";
|
||||
import "package:inventree/widget/fields.dart";
|
||||
|
||||
// Paginated response object
|
||||
class InvenTreePageResponse {
|
||||
|
|
@ -934,171 +932,3 @@ class InvenTreeUserSetting extends InvenTreeGlobalSetting {
|
|||
@override
|
||||
String get URL => "settings/user/";
|
||||
}
|
||||
|
||||
class InvenTreeAttachment extends InvenTreeModel {
|
||||
// Class representing an "attachment" file
|
||||
InvenTreeAttachment() : super();
|
||||
|
||||
InvenTreeAttachment.fromJson(Map<String, dynamic> json)
|
||||
: super.fromJson(json);
|
||||
|
||||
@override
|
||||
String get URL => "attachment/";
|
||||
|
||||
@override
|
||||
Map<String, Map<String, dynamic>> formFields() {
|
||||
Map<String, Map<String, dynamic>> fields = {"link": {}, "comment": {}};
|
||||
|
||||
if (!hasLink) {
|
||||
fields.remove("link");
|
||||
}
|
||||
|
||||
return fields;
|
||||
}
|
||||
|
||||
// Override this reference field for any subclasses
|
||||
// Note: This is used for the *legacy* attachment API
|
||||
String get REFERENCE_FIELD => "";
|
||||
|
||||
// Override this reference field for any subclasses
|
||||
// Note: This is used for the *modern* attachment API
|
||||
String get REF_MODEL_TYPE => "";
|
||||
|
||||
String get attachment => getString("attachment");
|
||||
|
||||
bool get hasAttachment => attachment.isNotEmpty;
|
||||
|
||||
// Return the filename of the attachment
|
||||
String get filename {
|
||||
return attachment.split("/").last;
|
||||
}
|
||||
|
||||
IconData get icon {
|
||||
String fn = filename.toLowerCase();
|
||||
|
||||
if (fn.endsWith(".pdf")) {
|
||||
return TablerIcons.file_type_pdf;
|
||||
} else if (fn.endsWith(".csv")) {
|
||||
return TablerIcons.file_type_csv;
|
||||
} else if (fn.endsWith(".doc") || fn.endsWith(".docx")) {
|
||||
return TablerIcons.file_type_doc;
|
||||
} else if (fn.endsWith(".xls") || fn.endsWith(".xlsx")) {
|
||||
return TablerIcons.file_type_xls;
|
||||
}
|
||||
|
||||
// Image formats
|
||||
final List<String> img_formats = [".png", ".jpg", ".gif", ".bmp", ".svg"];
|
||||
|
||||
for (String fmt in img_formats) {
|
||||
if (fn.endsWith(fmt)) {
|
||||
return TablerIcons.file_type_jpg;
|
||||
}
|
||||
}
|
||||
|
||||
return TablerIcons.file;
|
||||
}
|
||||
|
||||
String get comment => getString("comment");
|
||||
|
||||
DateTime? get uploadDate {
|
||||
if (jsondata.containsKey("upload_date")) {
|
||||
return DateTime.tryParse((jsondata["upload_date"] ?? "") as String);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Return a count of how many attachments exist against the specified model ID
|
||||
Future<int> countAttachments(int modelId) {
|
||||
Map<String, String> filters = {};
|
||||
|
||||
if (InvenTreeAPI().supportsModernAttachments) {
|
||||
filters["model_type"] = REF_MODEL_TYPE;
|
||||
filters["model_id"] = modelId.toString();
|
||||
} else {
|
||||
filters[REFERENCE_FIELD] = modelId.toString();
|
||||
}
|
||||
|
||||
return count(filters: filters);
|
||||
}
|
||||
|
||||
Future<bool> uploadAttachment(
|
||||
File attachment,
|
||||
int modelId, {
|
||||
String comment = "",
|
||||
Map<String, String> fields = const {},
|
||||
}) async {
|
||||
// Ensure that the correct reference field is set
|
||||
Map<String, String> data = Map<String, String>.from(fields);
|
||||
|
||||
String url = URL;
|
||||
|
||||
if (comment.isNotEmpty) {
|
||||
data["comment"] = comment;
|
||||
}
|
||||
|
||||
if (InvenTreeAPI().supportsModernAttachments) {
|
||||
url = "attachment/";
|
||||
data["model_id"] = modelId.toString();
|
||||
data["model_type"] = REF_MODEL_TYPE;
|
||||
} else {
|
||||
if (REFERENCE_FIELD.isEmpty) {
|
||||
sentryReportMessage(
|
||||
"uploadAttachment called with empty 'REFERENCE_FIELD'",
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
data[REFERENCE_FIELD] = modelId.toString();
|
||||
}
|
||||
|
||||
final APIResponse response = await InvenTreeAPI().uploadFile(
|
||||
url,
|
||||
attachment,
|
||||
method: "POST",
|
||||
name: "attachment",
|
||||
fields: data,
|
||||
);
|
||||
|
||||
return response.successful();
|
||||
}
|
||||
|
||||
Future<bool> uploadImage(int modelId, {String prefix = "InvenTree"}) async {
|
||||
bool result = false;
|
||||
|
||||
await FilePickerDialog.pickImageFromCamera().then((File? file) {
|
||||
if (file != null) {
|
||||
String dir = path.dirname(file.path);
|
||||
String ext = path.extension(file.path);
|
||||
String now = DateTime.now().toIso8601String().replaceAll(":", "-");
|
||||
|
||||
// Rename the file with a unique name
|
||||
String filename = "${dir}/${prefix}_image_${now}${ext}";
|
||||
|
||||
try {
|
||||
file.rename(filename).then((File renamed) {
|
||||
uploadAttachment(renamed, modelId).then((success) {
|
||||
result = success;
|
||||
showSnackIcon(
|
||||
result ? L10().imageUploadSuccess : L10().imageUploadFailure,
|
||||
success: result,
|
||||
);
|
||||
});
|
||||
});
|
||||
} catch (error, stackTrace) {
|
||||
sentryReportError("uploadImage", error, stackTrace);
|
||||
showSnackIcon(L10().imageUploadFailure, success: false);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Download this attachment file
|
||||
*/
|
||||
Future<void> downloadAttachment() async {
|
||||
await InvenTreeAPI().downloadFile(attachment);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue