mirror of
https://github.com/gryf/pygtktalog.git
synced 2025-12-17 11:30:19 +01:00
* Added models for files in searcher and search history.
* Added searcher method and add history elements. * Clean up files model. * Added some internal methods. * Code clean up.
This commit is contained in:
@@ -50,7 +50,12 @@ from utils.gthumb import GthumbCommentParser
|
||||
class MainModel(ModelMT):
|
||||
"""Create, load, save, manipulate db file which is container for data"""
|
||||
|
||||
__properties__ = {'busy': False, 'statusmsg': '', 'progress': 0}
|
||||
__properties__ = {'busy': False,
|
||||
'statusmsg': '',
|
||||
'progress': 0,
|
||||
# point from search controller - changes while user activate specified
|
||||
# file on search
|
||||
'point': None,}
|
||||
|
||||
# constants instead of dictionary tables
|
||||
# type of files
|
||||
@@ -99,22 +104,43 @@ class MainModel(ModelMT):
|
||||
self.busy = False
|
||||
self.statusmsg = "Idle"
|
||||
self.selected_tags = {}
|
||||
self.search_created = False
|
||||
|
||||
# Directory tree: id, name, icon, type
|
||||
self.discs_tree = gtk.TreeStore(gobject.TYPE_INT, gobject.TYPE_STRING,
|
||||
str, gobject.TYPE_INT)
|
||||
# File list of selected directory: is, filename, size,
|
||||
self.discs_tree = gtk.TreeStore(gobject.TYPE_INT,
|
||||
gobject.TYPE_STRING,
|
||||
str,
|
||||
gobject.TYPE_INT)
|
||||
# File list of selected directory: id, disc, filename, path, size,
|
||||
# date, type, icon
|
||||
self.files_list = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING,
|
||||
self.files_list = gtk.ListStore(gobject.TYPE_INT,
|
||||
gobject.TYPE_STRING,
|
||||
gobject.TYPE_STRING,
|
||||
gobject.TYPE_STRING,
|
||||
gobject.TYPE_UINT64,
|
||||
gobject.TYPE_STRING, gobject.TYPE_INT,
|
||||
gobject.TYPE_STRING, str)
|
||||
gobject.TYPE_STRING,
|
||||
gobject.TYPE_INT,
|
||||
str)
|
||||
# Search list. Exactly the same as file list above.
|
||||
self.search_list = gtk.ListStore(gobject.TYPE_INT,
|
||||
gobject.TYPE_STRING,
|
||||
gobject.TYPE_STRING,
|
||||
gobject.TYPE_STRING,
|
||||
gobject.TYPE_UINT64,
|
||||
gobject.TYPE_STRING,
|
||||
gobject.TYPE_INT,
|
||||
str)
|
||||
# iconview store - id, pixbuffer
|
||||
self.images_store = gtk.ListStore(gobject.TYPE_INT, gtk.gdk.Pixbuf)
|
||||
|
||||
# exif liststore - id, exif key, exif value
|
||||
self.exif_list = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING,
|
||||
gobject.TYPE_STRING)
|
||||
# search combobox liststore - entry
|
||||
self.search_history = gtk.ListStore(str)
|
||||
|
||||
# fill it
|
||||
self.__fill_history_model()
|
||||
|
||||
# tag cloud array element is a dict with 5 keys:
|
||||
# elem = {'id': str(id), 'name': tagname, 'size': size,
|
||||
@@ -126,6 +152,12 @@ class MainModel(ModelMT):
|
||||
self.tag_cloud = []
|
||||
return
|
||||
|
||||
def add_search_history(self, txt):
|
||||
"""add txt into search history, update search_history model"""
|
||||
self.config.add_search_history(txt)
|
||||
self.__fill_history_model()
|
||||
return
|
||||
|
||||
def add_tags(self, fid, tags):
|
||||
"""add tag (if not exists) and connect it with file"""
|
||||
for tag in tags.split(','):
|
||||
@@ -438,6 +470,7 @@ class MainModel(ModelMT):
|
||||
self.__connect_to_db()
|
||||
self.__create_database()
|
||||
self.__clear_trees()
|
||||
self.clear_search_tree()
|
||||
self.tag_cloud = []
|
||||
self.selected_tags = {}
|
||||
return
|
||||
@@ -463,6 +496,7 @@ class MainModel(ModelMT):
|
||||
self.filename = filename
|
||||
self.tag_cloud = []
|
||||
self.selected_tags = {}
|
||||
self.clear_search_tree()
|
||||
|
||||
try:
|
||||
tar = tarfile.open(filename, "r:gz")
|
||||
@@ -534,6 +568,106 @@ class MainModel(ModelMT):
|
||||
self.thread.start()
|
||||
return
|
||||
|
||||
def search(self, string):
|
||||
"""Get all children down from sepcified root"""
|
||||
self.clear_search_tree()
|
||||
id_filter = None
|
||||
sql_con = ""
|
||||
found = 0
|
||||
|
||||
if len(string) > 0:
|
||||
args = self.__postgresize(string)
|
||||
args = args.split()
|
||||
for arg in args:
|
||||
arg = "%" + arg + "%"
|
||||
sql_con += "AND (LOWER(filename) LIKE LOWER('%s')" % arg
|
||||
sql_con += " ESCAPE '\\' "
|
||||
sql_con += "OR LOWER(description) LIKE LOWER('%s')" % arg
|
||||
sql_con += " ESCAPE '\\' ) "
|
||||
|
||||
# directories
|
||||
if self.selected_tags:
|
||||
# we have tags selected, live with that
|
||||
id_filter = self.__filter2()
|
||||
if id_filter != None:
|
||||
if len(id_filter) == 1:
|
||||
id_filter = "(%d)" % id_filter[0]
|
||||
else:
|
||||
id_filter = str(tuple(id_filter))
|
||||
sql = """SELECT id, filename, size, date FROM files
|
||||
WHERE parent_id!=id
|
||||
AND parent_id!=1
|
||||
AND type=1
|
||||
AND id in """ + id_filter + sql_con + """
|
||||
ORDER BY filename"""
|
||||
|
||||
else:
|
||||
# alright, search throught all records
|
||||
sql = """SELECT id, filename, size, date FROM files
|
||||
WHERE parent_id!=id
|
||||
AND parent_id!=1
|
||||
AND type=1 """ + sql_con + """
|
||||
ORDER BY filename"""
|
||||
|
||||
if sql:
|
||||
self.db_cursor.execute(sql)
|
||||
data = self.db_cursor.fetchall()
|
||||
for row in data:
|
||||
found += 1
|
||||
myiter = self.search_list.insert_before(None, None)
|
||||
self.search_list.set_value(myiter, 0, row[0])
|
||||
self.search_list.set_value(myiter, 1,
|
||||
self.__get_file_root(row[0]))
|
||||
self.search_list.set_value(myiter, 2, row[1])
|
||||
self.search_list.set_value(myiter, 3,
|
||||
self.__get_file_path(row[0]))
|
||||
self.search_list.set_value(myiter, 4, row[2])
|
||||
self.search_list.set_value(myiter, 5,
|
||||
datetime.fromtimestamp(row[3]))
|
||||
self.search_list.set_value(myiter, 6, 1)
|
||||
self.search_list.set_value(myiter, 7, gtk.STOCK_DIRECTORY)
|
||||
|
||||
# files and links
|
||||
if self.selected_tags:
|
||||
if id_filter:
|
||||
# we have tags selected, live with that
|
||||
sql = """SELECT f.id, f.filename, f.size, f.date, f.type
|
||||
FROM files f
|
||||
WHERE f.type!=1
|
||||
AND parent_id!=1 AND id IN """ + id_filter + sql_con + """
|
||||
ORDER BY f.filename"""
|
||||
else:
|
||||
# alright, search throught all records
|
||||
sql = """SELECT f.id, f.filename, f.size, f.date, f.type
|
||||
FROM files f
|
||||
WHERE f.type!=1
|
||||
AND parent_id!=1 """ + sql_con + """
|
||||
ORDER BY f.filename"""
|
||||
|
||||
if sql:
|
||||
self.db_cursor.execute(sql)
|
||||
|
||||
data = self.db_cursor.fetchall()
|
||||
for row in data:
|
||||
found += 1
|
||||
myiter = self.search_list.insert_before(None, None)
|
||||
self.search_list.set_value(myiter, 0, row[0])
|
||||
self.search_list.set_value(myiter, 1,
|
||||
self.__get_file_root(row[0]))
|
||||
self.search_list.set_value(myiter, 2, row[1])
|
||||
self.search_list.set_value(myiter, 3,
|
||||
self.__get_file_path(row[0]))
|
||||
self.search_list.set_value(myiter, 4, row[2])
|
||||
self.search_list.set_value(myiter, 5,
|
||||
datetime.fromtimestamp(row[3]))
|
||||
self.search_list.set_value(myiter, 6, row[4])
|
||||
if row[4] == self.FIL:
|
||||
self.search_list.set_value(myiter, 7, gtk.STOCK_FILE)
|
||||
elif row[4] == self.LIN:
|
||||
self.search_list.set_value(myiter, 7, gtk.STOCK_INDEX)
|
||||
|
||||
return found
|
||||
|
||||
def rename(self, file_id, new_name=None):
|
||||
"""change name of selected object id"""
|
||||
if new_name:
|
||||
@@ -605,13 +739,14 @@ class MainModel(ModelMT):
|
||||
for row in data:
|
||||
myiter = self.files_list.insert_before(None, None)
|
||||
self.files_list.set_value(myiter, 0, row[0])
|
||||
self.files_list.set_value(myiter, 1, row[1])
|
||||
self.files_list.set_value(myiter, 2, row[2])
|
||||
self.files_list.set_value(myiter, 3,
|
||||
self.files_list.set_value(myiter, 1, self.__get_file_root(row[0]))
|
||||
self.files_list.set_value(myiter, 2, row[1])
|
||||
self.files_list.set_value(myiter, 3, self.__get_file_path(row[0]))
|
||||
self.files_list.set_value(myiter, 4, row[2])
|
||||
self.files_list.set_value(myiter, 5,
|
||||
datetime.fromtimestamp(row[3]))
|
||||
self.files_list.set_value(myiter, 4, 1)
|
||||
self.files_list.set_value(myiter, 5, 'direktorja')
|
||||
self.files_list.set_value(myiter, 6, gtk.STOCK_DIRECTORY)
|
||||
self.files_list.set_value(myiter, 6, 1)
|
||||
self.files_list.set_value(myiter, 7, gtk.STOCK_DIRECTORY)
|
||||
|
||||
# all the rest
|
||||
if not parent_id and self.selected_tags:
|
||||
@@ -648,19 +783,20 @@ class MainModel(ModelMT):
|
||||
for row in data:
|
||||
myiter = self.files_list.insert_before(None, None)
|
||||
self.files_list.set_value(myiter, 0, row[0])
|
||||
self.files_list.set_value(myiter, 1, row[1])
|
||||
self.files_list.set_value(myiter, 2, row[2])
|
||||
self.files_list.set_value(myiter, 3,
|
||||
self.files_list.set_value(myiter, 1, self.__get_file_root(row[0]))
|
||||
self.files_list.set_value(myiter, 2, row[1])
|
||||
self.files_list.set_value(myiter, 3, self.__get_file_path(row[0]))
|
||||
self.files_list.set_value(myiter, 4, row[2])
|
||||
self.files_list.set_value(myiter, 5,
|
||||
datetime.fromtimestamp(row[3]))
|
||||
self.files_list.set_value(myiter, 4, row[4])
|
||||
self.files_list.set_value(myiter, 5, 'kategoria srategoria')
|
||||
self.files_list.set_value(myiter, 6, row[4])
|
||||
if row[4] == self.FIL:
|
||||
self.files_list.set_value(myiter, 6, gtk.STOCK_FILE)
|
||||
self.files_list.set_value(myiter, 7, gtk.STOCK_FILE)
|
||||
elif row[4] == self.LIN:
|
||||
self.files_list.set_value(myiter, 6, gtk.STOCK_INDEX)
|
||||
self.files_list.set_value(myiter, 7, gtk.STOCK_INDEX)
|
||||
return
|
||||
|
||||
def get_parent_discs_value(self, child_id):
|
||||
def get_parent_id(self, child_id):
|
||||
"""get root id from specified child"""
|
||||
if child_id:
|
||||
sql = """SELECT parent_id FROM files WHERE id=?"""
|
||||
@@ -965,7 +1101,68 @@ class MainModel(ModelMT):
|
||||
self.db_connection.commit()
|
||||
return
|
||||
|
||||
def clear_search_tree(self):
|
||||
"""try to clear store for search"""
|
||||
try:
|
||||
self.search_list.clear()
|
||||
except:
|
||||
pass
|
||||
|
||||
# private class functions
|
||||
def __fill_history_model(self):
|
||||
"""fill search history model with config dict"""
|
||||
try:
|
||||
self.search_history.clear()
|
||||
except:
|
||||
pass
|
||||
|
||||
for entry in self.config.search_history:
|
||||
myiter = self.search_history.insert_before(None, None)
|
||||
self.search_history.set_value(myiter, 0, entry)
|
||||
return
|
||||
|
||||
def __get_file_root(self, file_id):
|
||||
"""return string with root (disc name) of selected banch (file_id)"""
|
||||
sql = """SELECT parent_id FROM files WHERE id=? and parent_id!=1"""
|
||||
self.db_cursor.execute(sql, (file_id,))
|
||||
res = self.db_cursor.fetchone()
|
||||
|
||||
root_id = None
|
||||
while res:
|
||||
root_id = res[0]
|
||||
self.db_cursor.execute(sql, (res[0],))
|
||||
res = self.db_cursor.fetchone()
|
||||
|
||||
sql = """SELECT filename FROM files WHERE id=?"""
|
||||
self.db_cursor.execute(sql, (root_id,))
|
||||
res = self.db_cursor.fetchone()
|
||||
|
||||
return res[0]
|
||||
|
||||
def __get_file_path(self, file_id):
|
||||
"""return string with path from the root of the disc"""
|
||||
#SQL: get parent id and filename to concatenate path
|
||||
path = ""
|
||||
sql = """SELECT parent_id FROM files WHERE id=? AND parent_id!=1"""
|
||||
self.db_cursor.execute(sql, (file_id,))
|
||||
res = self.db_cursor.fetchone()
|
||||
if not res:
|
||||
return "/"
|
||||
|
||||
while res:
|
||||
sql = """SELECT id, filename FROM files
|
||||
WHERE id=? AND parent_id!=1"""
|
||||
self.db_cursor.execute(sql, (res[0],))
|
||||
res = self.db_cursor.fetchone()
|
||||
if res:
|
||||
path = res[1] + "/" + path
|
||||
sql = """SELECT parent_id FROM files
|
||||
WHERE id=? AND id!=parent_id"""
|
||||
self.db_cursor.execute(sql, (res[0],))
|
||||
res = self.db_cursor.fetchone()
|
||||
|
||||
return "/" + path
|
||||
|
||||
def __bytes_to_human(self, integer):
|
||||
"""return integer digit in human readable string representation"""
|
||||
if integer <= 0 or integer < 1024:
|
||||
@@ -989,6 +1186,7 @@ class MainModel(ModelMT):
|
||||
"""clears treemodel and treestore of files and discs tree"""
|
||||
self.__clear_files_tree()
|
||||
self.__clear_discs_tree()
|
||||
self.clear_search_tree()
|
||||
|
||||
def __clear_discs_tree(self):
|
||||
"""try to clear model for discs"""
|
||||
@@ -1118,7 +1316,6 @@ class MainModel(ModelMT):
|
||||
self.db_cursor.execute(sql)
|
||||
self.db_connection.commit()
|
||||
|
||||
|
||||
def __filter(self):
|
||||
"""return list of ids of files (AND their parent, even if they have no
|
||||
assigned tags) that corresponds to tags"""
|
||||
@@ -1485,7 +1682,6 @@ class MainModel(ModelMT):
|
||||
db_cursor = db_connection.cursor()
|
||||
|
||||
# fetch all the directories
|
||||
#try:
|
||||
if not self.selected_tags:
|
||||
sql = """SELECT id, parent_id, filename FROM files
|
||||
WHERE type=1 ORDER BY parent_id, filename"""
|
||||
@@ -1500,13 +1696,6 @@ class MainModel(ModelMT):
|
||||
WHERE 1=0"""
|
||||
db_cursor.execute(sql)
|
||||
data = db_cursor.fetchall()
|
||||
#except:
|
||||
# # cleanup
|
||||
# self.cleanup()
|
||||
# self.filename = None
|
||||
# self.internal_dirname = None
|
||||
# print "%s: Wrong database format!" % self.filename
|
||||
# return
|
||||
|
||||
def get_children(parent_id = 1, iterator = None):
|
||||
"""fetch all children and place them in model"""
|
||||
@@ -1586,3 +1775,16 @@ class MainModel(ModelMT):
|
||||
else:
|
||||
return txt
|
||||
|
||||
def __postgresize(self, string):
|
||||
"""escape sql characters, return escaped string"""
|
||||
name = string.replace("\\","\\\\")
|
||||
name = name.replace('%','\%')
|
||||
name = name.replace('_','\_')
|
||||
name = name.replace("'","''")
|
||||
|
||||
# special characters ? and * convert to sql sepcial characters _ and %
|
||||
#name = name.replace('*','%')
|
||||
#name = name.replace('?','_')
|
||||
|
||||
return name
|
||||
|
||||
|
||||
Reference in New Issue
Block a user