1
0
mirror of https://github.com/gryf/pygtktalog.git synced 2025-12-17 19:40:21 +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:
2008-05-08 08:52:06 +00:00
parent 1a4bbbb653
commit 0038a5331d

View File

@@ -50,7 +50,12 @@ from utils.gthumb import GthumbCommentParser
class MainModel(ModelMT): class MainModel(ModelMT):
"""Create, load, save, manipulate db file which is container for data""" """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 # constants instead of dictionary tables
# type of files # type of files
@@ -99,22 +104,43 @@ class MainModel(ModelMT):
self.busy = False self.busy = False
self.statusmsg = "Idle" self.statusmsg = "Idle"
self.selected_tags = {} self.selected_tags = {}
self.search_created = False
# Directory tree: id, name, icon, type # Directory tree: id, name, icon, type
self.discs_tree = gtk.TreeStore(gobject.TYPE_INT, gobject.TYPE_STRING, self.discs_tree = gtk.TreeStore(gobject.TYPE_INT,
str, gobject.TYPE_INT) gobject.TYPE_STRING,
# File list of selected directory: is, filename, size, str,
gobject.TYPE_INT)
# File list of selected directory: id, disc, filename, path, size,
# date, type, icon # 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_UINT64,
gobject.TYPE_STRING, gobject.TYPE_INT, gobject.TYPE_STRING,
gobject.TYPE_STRING, str) 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 # iconview store - id, pixbuffer
self.images_store = gtk.ListStore(gobject.TYPE_INT, gtk.gdk.Pixbuf) self.images_store = gtk.ListStore(gobject.TYPE_INT, gtk.gdk.Pixbuf)
# exif liststore - id, exif key, exif value # exif liststore - id, exif key, exif value
self.exif_list = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING, self.exif_list = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING,
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: # tag cloud array element is a dict with 5 keys:
# elem = {'id': str(id), 'name': tagname, 'size': size, # elem = {'id': str(id), 'name': tagname, 'size': size,
@@ -126,6 +152,12 @@ class MainModel(ModelMT):
self.tag_cloud = [] self.tag_cloud = []
return 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): def add_tags(self, fid, tags):
"""add tag (if not exists) and connect it with file""" """add tag (if not exists) and connect it with file"""
for tag in tags.split(','): for tag in tags.split(','):
@@ -438,6 +470,7 @@ class MainModel(ModelMT):
self.__connect_to_db() self.__connect_to_db()
self.__create_database() self.__create_database()
self.__clear_trees() self.__clear_trees()
self.clear_search_tree()
self.tag_cloud = [] self.tag_cloud = []
self.selected_tags = {} self.selected_tags = {}
return return
@@ -463,6 +496,7 @@ class MainModel(ModelMT):
self.filename = filename self.filename = filename
self.tag_cloud = [] self.tag_cloud = []
self.selected_tags = {} self.selected_tags = {}
self.clear_search_tree()
try: try:
tar = tarfile.open(filename, "r:gz") tar = tarfile.open(filename, "r:gz")
@@ -534,6 +568,106 @@ class MainModel(ModelMT):
self.thread.start() self.thread.start()
return 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): def rename(self, file_id, new_name=None):
"""change name of selected object id""" """change name of selected object id"""
if new_name: if new_name:
@@ -605,13 +739,14 @@ class MainModel(ModelMT):
for row in data: for row in data:
myiter = self.files_list.insert_before(None, None) myiter = self.files_list.insert_before(None, None)
self.files_list.set_value(myiter, 0, row[0]) self.files_list.set_value(myiter, 0, row[0])
self.files_list.set_value(myiter, 1, row[1]) self.files_list.set_value(myiter, 1, self.__get_file_root(row[0]))
self.files_list.set_value(myiter, 2, row[2]) self.files_list.set_value(myiter, 2, row[1])
self.files_list.set_value(myiter, 3, 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])) datetime.fromtimestamp(row[3]))
self.files_list.set_value(myiter, 4, 1) self.files_list.set_value(myiter, 6, 1)
self.files_list.set_value(myiter, 5, 'direktorja') self.files_list.set_value(myiter, 7, gtk.STOCK_DIRECTORY)
self.files_list.set_value(myiter, 6, gtk.STOCK_DIRECTORY)
# all the rest # all the rest
if not parent_id and self.selected_tags: if not parent_id and self.selected_tags:
@@ -648,19 +783,20 @@ class MainModel(ModelMT):
for row in data: for row in data:
myiter = self.files_list.insert_before(None, None) myiter = self.files_list.insert_before(None, None)
self.files_list.set_value(myiter, 0, row[0]) self.files_list.set_value(myiter, 0, row[0])
self.files_list.set_value(myiter, 1, row[1]) self.files_list.set_value(myiter, 1, self.__get_file_root(row[0]))
self.files_list.set_value(myiter, 2, row[2]) self.files_list.set_value(myiter, 2, row[1])
self.files_list.set_value(myiter, 3, 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])) datetime.fromtimestamp(row[3]))
self.files_list.set_value(myiter, 4, row[4]) self.files_list.set_value(myiter, 6, row[4])
self.files_list.set_value(myiter, 5, 'kategoria srategoria')
if row[4] == self.FIL: 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: 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 return
def get_parent_discs_value(self, child_id): def get_parent_id(self, child_id):
"""get root id from specified child""" """get root id from specified child"""
if child_id: if child_id:
sql = """SELECT parent_id FROM files WHERE id=?""" sql = """SELECT parent_id FROM files WHERE id=?"""
@@ -965,7 +1101,68 @@ class MainModel(ModelMT):
self.db_connection.commit() self.db_connection.commit()
return return
def clear_search_tree(self):
"""try to clear store for search"""
try:
self.search_list.clear()
except:
pass
# private class functions # 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): def __bytes_to_human(self, integer):
"""return integer digit in human readable string representation""" """return integer digit in human readable string representation"""
if integer <= 0 or integer < 1024: if integer <= 0 or integer < 1024:
@@ -989,6 +1186,7 @@ class MainModel(ModelMT):
"""clears treemodel and treestore of files and discs tree""" """clears treemodel and treestore of files and discs tree"""
self.__clear_files_tree() self.__clear_files_tree()
self.__clear_discs_tree() self.__clear_discs_tree()
self.clear_search_tree()
def __clear_discs_tree(self): def __clear_discs_tree(self):
"""try to clear model for discs""" """try to clear model for discs"""
@@ -1118,7 +1316,6 @@ class MainModel(ModelMT):
self.db_cursor.execute(sql) self.db_cursor.execute(sql)
self.db_connection.commit() self.db_connection.commit()
def __filter(self): def __filter(self):
"""return list of ids of files (AND their parent, even if they have no """return list of ids of files (AND their parent, even if they have no
assigned tags) that corresponds to tags""" assigned tags) that corresponds to tags"""
@@ -1485,7 +1682,6 @@ class MainModel(ModelMT):
db_cursor = db_connection.cursor() db_cursor = db_connection.cursor()
# fetch all the directories # fetch all the directories
#try:
if not self.selected_tags: if not self.selected_tags:
sql = """SELECT id, parent_id, filename FROM files sql = """SELECT id, parent_id, filename FROM files
WHERE type=1 ORDER BY parent_id, filename""" WHERE type=1 ORDER BY parent_id, filename"""
@@ -1500,13 +1696,6 @@ class MainModel(ModelMT):
WHERE 1=0""" WHERE 1=0"""
db_cursor.execute(sql) db_cursor.execute(sql)
data = db_cursor.fetchall() 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): def get_children(parent_id = 1, iterator = None):
"""fetch all children and place them in model""" """fetch all children and place them in model"""
@@ -1586,3 +1775,16 @@ class MainModel(ModelMT):
else: else:
return txt 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