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):
|
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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user