def itemClicked(self, event): if (self.grillaSeries.selection()): item = self.grillaSeries.item(self.grillaSeries.selection()) print(item['values'][3]) self.serie = Series().get(item['values'][3]) imagen = self.serie.getImageCover() print(self.labelImagen) self.cover = ImageTk.PhotoImage(imagen.resize(self.coverSize)) self.labelImagen['image'] = self.cover
def buscarSerie(self, orderBy=None): # print(self.filtros) primerfiltro = True filtro = '' filtrosNoVacios = {} listaValores = [] # al parecer el for acede a la estructura en forma paralela y no tengo forma de determinar el primero. por esto se hace lo siguiente # sacamos las listas filtros vacias y solo dejamos la que tienen valores despues obtenemos la lista en la pos 1 y despues concatenemos el resto for nombreLista in self.filtros.keys(): if len(self.filtros[nombreLista]) > 0: print('lista: ' + nombreLista + ' long: ' + str(len(self.filtros[nombreLista]))) filtrosNoVacios[nombreLista] = self.filtros[nombreLista] listaKeys = [x for x in filtrosNoVacios.keys()] print(filtrosNoVacios) if len(listaKeys) > 0: primeraLista = filtrosNoVacios[listaKeys[0]] print('Primera lista: ' + str(filtrosNoVacios[listaKeys[0]])) for valor in primeraLista: filtro += listaKeys[0] + ' like ? or ' listaValores.append(valor) print(listaKeys[1:]) for key in listaKeys[1:]: filtro = filtro[:-4] + ' and ' filtrolocal = '' print('lista: ' + str(filtrosNoVacios[key])) for valor in filtrosNoVacios[key]: filtrolocal += key + ' like ? or ' listaValores.append(valor) filtro = filtro + filtrolocal filtro = filtro[:-4] if (len(filtro) > 0): print(filtro) print(listaValores) series = Series().getList(listaValores, filtro, orderBy) else: series = Series().getList(listaValores, '', orderBy) for item in self.grillaSeries.get_children(): self.grillaSeries.delete(item) for serie in series: self.grillaSeries.insert( '', 0, '', text='', values=(serie.nombre, serie.cantidadNumeros, serie.descripcion, serie.id, serie.image_url, serie.publisherName, serie.AnioInicio))
def addNewMedia(self): category = input( 'enter the category name first\n ( film - clip - documentary - series ): ' ) id = input('id: ') name = input('name: ') year = input('year: ') director = input('director: ') score = input('score: ') duration = input('duration: ') url = input('url: ') info = input('info: ') casts = input('casts: ') genre = input('genre: ') episode = input('episode: ') subject = input('subject: ') company = input('company: ') media_info = [ id, category, name, year, director, score, duration, url, info, casts, genre, episode, subject, company ] if category == 'film': self.medias.append(Film(media_info)) elif category == 'clip': self.medias.append(Clip(media_info)) elif category == 'documentary': self.medias.append(Documentary(media_info)) elif category == 'series': self.medias.append(Series(media_info)) else: print(Fore.RED + 'wrong input') self.menu()
def __init__(self): try: f = open('Data.csv') except Exception as e: print("error: ", e) exit() big_text = f.read() parts = big_text.split('\n') self.medias = [] i = 0 while i < len(parts): info = parts[i].split(',') if info[1] == 'film': self.medias.append(Film(info)) elif info[1] == 'documentary': self.medias.append(Documentary(info)) elif info[1] == 'clip': self.medias.append(Clip(info)) elif info[1] == 'series': self.medias.append(Series(info)) i += 1 print(Fore.LIGHTCYAN_EX + 'data loaded! \nwelcome dear user!') self.menu()
def __init__(self, master): self.window_root = master self.window_root.title("Comic Viewer") ws = self.window_root.winfo_screenwidth() hs = self.window_root.winfo_screenheight() x = int((ws / 2) - (WINDOW_WIDTH / 2)) y = int((hs / 2) - (WINDOW_HEIGHT / 2) - 10) self.window_root.geometry(str(WINDOW_WIDTH) + "x" + str(WINDOW_HEIGHT) + "+" + str(x) + "+" + str(y)) root_directory = "Mangas" comic_name = "Pokemon Adventures" self.shown_series = Series(root_directory, comic_name) img = self.shown_series.get_current_image() self.panel = Label(self.window_root) self.show_image(img) self.window_root.bind("<Left>", self.handle_left_key_event) self.window_root.bind("<Right>", self.handle_right_key_event)
def __createPanelComic__(self, parent, comicbook, comicCoverImage, **kw): panelComic = ttk.LabelFrame(parent, **kw) self.comicCovers.append(ImageTk.PhotoImage(comicCoverImage)) print(comicbook.getNombreArchivo()) comicCoverLabel = ttk.Label( panelComic, image=self.comicCovers[len(self.comicCovers) - 1], compound='top') comicCoverLabel.grid(column=0, row=0, sticky=(W)) panelInfo = ttk.LabelFrame(panelComic, text='--') panelInfo.grid(column=1, row=0, sticky=(W, E, N)) series = Series() serie = series.get(comicbook.serieId) if (series.status == 0): print('No se pudo recueperar la serie') nombreSerie = ttk.Label(panelInfo, text='Serie: ' + "") numerode = ttk.Label(panelInfo, text='Número: ' + str(comicbook.numero) + ' de ' + str(0)) else: nombreSerie = ttk.Label(panelInfo, text='Serie: ' + serie.nombre) numerode = ttk.Label(panelInfo, text='Número: ' + str(comicbook.numero) + ' de ' + str(serie.cantidadNumeros)) archivo = ttk.Label(panelInfo, text='Archivo: ' + comicbook.getNombreArchivo()) tituloEjemplar = ttk.Label(panelInfo, text='Título: ' + comicbook.titulo) arcoAlternativo = ttk.Label(panelInfo, text='Fecha Tapa: ' + comicbook.fechaTapa) archivo.grid(sticky=(W), padx=5) nombreSerie.grid(sticky=(W), padx=5) tituloEjemplar.grid(sticky=(W), padx=5) numerode.grid(sticky=(W), padx=5) arcoAlternativo.grid(sticky=(W), padx=5) return panelComic
class MainWindow: def __init__(self, master): self.window_root = master self.window_root.title("Comic Viewer") ws = self.window_root.winfo_screenwidth() hs = self.window_root.winfo_screenheight() x = int((ws / 2) - (WINDOW_WIDTH / 2)) y = int((hs / 2) - (WINDOW_HEIGHT / 2) - 10) self.window_root.geometry(str(WINDOW_WIDTH) + "x" + str(WINDOW_HEIGHT) + "+" + str(x) + "+" + str(y)) root_directory = "Mangas" comic_name = "Pokemon Adventures" self.shown_series = Series(root_directory, comic_name) img = self.shown_series.get_current_image() self.panel = Label(self.window_root) self.show_image(img) self.window_root.bind("<Left>", self.handle_left_key_event) self.window_root.bind("<Right>", self.handle_right_key_event) def show_image(self, img): self.panel.configure(image=img) self.panel.image = img self.panel.focus_set() self.panel.pack(side="bottom", fill="both", expand="yes") def handle_left_key_event(self, _): previous_page = self.shown_series.get_previous_page() self.show_image(previous_page) def handle_right_key_event(self, _): next_page = self.shown_series.get_next_page() self.show_image(next_page)
def run(self): """ Advances the model until the value of the curr_time property is >= the run_time property of the TimeParams instance passed to the constructor. It returns the results of running the model in an instance of the Results class. """ time_series = [self.curr_time] predator_series = [self.predators] prey_series = [self.prey] while self.advance(): time_series.append(self.curr_time) predator_series.append(self.predators) prey_series.append(self.prey) predator_series_obj = Series(predator_series, self.__population_labels.predator_label) prey_series_obj = Series(prey_series, self.__population_labels.prey_label) results = Results(time_series, predator_series_obj, prey_series_obj) return results
def main(self): choice = 1 while choice != 4: choice = int(input()) if choice == 1: cal = Cal() cal.op() print("--------------") print(cal.choice) if cal.choice == 0: self.menu() elif choice == 2: ser = Series() print("--------------") if ser.choice == 0: self.menu() else: break
async def task(serie_config, browser_context, aio_session, torrent_client): config = serie_config serie = Series(**config) page = await browser_context.newPage() await page.setViewport({"width": 1920, "height": 1080}) #await page.setUserAgent(user_agent) episode = serie.episode - 1 while serie.episode > episode: episode = serie.episode async for torrent_file in serie.get_torrent(page, aio_session): if torrent_file is not None: logger.info("%s %i - in task: download torrent ok", serie.name, serie.episode) if not serie.path.exists(): serie.path.mkdir(mode=0o777) torrent_id = torrent_client.add_torrent( torrent_file, True, str(serie.path)) config.read() config["episode"] = serie.episode + 1 config.write() # await asyncio.sleep(10) torrent = torrent_client.get_torrent_status(torrent_id) if torrent.size <= torrent.free_space - 100000000: torrent.start() logger.info("%s %i- in task: start %s", serie.name, serie.episode, torrent.name) logger.debug("%s %i - in task: Cancel pending Task", serie.name, serie.episode) serie.stop() config.read() serie = Series(**config) try: await page.close() except Exception as error: logger.error("%s - in task: %s", serie.name, error)
def __init__(self, parent, comicBook, cnf={}, **kw): Frame.__init__(self, parent, cnf, **kw) comic = self.comic = comicBook self.serie = Series().get(comicBook.serieId) notebook = ttk.Notebook(self) resumen = ttk.Frame(notebook) # first page, which would get widgets gridded into it detalle = ttk.Frame(notebook) # second page resumen.grid() detalle.grid() notebook.add(resumen, text='Resumen') notebook.add(detalle, text='Detalle') self.grid() notebook.grid() self.comic.openCbFile() comicBook.goto(0) im = Image.open(comicBook.getPage()) size = (int(320 * 0.5), int(496 * 0.5)) self.fImage = ImageTk.PhotoImage(im.resize(size)) # self.cover = ttk.Label(resumen, image=self.fImage, anc1hor=CENTER, compound='top', text='No anda') # self.cover.grid(column=0, row=4, columnspan=2, rowspan=2, sticky=(N, W, E, S)) self.cover = Canvas(resumen, width=size[0], height=size[1]) self.cover.create_image((0, 0), image=self.fImage,anchor=NW) # recordar que esto decide desde donde se muestra la imagen self.cover.create_rectangle((2, 2, 160, 248)) self.cover.grid(column=0, row=0, rowspan=5) ttk.Label(resumen, text=comic.getNombreArchivo(False)).grid(column=1, row=0, sticky=(W, N)) resumen.columnconfigure(1,weight=1) resumen.rowconfigure(1, weight=1) #tienen 9 lineas de alto y 59 chars de largo el texto resumenText = Text(resumen, width=50, height=9) if(comic.resumen): resumenText.insert(END, comic.resumen) resumenText.grid(column=1, row=1, sticky=(N,S,W,S), columnspan = 4) size = self.comic.getSize()/(1024*1024) ttk.Label(resumen, text="Tipo: "+self.comic.getTipo()+' '+str("%0.2f"%size)+'M' ).grid(column=0, row=5, sticky=(N, W)) ttk.Label(resumen, text="Páginas: "+str(self.comic.getCantidadPaginas())).grid(column=0, row=6, sticky=(N, W)) ttk.Label(resumen, text="Mi Valoración:").grid(column=1, row=5, sticky=(N, W)) ttk.Label(resumen, text="Valoración de la comunidad:").grid(column=1, row=6, sticky=(N, W)) donde = ttk.Label(resumen) donde.config(text="Dónde: {:.90s}".format(self.comic.path)) donde.grid(column=0, row=7,columnspan=2, sticky=(N, W)) donde.bind("<Button-1>",self.click) # los ttk no usans el text='' ttk.Label(detalle, text='Serie:').grid(column=0, row=0, sticky=(N, W)) entrada = ttk.Entry(detalle, width=50) entrada.grid(column=0, row=1, padx=5, sticky=(N, W), columnspan=2) entrada.insert(END, self.serie.nombre) ttk.Label(detalle, text='Volumen:').grid(column=2, row=0, sticky=(N, W)) entrada = ttk.Entry(detalle, width=6) entrada.grid(column=2, row=1, padx=5, sticky=(N, W)) entrada.insert(END, self.comic.volumen) ttk.Label(detalle, text='Número:').grid(column=3, row=0, sticky=(N, W)) entrada = Spinbox(detalle, from_=0, to=10000, width=6) entrada.grid(column=3, row=1, padx=5, sticky=(N, W)) entrada.delete(0) entrada.insert(END, self.comic.numero) ttk.Label(detalle, text='de:').grid(column=4, row=0, sticky=(N, W)) entrada = Spinbox(detalle, from_=0, to=10000, width=6) entrada.grid(column=4, row=1, padx=5, sticky=(N, W)) entrada.delete(0) entrada.insert(END, self.serie.cantidadNumeros) ttk.Label(detalle, text='Título:').grid(column=0, row=2, sticky=(N, W)) entrada = ttk.Entry(detalle, text='Título', width=50) entrada.grid(column=0, row=3, padx=5, sticky=(N, W), columnspan=2) entrada.insert(END, self.comic.titulo) ttk.Label(detalle, text='Fecha:').grid(column=2, row=2, sticky=(N, W)) entrada = ttk.Entry(detalle, width=10) entrada.grid(column=2, row=3, padx=5, sticky=(N, W), columnspan=2) entrada.insert(END, self.comic.fechaTapa) ttk.Label(detalle, text='Arco Argumental:').grid(column=0, row=4, sticky=(N, W)) entradaArco = ttk.Entry(detalle, text='', width=50) entradaArco.grid(column=0, row=5, padx=5, sticky=(N, W), columnspan=2) ttk.Label(detalle, text='Número:').grid(column=2, row=4, sticky=(N, W)) entradaNumero = Spinbox(detalle, from_=0, to=10000, width=6) entradaNumero.grid(column=2, row=5, padx=5, sticky=(N, W)) ttk.Label(detalle, text='de:').grid(column=3, row=4, sticky=(N, W)) entradaDe = Spinbox(detalle, text='', from_=0, to=10000, width=6) entradaDe.grid(column=3, row=5, padx=5, sticky=(N, W)) if comic.tieneArcoAlterno(): entradaArco.insert(END, ArcosArgumentales().get(comic.seriesAlternasNumero[0][0]).nombre) entradaNumero.delete(0) entradaNumero.insert(END, comic.seriesAlternasNumero[0][1]) arco = ArcosArgumentales().get(comic.seriesAlternasNumero[0][0]) entradaDe.delete(0) entradaDe.insert(END, arco.getCantidadTitulos()) notebook.select(0) self.entries = {} self.variables = {} self.varaible = StringVar(self).trace(mode='w', callback=self.__Changed__) self.botonGuardar = ttk.Button(self, text='Guardar', command=self.guardar) self.botonGuardar.grid(column=0, sticky=(E)) self.changed = False
class SeriesLookupGui(Frame): def __init__(self, parent, serie, cnf={}, **kw): Frame.__init__(self, parent, cnf={}, **kw) self.columnconfigure(0, weight=1) self.serie = serie self.rowconfigure(1, weight=1) # panel busqueda opciones entrada y boton buscar self.panelBusqueda = ttk.Frame(self) self.panelBusqueda.grid(column=0, row=0, sticky=(E, W, N)) self.panelBusqueda.columnconfigure(1, weight=1) self.comboOpcionBusqueda = StringVar() self.opcionesBusqueda = ttk.Combobox( self.panelBusqueda, textvariable=self.comboOpcionBusqueda) self.comboOpcionBusqueda.trace(mode='w', callback=self.__ChangedComboboxFilter__) self.opcionesBusqueda['values'] = ('Buscar por Nombre', 'Buscar por Número', 'Buscar por Editorial', 'Buscar por Año') self.filtros = { 'nombre': [''], 'name': [], 'cantidadNumeros': [], 'AnioInicio': [] } self.opcionesBusqueda.grid(sticky=(W)) self.varaiblePatronBusqueda = StringVar() self.entryFiltro = ttk.Entry(self.panelBusqueda, textvariable=self.varaiblePatronBusqueda) self.varaiblePatronBusqueda.trace(mode='w', callback=self.__ChangedFilter__) self.entryFiltro.grid(column=1, row=0, sticky=(W, E)) ttk.Button(self.panelBusqueda, text='Buscar', command=self.buscarSerie).grid(sticky=(E), column=3, row=0) # self.opcionesBusqueda.current(1) # panel de grilla y previsualizacion primer cover de serie self.framePrincipal = LabelFrame(self) self.framePrincipal.grid(sticky=(E, W, S, N), column=0, row=1) self.framePrincipal.columnconfigure(0, weight=1) self.framePrincipal.rowconfigure(0, weight=1) self.coverSize = (240, 372) # self.frame.columnconfigure(1,weight=1) # self.frame.rowconfigure(0,weight=1) # lo necesitamos para agruparla con la scroll self.frameGrilla = Frame(self.framePrincipal) self.frameGrilla.grid(sticky=(N, W, E, S)) self.frameGrilla.rowconfigure(0, weight=1) self.frameGrilla.columnconfigure(0, weight=1) ##config grilla series self.grillaSeries = ttk.Treeview( self.frameGrilla, columns=('name', 'count_of_issues', 'description', 'Id', 'image', 'publisher', 'start_year'), displaycolumns=('Id', 'name', 'count_of_issues', 'publisher', 'start_year')) self.grillaSeries.grid(column=0, row=0, rowspan=1, sticky=(N, S, E, W)) scrollGrid = ttk.Scrollbar(self.frameGrilla, orient=VERTICAL, command=self.grillaSeries.yview) scrollGrid.grid(column=1, row=0, rowspan=1, sticky=(N, S)) self.grillaSeries.configure(yscrollcommand=scrollGrid.set) self.grillaSeries.heading('Id', text='Id') self.grillaSeries.heading('name', text='Nombre') self.grillaSeries.heading('count_of_issues', text='Numeros') self.grillaSeries.heading('publisher', text='Editorial') self.grillaSeries.heading('start_year', text='Año') self.grillaSeries.config(show='headings') # tree, headings self.grillaSeries.heading( 'start_year', command=lambda col='AnioInicio': self.sortby(col)) self.grillaSeries.heading( 'name', command=lambda col='nombre': self.sortby(col)) self.grillaSeries.heading( 'count_of_issues', command=lambda col='cantidadNumeros': self.sortby(col)) self.grillaSeries.heading('publisher', command=lambda col='name': self.sortby(col)) ''' no ordena bien con 70000 registros es lento es mas facil tirar una nueva consutla contra el SQL self.grillaSeries.heading('start_year', command=lambda col='start_year': self.sortby(self.grillaSeries, 'start_year', int(True))) self.grillaSeries.heading('name', command=lambda col='name': self.sortby(self.grillaSeries, 'name', int(True))) self.grillaSeries.heading('count_of_issues', command=lambda col='count_of_issues': self.sortby(self.grillaSeries, 'count_of_issues', int(True))) self.grillaSeries.heading('publisher', command=lambda col='publisher': self.sortby(self.grillaSeries, 'publisher', int(True))) ''' self.grillaSeries.bind( '<<TreeviewSelect>>', self.itemClicked) # the item clicked can be found via tree.focus() self.labelImagen = Label(self.frameGrilla) self.labelImagen.grid(column=3, row=0) # boton parte inferior formulario ttk.Button(self, text='seleccionar', command=self.seleccionarSerie).grid(column=0, row=2, sticky=(E)) self.desc = True self.opcionesBusqueda.current(0) self.entryFiltro.focus() self.cover = ImageTk.PhotoImage( Image.open('CoverGenerica.png').resize(self.coverSize)) self.labelImagen['image'] = self.cover def __ChangedFilter__( self, *args ): # recordar siempre que son 4 paramentros sino da errores raros print('__ChangedFilter__ current: ', str(self.opcionesBusqueda.current())) if (self.opcionesBusqueda.current() == 0): print('limpiando filtro nombre') del self.filtros['nombre'] cadena = self.varaiblePatronBusqueda.get() self.filtros['nombre'] = [cadena] print('filtro cargado: ' + str(self.filtros['nombre'])) if (self.opcionesBusqueda.current() == 1): del self.filtros['cantidadNumeros'] cadena = self.varaiblePatronBusqueda.get() print('cantidadNumeros: ' + str(self.filtros)) print(len(cadena)) if len(cadena) > 0: self.filtros['cantidadNumeros'] = [ self.varaiblePatronBusqueda.get() ] if (self.opcionesBusqueda.current() == 2): del self.filtros['name'] self.filtros['name'] = [self.varaiblePatronBusqueda.get()] if (self.opcionesBusqueda.current() == 3): del self.filtros['AnioInicio'] print('AnioInicio: ' + str(self.filtros)) cadena = self.varaiblePatronBusqueda.get() if len(cadena) > 0: self.filtros['AnioInicio'] = [ self.varaiblePatronBusqueda.get() ] def __ChangedComboboxFilter__(self, *args): lista = [] if (self.opcionesBusqueda.current() == 0): if ('nombre' in self.filtros): lista = self.filtros['nombre'] elif (self.opcionesBusqueda.current() == 1): if ('cantidadNumeros' in self.filtros): lista = self.filtros['cantidadNumeros'] elif (self.opcionesBusqueda.current() == 2): if ('name' in self.filtros): lista = self.filtros['name'] elif (self.opcionesBusqueda.current() == 3): if ('AnioInicio' in self.filtros): lista = self.filtros['AnioInicio'] self.entryFiltro.delete(0, END) cadena = '' if lista: print('lista de palabras: ' + str(lista)) for palabra in lista: print('palabra: ' + palabra) cadena += palabra + " " self.entryFiltro.insert(END, cadena[:-1]) def getSerie(self): print('retornando serie: ' + self.serie.nombre) return self.serie def itemClicked(self, event): if (self.grillaSeries.selection()): item = self.grillaSeries.item(self.grillaSeries.selection()) print(item['values'][3]) self.serie = Series().get(item['values'][3]) imagen = self.serie.getImageCover() print(self.labelImagen) self.cover = ImageTk.PhotoImage(imagen.resize(self.coverSize)) self.labelImagen['image'] = self.cover # self.labelImagen.config(image=self.cover) # Label(self.frameGrilla, image=self.cover).grid(column=3,row=0) def seleccionarSerie(self): print(self.serie.id) def sortby(self, col): print('sort: ' + str(self.opcionesBusqueda.current())) if col == 'nombre': self.opcionesBusqueda.current(0) elif col == 'cantidadNumeros': self.opcionesBusqueda.current(1) elif col == 'name': self.opcionesBusqueda.current(2) elif col == 'AnioInicio': print('antes de cambiar sort:') self.opcionesBusqueda.current(3) print('despues de cambiar sort: ' + str(self.opcionesBusqueda.current())) if (not self.desc): self.buscarSerie('order by ' + col + ' desc') else: self.buscarSerie('order by ' + col + ' asc') self.desc = not self.desc ''' data = [(tree.set(child, col), child) for child in tree.get_children('')] # reorder data data.sort(reverse=descending) for indx, item in enumerate(data): tree.move(item[1], '', indx) ''' def buscarSerie(self, orderBy=None): # print(self.filtros) primerfiltro = True filtro = '' filtrosNoVacios = {} listaValores = [] # al parecer el for acede a la estructura en forma paralela y no tengo forma de determinar el primero. por esto se hace lo siguiente # sacamos las listas filtros vacias y solo dejamos la que tienen valores despues obtenemos la lista en la pos 1 y despues concatenemos el resto for nombreLista in self.filtros.keys(): if len(self.filtros[nombreLista]) > 0: print('lista: ' + nombreLista + ' long: ' + str(len(self.filtros[nombreLista]))) filtrosNoVacios[nombreLista] = self.filtros[nombreLista] listaKeys = [x for x in filtrosNoVacios.keys()] print(filtrosNoVacios) if len(listaKeys) > 0: primeraLista = filtrosNoVacios[listaKeys[0]] print('Primera lista: ' + str(filtrosNoVacios[listaKeys[0]])) for valor in primeraLista: filtro += listaKeys[0] + ' like ? or ' listaValores.append(valor) print(listaKeys[1:]) for key in listaKeys[1:]: filtro = filtro[:-4] + ' and ' filtrolocal = '' print('lista: ' + str(filtrosNoVacios[key])) for valor in filtrosNoVacios[key]: filtrolocal += key + ' like ? or ' listaValores.append(valor) filtro = filtro + filtrolocal filtro = filtro[:-4] if (len(filtro) > 0): print(filtro) print(listaValores) series = Series().getList(listaValores, filtro, orderBy) else: series = Series().getList(listaValores, '', orderBy) for item in self.grillaSeries.get_children(): self.grillaSeries.delete(item) for serie in series: self.grillaSeries.insert( '', 0, '', text='', values=(serie.nombre, serie.cantidadNumeros, serie.descripcion, serie.id, serie.image_url, serie.publisherName, serie.AnioInicio))
def _sync_series(self): """Synchronize the Series ID property to reflect the current state of the Series Number property.""" from Series import Series s = Series(self.series_num) self.series_id = s.id