def update_authors_author_table(): # make a backup before deleting everything authors_backup = list(Author.objects.all()) try: Author.objects.all().delete() authors_temp = AuthorTemp.objects.all() authors = [Author( nicname=item.nicname, profile_url=item.profile_url, avatar=item.avatar, number_of_followers=item.number_of_followers, workshop_submissions=item.workshop_submissions, coop_maps=item.coop_maps ) for item in authors_temp] Author.objects.bulk_create(authors) UpdateDate.objects.update_or_create(model_name='Author', defaults={ 'model_name': 'Author', 'timestamp': datetime.utcnow() }) print('All the authors have been successfully updated!') except: # in case something goes wrong restore the Author model from backup objects = [Author( nicname=item.nicname, profile_url=item.profile_url, avatar=item.avatar, number_of_followers=item.number_of_followers, workshop_submissions=item.workshop_submissions, coop_maps=item.coop_maps ) for item in authors_backup] Author.objects.bulk_create(objects) print('All authors have been restored from backup!') purge_steamids()
def run(): author1 = Author(name="J. K. Rowling", birth_date="1965-07-31", author_pic="authors/2020/05/jkrowling.jpg", bio="Es una escritora, productora de cine y guionista británica, conocida por ser la autora de la serie de libros Harry Potter, que han superado los quinientos millones de ejemplares vendidos.") author2 = Author(name="Rick Riordan", birth_date='1964-06-05', author_pic="authors/2020/06/rriordan.jpg", bio="Richard Russell Riordan es un escritor estadounidense. Es más conocido por ser el autor de la saga Percy Jackson y los dioses del Olimpo.") author3 = Author(name="Suzanne Collins", birth_date='1962-08-10', author_pic="authors/2020/06/scollins.jpg", bio="Escritora estadounidense, sus revolucionarias novelas juveniles, Los Juegos del Hambre, En llamas y Sinsajo fueron superventas de The New York Times. Recibieron reconocimiento en todo el mundo.") publisher1 = Publisher(name="Bloomsbury", city="Londres", country="Reino Unido", about="Bloomsbury Publishing es una casa editorial independiente, asentada en Londres en el Reino Unido, conocida por sus novelas literarias. Fue nombrada \"editorial del año\" en 1999 y 2000.", website="www.bloomsbury.com", publisher_pic="publishers/2020/06/bblogo.png") publisher2 = Publisher(name="Salamandra", city="Barcelona", country="España", about="Ediciones Salamandra, también llamada simplemente Salamandra, es una editorial fundada en 1989 en Barcelona como filial española de la editorial argentina Emecé Editores.", website="www.megustaleer.com/editoriales/salamandra/SD/", publisher_pic="publishers/2020/06/sallogo.jpg") publisher3 = Publisher(name="Scholastic", city="Nueva York", country="Estados Unidos", about="Scholastic es una empresa editora de libros estadounidense conocida por publicar materiales educativos para escuelas, además de libros comerciales.", website="www.scholastic.com", publisher_pic="publishers/2020/06/schlogo.png") tag1 = Tag(title="Fantasy") tag2 = Tag(title="Mystery") tag3 = Tag(title="Novel") tag4 = Tag(title="Adventure") book1 = Book(title="Harry Potter y la Piedra Filosofal", author=author1, pub_date="1997-06-26", publisher=publisher1, description="Harry Potter crece en la casa de sus tíos, los Dursley, quienes le ocultan su verdadera historia familiar; al cumplir Harry once años de edad, empiezan a llegarle cartas de remitente desconocido, que van aumentando en número a medida que sus tíos no dejan que las abra. Las mismas traen la noticia de que el niño ha sido admitido en el Colegio Hogwarts de Magia y Hechicería, ya que, al igual que sus padres, tiene poderes mágicos. \\n\\nSe descubre entonces que los Potter no murieron en un accidente de coche como se le había dicho a Harry, sino que habían sido asesinados en la noche de Halloween por un hechicero tenebroso conocido como lord Voldemort, quien había aterrorizado a la comunidad mágica británica años atrás. Sin embargo, algo ocurrió esa noche: Voldemort consiguió matar al matrimonio Potter pero no pudo asesinar al bebé, perdió su cuerpo y le dejó al niño una cicatriz permanente en forma de rayo en su frente. \\n\\nRubeus Hagrid aparece para llevarse a Harry una noche, cuando los Dursley intentan impedir que parta rumbo al colegio. Más tarde, el hombre ayuda a Harry a comprar sus materiales escolares en el callejón Diagon y allí éste descubre que es famoso entre los magos por haber sobrevivido al intento de homicidio. Posteriormente, el muchacho toma el tren que lo lleva a Hogwarts y allí conoce a Ron Weasley, un chico pelirrojo hijo de magos, y a Hermione Granger, una jovencita de origen muggle con altas aspiraciones académicas. Los tres se hacen amigos y más tarde, durante su año escolar, se ven envueltos en una serie de episodios relacionados con un objeto escondido en las profundidades del edificio: la piedra filosofal, un artefacto con el poder de transmutar los metales en oro y producir el elixir de la vida eterna. Diferentes hechos les hacen suponer que uno de sus profesores, Severus Snape, desea conseguir la piedra para entregársela a Voldemort, con quien el docente estaría confabulado.", price="199.99", cover_pic="covers/2020/05/hpylpf.jpg", book_content="contents/hpylpf.pdf") book2 = Book(title="Harry Potter y la Cámara Secreta", author=author1, pub_date="1998-07-08", publisher=publisher1, description="Tras derrotar una vez más a lord Voldemort, su siniestro enemigo en Harry Potter y la piedra filosofal, Harry espera impaciente en casa de sus insoportables tíos el inicio del segundo curso del Colegio Hogwarts de Magia y hechicería. Sin embargo, la espera dura poco, pues un elfo aparece en su habitación y le advierte que una amenaza mortal se cierne sobre la escuela. Así pues, Harry no se lo piensa dos veces y, acompañado de Ron, su mejor amigo, se dirige a Hogwarts en un coche volador. Pero ¿puede un aprendiz de mago defender la escuela de los malvados que pretenden destruirla? Sin saber que alguien ha abierto la Cámara de los Secretos, dejando escapar una serie de monstruos peligrosos, Harry y sus amigos Ron y Hermione tendrán que enfrentarse con arañas gigantes, serpientes encantadas, fantasmas enfurecidos y, sobre todo, con la mismísima reencarnación de su más temible adversario.", price="199.99", cover_pic="covers/2020/05/hpylca.jpg", book_content="contents/hpylca.pdf") book3 = Book(title="Harry Potter y el Prisionero de Azkaban", author=author1, pub_date="1999-07-08", publisher=publisher1, description="Por la cicatriz que lleva en la frente, sabemos que Harry Potter no es un niño como los demás, sino el héroe que venció a lord Voldemort, el mago más temible y maligno de todos los tiempos y culpable de la muerte de los padres de Harry. Desde entonces, Harry no tiene más remedio que vivir con sus pesados tíos y su insoportable primo Dudley, todos ellos muggles, o sea, personas no magas, que desprecian a su sobrino debido a sus poderes. Igual que en las dos primeras partes de la serie —La piedra filosofal y La cámara secreta— Harry aguarda con impaciencia el inicio del tercer curso en el Colegio Hogwarts de Magia y Hechicería. Tras haber cumplido los trece años, solo y lejos de sus amigos de Hogwarts, Harry se pelea con su bigotuda tía Marge, a la que convierte en globo, y debe huir en un autobús mágico. Mientras tanto, de la prisión de Azkaban se ha escapado un terrible villano, Sirius Black, un asesino en serie con poderes mágicos que fue cómplice de lord Voldemort y que parece dispuesto a eliminar a Harry del mapa. Y por si esto fuera poco, Harry deberá enfrentarse también a unos terribles monstruos, los dementores, seres abominables capaces de robarles la felicidad a los magos y de borrar todo recuerdo hermoso de aquellos que osan mirarlos. Lo que ninguno de estos malvados personajes sabe es que Harry, con la ayuda de sus fieles amigos Ron y Hermione, es capaz de todo y mucho más.", price="199.99", cover_pic="covers/2020/05/hpyepda.jpg", book_content="contents/hpyepda.pdf") book4 = Book(title="Harry Potter y el Cáliz de Fuego", author=author1, pub_date='2000-07-08', publisher=publisher1, description="Tras otro abominable verano con los Dursley, Harry se dispone a iniciar el cuarto curso en Hogwarts, la famosa escuela de magia y hechicería. A sus catorce años, a Harry le gustaría ser un joven mago como los demás y dedicarse a aprender nuevos sortilegios, encontrarse con sus amigos Ron y Hermione y asistir con ellos a los Mundiales de quidditch. Sin embargo, al llegar al colegio le espera una gran sorpresa que lo obligará a enfrentarse a los desafíos más temibles de toda su vida. Si logra superarlos, habrá demostrado que ya no es un niño y que está preparado para vivir las nuevas y emocionantes experiencias que el futuro le depara.", price="199.99", cover_pic="covers/2020/06/hpyecdf.jpg", book_content="contents/hpyecdf.pdf") book5 = Book(title="Percy Jackson y el Ladrón del Rayo", author=author2, pub_date='2005-06-28', publisher=publisher2, description="¿Qué pasaría si un día descubrieras que, en realidad, eres hijo de un dios griego que debe cumplir una misión secreta? Pues eso es lo que le sucede a Percy Jackson, que a partir de ese momento se dispone a vivir los acontecimientos más emocionantes de su vida. Expulsado de seis colegios, Percy padece dislexia y dificultades para concentrarse, o al menos ésa es la versión oficial. Objeto de burlas por inventarse historias fantásticas, ni siquiera él mismo acaba de creérselas hasta el día que los dioses del Olimpo le revelan la verdad: Percy es nada menos que un semidiós, es decir, el hijo de un dios y una mortal. Y como tal ha de descubrir quién ha robado el rayo de Zeus y así evitar que estalle una guerra entre los dioses. Para cumplir la misión contará con la ayuda de sus amigos Grover, un joven sátiro, y Annabeth, hija de Atenea. El ladrón del rayo da comienzo a la apasionante serie Percy Jackson y los Dioses del Olimpo, un mundo secreto que los antiguos dioses griegos han recreado a nuestro alrededor en pleno siglo XXI.", price="159.99", cover_pic="covers/2020/06/pjyeldr.jpg", book_content="contents/pjyeldr.pdf") book6 = Book(title="Percy Jackson y el Mar de los Monstruos", author=author2, pub_date='2006-04-01', publisher=publisher2, description="Desde que sabe que es hijo de un dios del Olimpo, Percy Jackson espera que el destino le depare continuas aventuras. Y sus expectativas se cumplen con creces. Aunque el nuevo curso en la Escuela Meriwether transcurre con inusual nor- malidad, un simple partido de balón prisionero acaba en batalla campal contra una banda de feroces gigantes. A partir de ahí los acontecimientos se precipitan: el perímetro mágico que protege el Campamento Mestizo es destruido por un misterioso enemigo y la única seguridad con que contaban los semidioses desaparece. Así, para impedir este daño irreparable, Percy y sus amigos inician la travesía del temible Mar de los Monstruos en busca de lo único que puede salvar el campamento: el Vellocino de Oro.", price="159.99", cover_pic="covers/2020/06/pjyemdlm.jpg", book_content="contents/pjyemdlm.pdf") book7 = Book(title="Percy Jackson y la Maldición del Titán", author=author2, pub_date="2007-04-15", publisher=publisher2, description="Ante la llamada de socorro de su amigo el sátiro Grover, Percy acude inmediatamente en su auxilio. Y aunque va acompañado de Annabeth y Thalia, las dos semidiosas que son sus aliadas, ninguno imagina la sorpresa que los aguarda: una terrible mantícora pretende secuestrarlos y llevarlos ante el general enviado por Cronos, el diabólico señor de los titanes. Sin embargo, gracias a la ayuda de las cazadoras de Artemisa, Percy y sus aliadas logran escapar y volver al campamento mestizo. Una vez allí, emprenderán la búsqueda del monstruo que puede provocar la destrucción del Olimpo, a pesar de que, según la profecía del Oráculo, sólo uno de ellos logrará resistir la maldición del titán.", price="159.99", cover_pic="covers/2020/06/pjylmdt.jpg", book_content="contents/pjylmdt.pdf") book8 = Book(title="The Hunger Games", author=author3, pub_date="2008-09-14", publisher=publisher3, description="Ganar significa fama y fortuna. Perder significa muerte segura. Los juegos del hambre han comenzado. . . . En las ruinas de un lugar una vez conocido como América del Norte se encuentra la nación de Panem, un brillante Capitolio rodeado de doce distritos periféricos. El Capitolio es duro y cruel y mantiene a los distritos en línea al obligarlos a enviar a un niño y una niña entre las edades de doce y dieciocho años a participar en los Juegos Anuales del Hambre, una pelea a muerte en la televisión en vivo.Katniss Everdeen, de 16 años, lo considera una sentencia de muerte cuando se adelanta para ocupar el lugar de su hermana en los Juegos. Pero Katniss ha estado cerca de la muerte antes, y la supervivencia, para ella, es una segunda naturaleza. Sin querer realmente, se convierte en una contendiente. Pero si quiere ganar, tendrá que comenzar a tomar decisiones que sopesen la supervivencia contra la humanidad y la vida contra el amor.", price="149.99", cover_pic="covers/2020/06/thg.jpg", book_content="contents/thg.pdf") book9 = Book(title="Catching Fire", author=author3, pub_date="2009-09-01", publisher=publisher3, description="Suzanne Collins continúa la increíble historia de Katniss Everdeen en la fenomenal trilogía de los Juegos del Hambre. Contra viento y marea, Katniss Everdeen ha ganado los Juegos del Hambre anuales con su colega tributo del distrito, Peeta Mellark. Pero fue una victoria ganada por el desafío del Capitolio y sus duras reglas. Katniss y Peeta deberían estar felices. Después de todo, acaban de ganar para ellos y sus familias una vida segura y abundante. Pero hay rumores de rebelión entre los sujetos, y Katniss y Peeta, para su horror, son los rostros de esa rebelión. El capitolio está enojado. El Capitolio quiere venganza.", price="149.99", cover_pic="covers/2020/06/thgcf.jpg", book_content="contents/thgcf.pdf") book10 = Book(title="Mockingjay", author=author3, pub_date="2010-08-24", publisher=publisher3, description="Katniss Everdeen, niña en llamas, ha sobrevivido, a pesar de que su casa ha sido destruida. Hay rebeldes. Hay nuevos líderes. Se está desarrollando una revolución. El Distrito 13 salió de las sombras y está planeando derrocar al Capitolio. Aunque ha sido parte de la revolución durante mucho tiempo, Katniss no lo ha sabido. Ahora parece que todos han intervenido en los planes cuidadosamente elaborados menos ella. El éxito de la rebelión depende de la voluntad de Katniss de ser un peón, de aceptar la responsabilidad de innumerables vidas y de cambiar el curso del futuro de Panem. Para hacer esto, debe dejar de lado sus sentimientos de ira y desconfianza. Ella debe convertirse en el Sinsajo de los rebeldes, sin importar el costo.", price="149.99", cover_pic="covers/2020/06/thgmj.jpg", book_content="contents/thgmj.pdf") author1.save() author2.save() author3.save() publisher1.save() publisher2.save() publisher3.save() tag1.save() tag2.save() tag3.save() tag4.save() book1.save() book2.save() book3.save() book4.save() book5.save() book6.save() book7.save() book8.save() book9.save() book10.save() book1.tags.set([tag1]) book2.tags.set([tag1, tag2]) book3.tags.set([tag1]) book4.tags.set([tag1, tag2]) book5.tags.set([tag1, tag4]) book6.tags.set([tag1, tag4]) book7.tags.set([tag1, tag4]) book8.tags.set([tag3]) book9.tags.set([tag3]) book10.tags.set([tag3])
def handle(self, *args, **options): if options['authors'][0]: fpath = options['authors'][0] if not os.path.exists(fpath): raise CommandError("file doesn't exist") with open(fpath, 'r') as fp: line = fp.readline() if line.strip() == "name": line = fp.readline() else: raise CommandError("Wrong format file") cont = 0 contp = 0 authors_list = [] self.stdout.write("Import started. This can take a while...") # Read every line in the file and bulk create on every 10000 registers while line: author = Author(name=line.strip()) authors_list.append(author) cont += 1 contp += 1 if contp == 10000: contp = 0 Author.objects.bulk_create(authors_list) authors_list = [] self.stdout.write("Imported " + str(cont) + " authors. Still running....") line = fp.readline() if authors_list: Author.objects.bulk_create(authors_list) self.stdout.write("Imported " + str(cont) + " authors from " + str(fpath)) else: self.stdout.write("Fail")
def mutate_and_get_payload(cls, root, info, **input): # проверяет токен token = input.get('token', None) if token != '******************': return "Invalid token" author = Author( name=input.get('name'), description=input.get('description'), photo=input.get('photo'), rating=input.get('rating', 0), show_counter=input.get('show_counter', 0), date_create=input.get('date_create', 0), book_count=input.get('book_count', 0), nationality_id=input.get('nationality', 0), ) if input.get('pk'): author.pk = input.get('pk') if input.get('birthday'): author.birthday = input.get('birthday') if input.get('death'): author.death = input.get('death') if input.get('name_original'): author.name_original = input.get('name_original') author.save() return AddAuthor(author=author)
def save(self, request): adapter = get_adapter() user = Author() self.cleaned_data = self.get_cleaned_data() adapter.save_user(request, user, self) self.custom_signup(request, user) setup_user_email(request, user, []) return user
def mutate(self, info, first_name, last_name, bio=None): author = Author(first_name=first_name, last_name=last_name, bio=bio) author.save() return CreateAuthor(id=author.id, first_name=author.first_name, last_name=author.last_name, bio=author.bio)
def test_get_book_page(self): author = Author(name="Test author name", photo="test.jpg") author.save() book = Books(title="Test for book", price=9.99, author_id=author.id, photo_main="test.jpg") book.save() response = self.client.get("/books/book/1") self.assertEqual(response.status_code, 200)
def test_create_author(self): """It is possible to create an author inserting it into the db""" self.assertEqual(Author.objects.count(), 0) author_name = "John Doe" author = Author(name=author_name) author.save() self.assertEqual(Author.objects.count(), 1) self.assertEqual(Author.objects.first().name, author_name)
def test_get_book_page(self): """ Tests that the book page view renders the book template """ author = Author(name="Test Author Name", photo="test.jpg") author.save() book = Books(title="Test Book Title", price=10.00, author_id=author.id, book_image="test.jpg") book.save() response = self.client.get("/books/book/1") self.assertEqual(response.status_code, 200)
def test_duplicated_author_error(self): """Trying to create authors with the same name raises an IntegrityError""" author_name = "John Doe" expected_message = (f"duplicate key value violates unique constraint " f'"authors_author_name_key"\nDETAIL: Key (name)=' f"({author_name}) already exists.\n") Author.objects.create(name=author_name) self.assertEqual(Author.objects.count(), 1) author = Author(name=author_name) with self.assertRaises(IntegrityError) as raised: with transaction.atomic(): author.save() self.assertEqual(str(raised.exception), expected_message) self.assertEqual(Author.objects.count(), 1)
def create_author(request): form_author = AuthorForm() context = {'form_author': form_author} if request.method == 'POST': form_author = AuthorForm(request.POST) if form_author.is_valid(): name = request.POST.get('name', ) surname = request.POST.get('surname', ) birthYear = request.POST.get('birthYear', ) facePhoto = request.POST.get('facePhoto', ) author_obj = Author(name=name, surname=surname, birthYear=birthYear, facePhoto=facePhoto) author_obj.save() all_authors = Author.objects.all() context = { 'all_authors': all_authors, } return render(request, 'authors/index.html', context) return render(request, 'authors/create_author.html', context)
def create_author(self, data): """ Functionality: Params: Response: """ try: author = Author.objects.filter( profile_id=data["profile"])[:1].get() except: author = None try: if author is None: profile = Profile.objects.get(pk=data["profile"]) setattr(profile, "is_authorized", True) profile.save() author = Author(profile=profile, anonym=data["anonym"]) author.save() serializer = AuthorSerializer(author) return serializer.data else: return {"message": "Already Exists"} except: return {"error_code": 404}
def handle(self, *args, **options): filename = options['file'] if not filename: raise CommandError('Not filename') errors = False with open(filename, 'r', newline='', encoding='utf-8') as file: reader = csv.DictReader(file, delimiter=';') try: authors = [Author(name=row['name']) for row in reader] except KeyError: errors = True if errors: self.stdout.write(self.style.ERROR('Please, insert "name" column in CSV file')) return created = Author.objects.bulk_create(authors, ignore_conflicts=True) count = len(created) if not count: self.stdout.write(self.style.WARNING('Author not inserted in the base, check registers')) self.stdout.write( self.style.SUCCESS( f'Imported CSV file {count} ' f'author{"s" if count != 1 else ""}. ' ) )
def add_video_task(id=None, active=False, category_ids=None, description=None, file_url=None, frame_time=3.0, rating_avg=None, title=None, rating_count=0, slug=None, tags=None, user_id=None, add_date=None, hits=0, author_names=None, highlighted=False, imported=False, id_se=None, process=False): from .models import Video from categories.models import Category from cms_local.models import SEImportedVideo files_to_delete = [] video = Video() if id: video.id = id if Video.objects.filter(id=id).exists(): raise VideoAlreadyExists('film o id %d juz istnieje' % id) video.active = active video.description = description video.frame_time = frame_time if slug is None: from murator_common.util.slughifi import slughifi slug = slughifi(title) video.slug = slug video.title = title video.tags = tags video.user_id = user_id video.hits = hits video.highlighted = highlighted video.imported = imported video.add_date = add_date video.pub_date = add_date # pobieram plik do tempa tmpdir = os.path.join(settings.VIDEO_TMP, hashlib.md5(file_url).hexdigest()) if not os.path.exists(tmpdir): os.makedirs(tmpdir) from urllib import urlopen response = urlopen(file_url) video_file_content = response.read() tmp_src_path = os.path.join(tmpdir, os.path.basename(file_url)) tmp_src = open(tmp_src_path, 'wb') tmp_src.write(video_file_content) tmp_src.close() video.file.save(os.path.basename(tmp_src_path), ContentFile(video_file_content)) video_filename = tmp_src_path files_to_delete.append(video_filename) video.save() if id_se: seiv = SEImportedVideo(id_se=id_se, video=video) seiv.save() for category_id in category_ids: try: category = Category.objects.get(id=category_id) except Category.DoesNotExist: # TODO: moze logowac? pass else: video.categories.add(category) for author_name in author_names: from authors.models import Author try: author = Author.objects.get(name=author_name) except Author.DoesNotExist: author = Author(name=author_name, real_name=author_name) author.save() finally: video.authors.add(author) for i in range(rating_count): video.rating.add(score=rating_avg, user=None, ip_address='127.0.0.1') video.save() if process: # TODO: przekopiowac pare rzeczy z process_video_task # pobieram info o pliku codec, width, height, duration = retrieve_info(video_filename) video.codec = codec video.width = width video.height = height video.aspect_ratio = video._calculate_ratio() # generowanie screena frame_filename = save_frame(video_filename, video) files_to_delete.append(frame_filename) # zapisanie całości zmian video.save() # generowanie formatów video formats = (settings.DEFAULT_VIDEO_FORMAT, ) format_filenames = save_formats(formats, video_filename, video) files_to_delete += format_filenames # sprzątnięcie zbędnych plików w tempie clean_files(*files_to_delete)
def test_author_of_month_defaults_to_False(self): author = Author(name="Test author name") author.save() self.assertEqual(author.name, "Test author name") self.assertFalse(author.is_author_of_month)
def test_can_create_an_author_with_a_name_and_status(self): author = Author(name="Test author name", is_author_of_month=True) author.save() self.assertEqual(author.name, "Test author name") self.assertTrue(author.is_author_of_month)
def import_from_litres(hour=23, minutes=59): image_template = 'https://partnersdnld.litres.ru/static/bookimages/{0}/{1}/{2}/{3}.bin.dir/{3}.cover.{4}' d = datetime.date.today() api = LitresApi(secret_key='D7psdo2s*Xjsoq3WdsoSWWvoo', partner_id='YABK') lazy_books = api.get_fresh_book( start_date=datetime.datetime(d.year, d.month, d.day - 1, 0, 0), end_date=datetime.datetime(d.year, d.month, d.day - 1, hour, minutes)) for lazy_book in lazy_books: if lazy_book.get('@lang') == 'ru': litres_id = lazy_book.get('@id') litres_file_id = lazy_book.get('@file_id') litres_book = lazy_book.get('title-info') litres_authors = litres_book.get('author') litres_genres = lazy_book.get('genres') litres_series = lazy_book.get('sequences') title = litres_book.get('book-title') description = litres_book.get('annotation') age = lazy_book.get('@adult') try: publish_info = lazy_book.get('publish-info') if publish_info: year = publish_info.get('year', 0) isbn = publish_info.get('isbn', '').replace('-', '') else: date = litres_book.get('date', 0) if type(date) is str: year = date elif type(date) is list: if date.get('#text'): year = date.get('#text', 0) if lazy_book.get('@isbn'): isbn = lazy_book.get('@isbn', '').replace('-', '') else: isbn = lazy_book.get('@litres_isbn', '').replace('-', '') except Exception as e: print('Exception {}'.format(e)) print(json.dumps(lazy_book, indent=4, ensure_ascii=False)) ext = lazy_book.get('@cover') rating = decimal.Decimal(lazy_book.get('@rating', 0)) # Импорт автора libs_authors = [] for litres_author in litres_authors: try: author = Author.objects.get( litres_id=litres_author.get('id')) libs_authors.append(author.id) except Author.DoesNotExist: fi = "{} {}".format(litres_author.get('last-name'), litres_author.get('first-name')) fi = fi.replace('None', '').strip() authors = Author.objects.filter(name__icontains=fi) if len(authors) == 1: author = authors[0] libs_authors.append(author.id) author.litres_id = litres_author.get('id') author.save(update_fields=['litres_id']) print("Обновил litres_id для автора {} {}".format( author.id, author.name)) elif len(authors) > 1: print("Множество совпадений авторов {} для книги {}". format(litres_authors, litres_book)) else: fi = "{} {}".format(litres_author.get('first-name'), litres_author.get('last-name')) fi = fi.replace('None', '').strip() authors = Author.objects.filter(name__icontains=fi) if len(authors) == 1: author = authors[0] libs_authors.append(author.id) author.litres_id = litres_author.get('id') author.save(update_fields=['litres_id']) print("Обновил litres_id для автора {} {}".format( author.id, author.name)) elif len(authors) > 1: print( "Множество совпадений авторов {} для книги {}". format(litres_authors, litres_book)) else: # Добавляет нового автора fi = "{} {}".format( litres_author.get('last-name'), litres_author.get('first-name')) fio = "{} {} {}".format( litres_author.get('last-name', ''), litres_author.get('first-name', ''), litres_author.get('middle-name', '')) author = Author( name=fi.replace('None', '').strip(), litres_name=fio.replace('None', '').strip(), ) author.save() libs_authors.append(author.id) # Опрееление жанра libs_genres = [] if litres_genres: litres_genres = litres_genres['genre'] for litres_genre in litres_genres: genres_new = GenreNew.objects.filter( genre_litres__icontains=litres_genre['@id']) for genre_new in genres_new: libs_genres.append(genre_new.id) if not len(genres_new): print("Жанр {} {} не найден".format( litres_genre['@title'], litres_genre['@id'])) # Если есть серия libs_series = None if litres_series: litres_series = litres_series.get('sequence')[0] try: # Проверяет по id libs_series = Series.objects.get( litres_id=litres_series['@uuid']) except Series.DoesNotExist: try: # проверяет по названию libs_series = Series.objects.get( title=litres_series['@name']) libs_series.litres_id = litres_series['@uuid'] libs_series.save(update_fields=['litres_id']) print("Обновил litres_id для серии {} {}".format( libs_series.id, libs_series.title)) except Series.MultipleObjectsReturned: print("Задвоилась серия {} {}".format( libs_series.id, libs_series.title)) except Series.DoesNotExist: # Добавляет новую серию libs_series = Series(title=litres_series['@name'], litres_id=litres_series['@uuid']) libs_series.save() # Ипорт книги try: book = Book.objects.get(litres_id=litres_id) except Book.MultipleObjectsReturned: print("Затроило книги litres_id {} isbn {}".format( litres_id, isbn)) except Book.DoesNotExist: # Проверяет по isbn try: if len(isbn): book = Book.objects.get(isbn=isbn) book.litres_id = litres_id book.save(update_fields=['litres_id']) print("Обновил litres_id для книги {} {}".format( book.id, book.title)) else: print("Пустой isbn litres_id {} isbn {}".format( litres_id, isbn)) except Book.MultipleObjectsReturned: print("Затроило книги litres_id {} isbn {}".format( litres_id, isbn)) except Book.DoesNotExist: # Проверяет совпадение по назанию if title and litres_author.get('last-name'): book = Book.objects.filter( title__icontains=title, author__name__icontains=litres_author.get( 'last-name')) if len(book) == 1: b = book[0] b.litres_id = litres_id b.isbn = isbn b.save(update_fields=['litres_id', 'isbn']) print("Обновил litres_id и isbn для книги {} {}". format(b.id, b.title)) elif len(book) > 1: print("Множество совпадений c книгой {}".format( litres_book)) else: litres_file_id_str = "{0:08d}".format( int(litres_file_id)) xx = litres_file_id_str[0:2] yy = litres_file_id_str[2:4] zz = litres_file_id_str[4:6] image = image_template.format( xx, yy, zz, litres_file_id, ext) if rating >= 4: rating = 4 book = Book(title=title, description=description, age=age, year=year, isbn=isbn, litres_id=litres_id, image=image, rating=rating) if decimal.Decimal(rating) > 0: book.rating_partner_votes = 1 if libs_series: book.series = libs_series try: book.save() except decimal.InvalidOperation: book.rating = 0 book.save() book.genre_new.set(libs_genres) book.author.set(libs_authors)
def setUp(self): """ Create a user object to be used by the tests """ time_mock = datetime.datetime(2017, 4, 10, 12, 00, tzinfo=pytz.utc) with mock.patch('django.utils.timezone.now') as mock_time: mock_time.return_value = time_mock self.user = CustomUser(id=111, email='*****@*****.**', password='******', first_name='fname', middle_name='mname', last_name='lname') self.user.save() self.user_free = CustomUser(id=222, email='*****@*****.**', password='******', first_name='2fname', middle_name='2mname', last_name='2lname') self.user_free.save() self.author1 = Author(id=101, name="author1", surname="s1", patronymic="p1") self.author1.save() self.author2 = Author(id=102, name="author2", surname="s2", patronymic="p2") self.author2.save() self.book1 = Book(id=101, name="book1", description="description1", count=1) self.book1.save() self.book1.authors.add(self.author1) self.book1.save() self.book2 = Book(id=102, name="book2", description="description2") self.book2.save() self.book2.authors.add(self.author2) self.book2.save() self.book3 = Book(id=103, name="book3", description="description3") self.book3.save() self.book3.authors.add(self.author1) self.book3.authors.add(self.author2) self.book3.save() self.order1 = Order(id=101, user=self.user, book=self.book1, plated_end_at=TEST_DATE) self.order1.save() self.order2 = Order(id=102, user=self.user, book=self.book2, plated_end_at=TEST_DATE) self.order2.save() self.order3 = Order(id=103, user=self.user, book=self.book3, end_at=TEST_DATE_END, plated_end_at=TEST_DATE) self.order3.save()
def test_cannot_save_empty_author(self): author = Author() with self.assertRaises(ValidationError): author.save() author.full_clean()