def set_details(self, item=None):#{{{ if item is None: item = {} if 'movie_id' in item and item['movie_id']: self._movie_id = item['movie_id'] else: self._movie_id = None w = self.widgets['movie'] if 'number' in item and item['number']: w['number'].set_text(str(int(item['number']))) else: w['number'].set_text('') if 'title' in item and item['title']: w['title'].set_markup("<b><span size='large'>%s</span></b>" % gutils.html_encode(item['title'])) else: w['title'].set_text('') if 'o_title' in item and item['o_title']: w['o_title'].set_markup("<span size='medium'><i>%s</i></span>" % gutils.html_encode(item['o_title'])) else: w['o_title'].set_text('') if 'director' in item and item['director']: w['director'].set_markup("<i>%s</i>" % gutils.html_encode(item['director'])) else: w['director'].set_text('') if 'plot' in item and item['plot']: w['plot'].set_text(str(item['plot'])) else: w['plot'].set_text('') if 'year' in item and item['year']: w['year'].set_text(str(item['year'])) else: w['year'].set_text('') if 'resolution' in item and item['resolution']: if self.config.get('use_resolution_alias', True): w['resolution'].set_text(item['resolution']) elif 'height' in item and item['height'] and 'width' in item and item['width']: w['resolution'].set_text("%dx%d" % (item['width'], item['height'])) else: # fallback to 'resolution' w['resolution'].set_text(item['resolution']) else: w['resolution'].set_text('') pass if 'runtime' in item and item['runtime']: w['runtime'].set_text(str(int(item['runtime']))) else: w['runtime'].set_text('x') if 'cameraman' in item and item['cameraman']: w['cameraman'].set_markup("<i>%s</i>" % gutils.html_encode(item['cameraman'])) else: w['cameraman'].set_text('') if 'screenplay' in item and item['screenplay']: w['screenplay'].set_markup("<i>%s</i>" % gutils.html_encode(item['screenplay'])) else: w['screenplay'].set_text('') if 'cast' in item and item['cast']: w['cast'].set_text(str(item['cast'])) else: w['cast'].set_text('') if 'country' in item and item['country']: w['country'].set_markup("<i>%s</i>" % gutils.html_encode(item['country'])) else: w['country'].set_text('') if 'genre' in item and item['genre']: w['genre'].set_markup("<i>%s</i>" % gutils.html_encode(item['genre'])) else: w['genre'].set_text('') if 'cond' in item and item['cond']: if str(item['cond']) in [str(i) for i in range(len(self._conditions))]: w['condition'].set_markup("<i>%s</i>" % self._conditions[item['cond']]) else: w['condition'].set_text('') log.info("Wrong value in 'condition' field (movie_id=%s, cond=%s)" % (item['movie_id'], item['cond'])) else: w['condition'].set_text('') if 'region' in item and item['region']: if str(item['region']) in [str(i) for i in range(len(self._regions))]: w['region'].set_markup("<i>%s</i>" % gutils.html_encode(item['region'])) if int(item['region']) < 9: self.widgets['tooltips'].set_tip(w['region'], self._regions[int(item['region'])]) else: log.info("Wrong value in 'region' field (movie_id=%s, region=%s)" % (item['movie_id'], item['region'])) w['region'].set_text('') self.widgets['tooltips'].set_tip(w['region'], self._regions[0]) # N/A else: w['region'].set_text('') self.widgets['tooltips'].set_tip(w['region'], self._regions[0]) # N/A if 'layers' in item and item['layers']: if str(item['layers']) in [str(i) for i in range(len(self._layers))]: w['layers'].set_markup("<i>%s</i>" % self._layers[item['layers']]) else: log.info("Wrong value in 'layers' field (movie_id=%s, layers=%s)" % (item['movie_id'], item['layers'])) w['layers'].set_text('') else: w['layers'].set_text('') if 'color' in item and item['color']: if str(item['color']) in [str(i) for i in range(len(self._colors))]: w['color'].set_markup("<i>%s</i>" % self._colors[item['color']]) else: log.info("Wrong value in 'color' field (movie_id=%s, color=%s)" % (item['movie_id'], item['color'])) w['color'].set_markup('') else: w['color'].set_markup('') if 'classification' in item and item['classification']: w['classification'].set_markup("<i>%s</i>" % gutils.html_encode(item['classification'])) else: w['classification'].set_text('') if 'studio' in item and item['studio']: w['studio'].set_markup("<i>%s</i>" % gutils.html_encode(item['studio'])) else: w['studio'].set_text('') if 'o_site' in item and item['o_site']: self._o_site_url = str(item['o_site']) w['go_o_site_button'].set_sensitive(True) else: self._o_site_url = None w['go_o_site_button'].set_sensitive(False) if 'site' in item and item['site']: self._site_url = str(item['site']) w['go_site_button'].set_sensitive(True) else: self._site_url = None w['go_site_button'].set_sensitive(False) if 'trailer' in item and item['trailer']: self._trailer_url = str(item.trailer) w['go_trailer_button'].set_sensitive(True) else: self._trailer_url = None w['go_trailer_button'].set_sensitive(False) if 'seen' in item and item['seen'] == True: w['seen_icon'].set_from_file(os.path.join(self.locations['images'], 'seen.png')) else: w['seen_icon'].set_from_file(os.path.join(self.locations['images'], 'unseen.png')) if 'notes' in item and item['notes']: w['notes'].set_text(str(item.notes)) else: w['notes'].set_text('') tmp = '' if 'media_num' in item and item['media_num']: tmp = str(item.media_num) else: tmp = '0' if 'medium_id' in item and item['medium_id']: if item.medium is not None: tmp += ' x ' + item.medium.name else: pass w['medium'].set_markup("<i>%s</i>" % gutils.html_encode(tmp)) if 'vcodec_id' in item: if item.vcodec is not None: w['vcodec'].set_markup("<i>%s</i>" % gutils.html_encode(item.vcodec.name)) else: w['vcodec'].set_text('') else: w['vcodec'].set_text('') # TODO: add widgets in main and edit windows #if 'ratio_id' in item: # if item.ratio is not None: # w['ratio'].set_markup("<i>%s</i>" % gutils.html_encode(item.ratio.name)) # else: # w['ratio'].set_text('') #else: # w['ratio'].set_text('') # poster if 'poster_md5' in item and item['poster_md5']: filename = gutils.get_image_fname(item['poster_md5'], self.db, 'm') if filename and os.path.isfile(filename): image_path = filename self.widgets['add']['delete_poster'].set_sensitive(True) w['picture_button'].set_sensitive(True) else: image_path = gutils.get_defaultimage_fname(self) self.widgets['add']['delete_poster'].set_sensitive(False) w['picture_button'].set_sensitive(False) else: image_path = gutils.get_defaultimage_fname(self) w['picture_button'].set_sensitive(False) w['picture'].set_from_file(image_path) # ratig rimage = int(self.config.get('rating_image', 0)) if rimage: prefix = '' else: prefix = 'meter' if 'rating' in item and item['rating']: rating_file = "%s/%s0%d.png" % (self.locations['images'], prefix, item['rating']) else: rating_file = "%s/%s0%d.png" % (self.locations['images'], prefix, 0) handler = w['image_rating'].set_from_pixbuf(gtk.gdk.pixbuf_new_from_file(rating_file)) gutils.garbage(handler) # check loan status and adjust buttons and history box if 'loaned' in item and item['loaned'] is True: self.widgets['popups']['loan'].set_sensitive(False) self.widgets['popups']['email'].set_sensitive(True) self.widgets['popups']['return'].set_sensitive(True) self.widgets['menu']['loan'].set_sensitive(False) self.widgets['menu']['email'].set_sensitive(True) self.widgets['menu']['return'].set_sensitive(True) w['loan_button'].set_sensitive(False) w['email_reminder_button'].set_sensitive(True) w['return_button'].set_sensitive(True) if getattr(item, 'loan_details', None) is None: log.warning("movie has no loan data, changing 'loaned' flag to False (movie_id: %s)", item['movie_id']) item.loaned = False else: self.person_name = item.loan_details.person.name self.person_email = item.loan_details.person.email self.loan_date = str(item.loan_details.date) w['loan_info'].set_use_markup(False) w['loan_info'].set_label(_("This movie has been loaned to %s on %s") % (self.person_name, self.loan_date[:10])) if 'loaned' in item and not item['loaned']: # "loaned" status can be changed above, so don't use "else:" in this line self.widgets['popups']['loan'].set_sensitive(True) self.widgets['popups']['email'].set_sensitive(False) self.widgets['popups']['return'].set_sensitive(False) self.widgets['menu']['loan'].set_sensitive(True) self.widgets['menu']['email'].set_sensitive(False) self.widgets['menu']['return'].set_sensitive(False) w['return_button'].set_sensitive(False) w['email_reminder_button'].set_sensitive(False) w['loan_button'].set_sensitive(True) w['loan_info'].set_markup("<b>%s</b>" % _("Movie not loaned")) # loan history self.loans_treemodel.clear() if getattr(item, 'loan_history', None) is not None: for loan in item.loan_history: myiter = self.loans_treemodel.append(None) self.loans_treemodel.set_value(myiter, 0, '%s' % str(loan.date)[:10]) if loan.return_date and loan.return_date != '': self.loans_treemodel.set_value(myiter, 1, str(loan.return_date)[:10]) else: self.loans_treemodel.set_value(myiter, 1, "---") person = self.db.session.query(db.Person.name).filter_by(person_id=loan.person.person_id).first() self.loans_treemodel.set_value(myiter, 2, person.name) # volumes/collections if 'volume_id' in item and item['volume_id'] > 0: if 'volume' in item and item['volume']: w['volume'].set_markup("<b>%s</b>" % gutils.html_encode(item['volume'].name)) w['show_volume_button'].set_sensitive(True) else: w['volume'].set_text('') w['show_volume_button'].set_sensitive(False) else: w['volume'].set_text('') w['show_volume_button'].set_sensitive(False) if 'collection_id' in item and item['collection_id'] > 0: if 'collection' in item and item['collection']: w['collection'].set_markup("<b>%s</b>" % gutils.html_encode(item['collection'].name)) w['show_collection_button'].set_sensitive(True) else: w['collection'].set_text('') w['show_collection_button'].set_sensitive(False) else: w['collection'].set_text('') w['show_collection_button'].set_sensitive(False) # languages for i in w['audio_vbox'].get_children(): i.destroy() for i in w['subtitle_vbox'].get_children(): i.destroy() if 'languages' in item and len(item['languages']) > 0: for i in item['languages']: if i.type == 3: # subtitles if i.subformat: tmp = "%s - %s" % (i.language.name, i.subformat.name) else: tmp = "%s" % i.language.name w['subtitle_vbox'].pack_start(gtk.Label(tmp)) else: language = i.language.name if i.type is not None and len(self._lang_types[i.type]) > 0: language += " <i>%s</i>" % self._lang_types[i.type] tmp = '' if i.achannel: tmp = i.achannel.name if i.acodec: if len(tmp) > 0: tmp += ", %s" % i.acodec.name else: tmp = i.acodec.name if len(tmp) > 0: tmp = "%s (%s)" % (language, tmp) else: tmp = language widget = gtk.Label(tmp) widget.set_use_markup(True) w['audio_vbox'].pack_start(widget) w['audio_vbox'].show_all() w['subtitle_vbox'].show_all() #tags if 'tags' in item: tmp = '' for tag in item['tags']: tmp += "%s, " % tag.name tmp = tmp[:-2] # cut last comma w['tags'].set_text(tmp)
def set_details(self, item=None):#{{{ from loan import get_loan_info, get_loan_history if item is None: item = {} if item.has_key('movie_id') and item['movie_id']: self._movie_id = item['movie_id'] else: self._movie_id = None w = self.widgets['movie'] if item.has_key('number') and item['number']: w['number'].set_text(str(int(item['number']))) else: w['number'].set_text('') if item.has_key('title') and item['title']: w['title'].set_markup("<b><span size='large'>%s</span></b>" % gutils.html_encode(item['title'])) else: w['title'].set_text('') if item.has_key('o_title') and item['o_title']: w['o_title'].set_markup("<span size='medium'><i>%s</i></span>" % gutils.html_encode(item['o_title'])) else: w['o_title'].set_text('') if item.has_key('director') and item['director']: w['director'].set_markup("<i>%s</i>" % gutils.html_encode(item['director'])) else: w['director'].set_text('') if item.has_key('plot') and item['plot']: w['plot'].set_text(str(item['plot'])) else: w['plot'].set_text('') if item.has_key('year') and item['year']: w['year'].set_text(str(item['year'])) else: w['year'].set_text('') if item.has_key('runtime') and item['runtime']: w['runtime'].set_text(str(int(item['runtime']))) else: w['runtime'].set_text('x') if item.has_key('cast') and item['cast']: w['cast'].set_text(str(item['cast'])) else: w['cast'].set_text('') if item.has_key('country') and item['country']: w['country'].set_markup("<i>%s</i>" % gutils.html_encode(item['country'])) else: w['country'].set_text('') if item.has_key('genre') and item['genre']: w['genre'].set_markup("<i>%s</i>" % gutils.html_encode(item['genre'])) else: w['genre'].set_text('') if item.has_key('cond') and item['cond']: if str(item['cond']) in [ str(i) for i in range(len(self._conditions)) ]: w['condition'].set_markup("<i>%s</i>" % self._conditions[item['cond']]) else: w['condition'].set_text('') self.debug.show("Wrong value in 'condition' field (movie_id=%s, cond=%s)" % (item['movie_id'], item['cond'])) else: w['condition'].set_text('') if item.has_key('region') and item['region']: if str(item['region']) in [ str(i) for i in range(len(self._regions)) ]: w['region'].set_markup("<i>%s</i>" % gutils.html_encode(item['region'])) if int(item['region']) < 9: self.widgets['tooltips'].set_tip(w['region'], self._regions[int(item['region'])]) else: self.debug.show("Wrong value in 'region' field (movie_id=%s, region=%s)" % (item['movie_id'], item['region'])) w['region'].set_text('') self.widgets['tooltips'].set_tip(w['region'], self._regions[0]) # N/A else: w['region'].set_text('') self.widgets['tooltips'].set_tip(w['region'], self._regions[0]) # N/A if item.has_key('layers') and item['layers']: if str(item['layers']) in [ str(i) for i in range(len(self._layers)) ]: w['layers'].set_markup("<i>%s</i>" % self._layers[item['layers']]) else: self.debug.show("Wrong value in 'layers' field (movie_id=%s, layers=%s)" % (item['movie_id'], item['layers'])) w['layers'].set_text('') else: w['layers'].set_text('') if item.has_key('color') and item['color']: if str(item['color']) in [ str(i) for i in range(len(self._colors)) ]: w['color'].set_markup("<i>%s</i>" % self._colors[item['color']]) else: self.debug.show("Wrong value in 'color' field (movie_id=%s, color=%s)" % (item['movie_id'], item['color'])) w['color'].set_markup('') else: w['color'].set_markup('') if item.has_key('classification') and item['classification']: w['classification'].set_markup("<i>%s</i>" % gutils.html_encode(item['classification'])) else: w['classification'].set_text('') if item.has_key('studio') and item['studio']: w['studio'].set_markup("<i>%s</i>" % gutils.html_encode(item['studio'])) else: w['studio'].set_text('') if item.has_key('o_site') and item['o_site']: self._o_site_url = str(item['o_site']) w['go_o_site_button'].set_sensitive(True) else: self._o_site_url = None w['go_o_site_button'].set_sensitive(False) if item.has_key('site') and item['site']: self._site_url = str(item['site']) w['go_site_button'].set_sensitive(True) else: self._site_url = None w['go_site_button'].set_sensitive(False) if item.has_key('trailer') and item['trailer']: self._trailer_url = str(item.trailer) w['go_trailer_button'].set_sensitive(True) else: self._trailer_url = None w['go_trailer_button'].set_sensitive(False) if item.has_key('seen') and item['seen'] == True: w['seen_icon'].set_from_file(os.path.join(self.locations['images'], 'seen.png')) else: w['seen_icon'].set_from_file(os.path.join(self.locations['images'], 'unseen.png')) if item.has_key('notes') and item['notes']: w['notes'].set_text(str(item.notes)) else: w['notes'].set_text('') tmp = '' if item.has_key('media_num') and item['media_num']: tmp = str(item.media_num) else: tmp = '0' if item.has_key('medium_id') and item['medium_id']: if item.medium is not None: tmp += ' x ' + item.medium.name else: pass w['medium'].set_markup("<i>%s</i>" % gutils.html_encode(tmp)) if item.has_key('vcodec_id'): if item.vcodec is not None: w['vcodec'].set_markup("<i>%s</i>" % gutils.html_encode(item.vcodec.name)) else: w['vcodec'].set_text('') else: w['vcodec'].set_text('') # poster if item.has_key('image') and item['image']: tmp_dest = self.locations['posters'] tmp_img = os.path.join(tmp_dest, "m_%s.jpg"%item['image']) tmp_img2 = os.path.join(tmp_dest, "%s.jpg"%item['image']) if os.path.isfile(tmp_img2): image_path = tmp_img self.widgets['add']['delete_poster'].set_sensitive(True) self.widgets['menu']['delete_poster'].set_sensitive(True) w['picture_button'].set_sensitive(True) else: image_path = os.path.join(self.locations['images'], 'default.png') self.widgets['add']['delete_poster'].set_sensitive(False) self.widgets['menu']['delete_poster'].set_sensitive(False) w['picture_button'].set_sensitive(False) # lets see if we have a scaled down medium image already created if not os.path.isfile(image_path): # if not, lets make one for future use :D original_image = os.path.join(tmp_dest, "%s.jpg"%item.image) if os.path.isfile(original_image): gutils.make_medium_image(self, "%s.jpg"%item.image) else: image_path = os.path.join(self.locations['images'], 'default.png') w['picture_button'].set_sensitive(False) w['picture'].set_from_file(image_path) # ratig rimage = int(self.config.get('rating_image', 0)) if rimage: prefix = '' else: prefix = 'meter' if item.has_key('rating') and item['rating']: rating_file = "%s/%s0%d.png" % (self.locations['images'], prefix, item['rating']) else: rating_file = "%s/%s0%d.png" % (self.locations['images'], prefix, 0) handler = w['image_rating'].set_from_pixbuf(gtk.gdk.pixbuf_new_from_file(rating_file)) gutils.garbage(handler) # check loan status and adjust buttons and history box if item.has_key('loaned') and item['loaned'] == True: self.widgets['popups']['loan'].set_sensitive(False) self.widgets['popups']['email'].set_sensitive(True) self.widgets['popups']['return'].set_sensitive(True) self.widgets['menu']['loan'].set_sensitive(False) self.widgets['menu']['email'].set_sensitive(True) self.widgets['menu']['return'].set_sensitive(True) w['loan_button'].set_sensitive(False) w['email_reminder_button'].set_sensitive(True) w['return_button'].set_sensitive(True) data_loan = get_loan_info(self.db, collection_id=item['collection_id'], volume_id=item['volume_id'], movie_id=item['movie_id']) if data_loan is None: item.loaned = False else: data_person = self.db.Person.get_by(person_id=data_loan.person.person_id) self.person_name = str(data_person.name) self.person_email = str(data_person.email) self.loan_date = str(data_loan.date) w['loan_info'].set_use_markup(False) w['loan_info'].set_label(_("This movie has been loaned to ") + self.person_name + _(" on ") + self.loan_date[:10]) if item.has_key('loaned') and item['loaned'] != True: # "loaned" status can be changed above, so don't use "else:" in this line self.widgets['popups']['loan'].set_sensitive(True) self.widgets['popups']['email'].set_sensitive(False) self.widgets['popups']['return'].set_sensitive(False) self.widgets['menu']['loan'].set_sensitive(True) self.widgets['menu']['email'].set_sensitive(False) self.widgets['menu']['return'].set_sensitive(False) w['return_button'].set_sensitive(False) w['email_reminder_button'].set_sensitive(False) w['loan_button'].set_sensitive(True) w['loan_info'].set_markup("<b>%s</b>" % _("Movie not loaned")) # loan history self.loans_treemodel.clear() if item.has_key('collection_id') or item.has_key('volume_id') or item.has_key('movie_id'): loans = get_loan_history(self.db, collection_id=item['collection_id'], volume_id=item['volume_id'], movie_id=item['movie_id']) for loan in loans: myiter = self.loans_treemodel.append(None) self.loans_treemodel.set_value(myiter, 0,'%s' % str(loan.date)[:10]) if loan.return_date and loan.return_date != '': self.loans_treemodel.set_value(myiter, 1, str(loan.return_date)[:10]) else: self.loans_treemodel.set_value(myiter, 1, "---") person = self.db.Person.get_by(person_id=loan.person.person_id) self.loans_treemodel.set_value(myiter, 2, person.name) # volumes/collections if item.has_key('volume_id') and item['volume_id']>0: if item.has_key('volume') and item['volume']: w['volume'].set_markup("<b>%s</b>" % gutils.html_encode(item['volume'].name)) w['show_volume_button'].set_sensitive(True) else: w['volume'].set_text('') w['show_volume_button'].set_sensitive(False) else: w['volume'].set_text('') w['show_volume_button'].set_sensitive(False) if item.has_key('collection_id') and item['collection_id']>0: if item.has_key('collection') and item['collection']: w['collection'].set_markup("<b>%s</b>" % gutils.html_encode(item['collection'].name)) w['show_collection_button'].set_sensitive(True) else: w['collection'].set_text('') w['show_collection_button'].set_sensitive(False) else: w['collection'].set_text('') w['show_collection_button'].set_sensitive(False) # languages for i in w['audio_vbox'].get_children(): i.destroy() for i in w['subtitle_vbox'].get_children(): i.destroy() if item.has_key('languages') and len(item['languages'])>0: for i in item['languages']: if i.type == 3: # subtitles if i.subformat: tmp = "%s - %s" % (i.language.name, i.subformat.name) else: tmp = "%s" % i.language.name w['subtitle_vbox'].pack_start(gtk.Label(tmp)) else: language = i.language.name if i.type is not None and len(self._lang_types[i.type])>0: language += " <i>%s</i>" % self._lang_types[i.type] tmp = '' if i.achannel: tmp = i.achannel.name if i.acodec: if len(tmp)>0: tmp += ", %s" % i.acodec.name else: tmp = i.acodec.name if len(tmp)>0: tmp = "%s (%s)" % (language, tmp) else: tmp = language widget = gtk.Label(tmp) widget.set_use_markup(True) w['audio_vbox'].pack_start(widget) w['audio_vbox'].show_all() w['subtitle_vbox'].show_all() #tags if item.has_key('tags'): tmp = '' for tag in item['tags']: tmp += "%s, " % tag.name tmp = tmp[:-2] # cut last comma w['tags'].set_text(tmp)
def set_details(self, item=None): # {{{ if item is None: item = {} if 'movie_id' in item and item['movie_id']: self._movie_id = item['movie_id'] else: self._movie_id = None w = self.widgets['movie'] if 'number' in item and item['number']: w['number'].set_text(str(int(item['number']))) else: w['number'].set_text('') if 'title' in item and item['title']: w['title'].set_markup("<b><span size='large'>%s</span></b>" % gutils.html_encode(item['title'])) else: w['title'].set_text('') if 'o_title' in item and item['o_title']: w['o_title'].set_markup("<span size='medium'><i>%s</i></span>" % gutils.html_encode(item['o_title'])) else: w['o_title'].set_text('') if 'director' in item and item['director']: w['director'].set_markup("<i>%s</i>" % gutils.html_encode(item['director'])) else: w['director'].set_text('') if 'plot' in item and item['plot']: w['plot'].set_text(str(item['plot'])) else: w['plot'].set_text('') if 'year' in item and item['year']: w['year'].set_text(str(item['year'])) else: w['year'].set_text('') if 'resolution' in item and item['resolution']: if self.config.get('use_resolution_alias', True): w['resolution'].set_text(item['resolution']) elif 'height' in item and item['height'] and 'width' in item and item[ 'width']: w['resolution'].set_text("%dx%d" % (item['width'], item['height'])) else: # fallback to 'resolution' w['resolution'].set_text(item['resolution']) else: w['resolution'].set_text('') pass if 'runtime' in item and item['runtime']: w['runtime'].set_text(str(int(item['runtime']))) else: w['runtime'].set_text('x') if 'cameraman' in item and item['cameraman']: w['cameraman'].set_markup("<i>%s</i>" % gutils.html_encode(item['cameraman'])) else: w['cameraman'].set_text('') if 'screenplay' in item and item['screenplay']: w['screenplay'].set_markup("<i>%s</i>" % gutils.html_encode(item['screenplay'])) else: w['screenplay'].set_text('') if 'cast' in item and item['cast']: w['cast'].set_text(str(item['cast'])) else: w['cast'].set_text('') if 'country' in item and item['country']: w['country'].set_markup("<i>%s</i>" % gutils.html_encode(item['country'])) else: w['country'].set_text('') if 'genre' in item and item['genre']: w['genre'].set_markup("<i>%s</i>" % gutils.html_encode(item['genre'])) else: w['genre'].set_text('') if 'cond' in item and item['cond']: if str(item['cond']) in [str(i) for i in range(len(self._conditions))]: w['condition'].set_markup("<i>%s</i>" % self._conditions[item['cond']]) else: w['condition'].set_text('') log.info( "Wrong value in 'condition' field (movie_id=%s, cond=%s)" % (item['movie_id'], item['cond'])) else: w['condition'].set_text('') if 'region' in item and item['region']: if item['region'] < len(self._regions): w['region'].set_markup( "<i>%s</i>" % gutils.html_encode(self._regions[item['region']])) if int(item['region']) < 12: self.widgets['tooltips'].set_tip( w['region'], self._regions[int(item['region'])]) else: log.info("Wrong value in 'region' field (movie_id=%s, region=%s)" % (item['movie_id'], item['region'])) w['region'].set_text('') self.widgets['tooltips'].set_tip(w['region'], self._regions[0]) # N/A else: w['region'].set_text('') self.widgets['tooltips'].set_tip(w['region'], self._regions[0]) # N/A if 'layers' in item and item['layers']: if str(item['layers']) in [str(i) for i in range(len(self._layers))]: w['layers'].set_markup("<i>%s</i>" % self._layers[item['layers']]) else: log.info("Wrong value in 'layers' field (movie_id=%s, layers=%s)" % (item['movie_id'], item['layers'])) w['layers'].set_text('') else: w['layers'].set_text('') if 'color' in item and item['color']: if str(item['color']) in [str(i) for i in range(len(self._colors))]: w['color'].set_markup("<i>%s</i>" % self._colors[item['color']]) else: log.info("Wrong value in 'color' field (movie_id=%s, color=%s)" % (item['movie_id'], item['color'])) w['color'].set_markup('') else: w['color'].set_markup('') if 'classification' in item and item['classification']: w['classification'].set_markup( "<i>%s</i>" % gutils.html_encode(item['classification'])) else: w['classification'].set_text('') if 'studio' in item and item['studio']: w['studio'].set_markup("<i>%s</i>" % gutils.html_encode(item['studio'])) else: w['studio'].set_text('') if 'o_site' in item and item['o_site']: self._o_site_url = str(item['o_site']) w['go_o_site_button'].set_sensitive(True) else: self._o_site_url = None w['go_o_site_button'].set_sensitive(False) if 'site' in item and item['site']: self._site_url = str(item['site']) w['go_site_button'].set_sensitive(True) else: self._site_url = None w['go_site_button'].set_sensitive(False) if 'trailer' in item and item['trailer']: self._trailer_url = str(item.trailer) w['go_trailer_button'].set_sensitive(True) else: self._trailer_url = None w['go_trailer_button'].set_sensitive(False) if 'seen' in item and item['seen'] == True: w['seen_icon'].set_from_file( os.path.join(self.locations['images'], 'seen.png')) else: w['seen_icon'].set_from_file( os.path.join(self.locations['images'], 'unseen.png')) if 'notes' in item and item['notes']: w['notes'].set_text(str(item.notes)) else: w['notes'].set_text('') tmp = '' if 'media_num' in item and item['media_num']: tmp = str(item.media_num) else: tmp = '0' if 'medium_id' in item and item['medium_id']: if item.medium is not None: tmp += ' x ' + item.medium.name else: pass w['medium'].set_markup("<i>%s</i>" % gutils.html_encode(tmp)) if 'vcodec_id' in item: if item.vcodec is not None: w['vcodec'].set_markup("<i>%s</i>" % gutils.html_encode(item.vcodec.name)) else: w['vcodec'].set_text('') else: w['vcodec'].set_text('') # TODO: add widgets in main and edit windows #if 'ratio_id' in item: # if item.ratio is not None: # w['ratio'].set_markup("<i>%s</i>" % gutils.html_encode(item.ratio.name)) # else: # w['ratio'].set_text('') #else: # w['ratio'].set_text('') # poster if 'poster_md5' in item and item['poster_md5']: filename = gutils.get_image_fname(item['poster_md5'], self.db, 'm') if filename and os.path.isfile(filename): image_path = filename self.widgets['add']['delete_poster'].set_sensitive(True) w['picture_button'].set_sensitive(True) else: image_path = gutils.get_defaultimage_fname(self) self.widgets['add']['delete_poster'].set_sensitive(False) w['picture_button'].set_sensitive(False) else: image_path = gutils.get_defaultimage_fname(self) self.widgets['add']['delete_poster'].set_sensitive(False) w['picture_button'].set_sensitive(False) w['picture'].set_from_file(image_path) # ratig rimage = int(self.config.get('rating_image', 0)) if rimage: prefix = '' else: prefix = 'meter' if 'rating' in item and item['rating']: rating_file = "%s/%s0%d.png" % (self.locations['images'], prefix, item['rating']) else: rating_file = "%s/%s0%d.png" % (self.locations['images'], prefix, 0) handler = w['image_rating'].set_from_pixbuf( gtk.gdk.pixbuf_new_from_file(rating_file)) gutils.garbage(handler) # check loan status and adjust buttons and history box if 'loaned' in item and item['loaned'] is True: self.widgets['popups']['loan'].set_sensitive(False) self.widgets['popups']['email'].set_sensitive(True) self.widgets['popups']['return'].set_sensitive(True) self.widgets['menu']['loan'].set_sensitive(False) self.widgets['menu']['email'].set_sensitive(True) self.widgets['menu']['return'].set_sensitive(True) w['loan_button'].set_sensitive(False) w['email_reminder_button'].set_sensitive(True) w['return_button'].set_sensitive(True) if getattr(item, 'loan_details', None) is None: log.warning( "movie has no loan data, changing 'loaned' flag to False (movie_id: %s)", item['movie_id']) item.loaned = False else: self.person_name = item.loan_details.person.name self.person_email = item.loan_details.person.email self.loan_date = str(item.loan_details.date) w['loan_info'].set_use_markup(False) w['loan_info'].set_label( _("This movie has been loaned to %s on %s") % (self.person_name, self.loan_date[:10])) if 'loaned' in item and not item[ 'loaned']: # "loaned" status can be changed above, so don't use "else:" in this line self.widgets['popups']['loan'].set_sensitive(True) self.widgets['popups']['email'].set_sensitive(False) self.widgets['popups']['return'].set_sensitive(False) self.widgets['menu']['loan'].set_sensitive(True) self.widgets['menu']['email'].set_sensitive(False) self.widgets['menu']['return'].set_sensitive(False) w['return_button'].set_sensitive(False) w['email_reminder_button'].set_sensitive(False) w['loan_button'].set_sensitive(True) w['loan_info'].set_markup("<b>%s</b>" % _("Movie not loaned")) # loan history self.loans_treemodel.clear() if getattr(item, 'loan_history', None) is not None: for loan in item.loan_history: myiter = self.loans_treemodel.append(None) self.loans_treemodel.set_value(myiter, 0, '%s' % str(loan.date)[:10]) if loan.return_date and loan.return_date != '': self.loans_treemodel.set_value(myiter, 1, str(loan.return_date)[:10]) else: self.loans_treemodel.set_value(myiter, 1, "---") if loan.person: person = self.db.session.query(db.Person.name).filter_by( person_id=loan.person.person_id).first() self.loans_treemodel.set_value(myiter, 2, person.name) # volumes/collections if 'volume_id' in item and item['volume_id'] > 0: if 'volume' in item and item['volume']: w['volume'].set_markup("<b>%s</b>" % gutils.html_encode(item['volume'].name)) w['show_volume_button'].set_sensitive(True) else: w['volume'].set_text('') w['show_volume_button'].set_sensitive(False) else: w['volume'].set_text('') w['show_volume_button'].set_sensitive(False) if 'collection_id' in item and item['collection_id'] > 0: if 'collection' in item and item['collection']: w['collection'].set_markup( "<b>%s</b>" % gutils.html_encode(item['collection'].name)) w['show_collection_button'].set_sensitive(True) else: w['collection'].set_text('') w['show_collection_button'].set_sensitive(False) else: w['collection'].set_text('') w['show_collection_button'].set_sensitive(False) # languages for i in w['audio_vbox'].get_children(): i.destroy() for i in w['subtitle_vbox'].get_children(): i.destroy() if 'languages' in item and len(item['languages']) > 0: for i in item['languages']: if i.type == 3: # subtitles if i.subformat: tmp = "%s - %s" % (i.language.name, i.subformat.name) else: tmp = "%s" % i.language.name w['subtitle_vbox'].pack_start(gtk.Label(tmp)) else: language = i.language.name if i.type is not None and len(self._lang_types[i.type]) > 0: language += " <i>%s</i>" % self._lang_types[i.type] tmp = '' if i.achannel: tmp = i.achannel.name if i.acodec: if len(tmp) > 0: tmp += ", %s" % i.acodec.name else: tmp = i.acodec.name if len(tmp) > 0: tmp = "%s (%s)" % (language, tmp) else: tmp = language widget = gtk.Label(tmp) widget.set_use_markup(True) w['audio_vbox'].pack_start(widget) w['audio_vbox'].show_all() w['subtitle_vbox'].show_all() #tags if 'tags' in item: tmp = '' for tag in item['tags']: tmp += "%s, " % tag.name tmp = tmp[:-2] # cut last comma w['tags'].set_text(tmp)
class ExportPlugin(Base): name = 'HTML' description = _('Plugin exports data using templates') author = 'Piotr Ożarowski' email = '*****@*****.**' version = '4.0' #==[ configuration - default values ]==========={{{ settings = { 'sorting': 'movies_title', 'sorting2': 'ASC', 'export_dir': '', 'template': 2, 'title': _("Griffith's movies list"), 'style': 0, 'custom_style': False, 'custom_style_file': None, 'split_num': 50, # split into x files/pages 'split_by': 1, # 0==files, 1==movies 'poster_convert': False, # dont convert 'poster_height': 200, 'poster_width': 150, 'poster_mode': 'RGB', # RGB == color, L == black and white 'poster_format': 'jpeg' } fields = { 'movies_cast': False, 'movies_classification': False, 'movies_country': True, 'movies_genre': True, 'movies_director': True, 'movies_image': True, 'movies_o_site': True, 'movies_site': True, 'movies_trailer': True, 'movies_loaned': False, 'movies_media_num': True, 'movies_number': True, 'movies_o_title': True, 'movies_plot': False, 'movies_rating': True, 'movies_runtime': True, 'movies_studio': False, 'movies_seen': True, 'movies_title': True, 'movies_year': True, 'movies_notes': False, 'movies_screenplay': False, 'movies_cameraman': False, 'movies_width': False, 'movies_height': False, 'movies_barcode': False, # 'movies_region' : False, # 'movies_layers' : False, # 'movies_condition' : False, # 'movies_color' : False, # 'movies_volume_id' : False, # 'movies_collection_id' : False, 'media_name': True, 'collections_name': True, 'volumes_name': True, # 'acodecs_name' : True, 'vcodecs_name': True, } fields_as_columns = { 'movies_cast': 'cast', 'movies_classification': 'classification', 'movies_country': 'country', 'movies_genre': 'genre', 'movies_director': 'director', 'movies_image': 'poster_md5', 'movies_o_site': 'o_site', 'movies_site': 'site', 'movies_trailer': 'trailer', 'movies_loaned': 'loaned', 'movies_media_num': 'media_num', 'movies_number': 'number', 'movies_o_title': 'o_title', 'movies_plot': 'plot', 'movies_rating': 'rating', 'movies_runtime': 'runtime', 'movies_studio': 'studio', 'movies_seen': 'seen', 'movies_title': 'title', 'movies_year': 'year', 'movies_notes': 'notes', 'movies_screenplay': 'screenplay', 'movies_cameraman': 'cameraman', 'movies_width': 'width', 'movies_height': 'height', 'movies_barcode': 'barcode', # 'movies_region' : 'region', # 'movies_layers' : 'layers', # 'movies_condition' : 'condition', # 'movies_color' : 'color', # 'movies_volume_id' : 'volume_id', # 'movies_collection_id' : 'collection_id', 'media_name': 'name', 'collections_name': 'name', 'volumes_name': 'name', # 'acodecs_name' : 'name', 'vcodecs_name': 'name', } names = { _('Cast'): 'movies_cast', _('Classification'): 'movies_classification', _('Country'): 'movies_country', _('Director'): 'movies_director', _('Genre'): 'movies_genre', _('Image'): 'movies_image', _('Official site'): 'movies_o_site', _('Site'): 'movies_site', _('Trailer'): 'movies_trailer', _('Loaned'): 'movies_loaned', _('Discs'): 'movies_media_num', _('Number'): 'movies_number', _('Original Title'): 'movies_o_title', _('Plot'): 'movies_plot', _('Rating'): 'movies_rating', _('Runtime'): 'movies_runtime', _('Studio'): 'movies_studio', _('Seen it'): 'movies_seen', _('Title'): 'movies_title', _('Year'): 'movies_year', _('Notes'): 'movies_notes', _('Screenplay'): 'movies_screenplay', _('Cameraman'): 'movies_cameraman', _('Width'): 'movies_width', _('Height'): 'movies_height', _('Barcode'): 'movies_barcode', # _('Region') : 'movies_region', # _('Layers') : 'movies_layers', # _('Condition') : 'movies_condition', # _('Color') : 'movies_color', # _('Volume') : 'movies_volume_id', # _('Collection') : 'movies_collection_id', _('Media'): 'media_name', _('Collection'): 'collections_name', _('Volume'): 'volumes_name', # _('Audio codecs') : 'acodecs_name', _('Video codec'): 'vcodecs_name', } #}}} def initialize(self): #{{{ self.fields_to_export = [] for field in ExportPlugin.fields: if field == 'movies_image': self.fields_to_export.append('movies.poster_md5') else: pos = field.find('_') self.fields_to_export.append("%s.%s" % (field[:pos], field[pos + 1:])) self.widgets = {} self.style_list = {} self.templates = self.make_template_list() # glade gf = os.path.join(self.locations['glade'], 'exporthtml.glade') self.load_configuration() self.define_widgets(gtk.glade.XML(gf)) self.fill_widgets() return True #}}} def load_configuration(self): #{{{ # persist config if self.config is not None: config = self.settings for name, value in config.items(): try: tmp = self.config.get(name, value, section='export-html') if isinstance(value, bool): config[name] = bool(int(tmp)) elif isinstance(value, int): config[name] = int(tmp) else: config[name] = tmp except: pass selected_fields = self.config.get('selected_fields', '', section='export-html') if selected_fields: for name in self.fields: self.fields[name] = False selected_fields = selected_fields.split(',') for selected_field in selected_fields: if selected_field in self.fields: self.fields[selected_field] = True #}}} def run(self): pass def get_node_value_by_language(self, parent, name, language='en'): #{{{ nodes = parent.getElementsByTagName(name) for node in nodes: if node.parentNode != parent: continue elif node.attributes.get('xml:lang') is not None: if node.attributes.get('xml:lang').value == language: return node.firstChild.nodeValue else: # set default value in case node has no xml:lang attribute value = node.firstChild.nodeValue return value #}}} def make_template_list(self): #{{{ language = 'en' if os.environ.has_key('LANG'): language = os.environ['LANG'][:2] templates = {} j = 0 # number of templates dirName = os.path.join(self.locations['share'], 'export_templates') items = os.listdir(dirName) items.sort() for i in items: fileName = os.path.join(dirName, i) if not os.path.islink(fileName) and os.path.isdir(fileName): # clear previous data doc = None styles = {} tpl_name = None tpl_author = None tpl_email = None tpl_version = None tpl_ext = None tpl_desc = None try: doc = minidom.parse(os.path.join(fileName, 'config.xml')) except: log.info( "Can't parse configuration file for template: %s" % fileName) continue for template in doc.getElementsByTagName('template'): tpl_name = self.get_node_value_by_language( template, 'name', language) tpl_author = template.getElementsByTagName( 'author')[0].firstChild.nodeValue tpl_email = template.getElementsByTagName( 'email')[0].firstChild.nodeValue tpl_version = template.getElementsByTagName( 'version')[0].firstChild.nodeValue tpl_ext = template.getElementsByTagName( 'extension')[0].firstChild.nodeValue tpl_desc = self.get_node_value_by_language( template, 'description', language) k = 0 # number of styles try: styles_list = template.getElementsByTagName( 'styles')[0].getElementsByTagName('style') for style in styles_list: tpl_style_name = self.get_node_value_by_language( style, 'name', language) tpl_style_file = style.getElementsByTagName( 'file')[0].firstChild.nodeValue # get preview if available try: tpl_style_preview = style.getElementsByTagName( 'preview')[0].firstChild.nodeValue except: tpl_style_preview = None styles[k] = { 'name': tpl_style_name, 'file': tpl_style_file, 'preview': tpl_style_preview } k = k + 1 except: styles = None if tpl_name == '': continue templates[j] = { 'dir': i, 'name': tpl_name, 'author': tpl_author, 'email': tpl_email, 'version': tpl_version, 'ext': tpl_ext, 'desc': tpl_desc, 'styles': styles } j = j + 1 return templates #}}} #==[ widgets ]=================================={{{ def define_widgets(self, glade_file): get = lambda x: glade_file.get_widget(x) self.widgets = { 'window': get('w_eh'), 'fcw': get('fcw'), 'box_include_1': get('box_include_1'), 'box_include_2': get('box_include_2'), 'box_include_3': get('box_include_3'), 'sb_split_num': get('sb_split_num'), 'rb_split_files': get('rb_split_files'), 'rb_split_movies': get('rb_split_movies'), 'entry_header': get('entry_header'), 'cb_custom_style': get('cb_custom_style'), 'cb_reverse': get('cb_reverse'), 'combo_style': get('combo_style'), 'combo_sortby': get('combo_sortby'), 'combo_theme': get('combo_theme'), 'fcb_custom_style_file': get('fcb_custom_style_file'), 'l_tpl_author': get('l_tpl_author'), 'l_tpl_email': get('l_tpl_email'), 'l_tpl_version': get('l_tpl_version'), 'l_tpl_desc': get('l_tpl_desc'), 'image_preview': get('image_preview'), 'vb_posters': get('vb_posters'), 'sb_height': get('sb_height'), 'sb_width': get('sb_width'), 'cb_black': get('cb_black'), 'combo_format': get('combo_format'), 'cb_convert': get('cb_convert'), } # define handlers for general events glade_file.signal_autoconnect({ 'on_export_button_clicked': self.export_data, 'on_rb_split_files_toggled': self.on_rb_split_files_toggled, 'on_rb_split_movies_toggled': self.on_rb_split_movies_toggled, 'on_cancel_button_clicked': self.on_quit, 'on_cb_data_toggled': self.on_cb_data_toggled, 'on_cb_custom_style_toggled': self.on_cb_custom_style_toggled, 'on_fcb_custom_style_file_activated': self.on_fcb_custom_style_file_activated, 'on_combo_style_changed': self.on_combo_style_changed, 'on_combo_theme_changed': self.on_combo_theme_changed, 'on_cb_convert_toggled': self.on_cb_convert_toggled, }) def fill_widgets(self): # themes for i in self.templates: self.widgets['combo_theme'].insert_text(i, self.templates[i]['name']) # sortby combo keys = self.names.keys() keys.sort() j = 0 pos_o_title = 0 for i in keys: self.widgets['combo_sortby'].append_text(i) if self.names[i] == self.settings['sorting']: pos_o_title = j j = j + 1 self.widgets['combo_sortby'].set_wrap_width(3) # include data j = 0 k = math.ceil(len(self.names) / float(3)) for i in keys: j = j + 1 field = self.names[i] self.widgets['cb_' + field] = gtk.CheckButton(i) self.widgets['cb_' + field].set_name("cb_%s" % field) self.widgets['cb_' + field].connect('toggled', self.on_cb_data_toggled) self.widgets['cb_' + field].set_active(self.fields[field]) if j <= k: self.widgets['box_include_1'].add(self.widgets["cb_%s" % field]) elif j <= 2 * k: self.widgets['box_include_2'].add(self.widgets["cb_%s" % field]) else: self.widgets['box_include_3'].add(self.widgets["cb_%s" % field]) self.widgets['box_include_1'].show_all() self.widgets['box_include_2'].show_all() self.widgets['box_include_3'].show_all() # set defaults -------------------------------- self.widgets['entry_header'].set_text(self.settings['title']) self.widgets['combo_sortby'].set_active(pos_o_title) if self.settings['sorting2'] == 'DESC': self.widgets['cb_reverse'].set_active(True) else: self.widgets['cb_reverse'].set_active(False) # template and theme style = self.settings[ 'style'] # save it temporary because change of the template set it 0 self.widgets['combo_theme'].set_active(self.settings['template']) self.widgets['combo_style'].set_active(style) self.widgets['cb_custom_style'].set_active( self.settings['custom_style']) if self.settings['custom_style_file']: self.widgets['fcb_custom_style_file'].set_filename( self.settings['custom_style_file']) # spliting self.widgets['sb_split_num'].set_value(self.settings['split_num']) if self.settings['split_by'] == 0: self.widgets['rb_split_files'].set_active(True) else: self.widgets['rb_split_movies'].set_active(True) # posters self.widgets['combo_format'].set_active(0) if self.settings['poster_format'] == 'PNG': self.widgets['combo_format'].set_active(1) elif self.settings['poster_format'] == 'GIF': self.widgets['combo_format'].set_active(2) if self.settings['poster_convert'] and self.settings[ 'poster_convert'] == True: self.widgets['cb_convert'].set_active(True) self.widgets['vb_posters'].set_sensitive(True) else: self.widgets['cb_convert'].set_active(False) self.widgets['vb_posters'].set_sensitive(False) self.widgets['sb_height'].set_value(self.settings['poster_height']) self.widgets['sb_width'].set_value(self.settings['poster_width']) if self.settings['poster_mode'] == 'L': self.widgets['cb_black'].set_active(True) # destination dir if self.settings['export_dir']: self.widgets['fcw'].set_current_folder(self.settings['export_dir']) #}}} #==[ callbacks ]================================{{{ # buttons: def on_quit(self, widget=None): self.widgets['window'].destroy() # data tab -------------------------------------#{{{ def on_rb_split_files_toggled(self, widget): self.settings['split_by'] = 0 # files def on_rb_split_movies_toggled(self, widget): self.settings['split_by'] = 1 # movies # export frame def on_cb_data_toggled(self, widget): self.fields[gutils.after(widget.get_name(), 'cb_')] = widget.get_active() # posters frame def on_cb_convert_toggled(self, widget): active = widget.get_active() self.settings['poster_convert'] = active if not active: self.widgets['vb_posters'].set_sensitive(False) else: self.widgets['vb_posters'].set_sensitive(True) #}}} # template tab ---------------------------------#{{{ def on_combo_theme_changed(self, widget): old_id = self.settings['template'] tpl_id = widget.get_active() self.settings['template'] = tpl_id # fill authors data self.widgets['l_tpl_author'].set_markup( "<i>%s</i>" % self.templates[tpl_id]['author']) self.widgets['l_tpl_email'].set_markup("<i>%s</i>" % self.templates[tpl_id]['email']) self.widgets['l_tpl_email'].set_selectable(True) self.widgets['l_tpl_version'].set_markup( "<i>%s</i>" % self.templates[tpl_id]['version']) self.widgets['l_tpl_desc'].set_markup("<i>%s</i>" % self.templates[tpl_id]['desc']) # remove old style list self.widgets['combo_style'].get_model().clear() # ... and add new if self.templates[tpl_id]['styles'] is not None: for i in self.templates[tpl_id]['styles']: self.widgets['combo_style'].insert_text( i, self.templates[tpl_id]['styles'][i] ['name']) # template name self.widgets['combo_style'].set_active(0) else: self.settings['style'] = None self.widgets['image_preview'].set_from_stock( gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_LARGE_TOOLBAR) def on_combo_style_changed(self, widget): self.settings['style'] = widget.get_active() self.widgets['cb_custom_style'].set_active(False) preview_file = None tpl_id = self.settings['template'] template_dir = os.path.join(self.locations['share'], 'export_templates', self.templates[tpl_id]['dir']) if self.settings['style'] > -1: preview_file = self.templates[self.settings['template']]['styles'][ self.settings['style']]['preview'] if preview_file is not None: preview_file = os.path.join(template_dir, preview_file) if preview_file is not None and not os.path.isfile(preview_file): preview_file = os.path.join( template_dir, 'preview.jpg') # try default preview image if not os.path.isfile(preview_file): preview_file = None if preview_file is not None: self.widgets['image_preview'].set_from_file(preview_file) else: self.widgets['image_preview'].set_from_stock( gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_LARGE_TOOLBAR) self.widgets['image_preview'].show() def on_cb_custom_style_toggled(self, widget): if widget.get_active(): self.settings['custom_style'] = True self.widgets['image_preview'].hide() else: self.settings['custom_style'] = False self.widgets['image_preview'].show() def on_fcb_custom_style_file_activated(self, widget): self.settings['custom_style_file'] = widget.get_filename() self.widgets['cb_custom_style'].set_active(True) #}}} }}} def make_navigation(self, pages, current): #{{{ if pages > 1: # navigation needed tpl_id = self.settings['template'] t = '<div class="navi">\n\t<p id="prev">' if current > 1: t += '<a href="./page_%s.%s">%s</a>' % \ (str(current-1), self.templates[tpl_id]['ext'], _('previous')) else: # first page t += _('previous') t += "</p>\n" for i in range(1, pages + 1): if i == current: t += '\t<p id="current">%s</p>\n' % str(i) else: t +='\t<p><a href="./page_%s.%s">%s</a></p>\n' % \ (str(i), self.templates[tpl_id]['ext'], str(i)) t += '\t<p id="next">' if pages > current: t +='<a href="./page_%s.%s">%s</a>' % \ (str(current+1), self.templates[tpl_id]['ext'], _('next')) else: # last page t += _('next') t += "</p>\n</div>" return t else: return '' #}}} def fill_template(self, template, field, data='', title='', remove=False): #{{{ start = template.find('<@' + field + '>') end = template.find('</@' + field + '>', start + 1) if start > -1 and end > -1: if remove == True: return template[:start] + template[end + 4 + len(field):] else: tmp = gutils.trim(template, '<@' + field + '>', '</@' + field + '>') tmp = tmp.replace("@DATA@", data) tmp = tmp.replace("@TITLE@", title) tmp = template[:start] + tmp + template[end + 4 + len(field):] if tmp.find('<@' + field + '>') != -1: tmp = self.fill_template(tmp, field, data, title, remove) return tmp else: return template #}}} def select(self): #{{{ config = self.settings # sort order TODO: update self.search_conditions["sort_by"] tmp = config['sorting'].split('_') sort_column = "%s.%s" % (tmp[0], '_'.join(tmp[1:])) if config['sorting2'] == 'ASC': sort_column += ' ASC' else: sort_column += ' DESC' self.search_conditions["sort_by"] = (sort_column, ) query = self.get_query() return query.execute() #}}} #==[ main function ]============================{{{ def export_data(self, widget): """Main exporting function""" config = self.settings fields = self.fields tid = config['template'] # get data from widgets self.settings['export_dir'] = self.widgets['fcw'].get_filename() self.settings['title'] = self.widgets['entry_header'].get_text( ).decode('utf-8') self.settings['sorting'] = self.names[ self.widgets['combo_sortby'].get_active_text().decode('utf-8')] if self.widgets['cb_reverse'].get_active(): self.settings['sorting2'] = 'DESC' else: self.settings['sorting2'] = 'ASC' self.settings['split_num'] = self.widgets[ 'sb_split_num'].get_value_as_int() self.settings['poster_height'] = self.widgets[ 'sb_height'].get_value_as_int() self.settings['poster_width'] = self.widgets[ 'sb_width'].get_value_as_int() if self.widgets['cb_black'].get_active(): self.settings['poster_mode'] = 'L' else: self.settings['poster_mode'] = 'RGB' self.settings['poster_format'] = self.widgets[ 'combo_format'].get_active_text() # persist config if self.config is not None: for name, value in config.items(): self.config.set(name, value, section='export-html') selected_fields = '' for name, value in self.fields.items(): if value: selected_fields = selected_fields + name + ',' self.config.set('selected_fields', selected_fields, section='export-html') self.config.save() # create directories if not config['export_dir']: log.info("Error: Folder name not set!") return 1 if not os.path.isdir(config['export_dir']): try: os.mkdir(config['export_dir']) except: gutils.error(_("Can't create %s!") % config['export_dir']) return 2 data_path = os.path.join(self.locations['share'], 'export_templates', self.templates[tid]['dir'], 'data') if os.path.isdir(data_path): try: gutils.copytree(data_path, config['export_dir']) except Exception, err: gutils.warning(str(err)) if fields['movies_image']: # import modules needed later # modules are needed at least to convert griffith.png to nopic.(gif|jpeg|png) from PIL import Image # py2exe problem workaround: if os.name == 'nt' or os.name.startswith('win'): # win32, win64 from PIL import PngImagePlugin from PIL import GifImagePlugin from PIL import JpegImagePlugin Image._initialized = 2 if not config['poster_convert']: config['poster_format'] = 'jpeg' # replace 'jpeg' posters_dir = os.path.join(config['export_dir'], 'posters') if os.path.isdir(posters_dir): if gutils.question( _("Directory %s already exists.\nDo you want to overwrite it?" ) % posters_dir, self.widgets['window']): try: shutil.rmtree(posters_dir) except: gutils.error( _("Can't remove %s!") % config['export_dir']) return 3 else: return 4 try: os.mkdir(posters_dir) except: gutils.error(_("Can't create %s!") % posters_dir) return 5 if config['custom_style']: if config['custom_style_file'] is not None and os.path.isfile( config['custom_style_file']): try: shutil.copy(config['custom_style_file'], config['export_dir']) except: gutils.warning(_("Can't copy %s!") % style_file) config['custom_style'] = False style = os.path.split(self.settings['custom_style_file'])[1] else: config['custom_style'] = False if config['style'] is not None and config['custom_style'] == False: style = self.templates[tid]['styles'][config['style']]['file'] style_path = os.path.join(self.locations['share'], 'export_templates', self.templates[tid]['dir'], style) try: shutil.copy(style_path, config['export_dir']) except: gutils.warning(_("Can't copy %s!") % style_path) # select exported movies exported_movies = self.select().fetchall() if self.settings['sorting'] in ('movies_title', 'movies_o_title'): # re-sorting movies case-insensitive and respect the current locale setting # if sorting by title or original title is selected import locale locale.setlocale(locale.LC_ALL, "") exported_movies.sort(cmp = locale.strcoll, \ key = lambda k: k[self.settings['sorting']] and k[self.settings['sorting']].lower() or '', \ reverse = self.settings['sorting2']=='DESC') number_of_exported_movies = len(exported_movies) if config['split_by'] == 1: # split by number of movies per page self.entries_per_page = config['split_num'] else: # split by number of pagess if number_of_exported_movies < config['split_num']: self.entries_per_page = 1 else: self.entries_per_page = int(number_of_exported_movies / config['split_num']) # calculate number of files to be created (pages) self.pages = int( math.ceil( float(number_of_exported_movies) / self.entries_per_page)) template_dir = os.path.join(self.locations['share'], 'export_templates', self.templates[tid]['dir']) try: filename = 'page.tpl' tpl_header = file(os.path.join(template_dir, filename), "r").read() except: gutils.error(_("Can't open %s!") % filename) return False tpl_header = self.fill_template(tpl_header, 'header', config['title']) try: tpl_header = self.fill_template(tpl_header, 'style', style) except: pass tmp = _('Document generated by Griffith v') + version.pversion + \ ' - Copyright (C) ' + version.pyear + ' ' + version.pauthor + ' - ' + \ _('Released Under the GNU/GPL License') tmp = gutils.html_encode(tmp) tmp = tmp.replace('@', ' at ') # prevent spam tpl_header = self.fill_template(tpl_header, 'copyright', tmp) tmp = None tpl_header = self.fill_template(tpl_header, 'pages', self.pages) # count exported fields rowspan = 0 for i in fields: if fields[i] == True: rowspan = rowspan + 1 rowspan = str(rowspan) tpl_header = self.fill_template(tpl_header, 'rowspan', rowspan) # split template tpl_tail = gutils.after(tpl_header, '<!-- /ITEMS -->') tpl_item = gutils.trim(tpl_header, '<!-- ITEMS -->', '<!-- /ITEMS -->') tpl_header = gutils.before(tpl_header, '<!-- ITEMS -->') # fill header for j in self.names: if self.fields[self.names[j]] == True: tpl_header = self.fill_template(tpl_header, self.names[j], '', j) else: tpl_header = self.fill_template(tpl_header, self.names[j], remove=True) # check if line break needs conversion if tpl_header.upper().find('XHTML 1.0') > -1: linebreak_replacement = '<br />' else: linebreak_replacement = None item = 1 # item's position on page (1 - first, ...) i = 1 page = 1 # page number for row in exported_movies: # fill items {{{ # check if new file has to be created if item == 1: filename = os.path.join( config['export_dir'], 'page_%s.' % page + self.templates[tid]['ext']) try: exported_file = file(filename, 'w') except: gutils.error(_("Can't create %s!") % filename) return False tmp2 = tpl_header + '' exported_file.write(self.fill_template(tmp2, 'page', str(page))) tmp2 = None # --------------------------------------------- tmp = tpl_item + '' # a copy (not a reference!) tmp = self.fill_template(tmp, 'id', str(item)) tmp = self.fill_template(tmp, 'item', str(i)) for j in self.names: if self.fields[self.names[j]] == True: if self.names[j] == 'movies_image': if row['movies_poster_md5']: #image = row['movies_poster_md5'] + '.' + config['poster_format'].lower() image = "%d.%s" % (row['movies_number'], config['poster_format'].lower()) tmp = self.fill_template(tmp, self.names[j], image, j) else: tmp = self.fill_template( tmp, self.names[j], 'nopic.' + config['poster_format'].lower(), j) elif row[self.names[j]] is None: tmp = self.fill_template(tmp, self.names[j], '', j) elif row[self.names[j]] is True: tmp = self.fill_template(tmp, self.names[j], _('Yes'), j) elif row[self.names[j]] is False: tmp = self.fill_template(tmp, self.names[j], _('No'), j) else: try: data = str(row[self.names[j]]).encode('utf-8') if linebreak_replacement is not None: data = data.replace('\r\n', linebreak_replacement) data = data.replace('\n', linebreak_replacement) tmp = self.fill_template(tmp, self.names[j], data, j) except UnicodeDecodeError: log.info( "Unicode Decode Error occurred while decoding %s (movie number: %s)" % (self.names[j], row['movies_number'])) data = str(row[self.names[j]]) if linebreak_replacement is not None: data = data.replace('\r\n', linebreak_replacement) data = data.replace('\n', linebreak_replacement) tmp = self.fill_template(tmp, self.names[j], data, j) except Exception, ex: log.info( "Error occurred while decoding %s (movie number: %s)" % (self.names[j], row['movies_number'])) else: tmp = self.fill_template(tmp, self.names[j], remove=True) tmp = gutils.convert_entities(tmp) exported_file.write(tmp) tmp = None # --------------------------------------------- # copy poster if fields['movies_image']: if row['movies_poster_md5']: image_file_src = gutils.get_image_fname( row['movies_poster_md5'], self.db) image_file_dst = os.path.join( posters_dir, "%d.%s" % (row['movies_number'], config['poster_format'].lower())) if not config['poster_convert']: # copy file try: shutil.copy(image_file_src, image_file_dst) except: log.info("Can't copy %s", image_file_src) else: # convert posters try: im = Image.open(image_file_src, 'r').convert(config['poster_mode']) im.thumbnail((config['poster_width'], config['poster_height']), Image.ANTIALIAS) im.save(image_file_dst, config['poster_format']) except: log.info("Can't convert %s", image_file_src) # close file if last item if ((page - 1) * self.entries_per_page) + item == number_of_exported_movies: tmp2 = tpl_tail + '' exported_file.write( self.fill_template(tmp2, 'navigation', self.make_navigation(self.pages, page))) exported_file.close() tmp2 = None # close file if last item in page elif item == self.entries_per_page: tmp2 = tpl_tail + '' exported_file.write( self.fill_template(tmp2, 'navigation', self.make_navigation(self.pages, page))) exported_file.close() page = page + 1 item = 1 tmp2 = None else: item = item + 1 i = i + 1
def set_details(self, item=None): # {{{ from loan import get_loan_info, get_loan_history if item is None: item = {} if item.has_key("movie_id") and item["movie_id"]: self._movie_id = item["movie_id"] else: self._movie_id = None w = self.widgets["movie"] if item.has_key("number") and item["number"]: w["number"].set_text(str(int(item["number"]))) else: w["number"].set_text("") if item.has_key("title") and item["title"]: w["title"].set_markup("<b><span size='large'>%s</span></b>" % gutils.html_encode(item["title"])) else: w["title"].set_text("") if item.has_key("o_title") and item["o_title"]: w["o_title"].set_markup("<span size='medium'><i>%s</i></span>" % gutils.html_encode(item["o_title"])) else: w["o_title"].set_text("") if item.has_key("director") and item["director"]: w["director"].set_markup("<i>%s</i>" % gutils.html_encode(item["director"])) else: w["director"].set_text("") if item.has_key("plot") and item["plot"]: w["plot"].set_text(str(item["plot"])) else: w["plot"].set_text("") if item.has_key("year") and item["year"]: w["year"].set_text(str(item["year"])) else: w["year"].set_text("") if item.has_key("runtime") and item["runtime"]: w["runtime"].set_text(str(int(item["runtime"]))) else: w["runtime"].set_text("x") if item.has_key("cast") and item["cast"]: w["cast"].set_text(str(item["cast"])) else: w["cast"].set_text("") if item.has_key("country") and item["country"]: w["country"].set_markup("<i>%s</i>" % gutils.html_encode(item["country"])) else: w["country"].set_text("") if item.has_key("genre") and item["genre"]: w["genre"].set_markup("<i>%s</i>" % gutils.html_encode(item["genre"])) else: w["genre"].set_text("") if item.has_key("cond") and item["cond"]: if str(item["cond"]) in [str(i) for i in range(len(self._conditions))]: w["condition"].set_markup("<i>%s</i>" % self._conditions[item["cond"]]) else: w["condition"].set_text("") self.debug.show( "Wrong value in 'condition' field (movie_id=%s, cond=%s)" % (item["movie_id"], item["cond"]) ) else: w["condition"].set_text("") if item.has_key("region") and item["region"]: if str(item["region"]) in [str(i) for i in range(len(self._regions))]: w["region"].set_markup("<i>%s</i>" % gutils.html_encode(item["region"])) if int(item["region"]) < 9: self.widgets["tooltips"].set_tip(w["region"], self._regions[int(item["region"])]) else: self.debug.show( "Wrong value in 'region' field (movie_id=%s, region=%s)" % (item["movie_id"], item["region"]) ) w["region"].set_text("") self.widgets["tooltips"].set_tip(w["region"], self._regions[0]) # N/A else: w["region"].set_text("") self.widgets["tooltips"].set_tip(w["region"], self._regions[0]) # N/A if item.has_key("layers") and item["layers"]: if str(item["layers"]) in [str(i) for i in range(len(self._layers))]: w["layers"].set_markup("<i>%s</i>" % self._layers[item["layers"]]) else: self.debug.show( "Wrong value in 'layers' field (movie_id=%s, layers=%s)" % (item["movie_id"], item["layers"]) ) w["layers"].set_text("") else: w["layers"].set_text("") if item.has_key("color") and item["color"]: if str(item["color"]) in [str(i) for i in range(len(self._colors))]: w["color"].set_markup("<i>%s</i>" % self._colors[item["color"]]) else: self.debug.show("Wrong value in 'color' field (movie_id=%s, color=%s)" % (item["movie_id"], item["color"])) w["color"].set_markup("") else: w["color"].set_markup("") if item.has_key("classification") and item["classification"]: w["classification"].set_markup("<i>%s</i>" % gutils.html_encode(item["classification"])) else: w["classification"].set_text("") if item.has_key("studio") and item["studio"]: w["studio"].set_markup("<i>%s</i>" % gutils.html_encode(item["studio"])) else: w["studio"].set_text("") if item.has_key("o_site") and item["o_site"]: self._o_site_url = str(item["o_site"]) w["go_o_site_button"].set_sensitive(True) else: self._o_site_url = None w["go_o_site_button"].set_sensitive(False) if item.has_key("site") and item["site"]: self._site_url = str(item["site"]) w["go_site_button"].set_sensitive(True) else: self._site_url = None w["go_site_button"].set_sensitive(False) if item.has_key("trailer") and item["trailer"]: self._trailer_url = str(item.trailer) w["go_trailer_button"].set_sensitive(True) else: self._trailer_url = None w["go_trailer_button"].set_sensitive(False) if item.has_key("seen") and item["seen"] == True: w["seen_icon"].set_from_file(os.path.join(self.locations["images"], "seen.png")) else: w["seen_icon"].set_from_file(os.path.join(self.locations["images"], "unseen.png")) if item.has_key("notes") and item["notes"]: w["notes"].set_text(str(item.notes)) else: w["notes"].set_text("") tmp = "" if item.has_key("media_num") and item["media_num"]: tmp = str(item.media_num) else: tmp = "0" if item.has_key("medium_id") and item["medium_id"]: if item.medium is not None: tmp += " x " + item.medium.name else: pass w["medium"].set_markup("<i>%s</i>" % gutils.html_encode(tmp)) if item.has_key("vcodec_id"): if item.vcodec is not None: w["vcodec"].set_markup("<i>%s</i>" % gutils.html_encode(item.vcodec.name)) else: w["vcodec"].set_text("") else: w["vcodec"].set_text("") # poster if item.has_key("image") and item["image"]: tmp_dest = self.locations["posters"] tmp_img = os.path.join(tmp_dest, "m_%s.jpg" % item["image"]) tmp_img2 = os.path.join(tmp_dest, "%s.jpg" % item["image"]) if os.path.isfile(tmp_img2): image_path = tmp_img self.widgets["add"]["delete_poster"].set_sensitive(True) self.widgets["menu"]["delete_poster"].set_sensitive(True) w["picture_button"].set_sensitive(True) else: image_path = os.path.join(self.locations["images"], "default.png") self.widgets["add"]["delete_poster"].set_sensitive(False) self.widgets["menu"]["delete_poster"].set_sensitive(False) w["picture_button"].set_sensitive(False) # lets see if we have a scaled down medium image already created if not os.path.isfile(image_path): # if not, lets make one for future use :D original_image = os.path.join(tmp_dest, "%s.jpg" % item.image) if os.path.isfile(original_image): gutils.make_medium_image(self, "%s.jpg" % item.image) else: image_path = os.path.join(self.locations["images"], "default.png") w["picture_button"].set_sensitive(False) w["picture"].set_from_file(image_path) # ratig rimage = int(self.config.get("rating_image", 0)) if rimage: prefix = "" else: prefix = "meter" if item.has_key("rating") and item["rating"]: rating_file = "%s/%s0%d.png" % (self.locations["images"], prefix, item["rating"]) else: rating_file = "%s/%s0%d.png" % (self.locations["images"], prefix, 0) handler = w["image_rating"].set_from_pixbuf(gtk.gdk.pixbuf_new_from_file(rating_file)) gutils.garbage(handler) # check loan status and adjust buttons and history box if item.has_key("loaned") and item["loaned"] == True: self.widgets["popups"]["loan"].set_sensitive(False) self.widgets["popups"]["email"].set_sensitive(True) self.widgets["popups"]["return"].set_sensitive(True) self.widgets["menu"]["loan"].set_sensitive(False) self.widgets["menu"]["email"].set_sensitive(True) self.widgets["menu"]["return"].set_sensitive(True) w["loan_button"].set_sensitive(False) w["email_reminder_button"].set_sensitive(True) w["return_button"].set_sensitive(True) data_loan = get_loan_info( self.db, collection_id=item["collection_id"], volume_id=item["volume_id"], movie_id=item["movie_id"] ) if data_loan is None: item.loaned = False else: data_person = self.db.Person.get_by(person_id=data_loan.person.person_id) self.person_name = str(data_person.name) self.person_email = str(data_person.email) self.loan_date = str(data_loan.date) w["loan_info"].set_use_markup(False) w["loan_info"].set_label( _("This movie has been loaned to ") + self.person_name + _(" on ") + self.loan_date[:10] ) if ( item.has_key("loaned") and item["loaned"] != True ): # "loaned" status can be changed above, so don't use "else:" in this line self.widgets["popups"]["loan"].set_sensitive(True) self.widgets["popups"]["email"].set_sensitive(False) self.widgets["popups"]["return"].set_sensitive(False) self.widgets["menu"]["loan"].set_sensitive(True) self.widgets["menu"]["email"].set_sensitive(False) self.widgets["menu"]["return"].set_sensitive(False) w["return_button"].set_sensitive(False) w["email_reminder_button"].set_sensitive(False) w["loan_button"].set_sensitive(True) w["loan_info"].set_markup("<b>%s</b>" % _("Movie not loaned")) # loan history self.loans_treemodel.clear() if item.has_key("collection_id") or item.has_key("volume_id") or item.has_key("movie_id"): loans = get_loan_history( self.db, collection_id=item["collection_id"], volume_id=item["volume_id"], movie_id=item["movie_id"] ) for loan in loans: myiter = self.loans_treemodel.append(None) self.loans_treemodel.set_value(myiter, 0, "%s" % str(loan.date)[:10]) if loan.return_date and loan.return_date != "": self.loans_treemodel.set_value(myiter, 1, str(loan.return_date)[:10]) else: self.loans_treemodel.set_value(myiter, 1, "---") person = self.db.Person.get_by(person_id=loan.person.person_id) self.loans_treemodel.set_value(myiter, 2, person.name) # volumes/collections if item.has_key("volume_id") and item["volume_id"] > 0: if item.has_key("volume") and item["volume"]: w["volume"].set_markup("<b>%s</b>" % gutils.html_encode(item["volume"].name)) w["show_volume_button"].set_sensitive(True) else: w["volume"].set_text("") w["show_volume_button"].set_sensitive(False) else: w["volume"].set_text("") w["show_volume_button"].set_sensitive(False) if item.has_key("collection_id") and item["collection_id"] > 0: if item.has_key("collection") and item["collection"]: w["collection"].set_markup("<b>%s</b>" % gutils.html_encode(item["collection"].name)) w["show_collection_button"].set_sensitive(True) else: w["collection"].set_text("") w["show_collection_button"].set_sensitive(False) else: w["collection"].set_text("") w["show_collection_button"].set_sensitive(False) # languages for i in w["audio_vbox"].get_children(): i.destroy() for i in w["subtitle_vbox"].get_children(): i.destroy() if item.has_key("languages") and len(item["languages"]) > 0: for i in item["languages"]: if i.type == 3: # subtitles if i.subformat: tmp = "%s - %s" % (i.language.name, i.subformat.name) else: tmp = "%s" % i.language.name w["subtitle_vbox"].pack_start(gtk.Label(tmp)) else: language = i.language.name if i.type is not None and len(self._lang_types[i.type]) > 0: language += " <i>%s</i>" % self._lang_types[i.type] tmp = "" if i.achannel: tmp = i.achannel.name if i.acodec: if len(tmp) > 0: tmp += ", %s" % i.acodec.name else: tmp = i.acodec.name if len(tmp) > 0: tmp = "%s (%s)" % (language, tmp) else: tmp = language widget = gtk.Label(tmp) widget.set_use_markup(True) w["audio_vbox"].pack_start(widget) w["audio_vbox"].show_all() w["subtitle_vbox"].show_all() # tags if item.has_key("tags"): tmp = "" for tag in item["tags"]: tmp += "%s, " % tag.name tmp = tmp[:-2] # cut last comma w["tags"].set_text(tmp)
def export_data(self, widget): """Main exporting function""" config = self.config fields = self.fields tid = config['template'] # get data from widgets self.config['exported_dir'] = self.widgets['fcw'].get_filename() self.config['title'] = self.widgets['entry_header'].get_text() self.config['sorting'] = self.names[self.widgets['combo_sortby'].get_active_text()] if self.widgets['cb_reverse'].get_active(): self.config['sorting2'] = 'DESC' else: self.config['sorting2'] = 'ASC' self.config['split_num'] = self.widgets['sb_split_num'].get_value_as_int() self.config['poster_height'] = self.widgets['sb_height'].get_value_as_int() self.config['poster_width'] = self.widgets['sb_width'].get_value_as_int() if self.widgets['cb_black'].get_active(): self.config['poster_mode'] = 'L' else: self.config['poster_mode'] = 'RGB' self.config['poster_format'] = self.widgets['combo_format'].get_active_text() # create directories if not config['exported_dir']: self.debug.show("Error: Folder name not set!") return 1 if not os.path.isdir(config['exported_dir']): try: os.mkdir(config['exported_dir']) except: gutils.error(self,_("Can't create %s!") % config['exported_dir']) return 2 if fields['image']: # import modules needed later if config['poster_convert']: from PIL import Image # py2exe problem workaround: # if self.windows: from PIL import PngImagePlugin from PIL import GifImagePlugin from PIL import JpegImagePlugin Image._initialized=2 # end if else: config['poster_format'] = 'jpg' # replace 'jpeg' posters_dir = os.path.join(config['exported_dir'], 'posters') if os.path.isdir(posters_dir): if gutils.question(self, _("Directory %s already exists.\nDo you want to overwrite it?") % posters_dir,1,self) == gtk.RESPONSE_YES: try: shutil.rmtree(posters_dir) except: gutils.error(self,_("Can't remove %s!") % config['exported_dir']) return 3 else: return 4 try: os.mkdir(posters_dir) except: gutils.error(self,_("Can't create %s!") % posters_dir) return 5 if config['custom_style']: if config['custom_style_file'] is not None and os.path.isfile(config['custom_style_file']): try: shutil.copy(config['custom_style_file'],config['exported_dir']) except: gutils.warning(self,_("Can't copy %s!")%style_file) config['custom_style'] = False style = os.path.split(self.config['custom_style_file'])[1] else: config['custom_style'] = False if config['style'] is not None and config['custom_style']==False: style = self.templates[tid]['styles'][config['style']]['file'] style_path = os.path.join(self.locations['share'], 'export_templates', self.templates[tid]['dir'], style) try: shutil.copy(style_path,config['exported_dir']) except: gutils.warning(self,_("Can't copy %s!")%style_path) # select exported movies exported_movies = self.select().fetchall() number_of_exported_movies = len(exported_movies) if config['split_by'] == 1: # split by number of movies per page self.entries_per_page = config['split_num'] else: # split by number of pagess if number_of_exported_movies < config['split_num']: self.entries_per_page = 1 else: self.entries_per_page = int(number_of_exported_movies / config['split_num']) # calculate number of files to be created (pages) self.pages = int(math.ceil(float(number_of_exported_movies) / self.entries_per_page)) template_dir = os.path.join(self.locations['share'], 'export_templates', self.templates[tid]['dir']) try: filename = 'page.tpl' tpl_header = file(os.path.join(template_dir,filename), "r").read() except: gutils.error(self,_("Can't open %s!")%filename) return False tpl_header = self.fill_template(tpl_header, 'header', config['title']) try: tpl_header = self.fill_template(tpl_header, 'style', style) except: pass tmp = _('Document generated by Griffith v') + version.pversion + \ ' - Copyright (C) ' + version.pyear + ' ' + version.pauthor + ' - ' + \ _('Released Under the GNU/GPL License') tmp = gutils.html_encode(tmp) tmp = tmp.replace('@', ' at ') # prevent spam tpl_header = self.fill_template(tpl_header, 'copyright', tmp) tmp = None tpl_header = self.fill_template(tpl_header, 'pages', self.pages) # count exported fields rowspan = 0 for i in fields: if fields[i] == True: rowspan = rowspan + 1 rowspan = str(rowspan) tpl_header = self.fill_template(tpl_header, 'rowspan', rowspan) # split template tpl_tail = gutils.after(tpl_header, '<!-- /ITEMS -->') tpl_item = gutils.trim(tpl_header, '<!-- ITEMS -->','<!-- /ITEMS -->') tpl_header = gutils.before(tpl_header, '<!-- ITEMS -->') # fill header for j in self.names: if self.fields[self.names[j]] == True: tpl_header = self.fill_template(tpl_header, self.names[j], '', j) else: tpl_header = self.fill_template(tpl_header, self.names[j], remove=True) item=1 # item's position on page (1 - first, ...) i = 1 page=1 # page number for row in exported_movies: # fill items {{{ # check if new file has to be created if item==1: filename = os.path.join(config['exported_dir'],'page_%s.' % page + self.templates[tid]['ext']) try: exported_file = file(filename, 'w') except: gutils.error(self,_("Can't create %s!")%filename) return False tmp2 = tpl_header + '' exported_file.write(self.fill_template(tmp2, 'page', str(page))) tmp2 = None # --------------------------------------------- tmp = tpl_item + '' # a copy (not a reference!) tmp = self.fill_template(tmp, 'id', str(item)) tmp = self.fill_template(tmp, 'item', str(i)) for j in self.names: if self.fields[self.names[j]] == True: if self.names[j] == 'image': if row['image']: image = row['image'] + '.' + config['poster_format'].lower() tmp = self.fill_template(tmp, self.names[j], image, j) else: tmp = self.fill_template(tmp, self.names[j], '', j) elif row[self.names[j]] is None: tmp = self.fill_template(tmp, self.names[j], '', j) elif row[self.names[j]] is True: tmp = self.fill_template(tmp, self.names[j], _('Yes'), j) elif row[self.names[j]] is False: tmp = self.fill_template(tmp, self.names[j], _('No'), j) else: try: tmp = self.fill_template(tmp, self.names[j], str(row[self.names[j]]).encode('utf-8'), j) except UnicodeDecodeError: self.debug.show("Unicode Decode Error occurred while decoding %s (movie number: %s)" % (self.names[j], row['number'])) tmp = self.fill_template(tmp, self.names[j], str(row[self.names[j]]), j) except Exception, ex: self.debug.show("Error occurred while decoding %s (movie number: %s)" % (self.names[j], row['number'])) else: tmp = self.fill_template(tmp, self.names[j], remove=True) tmp = gutils.convert_entities(tmp) exported_file.write(tmp) tmp = None # --------------------------------------------- # copy poster if fields['image']: if row['image'] is not None: image_file = os.path.join(self.locations['posters'], str(row['image']) + '.jpg') if not config['poster_convert']: # copy file try: shutil.copy(image_file, posters_dir) except: self.debug.show("Can't copy %s" % image_file) else: # convert posters try: im = Image.open(image_file, 'r').convert(config['poster_mode']) im.thumbnail((config['poster_width'], config['poster_height']), Image.ANTIALIAS) im.save(os.path.join(posters_dir, row['image']) + '.' + config['poster_format'].lower(), config['poster_format']) except: self.debug.show("Can't convert %s" % image_file) # close file if last item if ((page-1)*self.entries_per_page)+item == number_of_exported_movies: tmp2 = tpl_tail + '' exported_file.write(self.fill_template(tmp2, 'navigation', self.make_navigation(self.pages, page))) exported_file.close() tmp2 = None # close file if last item in page elif item == self.entries_per_page: tmp2 = tpl_tail + '' exported_file.write(self.fill_template(tmp2, 'navigation', self.make_navigation(self.pages, page))) exported_file.close() page = page+1 item=1 tmp2 = None else: item=item+1 i=i+1
def export_data(self, widget): """Main exporting function""" config = self.config fields = self.fields tid = config["template"] # get data from widgets self.config["exported_dir"] = self.widgets["fcw"].get_filename() self.config["title"] = self.widgets["entry_header"].get_text() self.config["sorting"] = self.names[self.widgets["combo_sortby"].get_active_text()] if self.widgets["cb_reverse"].get_active(): self.config["sorting2"] = "DESC" else: self.config["sorting2"] = "ASC" self.config["split_num"] = self.widgets["sb_split_num"].get_value_as_int() self.config["poster_height"] = self.widgets["sb_height"].get_value_as_int() self.config["poster_width"] = self.widgets["sb_width"].get_value_as_int() if self.widgets["cb_black"].get_active(): self.config["poster_mode"] = "L" else: self.config["poster_mode"] = "RGB" self.config["poster_format"] = self.widgets["combo_format"].get_active_text() # create directories if not config["exported_dir"]: self.debug.show("Error: Folder name not set!") return 1 if not os.path.isdir(config["exported_dir"]): try: os.mkdir(config["exported_dir"]) except: gutils.error(self, _("Can't create %s!") % config["exported_dir"]) return 2 if fields["image"]: # import modules needed later if config["poster_convert"]: from PIL import Image # py2exe problem workaround: # if self.windows: from PIL import PngImagePlugin from PIL import GifImagePlugin from PIL import JpegImagePlugin Image._initialized = 2 # end if else: config["poster_format"] = "jpg" # replace 'jpeg' posters_dir = os.path.join(config["exported_dir"], "posters") if os.path.isdir(posters_dir): if ( gutils.question( self, _("Directory %s already exists.\nDo you want to overwrite it?") % posters_dir, 1, self ) == gtk.RESPONSE_YES ): try: shutil.rmtree(posters_dir) except: gutils.error(self, _("Can't remove %s!") % config["exported_dir"]) return 3 else: return 4 try: os.mkdir(posters_dir) except: gutils.error(self, _("Can't create %s!") % posters_dir) return 5 if config["custom_style"]: if config["custom_style_file"] is not None and os.path.isfile(config["custom_style_file"]): try: shutil.copy(config["custom_style_file"], config["exported_dir"]) except: gutils.warning(self, _("Can't copy %s!") % style_file) config["custom_style"] = False style = os.path.split(self.config["custom_style_file"])[1] else: config["custom_style"] = False if config["style"] is not None and config["custom_style"] == False: style = self.templates[tid]["styles"][config["style"]]["file"] style_path = os.path.join(self.locations["share"], "export_templates", self.templates[tid]["dir"], style) try: shutil.copy(style_path, config["exported_dir"]) except: gutils.warning(self, _("Can't copy %s!") % style_path) # select exported movies exported_movies = self.select().fetchall() number_of_exported_movies = len(exported_movies) if config["split_by"] == 1: # split by number of movies per page self.entries_per_page = config["split_num"] else: # split by number of pagess if number_of_exported_movies < config["split_num"]: self.entries_per_page = 1 else: self.entries_per_page = int(number_of_exported_movies / config["split_num"]) # calculate number of files to be created (pages) self.pages = int(math.ceil(float(number_of_exported_movies) / self.entries_per_page)) template_dir = os.path.join(self.locations["share"], "export_templates", self.templates[tid]["dir"]) try: filename = "page.tpl" tpl_header = file(os.path.join(template_dir, filename), "r").read() except: gutils.error(self, _("Can't open %s!") % filename) return False tpl_header = self.fill_template(tpl_header, "header", config["title"]) try: tpl_header = self.fill_template(tpl_header, "style", style) except: pass tmp = ( _("Document generated by Griffith v") + version.pversion + " - Copyright (C) " + version.pyear + " " + version.pauthor + " - " + _("Released Under the GNU/GPL License") ) tmp = gutils.html_encode(tmp) tmp = tmp.replace("@", " at ") # prevent spam tpl_header = self.fill_template(tpl_header, "copyright", tmp) tmp = None tpl_header = self.fill_template(tpl_header, "pages", self.pages) # count exported fields rowspan = 0 for i in fields: if fields[i] == True: rowspan = rowspan + 1 rowspan = str(rowspan) tpl_header = self.fill_template(tpl_header, "rowspan", rowspan) # split template tpl_tail = gutils.after(tpl_header, "<!-- /ITEMS -->") tpl_item = gutils.trim(tpl_header, "<!-- ITEMS -->", "<!-- /ITEMS -->") tpl_header = gutils.before(tpl_header, "<!-- ITEMS -->") # fill header for j in self.names: if self.fields[self.names[j]] == True: tpl_header = self.fill_template(tpl_header, self.names[j], "", j) else: tpl_header = self.fill_template(tpl_header, self.names[j], remove=True) item = 1 # item's position on page (1 - first, ...) i = 1 page = 1 # page number for row in exported_movies: # fill items {{{ # check if new file has to be created if item == 1: filename = os.path.join(config["exported_dir"], "page_%s." % page + self.templates[tid]["ext"]) try: exported_file = file(filename, "w") except: gutils.error(self, _("Can't create %s!") % filename) return False tmp2 = tpl_header + "" exported_file.write(self.fill_template(tmp2, "page", str(page))) tmp2 = None # --------------------------------------------- tmp = tpl_item + "" # a copy (not a reference!) tmp = self.fill_template(tmp, "id", str(item)) tmp = self.fill_template(tmp, "item", str(i)) for j in self.names: if self.fields[self.names[j]] == True: if self.names[j] == "image": if row["image"]: image = row["image"] + "." + config["poster_format"].lower() tmp = self.fill_template(tmp, self.names[j], image, j) else: tmp = self.fill_template(tmp, self.names[j], "", j) elif row[self.names[j]] is None: tmp = self.fill_template(tmp, self.names[j], "", j) elif row[self.names[j]] is True: tmp = self.fill_template(tmp, self.names[j], _("Yes"), j) elif row[self.names[j]] is False: tmp = self.fill_template(tmp, self.names[j], _("No"), j) else: try: tmp = self.fill_template(tmp, self.names[j], str(row[self.names[j]]).encode("utf-8"), j) except UnicodeDecodeError: self.debug.show( "Unicode Decode Error occurred while decoding %s (movie number: %s)" % (self.names[j], row["number"]) ) tmp = self.fill_template(tmp, self.names[j], str(row[self.names[j]]), j) except Exception, ex: self.debug.show( "Error occurred while decoding %s (movie number: %s)" % (self.names[j], row["number"]) ) else: tmp = self.fill_template(tmp, self.names[j], remove=True) tmp = gutils.convert_entities(tmp) exported_file.write(tmp) tmp = None # --------------------------------------------- # copy poster if fields["image"]: if row["image"] is not None: image_file = os.path.join(self.locations["posters"], str(row["image"]) + ".jpg") if not config["poster_convert"]: # copy file try: shutil.copy(image_file, posters_dir) except: self.debug.show("Can't copy %s" % image_file) else: # convert posters try: im = Image.open(image_file, "r").convert(config["poster_mode"]) im.thumbnail((config["poster_width"], config["poster_height"]), Image.ANTIALIAS) im.save( os.path.join(posters_dir, row["image"]) + "." + config["poster_format"].lower(), config["poster_format"], ) except: self.debug.show("Can't convert %s" % image_file) # close file if last item if ((page - 1) * self.entries_per_page) + item == number_of_exported_movies: tmp2 = tpl_tail + "" exported_file.write(self.fill_template(tmp2, "navigation", self.make_navigation(self.pages, page))) exported_file.close() tmp2 = None # close file if last item in page elif item == self.entries_per_page: tmp2 = tpl_tail + "" exported_file.write(self.fill_template(tmp2, "navigation", self.make_navigation(self.pages, page))) exported_file.close() page = page + 1 item = 1 tmp2 = None else: item = item + 1 i = i + 1