Skip to content

Commit

Permalink
Support Paperless-NG
Browse files Browse the repository at this point in the history
Related: #18
  • Loading branch information
bauerj committed Dec 7, 2020
1 parent be5be43 commit c5e1038
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 46 deletions.
100 changes: 69 additions & 31 deletions lib/api.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:json_annotation/json_annotation.dart';

Expand All @@ -12,7 +11,8 @@ class Correspondent {
int id;
String name;

factory Correspondent.fromJson(Map<String, dynamic> json) => _$CorrespondentFromJson(json);
factory Correspondent.fromJson(Map<String, dynamic> json) =>
_$CorrespondentFromJson(json);
}

@JsonSerializable()
Expand All @@ -23,25 +23,57 @@ class Tag {
int colour;

factory Tag.fromJson(Map<String, dynamic> json) => _$TagFromJson(json);

}

@JsonSerializable(fieldRename: FieldRename.snake)
class Document {
Document();
int id;
String correspondent;
int correspondent;
String title;
String content;
List<String> tags;
List<int> tags;
String checksum;
DateTime created;
DateTime modified;
String fileName;
String thumbnailUrl;
String downloadUrl;

factory Document.fromJson(Map<String, dynamic> json) => _$DocumentFromJson(json);
factory Document.fromJson(Map<String, dynamic> json) =>
_$DocumentFromJson(json);

String getThumbnailUrl() {
return "${API.instance.baseURL}/fetch/thumb/$id";
}

String getDownloadUrl() {
return "${API.instance.baseURL}/fetch/doc/$id";
}
}

@JsonSerializable(fieldRename: FieldRename.snake)
class OgDocument extends Document {
OgDocument();

static int _idFromUrl(String url) {
return url == null ? null : _idsFromUrls([url])[0];
}

static List<int> _idsFromUrls(List<dynamic> urls) {
List<int> ids = new List();
for (String url in urls) {
var parts = url.split("/");
ids.add(int.parse(parts[parts.length - 2]));
}
return ids;
}

@JsonKey(fromJson: _idFromUrl)
int correspondent;
@JsonKey(fromJson: _idsFromUrls)
List<int> tags;

factory OgDocument.fromJson(Map<String, dynamic> json) =>
_$OgDocumentFromJson(json);
}

@JsonSerializable()
Expand All @@ -52,7 +84,8 @@ class ResponseList<T> {
@_Converter()
List<T> results;

factory ResponseList.fromJson(Map<String, dynamic> json) => _$ResponseListFromJson(json);
factory ResponseList.fromJson(Map<String, dynamic> json) =>
_$ResponseListFromJson(json);

bool hasMoreData() {
return next != null;
Expand All @@ -62,26 +95,29 @@ class ResponseList<T> {
var json = await API.instance.get(next);
return ResponseList<T>.fromJson(json);
}

}

class _Converter<T> implements JsonConverter<T, Object> {
const _Converter();

@override
T fromJson(Object json) {
if (json is Map<String, dynamic> &&
json.containsKey('checksum')) {
return Document.fromJson(json) as T;
if (json is Map<String, dynamic> && json.containsKey('colour')) {
return Tag.fromJson(json) as T;
}
if (json is Map<String, dynamic> && json.containsKey('name')) {
return Correspondent.fromJson(json) as T;
}
if (json is Map<String, dynamic> &&
json.containsKey('colour')) {
return Tag.fromJson(json) as T;
json.containsKey('correspondent') &&
!json.containsKey("thumbnail_url")) {
return Document.fromJson(json) as T;
}
if (json is Map<String, dynamic> &&
json.containsKey('name')) {
return Correspondent.fromJson(json) as T;
json.containsKey('correspondent')) {
return OgDocument.fromJson(json) as T;
}

// This will only work if `json` is a native JSON type:
// num, String, bool, null, etc
// *and* is assignable to `T`.
Expand All @@ -105,7 +141,7 @@ class API {
String authString;
final Dio dio = new Dio();

API(String baseURL, {this.username="", this.password=""}) {
API(String baseURL, {this.username = "", this.password = ""}) {
authString = getAuthString(username, password);
dio.options.headers.addAll({"Authorization": authString});

Expand Down Expand Up @@ -142,13 +178,15 @@ class API {
return url;
}

Future<Map<String, dynamic>> getAPIResource(String resourceType, {String ordering, String search}) async {
Future<Map<String, dynamic>> getAPIResource(String resourceType,
{String ordering, String search}) async {
String url = "/api/" + resourceType + "/?format=json";
print(url);
if (ordering != null) {
url += "&ordering="+ordering;
url += "&ordering=" + ordering;
}
if (search != null) {
url += "&search="+search;
url += "&search=" + search;
}
return await get(url);
}
Expand All @@ -159,8 +197,10 @@ class API {
return response.data;
}

Future<ResponseList<Document>> getDocuments({String ordering="-created", String search}) async {
var json = await getAPIResource("documents", ordering: ordering, search: search);
Future<ResponseList<Document>> getDocuments(
{String ordering = "-created", String search}) async {
var json =
await getAPIResource("documents", ordering: ordering, search: search);
return ResponseList<Document>.fromJson(json);
}

Expand All @@ -174,21 +214,19 @@ class API {
return ResponseList<Tag>.fromJson(json);
}

Future<void> downloadFile(String url, String savePath, {ProgressCallback onReceiveProgress}) async {
Future<void> downloadFile(String url, String savePath,
{ProgressCallback onReceiveProgress}) async {
url = getFullURL(url);
await dio.download(url, savePath, onReceiveProgress: onReceiveProgress);
}

Future<void> uploadFile(String path) async {
FormData formData = new FormData.fromMap({
"document": await MultipartFile.fromFile(path)
});
FormData formData =
new FormData.fromMap({"document": await MultipartFile.fromFile(path)});
try {
await dio.post(getFullURL("/push"), data: formData);
}
catch (e) {
} catch (e) {
print(e.toString());
}
}

}
}
6 changes: 2 additions & 4 deletions lib/routes/documents_route.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import 'package:intl/date_symbol_data_local.dart';
import 'package:paperless_app/scan.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:edge_detection/edge_detection.dart';

import 'package:paperless_app/routes/server_details_route.dart';
import 'package:paperless_app/routes/settings_route.dart';
Expand Down Expand Up @@ -209,9 +208,8 @@ class _DocumentsRouteState extends State<DocumentsRoute> {
fit: BoxFit.cover,
height: 200,
width: double.infinity,
imageUrl: API.instance.baseURL +
documents
.results[index].thumbnailUrl,
imageUrl: documents.results[index]
.getThumbnailUrl(),
httpHeaders: {
"Authorization":
API.instance.authString
Expand Down
6 changes: 2 additions & 4 deletions lib/widgets/correspondent_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,14 @@ class CorrespondentWidget extends StatelessWidget {

CorrespondentWidget(this.correspondent);

static CorrespondentWidget fromCorrespondentId(String _correspondentId, ResponseList<Correspondent> correspondents) {
static CorrespondentWidget fromCorrespondentId(int _correspondentId, ResponseList<Correspondent> correspondents) {
if (correspondents == null || _correspondentId == null) {
Correspondent correspondent = Correspondent();
correspondent.name = "";
return new CorrespondentWidget(correspondent);
}
var parts = _correspondentId.split("/");
int correspondentId = int.parse(parts[parts.length - 2]);
for (var _correspondent in correspondents.results) {
if (_correspondent.id == correspondentId) {
if (_correspondent.id == _correspondentId) {
return CorrespondentWidget(_correspondent);
}
}
Expand Down
7 changes: 4 additions & 3 deletions lib/widgets/online_pdf_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,17 @@ class _OnlinePdfDialogState extends State<OnlinePdfDialog> {
}

static Future<String> getDownloadPath(Document doc) async {
final fileType = doc.fileName.split(".").last;
String fileName = doc.fileName ?? "x.pdf";
final fileType = fileName.split(".").last;
final tempDir = await getTemporaryDirectory();
return '${tempDir.path}/${doc.checksum}.$fileType';
return '${tempDir.path}/${doc.id}.$fileType';
}

void downloadDocument() async {
final pdfPath = await getDownloadPath(doc);

if (!await io.File(pdfPath).exists()) {
await API.instance.downloadFile(doc.downloadUrl, pdfPath,
await API.instance.downloadFile(doc.getDownloadUrl(), pdfPath,
onReceiveProgress: onReceiveProgress);
}

Expand Down
6 changes: 2 additions & 4 deletions lib/widgets/tag_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,15 @@ class TagWidget extends StatelessWidget {

TagWidget(this.tag);

static TagWidget fromTagId(String _tagId, ResponseList<Tag> tags) {
static TagWidget fromTagId(int _tagId, ResponseList<Tag> tags) {
if (tags == null) {
Tag tag = Tag();
tag.name = "...";
tag.colour = 1;
return new TagWidget(tag);
}
var parts = _tagId.split("/");
int tagId = int.parse(parts[parts.length - 2]);
for (var _tag in tags.results) {
if (_tag.id == tagId) {
if (_tag.id == _tagId) {
return TagWidget(_tag);
}
}
Expand Down

0 comments on commit c5e1038

Please sign in to comment.