183 lines
5.6 KiB
Text
183 lines
5.6 KiB
Text
|
#!/usr/bin/env python3
|
||
|
# -*- coding: utf-8 -*-
|
||
|
#
|
||
|
# List System
|
||
|
# Copyright (C) 2011 Øyvind Jensen
|
||
|
#
|
||
|
# This program is free software: you can redistribute it and/or modify
|
||
|
# it under the terms of the GNU Affero General Public License as published by
|
||
|
# the Free Software Foundation, either version 3 of the License, or
|
||
|
# (at your option) any later version.
|
||
|
#
|
||
|
# This program is distributed in the hope that it will be useful,
|
||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
# GNU Affero General Public License for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU Affero General Public License
|
||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
import cmd
|
||
|
import shelve
|
||
|
import os
|
||
|
|
||
|
class CLI(cmd.Cmd):
|
||
|
|
||
|
|
||
|
header = 'Virtual Inventory Logger'
|
||
|
prompt = '> '
|
||
|
storage = None
|
||
|
snd = None
|
||
|
filename = 'registry'
|
||
|
unablemsg = 'Unable to complete operation'
|
||
|
|
||
|
def complete_most(self, text, line):
|
||
|
col = []
|
||
|
for key in self.storage.keys():
|
||
|
col.append(key)
|
||
|
for item in self.storage[key]:
|
||
|
col.append(item)
|
||
|
if text:
|
||
|
return [
|
||
|
key for key in col
|
||
|
if key.startswith(text)
|
||
|
]
|
||
|
else:
|
||
|
return col
|
||
|
|
||
|
def log(self, line):
|
||
|
os.system('journal ' + line)
|
||
|
|
||
|
def do_place(self, op):
|
||
|
'USAGE: place <name> <location>'
|
||
|
thinglocation = op.split()
|
||
|
thinglocation = self.strip(thinglocation)
|
||
|
if len(thinglocation) == 2:
|
||
|
location = thinglocation[1]
|
||
|
name = thinglocation[0]
|
||
|
try:
|
||
|
self.storage[location]
|
||
|
except KeyError:
|
||
|
self.storage[location] = []
|
||
|
self.storage[location].append(name)
|
||
|
response = name + ' placed in ' + location
|
||
|
self.log(response)
|
||
|
else:
|
||
|
print(self.unablemsg)
|
||
|
|
||
|
def complete_place(self, text, line, start_index, end_index):
|
||
|
return self.complete_most(text, line)
|
||
|
|
||
|
def do_search(self, phrase):
|
||
|
'USAGE: search <name>'
|
||
|
found = False
|
||
|
if len(phrase) > 0:
|
||
|
for location in self.storage:
|
||
|
for item in self.storage[location]:
|
||
|
if phrase in item or item in phrase:
|
||
|
print(item + ' is located in ' + location)
|
||
|
found = True
|
||
|
if not found:
|
||
|
print(phrase + ' is nowhere to be found')
|
||
|
print('Please get one and put it somewhere')
|
||
|
else:
|
||
|
print(self.unablemsg)
|
||
|
|
||
|
def do_remove(self, op):
|
||
|
'USAGE: remove <name> <location>'
|
||
|
thinglocation = op.split()
|
||
|
thinglocation = self.strip(thinglocation)
|
||
|
if len(thinglocation) == 2:
|
||
|
location = thinglocation[1]
|
||
|
name = thinglocation[0]
|
||
|
try:
|
||
|
self.storage[location].remove(name)
|
||
|
if len(self.storage[location]) == 0:
|
||
|
self.storage.pop(location)
|
||
|
response = name + ' removed from ' + location
|
||
|
self.log(response)
|
||
|
except:
|
||
|
print(name + ' not found in ' + location)
|
||
|
else:
|
||
|
print(self.unablemsg)
|
||
|
|
||
|
def complete_remove(self, text, line, start_index, end_index):
|
||
|
return self.complete_most(text, line)
|
||
|
|
||
|
def do_move(self, op):
|
||
|
'USAGE: move <name> <from location> <to location>'
|
||
|
moveop = op.split()
|
||
|
moveop = self.strip(moveop)
|
||
|
if len(moveop) == 3:
|
||
|
name = moveop[0]
|
||
|
fromloc = moveop[1]
|
||
|
toloc = moveop[2]
|
||
|
self.do_remove(name + ' ' + fromloc)
|
||
|
self.do_place(name + ' ' + toloc)
|
||
|
#print(name + ' moved from ' + fromloc + ' to ' + toloc)
|
||
|
else:
|
||
|
print(self.unablemsg)
|
||
|
|
||
|
def complete_move(self, text, line, start_index, end_index):
|
||
|
return self.complete_most(text, line)
|
||
|
|
||
|
def do_list(self, location):
|
||
|
'USAGE: list <location>'
|
||
|
if len(location) > 0:
|
||
|
self.list_location(location)
|
||
|
else:
|
||
|
for onelocation in self.storage:
|
||
|
self.list_location(onelocation)
|
||
|
|
||
|
def complete_list(self, text, line, start_index, end_index):
|
||
|
return self.complete_most(text, line)
|
||
|
|
||
|
def do_journal(self, line):
|
||
|
'USAGE: journal <journal entry>'
|
||
|
os.system('journal ' + line)
|
||
|
|
||
|
def strip(self, tostrip):
|
||
|
words = ['in', 'from', 'inside', 'into']
|
||
|
for word in words:
|
||
|
if word in tostrip:
|
||
|
tostrip.remove(word)
|
||
|
return tostrip
|
||
|
|
||
|
def list_location(self, location):
|
||
|
print(location)
|
||
|
try:
|
||
|
if self.storage[location] is not None:
|
||
|
for item in self.storage[location]:
|
||
|
print('\t' + item)
|
||
|
except KeyError:
|
||
|
print('There is no place like ' + location)
|
||
|
|
||
|
def do_copyright(self, line):
|
||
|
print("Copyright (C) 2011- Øyvind Jensen")
|
||
|
|
||
|
def do_credits(self, line):
|
||
|
print("Author:")
|
||
|
print("Øyvind Jensen")
|
||
|
print("oyvind.jensen@protonmail.com")
|
||
|
|
||
|
def do_exit(self, line):
|
||
|
print('Be well..')
|
||
|
return True
|
||
|
|
||
|
def __init__(self):
|
||
|
cmd.Cmd.__init__(self)
|
||
|
self.storage = shelve.open(self.filename, writeback = True)
|
||
|
|
||
|
def do_EOF(self, line):
|
||
|
print()
|
||
|
return self.do_exit('')
|
||
|
|
||
|
def complete(self, text, state):
|
||
|
"""Add a whitespace after word completion"""
|
||
|
return cmd.Cmd.complete(self, text, state) + ' '
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
CLI().cmdloop()
|
||
|
|