double check that volume is still around, only flag files as missing
This commit is contained in:
parent
ee315399bb
commit
8928b5447b
3 changed files with 66 additions and 14 deletions
|
@ -556,6 +556,11 @@ class Item(db.Model):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def missing_file(self):
|
||||||
|
logger.debug('file is missing! %s: %s', self.id, self.get_path())
|
||||||
|
self.info['missing'] = True
|
||||||
|
state.db.session.add(self)
|
||||||
|
|
||||||
def remove_file(self):
|
def remove_file(self):
|
||||||
for f in self.files.all():
|
for f in self.files.all():
|
||||||
path = f.fullpath()
|
path = f.fullpath()
|
||||||
|
|
|
@ -29,10 +29,11 @@ def remove_missing(books=None):
|
||||||
dirty = False
|
dirty = False
|
||||||
logger.debug('remove missing')
|
logger.debug('remove missing')
|
||||||
prefix = get_prefix()
|
prefix = get_prefix()
|
||||||
|
oml_prefix = os.path.dirname(prefix)
|
||||||
if books is None:
|
if books is None:
|
||||||
books = collect_books(prefix)
|
books = collect_books(prefix)
|
||||||
with db.session():
|
with db.session():
|
||||||
if os.path.exists(prefix):
|
if os.path.exists(prefix) and os.path.exists(oml_prefix):
|
||||||
logger.debug('scan for removed files')
|
logger.debug('scan for removed files')
|
||||||
db_paths = []
|
db_paths = []
|
||||||
items = {}
|
items = {}
|
||||||
|
@ -44,27 +45,33 @@ def remove_missing(books=None):
|
||||||
if f.item:
|
if f.item:
|
||||||
items[path] = f.sha1
|
items[path] = f.sha1
|
||||||
else:
|
else:
|
||||||
|
logger.debug('remove orphaned file %s', f)
|
||||||
state.db.session.delete(f)
|
state.db.session.delete(f)
|
||||||
dirty = True
|
dirty = True
|
||||||
if dirty:
|
if dirty:
|
||||||
state.db.session.commit()
|
state.db.session.commit()
|
||||||
dirty = False
|
dirty = False
|
||||||
nfd_books = {unicodedata.normalize('NFD', path) for path in books}
|
nfc_books = {unicodedata.normalize('NFC', path) for path in books}
|
||||||
removed = [
|
removed = [
|
||||||
path for path in db_paths
|
path for path in db_paths
|
||||||
if unicodedata.normalize('NFD', path) not in nfd_books
|
if unicodedata.normalize('NFC', path) not in nfc_books
|
||||||
]
|
]
|
||||||
if removed:
|
if removed and os.path.exists(prefix) and os.path.exists(oml_prefix):
|
||||||
logger.debug('%s files removed', len(removed))
|
logger.debug('%s files removed', len(removed))
|
||||||
ids = [items[path] for path in removed]
|
ids = [items[path] for path in removed]
|
||||||
|
if ids:
|
||||||
orphaned = set(ids)
|
orphaned = set(ids)
|
||||||
for i in Item.query.filter(Item.id.in_(ids)):
|
for i in Item.query.filter(Item.id.in_(ids)):
|
||||||
i.remove_file()
|
if state.shutdown:
|
||||||
|
continue
|
||||||
|
i.missing_file()
|
||||||
orphaned.remove(i.id)
|
orphaned.remove(i.id)
|
||||||
dirty = True
|
dirty = True
|
||||||
if orphaned:
|
if orphaned:
|
||||||
logger.debug('%s files orphaned', len(orphaned))
|
logger.debug('%s files orphaned', len(orphaned))
|
||||||
for f in File.query.filter(File.sha1.in_(orphaned)):
|
for f in File.query.filter(File.sha1.in_(orphaned)):
|
||||||
|
if state.shutdown:
|
||||||
|
continue
|
||||||
state.db.session.delete(f)
|
state.db.session.delete(f)
|
||||||
dirty = True
|
dirty = True
|
||||||
if dirty:
|
if dirty:
|
||||||
|
@ -182,6 +189,10 @@ def run_scan():
|
||||||
add_record('edititem', item.id, item.meta)
|
add_record('edititem', item.id, item.meta)
|
||||||
item.update()
|
item.update()
|
||||||
added += 1
|
added += 1
|
||||||
|
if file and file.item.info.get('missing'):
|
||||||
|
logger.debug('missing file showed up again %s: %s', id, file.fullpath())
|
||||||
|
del file.item.info['missing']
|
||||||
|
file.item.save()
|
||||||
if file and not file.item.added:
|
if file and not file.item.added:
|
||||||
file.item.added = datetime.utcnow()
|
file.item.added = datetime.utcnow()
|
||||||
if file.item.accessed:
|
if file.item.accessed:
|
||||||
|
|
|
@ -256,6 +256,42 @@ oml.ui.infoView = function(externalData, isMixed) {
|
||||||
],
|
],
|
||||||
float: 'right'
|
float: 'right'
|
||||||
})
|
})
|
||||||
|
: data.missing
|
||||||
|
? Ox.FormElementGroup({
|
||||||
|
elements: [
|
||||||
|
Ox.Button({
|
||||||
|
style: 'squared',
|
||||||
|
title: Ox._('Book Missing'),
|
||||||
|
width: 112
|
||||||
|
})
|
||||||
|
.bindEvent({
|
||||||
|
click: function() {
|
||||||
|
if (!oml.readOnly) {
|
||||||
|
oml.api.openFolder({id: oml.user.ui.item});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
Ox.MenuButton({
|
||||||
|
items: [
|
||||||
|
].concat(oml.readOnly ? [] : [
|
||||||
|
{id: 'show', title: Ox._('Show File')}
|
||||||
|
]),
|
||||||
|
overlap: 'left',
|
||||||
|
style: 'squared',
|
||||||
|
title: 'select',
|
||||||
|
tooltip: Ox._('File was removed'),
|
||||||
|
type: 'image'
|
||||||
|
})
|
||||||
|
.bindEvent({
|
||||||
|
click: function(data_) {
|
||||||
|
if (!oml.readOnly) {
|
||||||
|
oml.api.openFolder({id: oml.user.ui.item});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
],
|
||||||
|
float: 'right'
|
||||||
|
})
|
||||||
: Ox.FormElementGroup({
|
: Ox.FormElementGroup({
|
||||||
elements: [
|
elements: [
|
||||||
Ox.Button({
|
Ox.Button({
|
||||||
|
|
Loading…
Reference in a new issue