def restore(self): """restores a griffith compressed backup""" filename = gutils.file_chooser(_("Restore Griffith backup"), \ action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons= \ (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, \ gtk.STOCK_OPEN, gtk.RESPONSE_OK)) if filename[0]: try: zip = zipfile.ZipFile(filename[0], 'r') except: gutils.error(self, _("Can't read backup file"), self.widgets['window']) return False mypath = os.path.join(self.locations['posters']) for each in zip.namelist(): file_to_restore = os.path.split(each) if not os.path.isdir(file_to_restore[1]): if file_to_restore[1] == '': continue if file_to_restore[1].endswith('.jpg'): myfile = os.path.join(mypath,file_to_restore[1]) else: myfile = os.path.join(self.locations['home'],file_to_restore[1]) outfile = open(myfile, 'wb') outfile.write(zip.read(each)) outfile.flush() outfile.close() zip.close() # restore config file self.config = config.Config(file=os.path.join(self.locations['home'],'griffith.conf')) filename = os.path.join(self.locations['home'], self.config["default_db"]) self.db.metadata.engine.dispose() # close DB from sqlalchemy.orm import clear_mappers clear_mappers() # check if file needs conversion if self.config['default_db'].lower().endswith('.gri'): self.debug.show('Old database format detected. Converting...') from dbupgrade import convert_from_old_db from initialize import location_posters if convert_from_old_db(self, filename, os.path.join(self.locations['home'], 'griffith.db')): self.config.save() location_posters(self.locations, self.config) else: print 'Cant convert old database, exiting.' import sys sys.exit(4) self.db = sql.GriffithSQL(self.config, self.debug, self.locations['home']) from initialize import dictionaries, people_treeview dictionaries(self) people_treeview(self) # let's refresh the treeview self.clear_details() self.populate_treeview() self.go_last() self.treeview_clicked() self.count_statusbar() gutils.info(self, _("Backup restored"), self.widgets['window'])
def new_db(self, parent): #{{{ """initializes a new griffith database file""" response = gutils.question(self, \ _("Are you sure you want to create a new database?\nYou will lose ALL your current data!"), \ 1, parent.main_window) if response == gtk.RESPONSE_YES: response_sec = gutils.question(self, \ _("Last chance!\nDo you confirm that you want\nto lose your current data?"), \ 1, parent.main_window) if response_sec == gtk.RESPONSE_YES: # delete images for root, dirs, files in os.walk(os.path.join(self.griffith_dir,"posters"), topdown=False): for name in files: os.remove(os.path.join(root, name)) # delete db parent.db.con.close() os.unlink(os.path.join(self.griffith_dir,self.config.get('default_db'))) # create/connect db parent.db = GriffithSQL(self.config, self.debug, self.griffith_dir) parent.clear_details() parent.total = 0 parent.count_statusbar() parent.treemodel.clear() from initialize import dictionaries dictionaries(parent) else: pass else: pass
def restore(self): """restores a griffith compressed backup""" filename = gutils.file_chooser(_("Restore Griffith backup"), \ action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons= \ (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, \ gtk.STOCK_OPEN, gtk.RESPONSE_OK)) if filename[0]: response_unzip = gutils.restore(filename[0], self.griffith_dir) if not response_unzip: gutils.error(self, _("Can't read backup file"), self.main_window) return self.db.con.close() self.db = sql.GriffithSQL(self.config, self.debug, self.griffith_dir) from initialize import dictionaries dictionaries(self) gutils.info(self, _("Backup restored"), self.main_window) # let's refresh the treeview self.populate_treeview(self.db.get_all_data()) self.total = self.db.count_records("movies") self.select_last_row(self.total) self.treeview_clicked() self.count_statusbar()
def restore(self, merge=False): """ Merge database from: * compressed backup (*.zip) * SQLite2 *.gri file * SQLite3 *.db file """ # let user select a backup file filename = gutils.file_chooser(_("Restore Griffith backup"), \ action=gtk.FILE_CHOOSER_ACTION_OPEN, backup=True, \ buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) if not filename: log.debug('no file selected') return False try: tmp_db = None tmp_dir = mkdtemp() os.mkdir(os.path.join(tmp_dir, 'posters')) print filename if filename.lower().endswith('.zip'): try: zip_file = zipfile.ZipFile(filename, 'r') except: gutils.error(_("Can't read backup file"), self.widgets['window']) return False old_config_file = False # unpack files to temporary directory for file_path in zip_file.namelist(): file_name = os.path.split(file_path)[-1] if not os.path.isdir(file_name): if not file_name: log.debug('skipping %s', file_path) continue if 'posters' in file_path: new_file = os.path.join(tmp_dir, 'posters', file_name) else: new_file = os.path.join(tmp_dir, file_name) if file_name.endswith('.conf'): old_config_file = new_file outfile = open(new_file, 'wb') outfile.write(zip_file.read(file_path)) outfile.close() zip_file.close() # restore config file (new one will be created if old config format is detected) tmp_config = config.Config(file=os.path.join(tmp_dir, 'griffith.cfg')) if old_config_file: log.info('Old config file detected. Please note that it will not be used.') f = open(old_config_file, 'r') old_config_raw_data = f.read() f.close() if old_config_raw_data.find('griffith.gri') >= -1: tmp_config.set('file', 'griffith.gri', section='database') # update filename var. to point to the unpacked database filename = os.path.join(tmp_dir, tmp_config.get('name', 'griffith', section='database') + '.db') else: # not a zip file? prepare a fake config file then tmp_config = config.Config(file=os.path.join(tmp_dir, 'griffith.cfg')) tmp_config.set('type', 'sqlite', section='database') tmp_config.set('file', 'griffith.db', section='database') # prepare temporary GriffithSQL instance locations = {'home': tmp_dir} # check if file needs conversion if filename.lower().endswith('.gri'): from dbupgrade import convert_from_old_db tmp_db = convert_from_old_db(tmp_config, filename, os.path.join(tmp_dir, 'griffith.db'), locations) if not tmp_db: log.info("MERGE: Can't convert database, aborting.") return False else: tmp_db = sql.GriffithSQL(tmp_config, tmp_dir, fallback=False) if merge: merge_db(tmp_db, self.db) else: self.db.session.rollback() # cancel all pending operations copy_db(tmp_db.session.bind, self.db.session.bind) # update old database section with current config values # (important while restoring to external databases) for key in ('name', 'passwd', 'host', 'user', 'file', 'type', 'port'): tmp_config.set(key, self.config.get(key, section='database'), section='database') tmp_config._file = self.config._file self.config = tmp_config self.config.save() dictionaries(self) people_treeview(self) # let's refresh the treeview self.clear_details() self.populate_treeview() #gutils.info(_("Databases merged!\n\nProcessed movies: %s\nMerged movies: %s"%(movies, merged)), self.widgets['window']) gutils.info(_("Backup restored"), self.widgets['window']) except: log.exception('') raise finally: # disposing the temporary db connection before rmtree and in finally block to avoid locked db file if tmp_db: tmp_db.dispose() log.debug('temporary directory no logger needed, removing %s', tmp_dir) rmtree(tmp_dir)
def merge(self): # FIXME """ Merge database from: * compressed backup * SQLite2 *.gri file * SQLite3 *.db file """ filename = gutils.file_chooser(_("Restore Griffith backup"), \ action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons= \ (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, \ gtk.STOCK_OPEN, gtk.RESPONSE_OK))[0] if filename: from tempfile import mkdtemp from shutil import rmtree, move #tmp_config={} #tmp_config.get('type', 'sqlite', section='database') if filename.lower().endswith('.zip'): tmp_dir = mkdtemp() try: zip = zipfile.ZipFile(filename, 'r') except: gutils.error(self, _("Can't read backup file"), self.widgets['window']) return False for each in zip.namelist(): file_to_restore = os.path.split(each) if not os.path.isdir(file_to_restore[1]): myfile = os.path.join(tmp_dir, file_to_restore[1]) outfile = open(myfile, 'wb') outfile.write(zip.read(each)) outfile.flush() outfile.close() # load stored database filename tmp_config = config.Config(file=os.path.join(tmp_dir,'griffith.conf')) filename = os.path.join(tmp_dir, tmp_config('file', 'griffith.db', section='database')) zip.close() # check if file needs conversion if filename.lower().endswith(".gri"): if os.path.isfile(filename) and open(filename).readline()[:47] == "** This file contains an SQLite 2.1 database **": self.debug.show("MERGE: SQLite2 database format detected. Converting...") if not self.db.convert_from_sqlite2(filename, os.path.join(tmp_dir, self.config.get('file', 'griffith.db', section='database'))): self.debug.show("MERGE: Can't convert database, aborting.") return False tmp_dir, tmp_file = os.path.split(filename) self.config.get('file', tmp_file, section='database') tmp_db = sql.GriffithSQL(tmp_config, self.debug, tmp_dir) merged=0 movies = tmp_db.Movie.count() for movie in tmp_db.Movie.select(): if self.db.Movie.get_by(o_title=movie.o_title) is not None: continue t_movies = {} for column in movie.mapper.c.keys(): t_movies[column] = eval("movie.%s"%column) # replace number with new one t_movies["number"] = gutils.find_next_available(self.db) # don't restore volume/collection/tag/language/loan data (it's dangerous) t_movies.pop('movie_id') t_movies.pop('loaned') t_movies.pop('volume_id') t_movies.pop('collection_id') if self.db.add_movie(t_movies): print t_movies if movie.image is not None: dest_file = os.path.join(self.locations['posters'], movie.image+'.jpg') if not os.path.isfile(dest_file): src_file = os.path.join(tmp_dir, movie.image+'.jpg') if os.path.isfile(src_file): move(src_file, dest_file) merged+=1 rmtree(tmp_dir) from initialize import dictionaries, people_treeview dictionaries(self) people_treeview(self) # let's refresh the treeview self.clear_details() self.populate_treeview(self.db.Movie.select()) self.total = self.db.Movie.count() self.count_statusbar()
def save_preferences(self): w = self.widgets['preferences'] c = self.config global spell_support was_false = notes_was_false = plot_was_false = 1 if c.get('gtkspell', False, section='spell') == True: was_false = 0 if c.get('notes', False, section='spell') == True: notes_was_false = 0 if c.get('plot', False, section='spell') == True: plot_was_false = 0 # number if w['view_number'].get_active(): c.set('number', 'True', section='mainlist') else: c.set('number', 'False', section='mainlist') # image if w['view_image'].get_active(): c.set('image', 'True', section='mainlist') else: c.set('image', 'False', section='mainlist') # original title if w['view_o_title'].get_active(): c.set('otitle', 'True', section='mainlist') else: c.set('otitle', 'False', section='mainlist') # title if w['view_title'].get_active(): c.set('title', 'True', section='mainlist') else: c.set('title', 'False', section='mainlist') # director if w['view_director'].get_active(): c.set('director', 'True', section='mainlist') else: c.set('director', 'False', section='mainlist') # genre if w['view_genre'].get_active(): c.set('genre', 'True', section='mainlist') else: c.set('genre', 'False', section='mainlist') # seen if w['view_seen'].get_active(): c.set('seen', 'True', section='mainlist') else: c.set('seen', 'False', section='mainlist') # year if w['view_year'].get_active(): c.set('year', 'True', section='mainlist') else: c.set('year', 'False', section='mainlist') # runtime if w['view_runtime'].get_active(): c.set('runtime', 'True', section='mainlist') else: c.set('runtime', 'False', section='mainlist') # rating if w['view_rating'].get_active(): c.set('rating', 'True', section='mainlist') else: c.set('rating', 'False', section='mainlist') # sortby if w['sortby'].get_active(): field = self.sort_criteria[w['sortby'].get_active()] if field: c.set('sortby', field, section='mainlist') else: c.set('sortby', 'number', section='mainlist') c.set('sortby_reverse', w['sortby_reverse'].get_active(), section='mainlist') c.set('limit', str(int(w['s_limit'].get_value())), section='mainlist') # pdf font if w['font'].get_filename(): c['font'] = w['font'].get_filename() # spellchecker if w['spellchecker'].get_active(): c.set('gtkspell', True, section='spell') else: c.set('gtkspell', False, section='spell') if w['spell_notes'].get_active(): c.set('notes', True, section='spell') else: c.set('notes', False, section='spell') if w['spell_plot'].get_active(): c.set('plot', True, section='spell') else: c.set('plot', False, section='spell') # rating image c['rating_image'] = str(w['rating_image'].get_active()) #defaults media_id = self.media_ids[w['media'].get_active()] if media_id is None: media_id = 0 c.set('media', media_id, section='defaults') vcodec_id = self.vcodecs_ids[w['vcodec'].get_active()] if vcodec_id is None: vcodec_id = 0 c.set('vcodec', vcodec_id, section='defaults') c.set('condition', str(w['condition'].get_active()), section='defaults') c.set('region', str(w['region'].get_active()), section='defaults') c.set('layers', str(w['layers'].get_active()), section='defaults') c.set('color', str(w['color'].get_active()), section='defaults') # email reminder if w['mail_use_auth'].get_active(): c.set('use_auth', True, section='mail') else: c.set('use_auth', False, section='mail') if w['mail_use_tls'].get_active(): c.set('mail_use_tls', True, section='mail') else: c.set('mail_use_tls', False, section='mail') c.set('smtp_server', w['mail_smtp_server'].get_text(), section='mail') c.set('mail_smtp_port', w['mail_smtp_port'].get_text(), section='mail') c.set('username', w['mail_username'].get_text(), section='mail') c.set('password', w['mail_password'].get_text(), section='mail') c.set('email', w['mail_email'].get_text(), section='mail') # default movie plugin if w['default_plugin'].get_active(): c['default_movie_plugin'] = \ gutils.on_combo_box_entry_changed(w['default_plugin']) # search for: c.set('s_classification', w['s_classification'].get_active(), section='add') c.set('s_country', w['s_country'].get_active(), section='add') c.set('s_director', w['s_director'].get_active(), section='add') c.set('s_genre', w['s_genre'].get_active(), section='add') c.set('s_image', w['s_image'].get_active(), section='add') c.set('s_notes', w['s_notes'].get_active(), section='add') c.set('s_o_site', w['s_o_site'].get_active(), section='add') c.set('s_o_title', w['s_o_title'].get_active(), section='add') c.set('s_plot', w['s_plot'].get_active(), section='add') c.set('s_rating', w['s_rating'].get_active(), section='add') c.set('s_runtime', w['s_runtime'].get_active(), section='add') c.set('s_site', w['s_site'].get_active(), section='add') c.set('s_studio', w['s_studio'].get_active(), section='add') c.set('s_title', w['s_title'].get_active(), section='add') c.set('s_trailer', w['s_trailer'].get_active(), section='add') c.set('s_cast', w['s_cast'].get_active(), section='add') c.set('s_year', w['s_year'].get_active(), section='add') mcounter = 0 for p in self.plugins: plugin_module = os.path.basename(p).replace('.py','') plugin_name = plugin_module.replace('PluginMovie','') if gutils.on_combo_box_entry_changed(w['default_plugin']) == plugin_name: self.d_plugin = mcounter mcounter = mcounter + 1 self.widgets['add']['source'].set_active(self.d_plugin) if self.windows: save_reader = '' else: save_reader = w['epdf_reader'].get_text() c.set('lang', w['spell_lang'].get_text(), section='spell') c['pdf_reader'] = save_reader c.set('amazon_locale', w['amazon_locale'].get_active(), section='add') if spell_support: if c.get('gtkspell', False, section='spell') == False and not was_false: self.notes_spell.detach() self.plot_spell.detach() elif c.get('gtkspell', False, section='spell') == True and was_false: initialize.initialize_gtkspell(self) else: pass if c.get('gtkspell', False, section='spell') == True: if c.get('plot', True, section='spell') == False and not plot_was_false: self.plot_spell.detach() elif c.get('plot', True, section='spell') == True and plot_was_false: self.plot_spell = gtkspell.Spell(self.widgets['add']['plot']) self.plot_spell.set_language(c.get('lang', 'en', section='spell')) else: pass if c.get('notes', True, section='spell') == False and not notes_was_false: self.notes_spell.detach() elif c.get('notes', True, section='spell') == True and notes_was_false: self.notes_spell = gtkspell.Spell(self.widgets['add']['notes']) self.notes_spell.set_language(c.get('lang', 'en', section='spell')) else: pass self.pdf_reader = save_reader # database old = c.toDict(section='database') c.set('host', w['db_host'].get_text(), section='database') c.set('port', int(w['db_port'].get_value()), section='database') c.set('name', w['db_name'].get_text(), section='database') c.set('user', w['db_user'].get_text(), section='database') c.set('passwd', w['db_passwd'].get_text(), section='database') db_type = int(w['db_type'].get_active()) if db_type == 1: c.set('type', 'postgres', section='database') elif db_type == 2: c.set('type', 'mysql', section='database') elif db_type == 3: c.set('type', 'mssql', section='database') else: c.set('type', 'sqlite', section='database') if old['type'] != c.get('type', section='database') or (old['type']!='sqlite' and (\ old['host'] != c.get('host', section='database') or \ old['port'] != c.get('port', section='database') or \ old['user'] != c.get('user', section='database') or \ old['passwd'] != c.get('passwd', section='database'))) or \ old['name'] != c.get('name', section='database'): self.debug.show('DATABASE: connecting to new db server...') # new database connection import sql self.initialized = False self.db.metadata.clear() from sqlalchemy.orm import clear_mappers from sqlalchemy.exceptions import InvalidRequestError clear_mappers() try: self.db = sql.GriffithSQL(c, self.debug, self.locations['home']) except InvalidRequestError, e: self.debug.show(str(e)) c.set('type', 'sqlite', section='database') w['db_type'].set_active(0) self.db = sql.GriffithSQL(c, self.debug, self.locations['home']) self.debug.show("New database Engine: %s" % self.db.metadata.engine.name) # initialize new database self.total = int(self.db.Movie.count()) self.count_statusbar() from initialize import dictionaries, people_treeview, location_posters c['posters'] = None # force update location_posters(self.locations, self.config) dictionaries(self) people_treeview(self, False) self.initialized = True
def restore(self, merge=False): """ Merge database from: * compressed backup (*.zip) * SQLite2 *.gri file * SQLite3 *.db file """ # let user select a backup file filename, path = gutils.file_chooser(_("Restore Griffith backup"), \ action=gtk.FILE_CHOOSER_ACTION_OPEN, backup=True, \ buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) if not filename: log.debug('no file selected') return False try: tmp_db = None tmp_dir = mkdtemp() os.mkdir(os.path.join(tmp_dir, 'posters')) print filename if filename.lower().endswith('.zip'): try: zip_file = zipfile.ZipFile(filename, 'r') except: gutils.error(_("Can't read backup file"), self.widgets['window']) return False old_config_file = False # unpack files to temporary directory for file_path in zip_file.namelist(): file_name = os.path.split(file_path)[-1] if not os.path.isdir(file_name): if not file_name: log.debug('skipping %s', file_path) continue if 'posters' in file_path: new_file = os.path.join(tmp_dir, 'posters', file_name) else: new_file = os.path.join(tmp_dir, file_name) if file_name.endswith('.conf'): old_config_file = new_file outfile = open(new_file, 'wb') outfile.write(zip_file.read(file_path)) outfile.close() zip_file.close() # restore config file (new one will be created if old config format is detected) tmp_config = config.Config(file=os.path.join(tmp_dir, 'griffith.cfg')) if old_config_file: log.info('Old config file detected. Please note that it will not be used.') f = open(old_config_file, 'r') old_config_raw_data = f.read() f.close() if old_config_raw_data.find('griffith.gri') >= -1: tmp_config.set('file', 'griffith.gri', section='database') # update filename var. to point to the unpacked database filename = os.path.join(tmp_dir, tmp_config.get('name', 'griffith', section='database') + '.db') else: # not a zip file? prepare a fake config file then tmp_config = config.Config(file=os.path.join(tmp_dir, 'griffith.cfg')) tmp_config.set('type', 'sqlite', section='database') tmp_config.set('file', 'griffith.db', section='database') # prepare temporary GriffithSQL instance locations = {'home': tmp_dir} # check if file needs conversion if filename.lower().endswith('.gri'): from dbupgrade import convert_from_old_db tmp_db = convert_from_old_db(tmp_config, filename, os.path.join(tmp_dir, 'griffith.db'), locations) if not tmp_db: log.info("MERGE: Can't convert database, aborting.") return False else: tmp_db = sql.GriffithSQL(tmp_config, tmp_dir, fallback=False) if merge: merge_db(tmp_db, self.db) else: self.db.session.rollback() # cancel all pending operations copy_db(tmp_db.session.bind, self.db.session.bind) # update old database section with current config values # (important while restoring to external databases) for key in ('name', 'passwd', 'host', 'user', 'file', 'type', 'port'): tmp_config.set(key, self.config.get(key, section='database'), section='database') tmp_config._file = self.config._file self.config = tmp_config self.config.save() dictionaries(self) people_treeview(self) # let's refresh the treeview self.clear_details() self.populate_treeview() #gutils.info(_("Databases merged!\n\nProcessed movies: %s\nMerged movies: %s"%(movies, merged)), self.widgets['window']) gutils.info(_("Backup restored"), self.widgets['window']) except: log.exception('') raise finally: # disposing the temporary db connection before rmtree and in finally block to avoid locked db file if tmp_db: tmp_db.dispose() log.debug('temporary directory no logger needed, removing %s', tmp_dir) rmtree(tmp_dir)
def save_preferences(self): w = self.widgets['preferences'] c = self.config global spell_support was_false = notes_was_false = plot_was_false = 1 if c.get('gtkspell', False, section='spell') == True: was_false = 0 if c.get('notes', False, section='spell') == True: notes_was_false = 0 if c.get('plot', False, section='spell') == True: plot_was_false = 0 # number if w['view_number'].get_active(): c.set('number', 'True', section='mainlist') else: c.set('number', 'False', section='mainlist') # image if w['view_image'].get_active(): c.set('image', 'True', section='mainlist') else: c.set('image', 'False', section='mainlist') # original title if w['view_o_title'].get_active(): c.set('otitle', 'True', section='mainlist') else: c.set('otitle', 'False', section='mainlist') # title if w['view_title'].get_active(): c.set('title', 'True', section='mainlist') else: c.set('title', 'False', section='mainlist') # director if w['view_director'].get_active(): c.set('director', 'True', section='mainlist') else: c.set('director', 'False', section='mainlist') # genre if w['view_genre'].get_active(): c.set('genre', 'True', section='mainlist') else: c.set('genre', 'False', section='mainlist') # seen if w['view_seen'].get_active(): c.set('seen', 'True', section='mainlist') else: c.set('seen', 'False', section='mainlist') # year if w['view_year'].get_active(): c.set('year', 'True', section='mainlist') else: c.set('year', 'False', section='mainlist') # runtime if w['view_runtime'].get_active(): c.set('runtime', 'True', section='mainlist') else: c.set('runtime', 'False', section='mainlist') # rating if w['view_rating'].get_active(): c.set('rating', 'True', section='mainlist') else: c.set('rating', 'False', section='mainlist') # created if w['view_created'].get_active(): c.set('created', 'True', section='mainlist') else: c.set('created', 'False', section='mainlist') # updated if w['view_updated'].get_active(): c.set('updated', 'True', section='mainlist') else: c.set('updated', 'False', section='mainlist') # sortby if w['sortby'].get_active(): field = self.sort_criteria[w['sortby'].get_active()] if field: c.set('sortby', field, section='mainlist') else: c.set('sortby', 'number', section='mainlist') c.set('sortby_reverse', w['sortby_reverse'].get_active(), section='mainlist') c.set('limit', str(int(w['s_limit'].get_value())), section='mainlist') # pdf font if w['font'].get_filename(): c['font'] = w['font'].get_filename() c['font_size'] = int(w['font_size'].get_value()) # pdf elements pdf_elements = '' for child in w['pdf_elements_table']: if child.get_active(): pdf_elements = pdf_elements + child.get_name()[4:] + ',' if pdf_elements: c.set('pdf_elements', pdf_elements[:-1]) else: c.set('pdf_elements', pdf_elements) # spellchecker if w['spellchecker'].get_active(): c.set('gtkspell', True, section='spell') else: c.set('gtkspell', False, section='spell') if w['spell_notes'].get_active(): c.set('notes', True, section='spell') else: c.set('notes', False, section='spell') if w['spell_plot'].get_active(): c.set('plot', True, section='spell') else: c.set('plot', False, section='spell') # rating image c['rating_image'] = str(w['rating_image'].get_active()) #defaults media_id = self.media_ids[w['media'].get_active()] if media_id is None: media_id = 0 c.set('media', media_id, section='defaults') vcodec_id = self.vcodecs_ids[w['vcodec'].get_active()] if vcodec_id is None: vcodec_id = 0 c.set('vcodec', vcodec_id, section='defaults') c.set('condition', str(w['condition'].get_active()), section='defaults') c.set('region', str(w['region'].get_active()), section='defaults') c.set('layers', str(w['layers'].get_active()), section='defaults') c.set('color', str(w['color'].get_active()), section='defaults') # email reminder if w['mail_use_auth'].get_active(): c.set('use_auth', True, section='mail') else: c.set('use_auth', False, section='mail') if w['mail_use_tls'].get_active(): c.set('mail_use_tls', True, section='mail') else: c.set('mail_use_tls', False, section='mail') c.set('smtp_server', w['mail_smtp_server'].get_text(), section='mail') c.set('mail_smtp_port', w['mail_smtp_port'].get_text(), section='mail') c.set('username', w['mail_username'].get_text(), section='mail') c.set('password', w['mail_password'].get_text(), section='mail') c.set('email', w['mail_email'].get_text(), section='mail') # default movie plugin if w['default_plugin'].get_active(): c['default_movie_plugin'] = \ gutils.on_combo_box_entry_changed(w['default_plugin']) # search for: c.set('s_classification', w['s_classification'].get_active(), section='add') c.set('s_country', w['s_country'].get_active(), section='add') c.set('s_director', w['s_director'].get_active(), section='add') c.set('s_genre', w['s_genre'].get_active(), section='add') c.set('s_image', w['s_image'].get_active(), section='add') c.set('s_notes', w['s_notes'].get_active(), section='add') c.set('s_o_site', w['s_o_site'].get_active(), section='add') c.set('s_o_title', w['s_o_title'].get_active(), section='add') c.set('s_plot', w['s_plot'].get_active(), section='add') c.set('s_rating', w['s_rating'].get_active(), section='add') c.set('s_runtime', w['s_runtime'].get_active(), section='add') c.set('s_site', w['s_site'].get_active(), section='add') c.set('s_studio', w['s_studio'].get_active(), section='add') c.set('s_title', w['s_title'].get_active(), section='add') c.set('s_trailer', w['s_trailer'].get_active(), section='add') c.set('s_cast', w['s_cast'].get_active(), section='add') c.set('s_year', w['s_year'].get_active(), section='add') c.set('s_screenplay', w['s_screenplay'].get_active(), section='add') c.set('s_cameraman', w['s_cameraman'].get_active(), section='add') c.set('s_resolution', w['s_resolution'].get_active(), section='add') c.set('s_barcode', w['s_barcode'].get_active(), section='add') mcounter = 0 for p in self.plugins: plugin_module = os.path.basename(p).replace('.py','') plugin_name = plugin_module.replace('PluginMovie','') if gutils.on_combo_box_entry_changed(w['default_plugin']) == plugin_name: break mcounter = mcounter + 1 self.widgets['add']['source'].set_active(mcounter) save_reader = w['epdf_reader'].get_text() c.set('lang', w['spell_lang'].get_text(), section='spell') c['pdf_reader'] = save_reader if spell_support: if c.get('gtkspell', False, section='spell') == False and not was_false: self.notes_spell.detach() self.plot_spell.detach() elif c.get('gtkspell', False, section='spell') == True and was_false: initialize.spellcheck(self) else: pass if c.get('gtkspell', False, section='spell') == True: if c.get('plot', True, section='spell') == False and not plot_was_false: self.plot_spell.detach() elif c.get('plot', True, section='spell') == True and plot_was_false: self.plot_spell = gtkspell.Spell(self.widgets['add']['plot']) self.plot_spell.set_language(c.get('lang', 'en', section='spell')) else: pass if c.get('notes', True, section='spell') == False and not notes_was_false: self.notes_spell.detach() elif c.get('notes', True, section='spell') == True and notes_was_false: self.notes_spell = gtkspell.Spell(self.widgets['add']['notes']) self.notes_spell.set_language(c.get('lang', 'en', section='spell')) else: pass self.pdf_reader = save_reader # extensions settings for ext_name in plugins.extensions.by_name: preferenceswidgets = plugins.extensions.by_name[ext_name].preferenceswidgets for prefname in preferenceswidgets: widget = preferenceswidgets[prefname] if isinstance(widget, gtk.CheckButton): value = widget.get_active() elif isinstance(widget, gtk.Entry): value = widget.get_text() elif isinstance(widget, gtk.ComboBox): iter = widget.get_active_iter() if iter: value = widget.get_model().get_value(iter, 1) else: log.error('widget type not supported %s', type(widget)) continue c.set("%s_%s" % (ext_name, prefname), value, section='extensions') # database old = c.to_dict(section='database') c.set('host', w['db_host'].get_text(), section='database') c.set('port', int(w['db_port'].get_value()), section='database') c.set('name', w['db_name'].get_text(), section='database') c.set('user', w['db_user'].get_text(), section='database') c.set('passwd', w['db_passwd'].get_text(), section='database') db_type = int(w['db_type'].get_active()) if db_type == 1: c.set('type', 'postgres', section='database') elif db_type == 2: c.set('type', 'mysql', section='database') elif db_type == 3: c.set('type', 'mssql', section='database') else: c.set('type', 'sqlite', section='database') if old['type'] != c.get('type', section='database') or (old['type']!='sqlite' and (\ old['host'] != c.get('host', section='database') or \ old['port'] != c.get('port', section='database') or \ old['user'] != c.get('user', section='database') or \ old['passwd'] != c.get('passwd', section='database'))) or \ old['name'] != c.get('name', section='database'): log.info('DATABASE: connecting to new db server...') import sql from sqlalchemy.exceptions import InvalidRequestError from initialize import dictionaries, people_treeview # new database connection self.initialized = False if c.has_key('posters'): c['posters'] = None # force update try: self.db.dispose() self.db = sql.GriffithSQL(c, self.locations['home'], fallback=True) except InvalidRequestError, e: log.exception('') c.set('type', 'sqlite', section='database') w['db_type'].set_active(0) self.db = sql.GriffithSQL(c, self.locations['home']) log.info("New database Engine: %s" % self.db.session.bind.engine.name) # initialize new database self.total = int(self.db.session.query(db.Movie).count()) self.count_statusbar() dictionaries(self) people_treeview(self, False) self.initialized = True
def restore(self): """restores a griffith compressed backup""" filename = gutils.file_chooser(_("Restore Griffith backup"), \ action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons= \ (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, \ gtk.STOCK_OPEN, gtk.RESPONSE_OK)) if filename[0]: try: zip = zipfile.ZipFile(filename[0], 'r') except: gutils.error(self, _("Can't read backup file"), self.widgets['window']) return False mypath = os.path.join(self.locations['posters']) old_config_file = False for each in zip.namelist(): file_to_restore = os.path.split(each) if not os.path.isdir(file_to_restore[1]): if file_to_restore[1] == '': continue if file_to_restore[1].endswith('.jpg'): myfile = os.path.join(mypath,file_to_restore[1]) else: myfile = os.path.join(self.locations['home'],file_to_restore[1]) if file_to_restore[1].endswith('.conf'): old_config_file = myfile outfile = open(myfile, 'wb') outfile.write(zip.read(each)) outfile.flush() outfile.close() zip.close() # restore config file self.config = config.Config(file=os.path.join(self.locations['home'],'griffith.cfg')) if old_config_file: log.info('Old config file detected. Please note that it will not be used.') f = open(old_config_file, 'r') old_config_raw_data = f.read() f.close() if old_config_raw_data.find('griffith.gri') >= -1: self.config.set('file', 'griffith.gri', section='database') filename = os.path.join(self.locations['home'], self.config.get('name', 'griffith', section='database') + '.db') self.db.session.bind.engine.dispose() # close DB # check if file needs conversion if self.config.get('file', 'griffith.db', section='database').lower().endswith('.gri'): log.info('Old database format detected. Converting...') from dbupgrade import convert_from_old_db if convert_from_old_db(self, filename, os.path.join(self.locations['home'], 'griffith.db')): self.config.save() else: log.error('Cant convert old database, exiting.') import sys sys.exit(4) self.db = sql.GriffithSQL(self.config, self.locations['home'], self.locations) from initialize import dictionaries, people_treeview dictionaries(self) people_treeview(self) # let's refresh the treeview self.clear_details() self.populate_treeview() gutils.info(_("Backup restored"), self.widgets['window'])
def save_preferences(self): w = self.widgets['preferences'] c = self.config global spell_support was_false = notes_was_false = plot_was_false = 1 if c.get('use_gtkspell', 'False') == 'True': was_false = 0 if c.get('spell_notes', 'False') == 'True': notes_was_false = 0 if c.get('spell_plot', 'False') == 'True': plot_was_false = 0 # image if w['view_image'].get_active(): c['view_image'] = 'True' else: c['view_image'] = 'False' # original title if w['view_o_title'].get_active(): c['view_otitle'] = 'True' else: c['view_otitle'] = 'False' # title if w['view_title'].get_active(): c['view_title'] = 'True' else: c['view_title'] = 'False' # director if w['view_director'].get_active(): c['view_director'] = 'True' else: c['view_director'] = 'False' # sortby if w['sortby'].get_active(): field = self.sort_criteria[w['sortby'].get_active()] if field: c['sortby'] = field else: c['sortby'] = 'number' c['sortby_reverse'] = w['sortby_reverse'].get_active() # pdf font if w['font'].get_filename(): c['font'] = w['font'].get_filename() # spellchecker if w['spellchecker'].get_active(): c['use_gtkspell'] = 'True' else: c['use_gtkspell'] = 'False' if w['spell_notes'].get_active(): c['spell_notes'] = 'True' else: c['spell_notes'] = 'False' if w['spell_plot'].get_active(): c['spell_plot'] = 'True' else: c['spell_plot'] = 'False' # rating image c['rating_image'] = str(w['rating_image'].get_active()) #defaults c['media'] = self.media_ids[w['media'].get_active()] c['vcodec'] = self.vcodecs_ids[w['vcodec'].get_active()] c['condition'] = str(w['condition'].get_active()) c['region'] = str(w['region'].get_active()) c['layers'] = str(w['layers'].get_active()) c['color'] = str(w['color'].get_active()) # email reminder if w['mail_use_auth'].get_active(): c['mail_use_auth'] = 'True' else: c['mail_use_auth'] = 'False' c['mail_smtp_server'] = w['mail_smtp_server'].get_text() c['mail_username'] = w['mail_username'].get_text() c['mail_password'] = w['mail_password'].get_text() c['mail_email'] = w['mail_email'].get_text() # default movie plugin if w['default_plugin'].get_active(): c['default_movie_plugin'] = \ gutils.on_combo_box_entry_changed(w['default_plugin']) # search for: c['s_classification'] = w['s_classification'].get_active() c['s_country'] = w['s_country'].get_active() c['s_director'] = w['s_director'].get_active() c['s_genre'] = w['s_genre'].get_active() c['s_image'] = w['s_image'].get_active() c['s_notes'] = w['s_notes'].get_active() c['s_o_site'] = w['s_o_site'].get_active() c['s_o_title'] = w['s_o_title'].get_active() c['s_plot'] = w['s_plot'].get_active() c['s_rating'] = w['s_rating'].get_active() c['s_runtime'] = w['s_runtime'].get_active() c['s_site'] = w['s_site'].get_active() c['s_studio'] = w['s_studio'].get_active() c['s_title'] = w['s_title'].get_active() c['s_trailer'] = w['s_trailer'].get_active() c['s_cast'] = w['s_cast'].get_active() c['s_year'] = w['s_year'].get_active() mcounter = 0 for p in self.plugins: plugin_module = os.path.basename(p).replace('.py','') plugin_name = plugin_module.replace('PluginMovie','') if gutils.on_combo_box_entry_changed(w['default_plugin']) == plugin_name: self.d_plugin = mcounter mcounter = mcounter + 1 self.widgets['add']['source'].set_active(self.d_plugin) if self.windows: save_reader = '' else: save_reader = w['epdf_reader'].get_text() c['spell_lang'] = w['spell_lang'].get_text() c['pdf_reader'] = save_reader c['amazon_locale'] = w['amazon_locale'].get_active() if spell_support: if c.get('use_gtkspell', 'False') == 'False' and not was_false: self.notes_spell.detach() self.plot_spell.detach() elif c.get('use_gtkspell', 'False') == 'True' and was_false: initialize.initialize_gtkspell(self) else: pass if c.get('use_gtkspell', 'False') == 'True': if c.get('spell_plot', 'True') == 'False' and not plot_was_false: self.plot_spell.detach() elif c.get('spell_plot', 'True') == 'True' and plot_was_false: self.plot_spell = gtkspell.Spell(self.widgets['add']['plot']) self.plot_spell.set_language(c.get('spell_lang', 'en')) else: pass if c.get('spell_notes', 'True') == 'False' and not notes_was_false: self.notes_spell.detach() elif c.get('spell_notes', 'True') == 'True' and notes_was_false: self.notes_spell = gtkspell.Spell(self.widgets['add']['notes']) self.notes_spell.set_language(c.get('spell_lang', 'en')) else: pass self.pdf_reader = save_reader # database old = { 'db_type': c['db_type'], 'db_host': c['db_host'], 'db_port': c['db_port'], 'db_name': c['db_name'], 'db_user': c['db_user'], 'db_passwd': c['db_passwd'], } c['db_host'] = w['db_host'].get_text() c['db_port'] = int(w['db_port'].get_value()) c['db_name'] = w['db_name'].get_text() c['db_user'] = w['db_user'].get_text() c['db_passwd'] = w['db_passwd'].get_text() db_type = int(w['db_type'].get_active()) if db_type == 1: c['db_type'] = 'postgres' elif db_type == 2: c['db_type'] = 'mysql' else: c['db_type'] = 'sqlite' if old['db_type'] != c['db_type'] or (old['db_type']!='sqlite' and (\ old['db_host'] != c['db_host'] or \ old['db_port'] != c['db_port'] or \ old['db_name'] != c['db_name'] or \ old['db_user'] != c['db_user'] or \ old['db_passwd'] != c['db_passwd'])): self.debug.show('DATABASE: connecting to new db server...') # new database connection import sql self.initialized = False self.db.metadata.clear() from sqlalchemy.orm import clear_mappers clear_mappers() self.db = sql.GriffithSQL(c, self.debug, self.locations['home']) self.debug.show("New database Engine: %s" % self.db.metadata.engine.name) # initialize new database self.total = int(self.db.Movie.count()) self.count_statusbar() from initialize import dictionaries, people_treeview, location_posters c['posters'] = None # force update location_posters(self.locations, self.config) dictionaries(self) people_treeview(self, False) self.initialized = True self.clear_details() self.populate_treeview() self.go_last() c.save()
def __init__(self, *args, **kwds): # debug object global debug debug = self.debug = gdebug.GriffithDebug() gconsole.check_args(self) initialize.locations(self) initialize.i18n(self, self.locations['i18n']) self.posix = (os.name == 'posix') # Configuration if self._tmp_config.find('/') >=0 or self._tmp_config.find('\\') >=0: configFileName = self._tmp_config else: configFileName = os.path.join(self.locations['home'], self._tmp_config) self.config = config.Config(file=configFileName) initialize.location_posters(self.locations, self.config) # convert old database filename = os.path.join(self.locations['home'], self.config.get('file', 'griffith.db', section='database')) if self.config.get('file', 'griffith.db', section='database').lower().endswith('.gri'): debug.show('Old database format detected. Converting...') from dbupgrade import convert_from_old_db if convert_from_old_db(self, filename, os.path.join(self.locations['home'], 'griffith.db')): self.config.save() initialize.location_posters(self.locations, self.config) else: print 'Cant convert old database, exiting.' sys.exit(4) # create/connect db from sql import GriffithSQL self.db = GriffithSQL(self.config, self.debug, self.locations['home']) # let's check any console arguments to parse gconsole.check_args_with_db(self) self.filter_l = False # begin wxGlade: MainFrame.__init__ kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.window_1 = wx.SplitterWindow(self, -1, style=wx.SP_3D|wx.SP_BORDER|wx.SP_LIVE_UPDATE) self.window_1_pane_2 = wx.Panel(self.window_1, -1) self.notebook_1 = wx.Notebook(self.window_1_pane_2, -1, style=0) self.window_1_pane_1 = wx.Panel(self.window_1, -1) # Menu Bar self.main_frame_menubar = wx.MenuBar() wxglade_tmp_menu = wx.Menu() self.new = wx.MenuItem(wxglade_tmp_menu, 1, _("&New"), _("Start a blank database"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.new) self.save_as = wx.MenuItem(wxglade_tmp_menu, 2, _("Save as..."), _("Make a backup of the database"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.save_as) self.revert = wx.MenuItem(wxglade_tmp_menu, 3, _("Revert"), _("Revert to a previous database backup"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.revert) wxglade_tmp_menu.AppendSeparator() self.import_data = wx.MenuItem(wxglade_tmp_menu, 4, _("Import"), "", wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.import_data) self.export_data = wx.MenuItem(wxglade_tmp_menu, 5, _("Export"), "", wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.export_data) wxglade_tmp_menu.AppendSeparator() self._print = wx.MenuItem(wxglade_tmp_menu, 6, _("Print"), "", wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self._print) wxglade_tmp_menu.AppendSeparator() self.exit = wx.MenuItem(wxglade_tmp_menu, wx.ID_EXIT, _("Exit"), _("Terminate the program"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.exit) self.main_frame_menubar.Append(wxglade_tmp_menu, _("File")) wxglade_tmp_menu = wx.Menu() self.add = wx.MenuItem(wxglade_tmp_menu, 7, _("Add"), _("Add a new record"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.add) self.delete = wx.MenuItem(wxglade_tmp_menu, 8, _("Delete"), _("Deletes a record"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.delete) self.edit = wx.MenuItem(wxglade_tmp_menu, 9, _("Edit"), _("Edit a record"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.edit) self.duplicate = wx.MenuItem(wxglade_tmp_menu, 10, _("Duplicate"), _("Duplicates a record"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.duplicate) wxglade_tmp_menu.AppendSeparator() wxglade_tmp_menu_sub = wx.Menu() self.open = wx.MenuItem(wxglade_tmp_menu_sub, 11, _("Open"), _("Opens the poster viewer"), wx.ITEM_NORMAL) wxglade_tmp_menu_sub.AppendItem(self.open) self.fetch = wx.MenuItem(wxglade_tmp_menu_sub, 12, _("Fetch from Amazon"), _("Fetches a poster using Amazon service"), wx.ITEM_NORMAL) wxglade_tmp_menu_sub.AppendItem(self.fetch) self.erase = wx.MenuItem(wxglade_tmp_menu_sub, 13, _("Erase"), _("Erase the current poster"), wx.ITEM_NORMAL) wxglade_tmp_menu_sub.AppendItem(self.erase) wxglade_tmp_menu.AppendMenu(wx.NewId(), _("Poster image"), wxglade_tmp_menu_sub, "") self.main_frame_menubar.Append(wxglade_tmp_menu, _("Edit")) wxglade_tmp_menu = wx.Menu() self.view_toolbar = wx.MenuItem(wxglade_tmp_menu, 14, _("Toolbar"), _("Toggles toolbar visibility"), wx.ITEM_CHECK) wxglade_tmp_menu.AppendItem(self.view_toolbar) wxglade_tmp_menu.AppendSeparator() self.view_not_seen = wx.MenuItem(wxglade_tmp_menu, 15, _("Not seen"), _("View only not seen"), wx.ITEM_RADIO) wxglade_tmp_menu.AppendItem(self.view_not_seen) self.view_loaned = wx.MenuItem(wxglade_tmp_menu, 16, _("Loaned"), _("View only loaned"), wx.ITEM_RADIO) wxglade_tmp_menu.AppendItem(self.view_loaned) self.view_all = wx.MenuItem(wxglade_tmp_menu, 17, _("All"), _("View all records"), wx.ITEM_RADIO) wxglade_tmp_menu.AppendItem(self.view_all) self.main_frame_menubar.Append(wxglade_tmp_menu, _("View")) wxglade_tmp_menu = wx.Menu() self.suggest = wx.MenuItem(wxglade_tmp_menu, 18, _("Suggest"), _("Suggest an unseen film"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.suggest) wxglade_tmp_menu_sub = wx.Menu() self.print_cover_builtin = wx.MenuItem(wxglade_tmp_menu_sub, 19, _("Built-in"), _("Prints a cover with record data"), wx.ITEM_NORMAL) wxglade_tmp_menu_sub.AppendItem(self.print_cover_builtin) self.prints_cover_custom = wx.MenuItem(wxglade_tmp_menu_sub, 20, _("Custom"), _("Prints a cover with a custom image"), wx.ITEM_NORMAL) wxglade_tmp_menu_sub.AppendItem(self.prints_cover_custom) wxglade_tmp_menu.AppendMenu(wx.NewId(), _("Print cover"), wxglade_tmp_menu_sub, "") wxglade_tmp_menu.AppendSeparator() self.preferences = wx.MenuItem(wxglade_tmp_menu, wx.ID_PREFERENCES, _("Preferences"), _("Define the preferences"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.preferences) self.main_frame_menubar.Append(wxglade_tmp_menu, _("Tools")) wxglade_tmp_menu = wx.Menu() self.loan_film = wx.MenuItem(wxglade_tmp_menu, 22, _("Loan"), _("Loans a film"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.loan_film) self.return_film = wx.MenuItem(wxglade_tmp_menu, 23, _("Return"), _("Returns a previously loaned film"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.return_film) self.email_reminder = wx.MenuItem(wxglade_tmp_menu, 24, _("E-mail reminder"), _("Sends an automatic loan reminder e-mail message "), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.email_reminder) wxglade_tmp_menu.AppendSeparator() self.people = wx.MenuItem(wxglade_tmp_menu, 25, _("People"), _("Manages people information"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.people) self.main_frame_menubar.Append(wxglade_tmp_menu, _("Loans")) wxglade_tmp_menu = wx.Menu() self.homepage = wx.MenuItem(wxglade_tmp_menu, 26, _("Homepage"), _("Visit Griffith's homepage"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.homepage) self.forum = wx.MenuItem(wxglade_tmp_menu, 27, _("Forum"), _("Visit Griffith's community forum"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.forum) self.reportbug = wx.MenuItem(wxglade_tmp_menu, 28, _("Reportbug"), _("Report a new bug"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.reportbug) wxglade_tmp_menu.AppendSeparator() self.about = wx.MenuItem(wxglade_tmp_menu, wx.ID_ABOUT, _("About"), _("Display information about this program"), wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.about) self.main_frame_menubar.Append(wxglade_tmp_menu, _("Help")) self.SetMenuBar(self.main_frame_menubar) # Menu Bar end self.main_frame_statusbar = self.CreateStatusBar(1, 0) # Tool Bar self.main_frame_toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL|wx.TB_DOCKABLE|wx.TB_TEXT) self.SetToolBar(self.main_frame_toolbar) self.main_frame_toolbar.AddLabelTool(1004, _("First"), wx.Bitmap("images/go-first.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "", "") self.main_frame_toolbar.AddLabelTool(1003, _("Previous"), wx.Bitmap("images/go-previous.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "", "") self.main_frame_toolbar.AddLabelTool(1004, _("Next"), wx.Bitmap("images/go-next.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "", "") self.main_frame_toolbar.AddLabelTool(1005, _("Last"), wx.Bitmap("images/go-last.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "", "") self.main_frame_toolbar.AddSeparator() self.main_frame_toolbar.AddLabelTool(1006, _("Add"), wx.Bitmap("images/document-new.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, _("Add a new film"), _("Add a new film to the collection")) self.main_frame_toolbar.AddLabelTool(1008, _("Delete"), wx.Bitmap("images/user-trash.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, _("Delete this film"), _("Deletes this film from collection")) self.main_frame_toolbar.AddLabelTool(1009, _("Edit"), wx.Bitmap("images/edit-select-all.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, _("Edit film details"), _("Edit film details")) self.main_frame_toolbar.AddSeparator() self.main_frame_toolbar.AddLabelTool(1010, _("Webpage"), wx.Bitmap("images/applications-internet.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, _("Go to the film webpage"), _("Go to the film webpage")) self.main_frame_toolbar.AddSeparator() self.main_frame_toolbar.AddLabelTool(1013, _("Amazon Poster"), wx.Bitmap("images/applications-graphics.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, _("Add Poster From Amazon"), _("Try to find a poster using the Amazon Services on the web")) self.main_frame_toolbar.AddSeparator() self.main_frame_toolbar.AddLabelTool(1014, _("People"), wx.Bitmap("images/system-users.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "", "") # Tool Bar end self.label_1 = wx.StaticText(self, -1, _("Filter")) self.tc_filter = wx.TextCtrl(self, -1, "") self.bt_clear_filter = wx.Button(self, -1, _("clear")) self.cb_criteria = wx.ComboBox(self, -1, choices=[], style=wx.CB_DROPDOWN) self.main_listcontrol = wx.ListCtrl(self.window_1_pane_1, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) self.number = wx.StaticText(self.window_1_pane_2, -1, _("label_2")) self.o_title = wx.StaticText(self.window_1_pane_2, -1, _("label_2")) self.title = wx.StaticText(self.window_1_pane_2, -1, _("label_2")) self.poster = wx.BitmapButton(self.window_1_pane_2, -1, wx.NullBitmap, style=wx.BU_AUTODRAW) self.plot = wx.TextCtrl(self.notebook_1, -1, "", style=wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_RICH2|wx.TE_AUTO_URL|wx.TE_LINEWRAP|wx.TE_WORDWRAP) self.cast = wx.TextCtrl(self.notebook_1, -1, "", style=wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_RICH2|wx.TE_AUTO_URL|wx.TE_LINEWRAP|wx.TE_WORDWRAP) self.notes = wx.TextCtrl(self.notebook_1, -1, "", style=wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_RICH2|wx.TE_AUTO_URL|wx.TE_LINEWRAP|wx.TE_WORDWRAP) self.__set_properties() self.__do_layout() self.Bind(wx.EVT_MENU, self.OnNew, self.new) self.Bind(wx.EVT_MENU, self.OnSaveAs, self.save_as) self.Bind(wx.EVT_MENU, self.OnRevert, self.revert) self.Bind(wx.EVT_MENU, self.OnImport, self.import_data) self.Bind(wx.EVT_MENU, self.OnExport, self.export_data) self.Bind(wx.EVT_MENU, self.OnPrint, self._print) self.Bind(wx.EVT_MENU, self.OnExit, self.exit) self.Bind(wx.EVT_MENU, self.OnAdd, self.add) self.Bind(wx.EVT_MENU, self.OnDelete, self.delete) self.Bind(wx.EVT_MENU, self.OnEdit, self.edit) self.Bind(wx.EVT_MENU, self.onDuplicate, self.duplicate) self.Bind(wx.EVT_MENU, self.OnPosterOpen, self.open) self.Bind(wx.EVT_MENU, self.OnPosterFromAmazon, self.fetch) self.Bind(wx.EVT_MENU, self.OnPosterErase, self.erase) self.Bind(wx.EVT_MENU, self.OnViewToolbar, self.view_toolbar) self.Bind(wx.EVT_MENU, self.OnViewNotSeen, self.view_not_seen) self.Bind(wx.EVT_MENU, self.OnViewLoaned, self.view_loaned) self.Bind(wx.EVT_MENU, self.OnViewAll, self.view_all) self.Bind(wx.EVT_MENU, self.OnSuggest, self.suggest) self.Bind(wx.EVT_MENU, self.OnPrintCoverBuiltin, self.print_cover_builtin) self.Bind(wx.EVT_MENU, self.OnPrintCoverCustom, self.prints_cover_custom) self.Bind(wx.EVT_MENU, self.OnPreferences, self.preferences) self.Bind(wx.EVT_MENU, self.OnLoanFilm, self.loan_film) self.Bind(wx.EVT_MENU, self.OnReturnFilm, self.return_film) self.Bind(wx.EVT_MENU, self.OnEmailReminder, self.email_reminder) self.Bind(wx.EVT_MENU, self.OnPeople, self.people) self.Bind(wx.EVT_MENU, self.OnHomepage, self.homepage) self.Bind(wx.EVT_MENU, self.OnForum, self.forum) self.Bind(wx.EVT_MENU, self.OnReportBug, self.reportbug) self.Bind(wx.EVT_MENU, self.OnAbout, self.about) self.Bind(wx.EVT_TOOL, self.OnFirst, id=1004) self.Bind(wx.EVT_TOOL, self.OnPrevious, id=1003) self.Bind(wx.EVT_TOOL, self.OnNext, id=1004) self.Bind(wx.EVT_TOOL, self.OnLast, id=1005) self.Bind(wx.EVT_TOOL, self.OnAdd, id=1006) self.Bind(wx.EVT_TOOL, self.OnDelete, id=1008) self.Bind(wx.EVT_TOOL, self.OnEdit, id=1009) self.Bind(wx.EVT_TOOL, self.OnWebpage, id=1010) self.Bind(wx.EVT_TOOL, self.OnAddAmazonPoster, id=1013) self.Bind(wx.EVT_TOOL, self.OnPeople, id=1014) self.Bind(wx.EVT_TEXT, self.OnFilterChange, self.tc_filter) self.Bind(wx.EVT_BUTTON, self.OnClearFilter, self.bt_clear_filter) self.Bind(wx.EVT_TEXT, self.OnChangeCriteria, self.cb_criteria) self.Bind(wx.EVT_LIST_DELETE_ITEM, self.OnMainListDelete, self.main_listcontrol) self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnMainListSelected, self.main_listcontrol) self.Bind(wx.EVT_LIST_COL_CLICK, self.OnMainLColumnClicked, self.main_listcontrol) self.Bind(wx.EVT_BUTTON, self.OnPosterClick, self.poster) # end wxGlade initialize.locations_misc(self) #initialize.toolbar(self) initialize.treeview(self) #initialize.loans_treeview(self) #initialize.lang_treeview(self) initialize.dictionaries(self) initialize.combos(self) #initialize.preferences(self) #initialize.movie_plugins(self) #initialize.export_plugins(self) #initialize.people_treeview(self) #initialize.web_results(self) self.initialized = True #self.restore_state() #self.clear_details() self.populate_treeview()
def save_preferences(self): w = self.widgets['preferences'] c = self.config global spell_support was_false = notes_was_false = plot_was_false = 1 if c.get('gtkspell', False, section='spell') == True: was_false = 0 if c.get('notes', False, section='spell') == True: notes_was_false = 0 if c.get('plot', False, section='spell') == True: plot_was_false = 0 # number if w['view_number'].get_active(): c.set('number', 'True', section='mainlist') else: c.set('number', 'False', section='mainlist') # image if w['view_image'].get_active(): c.set('image', 'True', section='mainlist') else: c.set('image', 'False', section='mainlist') # original title if w['view_o_title'].get_active(): c.set('otitle', 'True', section='mainlist') else: c.set('otitle', 'False', section='mainlist') # title if w['view_title'].get_active(): c.set('title', 'True', section='mainlist') else: c.set('title', 'False', section='mainlist') # director if w['view_director'].get_active(): c.set('director', 'True', section='mainlist') else: c.set('director', 'False', section='mainlist') # genre if w['view_genre'].get_active(): c.set('genre', 'True', section='mainlist') else: c.set('genre', 'False', section='mainlist') # seen if w['view_seen'].get_active(): c.set('seen', 'True', section='mainlist') else: c.set('seen', 'False', section='mainlist') # year if w['view_year'].get_active(): c.set('year', 'True', section='mainlist') else: c.set('year', 'False', section='mainlist') # runtime if w['view_runtime'].get_active(): c.set('runtime', 'True', section='mainlist') else: c.set('runtime', 'False', section='mainlist') # rating if w['view_rating'].get_active(): c.set('rating', 'True', section='mainlist') else: c.set('rating', 'False', section='mainlist') # created if w['view_created'].get_active(): c.set('created', 'True', section='mainlist') else: c.set('created', 'False', section='mainlist') # updated if w['view_updated'].get_active(): c.set('updated', 'True', section='mainlist') else: c.set('updated', 'False', section='mainlist') # sortby if w['sortby'].get_active(): field = self.sort_criteria[w['sortby'].get_active()] if field: c.set('sortby', field, section='mainlist') else: c.set('sortby', 'number', section='mainlist') c.set('sortby_reverse', w['sortby_reverse'].get_active(), section='mainlist') c.set('limit', str(int(w['s_limit'].get_value())), section='mainlist') # pdf font if w['font'].get_filename(): c['font'] = w['font'].get_filename() c['font_size'] = int(w['font_size'].get_value()) # pdf elements pdf_elements = '' for child in w['pdf_elements_table']: if child.get_active(): pdf_elements = pdf_elements + child.get_name()[4:] + ',' if pdf_elements: c.set('pdf_elements', pdf_elements[:-1]) else: c.set('pdf_elements', pdf_elements) # spellchecker if w['spellchecker'].get_active(): c.set('gtkspell', True, section='spell') else: c.set('gtkspell', False, section='spell') if w['spell_notes'].get_active(): c.set('notes', True, section='spell') else: c.set('notes', False, section='spell') if w['spell_plot'].get_active(): c.set('plot', True, section='spell') else: c.set('plot', False, section='spell') # rating image c['rating_image'] = str(w['rating_image'].get_active()) #defaults media_id = self.media_ids[w['media'].get_active()] if media_id is None: media_id = 0 c.set('media', media_id, section='defaults') vcodec_id = self.vcodecs_ids[w['vcodec'].get_active()] if vcodec_id is None: vcodec_id = 0 c.set('vcodec', vcodec_id, section='defaults') c.set('condition', str(w['condition'].get_active()), section='defaults') c.set('region', str(w['region'].get_active()), section='defaults') c.set('layers', str(w['layers'].get_active()), section='defaults') c.set('color', str(w['color'].get_active()), section='defaults') c.set('seen', str(w['seen'].get_active()), section='defaults') # email reminder if w['mail_use_auth'].get_active(): c.set('use_auth', True, section='mail') else: c.set('use_auth', False, section='mail') if w['mail_use_tls'].get_active(): c.set('mail_use_tls', True, section='mail') else: c.set('mail_use_tls', False, section='mail') c.set('smtp_server', w['mail_smtp_server'].get_text(), section='mail') c.set('mail_smtp_port', w['mail_smtp_port'].get_text(), section='mail') c.set('username', w['mail_username'].get_text(), section='mail') c.set('password', w['mail_password'].get_text(), section='mail') c.set('email', w['mail_email'].get_text(), section='mail') # default movie plugin if w['default_plugin'].get_active(): c['default_movie_plugin'] = \ gutils.on_combo_box_entry_changed(w['default_plugin']) # search for: c.set('s_classification', w['s_classification'].get_active(), section='add') c.set('s_country', w['s_country'].get_active(), section='add') c.set('s_director', w['s_director'].get_active(), section='add') c.set('s_genre', w['s_genre'].get_active(), section='add') c.set('s_image', w['s_image'].get_active(), section='add') c.set('s_notes', w['s_notes'].get_active(), section='add') c.set('s_o_site', w['s_o_site'].get_active(), section='add') c.set('s_o_title', w['s_o_title'].get_active(), section='add') c.set('s_plot', w['s_plot'].get_active(), section='add') c.set('s_rating', w['s_rating'].get_active(), section='add') c.set('s_runtime', w['s_runtime'].get_active(), section='add') c.set('s_site', w['s_site'].get_active(), section='add') c.set('s_studio', w['s_studio'].get_active(), section='add') c.set('s_title', w['s_title'].get_active(), section='add') c.set('s_trailer', w['s_trailer'].get_active(), section='add') c.set('s_cast', w['s_cast'].get_active(), section='add') c.set('s_year', w['s_year'].get_active(), section='add') c.set('s_screenplay', w['s_screenplay'].get_active(), section='add') c.set('s_cameraman', w['s_cameraman'].get_active(), section='add') c.set('s_resolution', w['s_resolution'].get_active(), section='add') c.set('s_barcode', w['s_barcode'].get_active(), section='add') mcounter = 0 for p in self.plugins: plugin_module = os.path.basename(p).replace('.py', '') plugin_name = plugin_module.replace('PluginMovie', '') if gutils.on_combo_box_entry_changed( w['default_plugin']) == plugin_name: break mcounter = mcounter + 1 self.widgets['add']['source'].set_active(mcounter) save_reader = w['epdf_reader'].get_text() c.set('lang', w['spell_lang'].get_text(), section='spell') c['pdf_reader'] = save_reader if spell_support: if c.get('gtkspell', False, section='spell') == False and not was_false: self.notes_spell.detach() self.plot_spell.detach() elif c.get('gtkspell', False, section='spell') == True and was_false: initialize.spellcheck(self) else: pass if c.get('gtkspell', False, section='spell') == True: if c.get('plot', True, section='spell') == False and not plot_was_false: self.plot_spell.detach() elif c.get('plot', True, section='spell') == True and plot_was_false: self.plot_spell = gtkspell.Spell(self.widgets['add']['plot']) self.plot_spell.set_language( c.get('lang', 'en', section='spell')) else: pass if c.get('notes', True, section='spell') == False and not notes_was_false: self.notes_spell.detach() elif c.get('notes', True, section='spell') == True and notes_was_false: self.notes_spell = gtkspell.Spell(self.widgets['add']['notes']) self.notes_spell.set_language( c.get('lang', 'en', section='spell')) else: pass self.pdf_reader = save_reader # extensions settings for ext_name in plugins.extensions.by_name: preferenceswidgets = plugins.extensions.by_name[ ext_name].preferenceswidgets for prefname in preferenceswidgets: widget = preferenceswidgets[prefname] if isinstance(widget, gtk.CheckButton): value = widget.get_active() elif isinstance(widget, gtk.Entry): value = widget.get_text() elif isinstance(widget, gtk.ComboBox): iter = widget.get_active_iter() if iter: value = widget.get_model().get_value(iter, 1) else: log.error('widget type not supported %s', type(widget)) continue c.set("%s_%s" % (ext_name, prefname), value, section='extensions') # database old = c.to_dict(section='database') c.set('host', w['db_host'].get_text(), section='database') c.set('port', int(w['db_port'].get_value()), section='database') c.set('name', w['db_name'].get_text(), section='database') c.set('user', w['db_user'].get_text(), section='database') c.set('passwd', w['db_passwd'].get_text(), section='database') db_type = int(w['db_type'].get_active()) if db_type == 1: c.set('type', 'postgres', section='database') elif db_type == 2: c.set('type', 'mysql', section='database') elif db_type == 3: c.set('type', 'mssql', section='database') else: c.set('type', 'sqlite', section='database') if old['type'] != c.get('type', section='database') or (old['type']!='sqlite' and (\ old['host'] != c.get('host', section='database') or \ old['port'] != c.get('port', section='database') or \ old['user'] != c.get('user', section='database') or \ old['passwd'] != c.get('passwd', section='database'))) or \ old['name'] != c.get('name', section='database'): log.info('DATABASE: connecting to new db server...') import sql from sqlalchemy.exc import InvalidRequestError from initialize import dictionaries, people_treeview # new database connection self.initialized = False if c.has_key('posters'): c['posters'] = None # force update try: self.db.dispose() self.db = sql.GriffithSQL(c, self.locations['home'], fallback=True) except InvalidRequestError, e: log.exception('') c.set('type', 'sqlite', section='database') w['db_type'].set_active(0) self.db = sql.GriffithSQL(c, self.locations['home']) log.info("New database Engine: %s" % self.db.session.bind.engine.name) # initialize new database self.total = int(self.db.session.query(db.Movie).count()) self.count_statusbar() dictionaries(self) people_treeview(self, False) self.initialized = True