def run(self, name): """Import movies, function called in a loop over source files""" from add import validate_details, edit_movie from gutils import find_next_available from sqlalchemy import Select, func import gtk if not self.set_source(name): self.debug.show("Can't read data from file %s" % name) return False self.widgets['pwindow'].show() while gtk.events_pending(): # give GTK some time for updates gtk.main_iteration() # progressbar update_on = [] count = self.count_movies() if count > 0: for i in range(0,100): update_on.append(int(float(i)/100*count)) statement = Select( [ func.max(self.db.Movie.c.number) ] ) number = statement.execute().fetchone()[0] if number is None: number = 1 else: number += 1 statement = Select([self.db.Movie.c.number]) processed = 0 while self._abort is False: details = self.get_movie_details() if details is None: break processed += 1 if processed in update_on: self.widgets['progressbar'].set_fraction(float(processed)/float(count)) gtk.main_iteration() self.widgets['progressbar'].set_text("%s (%s/%s)" % (str(self.imported), str(processed), str(count))) gtk.main_iteration() gtk.main_iteration() # extra iteration for abort button if (details.has_key('o_title') and details['o_title']) or (details.has_key('title') and details['title']): if details.has_key('o_title') and details['o_title']: statement.whereclause = func.lower(self.db.Movie.c.o_title)==details['o_title'].lower() if details.has_key('title') and details['title']: statement.append_whereclause( func.lower(self.db.Movie.c.title)==details['title'].lower() ) tmp = statement.execute().fetchone() if tmp is not None: self.debug.show("movie already exists (number=%s, o_title=%s)" % (tmp.number, details['o_title'])) continue elif details.has_key('title') and details['title']: statement.whereclause = func.lower(self.db.Movie.c.title)==details['title'].lower() tmp = statement.execute().fetchone() if tmp is not None: self.debug.show("movie already exists (number=%s, title=%s)" % (tmp.number, details['title'])) continue validate_details(details, self.fields_to_import) if self.edit is True: response = edit_movie(self.parent, details) # FIXME: wait until save or cancel button pressed if response == 1: self.imported += 1 else: if not details.has_key('number') or (details.has_key('number') and details['number'] is None): #details['number'] = find_next_available(self.db) details['number'] = number number += 1 #movie = self.db.Movie() #movie.add_to_db(details) try: self.db.Movie.mapper.mapped_table.insert().execute(details) self.imported += 1 except Exception, e: self.debug.show("movie details are not unique, skipping: %s" % str(e)) else: self.debug.show('skipping movie without title or original title')
def populate(self, movies=None, where=None):#{{{ if self.initialized is False: return False from sqlalchemy import Select, desc if movies is None: movies = Select([self.db.Movie.c.number, self.db.Movie.c.o_title, self.db.Movie.c.title, self.db.Movie.c.director, self.db.Movie.c.image, self.db.Movie.c.genre, self.db.Movie.c.seen, self.db.Movie.c.year, self.db.Movie.c.runtime, self.db.Movie.c.rating]) if isinstance(movies, Select): if not where: # because of possible 'seen', 'loaned', 'collection_id' in where # seen / loaned loaned_only = self.widgets['menu']['loaned_movies'].get_active() not_seen_only = self.widgets['menu']['not_seen_movies'].get_active() if loaned_only: movies.append_whereclause(self.db.Movie.c.loaned==True) if not_seen_only: movies.append_whereclause(self.db.Movie.c.seen==False) # collection pos = self.widgets['filter']['collection'].get_active() if pos >= 0: col_id = self.collection_combo_ids[pos] if col_id > 0: movies.append_whereclause(self.db.Movie.c.collection_id==col_id) # volume pos = self.widgets['filter']['volume'].get_active() if pos >= 0: vol_id = self.volume_combo_ids[pos] if vol_id > 0: movies.append_whereclause(self.db.Movie.c.volume_id==vol_id) # loaned to pos = self.widgets['filter']['loanedto'].get_active() if pos >= 0: per_id = self.loanedto_combo_ids[pos] if per_id > 0: from sqlalchemy import join, exists, and_ loan_exists = exists([self.db.Loan.c.movie_id], \ and_(self.db.Movie.c.movie_id==self.db.Loan.c.movie_id, self.db.Loan.c.person_id==per_id, self.db.Loan.c.return_date==None)) movies.append_whereclause(loan_exists) #loan_join = join(self.db.metadata.tables['movies'], \ # self.db.metadata.tables['loans'], \ # self.db.metadata.tables['movies'].c.movie_id==self.db.metadata.tables['loans'].c.movie_id) #movies = movies.select_from(loan_join) # tag pos = self.widgets['filter']['tag'].get_active() if pos >= 0: tag_id = self.bytag_combo_ids[pos] if tag_id > 0: from sqlalchemy import join, exists, and_ tag_exists = exists([self.db.MovieTag.c.movie_id], \ and_(self.db.Movie.c.movie_id==self.db.MovieTag.c.movie_id, self.db.MovieTag.c.tag_id==tag_id)) movies.append_whereclause(tag_exists) # select sort column sort_column_name = self.config.get('sortby', 'number', section='mainlist') sort_reverse = self.config.get('sortby_reverse', False, section='mainlist') for i in sort_column_name.split(','): if self.db.Movie.c.has_key(i): if sort_reverse: movies.order_by_clause.append(desc(self.db.Movie.c[i])) else: movies.order_by_clause.append(self.db.Movie.c[i]) # additional whereclause (volume_id, collection_id, ...) if where: for i in where: if self.db.Movie.c.has_key(i): movies.append_whereclause(self.db.Movie.c[i]==where[i]) movies = movies.execute().fetchall() self.total = len(movies) # disable refreshing while inserting self.widgets['treeview'].freeze_child_notify() self.widgets['treeview'].set_model(None) # save user sort column sort_column_id, order = self.treemodel.get_sort_column_id() # new treemodel (faster and prevents some problems) self.treemodel = gtk.TreeStore(str, gtk.gdk.Pixbuf, str, str, str, str, bool, str, str, int) # check preferences to hide or show columns if self.config.get('number', True, 'mainlist') == True: self.number_column.set_visible(True) else: self.number_column.set_visible(False) if self.config.get('otitle', True, 'mainlist') == True: self.otitle_column.set_visible(True) else: self.otitle_column.set_visible(False) if self.config.get('title', True, 'mainlist') == True: self.title_column.set_visible(True) else: self.title_column.set_visible(False) if self.config.get('director', True, 'mainlist') == True: self.director_column.set_visible(True) else: self.director_column.set_visible(False) if self.config.get('image', True, 'mainlist') == True: self.image_column.set_visible(True) else: self.image_column.set_visible(False) if self.config.get('genre', True, 'mainlist') == True: self.genre_column.set_visible(True) else: self.genre_column.set_visible(False) if self.config.get('seen', True, 'mainlist') == True: self.seen_column.set_visible(True) else: self.seen_column.set_visible(False) if self.config.get('year', True, 'mainlist') == True: self.year_column.set_visible(True) else: self.year_column.set_visible(False) if self.config.get('runtime', True, 'mainlist') == True: self.runtime_column.set_visible(True) else: self.runtime_column.set_visible(False) if self.config.get('rating', True, 'mainlist') == True: self.rating_column.set_visible(True) else: self.rating_column.set_visible(False) for movie in movies: myiter = self.treemodel.append(None) self.treemodel.set_value(myiter,0,'%004d' % int(movie.number)) if self.config.get('image', True, section='mainlist') == True: tmp_dest = self.locations['posters'] tmp_img = os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image)) if movie.image and os.path.isfile(tmp_img): image_path = tmp_img else: image_path = os.path.join(self.locations['images'], 'default_thumbnail.png') # lets see if we have a scaled down thumbnail already created if os.path.isfile(os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image))): pass else: # if not, lets make one for future use :D original_image = os.path.join(tmp_dest, "%s.jpg" % movie.image) if os.path.isfile(original_image): gutils.make_thumbnail(self, "%s.jpg" % movie.image) else: self.Image.set_from_file("%s/default_thumbnail.png" % self.locations['images']) pixbuf = self.Image.get_pixbuf() self.Image.set_from_file(image_path) pixbuf = self.Image.get_pixbuf() self.treemodel.set_value(myiter, 1, pixbuf) self.treemodel.set_value(myiter,2,movie.o_title) self.treemodel.set_value(myiter,3,movie.title) self.treemodel.set_value(myiter,4,movie.director) self.treemodel.set_value(myiter,5,movie.genre) self.treemodel.set_value(myiter,6,movie.seen) if movie.year is not None and isinstance(movie.year, int): self.treemodel.set_value(myiter,7,movie.year) if movie.runtime is not None and isinstance(movie.runtime, int): self.treemodel.set_value(myiter,8, '%003d' % movie.runtime + _(' min')) if movie.rating is not None and isinstance(movie.rating, int): self.treemodel.set_value(myiter,9,movie.rating) # restore user sort column if sort_column_id is not None: self.treemodel.set_sort_column_id(sort_column_id, gtk.SORT_ASCENDING) # add new treemodel and allow refreshs again self.widgets['treeview'].set_model(self.treemodel) self.widgets['treeview'].thaw_child_notify() self.widgets['treeview'].set_cursor_on_cell(0) self.count_statusbar()
def populate(self, movies=None, where=None):#{{{ import sys if self.initialized is False: return False from sqlalchemy import Select, desc if movies is None: movies = Select([self.db.Movie.c.number, self.db.Movie.c.o_title, self.db.Movie.c.title, self.db.Movie.c.director, self.db.Movie.c.image, self.db.Movie.c.genre, self.db.Movie.c.seen, self.db.Movie.c.year, self.db.Movie.c.runtime]) if isinstance(movies, Select): """if not where: # because of possible 'seen', 'loaned', 'collection_id' in where # seen / loaned #loaned_only = self.widgets['menu']['loaned_movies'].get_active() #not_seen_only = self.widgets['menu']['not_seen_movies'].get_active() pass if loaned_only: movies.append_whereclause(self.db.Movie.c.loaned==True) if not_seen_only: movies.append_whereclause(self.db.Movie.c.seen==False) # collection #pos = self.widgets['filter']['collection'].get_active() if pos >= 0: #col_id = self.collection_combo_ids[pos] if col_id > 0: movies.append_whereclause(self.db.Movie.c.collection_id==col_id) # volume #pos = self.widgets['filter']['volume'].get_active() if pos >= 0: #vol_id = self.volume_combo_ids[pos] if vol_id > 0: movies.append_whereclause(self.db.Movie.c.volume_id==vol_id) """ # select sort column sort_column_name = self.config.get('sortby', 'number', section='mainlist') sort_reverse = self.config.get('sortby_reverse', False, section='mainlist') for i in sort_column_name.split(','): if self.db.Movie.c.has_key(i): if sort_reverse: movies.append_order_by(desc(self.db.Movie.c[i])) else: #movies.append_order_by(self.db.Movie.c[i]) pass # additional whereclause (volume_id, collection_id, ...) if where: for i in where: if self.db.Movie.c.has_key(i): movies.append_whereclause(self.db.Movie.c[i]==where[i]) movies = movies.execute().fetchall() self.main_listcontrol.DeleteAllItems() for movie in movies: index = self.main_listcontrol.InsertStringItem(sys.maxint, str(movie.number)) self.main_listcontrol.SetStringItem(index, 1, unicode(movie.o_title)) self.main_listcontrol.SetStringItem(index, 2, unicode(movie.title)) self.main_listcontrol.SetStringItem(index, 3, unicode(movie.director)) self.main_listcontrol.SetStringItem(index, 4, unicode(movie.genre)) self.main_listcontrol.SetStringItem(index, 5, str(movie.seen)) self.main_listcontrol.SetStringItem(index, 6, str(movie.year)) self.main_listcontrol.SetStringItem(index, 7, str(movie.runtime)) statusbar.count_statusbar(self) self.main_listcontrol.SetColumnWidth(0, 40) self.main_listcontrol.SetColumnWidth(1, wx.LIST_AUTOSIZE) self.main_listcontrol.SetColumnWidth(2, wx.LIST_AUTOSIZE) self.main_listcontrol.SetColumnWidth(3, wx.LIST_AUTOSIZE)
def populate(self, movies=None, where=None):#{{{ if self.initialized is False: return False from sqlalchemy import Select, desc if movies is None: movies = Select([self.db.Movie.c.number, self.db.Movie.c.o_title, self.db.Movie.c.title, self.db.Movie.c.director, self.db.Movie.c.image]) if isinstance(movies, Select): if not where: # because of possible 'seen', 'loaned', 'collection_id' in where # seen / loaned loaned_only = self.widgets['menu']['loaned_movies'].get_active() not_seen_only = self.widgets['menu']['not_seen_movies'].get_active() if loaned_only: movies.append_whereclause(self.db.Movie.c.loaned==True) if not_seen_only: movies.append_whereclause(self.db.Movie.c.seen==False) # collection col_id = self.collection_combo_ids[self.widgets['filter']['collection'].get_active()] if col_id > 0: movies.append_whereclause(self.db.Movie.c.collection_id==col_id) # select sort column sort_column_name = self.config.get('sortby', 'number') sort_reverse = self.config.get('sortby_reverse', False) for i in sort_column_name.split(','): if self.db.Movie.c.has_key(i): if sort_reverse: movies.order_by_clause.append(desc(self.db.Movie.c[i])) else: movies.order_by_clause.append(self.db.Movie.c[i]) # additional whereclause (volume_id, collection_id, ...) if where: for i in where: if self.db.Movie.c.has_key(i): movies.append_whereclause(self.db.Movie.c[i]==where[i]) movies = movies.execute().fetchall() self.total = len(movies) # disable refreshing while inserting self.widgets['treeview'].freeze_child_notify() self.widgets['treeview'].set_model(None) # save user sort column sort_column_id, order = self.treemodel.get_sort_column_id() # new treemodel (faster and prevents some problems) self.treemodel = gtk.TreeStore(str, gtk.gdk.Pixbuf, str, str, str) # check preferences to hide or show columns if self.config.get('view_number', 'True') == 'True': self.number_column.set_visible(True) else: self.number_column.set_visible(False) if self.config.get('view_otitle', 'True') == 'True': self.otitle_column.set_visible(True) else: self.otitle_column.set_visible(False) if self.config.get('view_title', 'True') == 'True': self.title_column.set_visible(True) else: self.title_column.set_visible(False) if self.config.get('view_director', 'True') == 'True': self.director_column.set_visible(True) else: self.director_column.set_visible(False) if self.config.get('view_image', 'True') == 'True': self.image_column.set_visible(True) else: self.image_column.set_visible(False) for movie in movies: myiter = self.treemodel.append(None) self.treemodel.set_value(myiter,0,'%004d' % int(movie.number)) if self.config.get('view_image', 'True') == 'True': tmp_dest = self.locations['posters'] tmp_img = os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image)) if movie.image and os.path.isfile(tmp_img): image_path = tmp_img else: image_path = os.path.join(self.locations['images'], 'default_thumbnail.png') # lets see if we have a scaled down thumbnail already created if os.path.isfile(os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image))): pass else: # if not, lets make one for future use :D original_image = os.path.join(tmp_dest, "%s.jpg" % movie.image) if os.path.isfile(original_image): gutils.make_thumbnail(self, "%s.jpg" % movie.image) else: self.Image.set_from_file("%s/default_thumbnail.png" % self.locations['images']) pixbuf = self.Image.get_pixbuf() self.Image.set_from_file(image_path) pixbuf = self.Image.get_pixbuf() self.treemodel.set_value(myiter, 1, pixbuf) self.treemodel.set_value(myiter,2,movie.o_title) self.treemodel.set_value(myiter,3,movie.title) self.treemodel.set_value(myiter,4,movie.director) # restore user sort column if sort_column_id is not None: self.treemodel.set_sort_column_id(sort_column_id, gtk.SORT_ASCENDING) # add new treemodel and allow refreshs again self.widgets['treeview'].set_model(self.treemodel) self.widgets['treeview'].thaw_child_notify() self.widgets['treeview'].set_cursor_on_cell(0)
def populate(self, movies=None, where=None):#{{{ from sqlalchemy import Select, desc if movies is None: movies = Select([self.db.Movie.c.number, self.db.Movie.c.o_title, self.db.Movie.c.title, self.db.Movie.c.director, self.db.Movie.c.image]) if isinstance(movies, Select): if not where: # because of possible 'seen', 'loaned', 'collection_id' in where # seen / loaned loaned_only = self.widgets['menu']['loaned_movies'].get_active() not_seen_only = self.widgets['menu']['not_seen_movies'].get_active() if loaned_only: movies.append_whereclause(self.db.Movie.c.loaned==True) if not_seen_only: movies.append_whereclause(self.db.Movie.c.seen==False) # collection col_id = self.collection_combo_ids[self.widgets['filter']['collection'].get_active()] if col_id > 0: movies.append_whereclause(self.db.Movie.c.collection_id==col_id) # select sort column sort_column_name = self.config.get('sortby', 'number') sort_reverse = self.config.get('sortby_reverse', False) for i in sort_column_name.split(','): if self.db.Movie.c.has_key(i): if sort_reverse: movies.order_by_clause.append(desc(self.db.Movie.c[i])) else: movies.order_by_clause.append(self.db.Movie.c[i]) # additional whereclause (volume_id, collection_id, ...) if where: for i in where: if self.db.Movie.c.has_key(i): movies.append_whereclause(self.db.Movie.c[i]==where[i]) movies = movies.execute().fetchall() self.total = len(movies) self.treemodel.clear() for movie in movies: myiter = self.treemodel.append(None) self.treemodel.set_value(myiter,0,'%004d' % int(movie.number)) # check preferences to hide or show columns if self.config.get('view_otitle') == 'True': self.otitle_column.set_visible(True) else: self.otitle_column.set_visible(False) if self.config.get('view_title') == 'True': self.title_column.set_visible(True) else: self.title_column.set_visible(False) if self.config.get('view_director') == 'True': self.director_column.set_visible(True) else: self.director_column.set_visible(False) if self.config['view_image'] == 'True': self.image_column.set_visible(True) tmp_dest = self.locations['posters'] tmp_img = os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image)) if movie.image and os.path.isfile(tmp_img): image_path = tmp_img else: image_path = os.path.join(self.locations['images'], 'default_thumbnail.png') # lets see if we have a scaled down thumbnail already created if os.path.isfile(os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image))): pass else: # if not, lets make one for future use :D original_image = os.path.join(tmp_dest, "%s.jpg" % movie.image) if os.path.isfile(original_image): gutils.make_thumbnail(self, "%s.jpg" % movie.image) else: self.Image.set_from_file("%s/default_thumbnail.png" % self.locations['images']) pixbuf = self.Image.get_pixbuf() self.Image.set_from_file(image_path) pixbuf = self.Image.get_pixbuf() self.treemodel.set_value(myiter, 1, pixbuf) else: # let's hide image column from main treeview since we don't want it to be visible self.image_column.set_visible(False) self.treemodel.set_value(myiter,2,movie.o_title) self.treemodel.set_value(myiter,3,movie.title) self.treemodel.set_value(myiter,4,movie.director)