summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.net>2017-10-04 00:27:34 +0200
committerRené 'Necoro' Neumann <necoro@necoro.net>2017-10-04 00:27:34 +0200
commit4427fea489c74158b0c6f33451ec74282f3a2c7e (patch)
tree157c719fb543179ea7193d430e8d9377dad88c3a
parentcea032ecb83a589be94860f6045c55533237c529 (diff)
downloadarchivist-4427fea489c74158b0c6f33451ec74282f3a2c7e.tar.gz
archivist-4427fea489c74158b0c6f33451ec74282f3a2c7e.tar.bz2
archivist-4427fea489c74158b0c6f33451ec74282f3a2c7e.zip
Implement storing and opening saved documents
-rw-r--r--archivist/cli.py48
-rw-r--r--archivist/model.py8
2 files changed, 55 insertions, 1 deletions
diff --git a/archivist/cli.py b/archivist/cli.py
index 9299c94..fee0cd9 100644
--- a/archivist/cli.py
+++ b/archivist/cli.py
@@ -1,8 +1,10 @@
import click
import os
+import sys
from functools import reduce
import operator as op
+import pathlib
from .virtual_prefixes import query as query_virtual, is_virtual, register_prefixes
from .utils import ProxyCommand
@@ -263,6 +265,52 @@ def add_doc(file, tags, create_tags, ignore_missing_tags):
Document.create_from_file(file, tags, direction = Document.Direction.IN, mimetype = mimetype)
+@doc.command('store')
+@click.argument('id', type=int)
+@click.argument('path', type=click.Path(file_okay=True, dir_okay=True, writable=True, allow_dash=True))
+@click.option('--parents', '-p', is_flag=True, help = "Create intermediate directories, if needed.")
+def store_doc(id, path, parents):
+ from .model import Document
+
+ try:
+ d = Document.get(id = id)
+ except Document.DoesNotExist:
+ print("Document with ID #%s does not exist" % id)
+ return
+
+ if path in (b'-', '-'):
+ click.get_binary_stream('stdout').write(d.content.blob)
+ else:
+ p = pathlib.Path(path)
+ if p.is_dir():
+ p = p / d.path.name
+
+ if parents:
+ p.parent.mkdir(parents=True)
+ elif not p.parent.exists():
+ raise click.UsageError("Directory %s does not exist (use option '-p'?)." % p.parent)
+
+ with p.open(mode='wb') as f:
+ f.write(d.content.blob)
+
+@doc.command('open')
+@click.argument('id', type=int)
+def open_doc(id):
+ from .model import Document
+ import tempfile
+
+ try:
+ d = Document.get(id = id)
+ except Document.DoesNotExist:
+ print("Document with ID #%s does not exist" % id)
+ return
+
+ with tempfile.TemporaryDirectory() as tmpdir:
+ filename = pathlib.Path(tmpdir, d.path.name)
+ with filename.open('xb') as outfile:
+ outfile.write(d.content.blob)
+ click.launch(str(filename), wait=True)
+
@doc.command('find')
@click.argument('tags', type=TAG, nargs=-1)
def find_doc(tags):
diff --git a/archivist/model.py b/archivist/model.py
index 8aa8897..d660218 100644
--- a/archivist/model.py
+++ b/archivist/model.py
@@ -3,6 +3,8 @@ from playhouse.fields import CompressedField as _CompressedField
from playhouse.hybrid import *
from playhouse.sqlite_ext import SqliteExtDatabase, ClosureTable
+import pathlib
+
import datetime
from enum import Enum, unique
from pkg_resources import resource_filename
@@ -86,7 +88,7 @@ class Document(BaseModel):
content = DocumentContent.create(blob=from_file.read())
doc = cls.create(content = content,
- original_path = from_file.name,
+ original_path = pathlib.PurePath(from_file.name).as_posix(),
**kwargs)
for t in tags:
@@ -94,6 +96,10 @@ class Document(BaseModel):
return doc
+ @property
+ def path(self):
+ return pathlib.PurePosixPath(self.original_path)
+
@table
class Prefix(BaseModel):
__keys__ = ('name',)