def _info(args: Namespace, file: TextIO = sys.stdout): edition = Edition.get(args.obj) paper = Paper.get(args.obj) issue = Issue.get(args.obj) if edition is None and paper is None and issue is None: return elif edition is not None and paper is None and issue is None: edition.print(file) elif edition is None and paper is not None and issue is None: paper.print(file) elif edition is None and paper is None and issue is not None: issue.print(file) else: stdout.write(["More than one found."], after="=")
def setUp(self): self.paper, created = Paper.from_dict({"title": "Really cool stuff"}) self.assertTrue(created) self.assertIsNotNone(self.paper.id) magazine, created = Magazine.from_dict({"name": "Example"}) self.assertTrue(created) self.assertIsNotNone(magazine.pk) self.issue, created = Issue.from_dict({"issue": "1/2021"}, magazine) self.assertTrue(created) self.assertIsNotNone(self.issue.pk) book, created = Book.from_dict({"title": "Example"}) self.assertTrue(created) self.assertIsNotNone(book.pk) self.edition, created = Edition.from_dict( {"publishing_date": "2021-02-01"}, book) self.assertTrue(created) self.assertIsNotNone(self.edition.pk)
def test_search(self): for obj in [self.edition, self.issue, self.paper]: read, created = Read.from_dict({"started": "2021-01-01"}, obj) self.assertTrue(created) self.assertIsNotNone(read.pk) read, created = Read.from_dict( { "date": "2021-01-10", "finished": "2021-04-15" }, obj) self.assertTrue(created) self.assertIsNotNone(read.pk) read, created = Read.from_dict({"finished": "2021-03-18"}, obj) self.assertTrue(created) self.assertIsNotNone(read.pk) if type(obj) == Edition: edition, created = Edition.from_dict({}, obj.book) self.assertTrue(created) self.assertIsNotNone(edition.id) read, created = Read.from_dict( { "date": "2021-01-10", "finished": "2021-01-31" }, edition) self.assertTrue(created) self.assertIsNotNone(read.pk) self.assertEquals(4, Read.objects.all().count()) self.assertEquals(4, Read.search("example").count()) self.assertEquals(1, Read.search("4", editions=edition).count()) elif type(obj) == Issue: issue, created = Issue.from_dict({"issue": "2/2021"}, obj.magazine) self.assertTrue(created) self.assertIsNotNone(issue.id) read, created = Read.from_dict( { "date": "2021-01-10", "finished": "2021-01-31" }, issue) self.assertTrue(created) self.assertIsNotNone(read.pk) self.assertEquals(8, Read.objects.all().count()) self.assertEquals(8, Read.search("example").count()) self.assertEquals(1, Read.search("8", issues=issue).count()) elif type(obj) == Paper: paper, created = Paper.from_dict({"title": "Old stuff"}) self.assertTrue(created) self.assertIsNotNone(paper.id) read, created = Read.from_dict( { "date": "2021-01-10", "finished": "2021-01-31" }, paper) self.assertTrue(created) self.assertIsNotNone(read.pk) self.assertEquals(12, Read.objects.all().count()) self.assertEquals(3, Read.search("cool").count()) self.assertEquals(1, Read.search("12", papers=paper).count())
def test_get(self): for obj in [self.edition, self.issue, self.paper]: read, created = Read.from_dict({"finished": "2021-01-01"}, obj) self.assertTrue(created) self.assertIsNotNone(read.pk) if type(obj) == Edition: read2 = Read.get(obj.book.title) elif type(obj) == Issue: read2 = Read.get(f"{obj.magazine.name} {obj.issue}") elif type(obj) == Paper: read2 = Read.get(obj.title) self.assertIsNotNone(read2) self.assertEquals(read, read2) read2 = read.get(str(read.pk)) self.assertIsNotNone(read2) self.assertEquals(read, read2) if type(obj) == Edition: edition, created = Edition.from_dict({"title": "Old stuff"}, obj.book) self.assertTrue(created) self.assertIsNotNone(edition.id) read, created = Read.from_dict( { "started": "2021-01-10", "finished": "2021-01-31" }, edition) self.assertTrue(created) self.assertIsNotNone(read.pk) read2 = read.get(str(read.pk), editions=edition) self.assertIsNotNone(read2) self.assertEquals(read, read2) elif type(obj) == Issue: issue, created = Issue.from_dict({"issue": "2/2021"}, obj.magazine) self.assertTrue(created) self.assertIsNotNone(issue.id) read, created = Read.from_dict( { "started": "2021-01-10", "finished": "2021-01-31" }, issue) self.assertTrue(created) self.assertIsNotNone(read.pk) read2 = read.get(str(read.pk), issues=issue) self.assertIsNotNone(read2) self.assertEquals(read, read2) elif type(obj) == Paper: paper, created = Paper.from_dict({"title": "Old stuff"}) self.assertTrue(created) self.assertIsNotNone(paper.id) read, created = Read.from_dict( { "started": "2021-01-10", "finished": "2021-01-31" }, paper) self.assertTrue(created) self.assertIsNotNone(read.pk) read2 = read.get(str(read.pk), papers=paper) self.assertIsNotNone(read2) self.assertEquals(read, read2)
def test_search(self): for obj in [self.edition, self.issue, self.paper]: acquisition, created = Acquisition.from_dict( {"date": "2021-01-01"}, obj) self.assertTrue(created) self.assertIsNotNone(acquisition.pk) acquisition, created = Acquisition.from_dict( { "date": "2021-01-10", "price": 10.99 }, obj) self.assertTrue(created) self.assertIsNotNone(acquisition.pk) acquisition, created = Acquisition.from_dict({"price": 1.99}, obj) self.assertTrue(created) self.assertIsNotNone(acquisition.pk) if type(obj) == Edition: edition, created = Edition.from_dict({}, obj.book) self.assertTrue(created) self.assertIsNotNone(edition.id) acquisition, created = Acquisition.from_dict( { "date": "2021-01-10", "price": 1.99 }, edition) self.assertTrue(created) self.assertIsNotNone(acquisition.pk) self.assertEquals(4, Acquisition.objects.all().count()) self.assertEquals(4, Acquisition.search("example").count()) self.assertEquals( 1, Acquisition.search("4", editions=edition).count()) elif type(obj) == Issue: issue, created = Issue.from_dict({"issue": "2/2021"}, obj.magazine) self.assertTrue(created) self.assertIsNotNone(issue.id) acquisition, created = Acquisition.from_dict( { "date": "2021-01-10", "price": 1.99 }, issue) self.assertTrue(created) self.assertIsNotNone(acquisition.pk) self.assertEquals(8, Acquisition.objects.all().count()) self.assertEquals(8, Acquisition.search("example").count()) self.assertEquals( 1, Acquisition.search("8", issues=issue).count()) elif type(obj) == Paper: paper, created = Paper.from_dict({"title": "Old stuff"}) self.assertTrue(created) self.assertIsNotNone(paper.id) acquisition, created = Acquisition.from_dict( { "date": "2021-01-10", "price": 1.99 }, paper) self.assertTrue(created) self.assertIsNotNone(acquisition.pk) self.assertEquals(12, Acquisition.objects.all().count()) self.assertEquals(3, Acquisition.search("cool").count()) self.assertEquals( 1, Acquisition.search("12", papers=paper).count())
def test_get(self): for obj in [self.edition, self.issue, self.paper]: acquisition, created = Acquisition.from_dict( {"date": "2021-01-01"}, obj) self.assertTrue(created) self.assertIsNotNone(acquisition.pk) if type(obj) == Edition: acquisition2 = Acquisition.get(obj.book.title) elif type(obj) == Issue: acquisition2 = Acquisition.get( f"{obj.magazine.name} {obj.issue}") elif type(obj) == Paper: acquisition2 = Acquisition.get(obj.title) self.assertIsNotNone(acquisition2) self.assertEquals(acquisition, acquisition2) acquisition2 = Acquisition.get(str(acquisition.pk)) self.assertIsNotNone(acquisition2) self.assertEquals(acquisition, acquisition2) if type(obj) == Edition: edition, created = Edition.from_dict({"title": "Old stuff"}, obj.book) self.assertTrue(created) self.assertIsNotNone(edition.id) acquisition, created = Acquisition.from_dict( { "date": "2021-01-10", "price": 1.99 }, edition) self.assertTrue(created) self.assertIsNotNone(acquisition.pk) acquisition2 = Acquisition.get(str(acquisition.pk), editions=edition) self.assertIsNotNone(acquisition2) self.assertEquals(acquisition, acquisition2) elif type(obj) == Issue: issue, created = Issue.from_dict({"issue": "2/2021"}, obj.magazine) self.assertTrue(created) self.assertIsNotNone(issue.id) acquisition, created = Acquisition.from_dict( { "date": "2021-01-10", "price": 1.99 }, issue) self.assertTrue(created) self.assertIsNotNone(acquisition.pk) acquisition2 = Acquisition.get(str(acquisition.pk), issues=issue) self.assertIsNotNone(acquisition2) self.assertEquals(acquisition, acquisition2) elif type(obj) == Paper: paper, created = Paper.from_dict({"title": "Old stuff"}) self.assertTrue(created) self.assertIsNotNone(paper.id) acquisition, created = Acquisition.from_dict( { "date": "2021-01-10", "price": 1.99 }, paper) self.assertTrue(created) self.assertIsNotNone(acquisition.pk) acquisition2 = Acquisition.get(str(acquisition.pk), papers=paper) self.assertIsNotNone(acquisition2) self.assertEquals(acquisition, acquisition2)
def _book(args: Namespace, file: TextIO = sys.stdout): book: Optional[Book] = None if args.subparser == "add": book, created = Book.from_dict({ "title": args.title, "authors": [Person.get_or_create(author).to_dict() for author in args.author], "series": Series.get_or_create(args.series).to_dict() if args.series else None, "volume": args.volume, "genres": [Genre.get_or_create(genre).to_dict() for genre in args.genre], "links": [Link.get_or_create(link).to_dict() for link in args.link], }) if created: stdout.write( _('Successfully added book "%(title)s" with id "%(pk)d".') % { "title": book.title, "pk": book.pk }, "=", file=file, ) book.print(file) else: stdout.write( _('The book "%(title)s" already exists with id "%(pk)d", aborting...' ) % { "title": book.title, "pk": book.pk }, "", file=file, ) elif args.subparser == "delete": book = Book.get(args.book) if book: book.delete() stdout.write( _('Successfully deleted book "%(title)s" with id "%(pk)d".') % { "title": book.title, "pk": book.pk }, "", file=file, ) else: stdout.write(_("No book found."), "", file=file) elif args.subparser == "edit": book = Book.get(args.book) if book: book.edit(args.edit_subparser, args.value) stdout.write( _('Successfully edited book "%(title)s" with id "%(pk)d".') % { "title": book.title, "pk": book.pk }, "=", file=file, ) book.print(file) else: stdout.write(_("No book found."), "", file=file) elif args.subparser == "edition": book = Book.get(args.book) if book: if args.edition_subparser == "acquisition" and book: edition = Edition.get(args.edition, book) acquisition: Optional[Acquisition] = None if args.acquisition_subparser == "add" and edition: acquisition, created = Acquisition.from_dict( { "date": args.date, "price": args.price }, edition) if created: stdout.write( _('Successfully added acquisition with id "%(pk)d".' ) % {"pk": acquisition.pk}, "=", file=file, ) else: stdout.write( _('The acquisition already exists with id "%(pk)d".' ) % {"pk": acquisition.pk}, "", file=file, ) acquisition.print(file) elif args.acquisition_subparser == "delete" and edition: acquisition = Acquisition.get(args.acquisition, editions=edition) if acquisition: acquisition.delete(acquisition) stdout.write( _('Successfully deleted acquisition with id "%(pk)d".' ) % {"pk": acquisition.pk}, "", file=file, ) else: stdout.write(_("No acquisition found."), "", file=file) elif args.acquisition_subparser == "edit" and edition: acquisition = Acquisition.get(args.acquisition, editions=edition) if acquisition: acquisition.edit(args.field, args.value) stdout.write( _('Successfully edited acquisition with id "%(pk)d".' ) % {"pk": acquisition.pk}, "=", file=file, ) acquisition.print(file) else: stdout.write(_("No acquisition found."), "", file=file) else: stdout.write([_("No edition found.")], "", file=file) elif args.edition_subparser == "add" and book: edition, created = Edition.from_dict( { "alternate_title": args.alternate_title, "isbn": args.isbn, "publishing_date": args.publishing_date, "cover": args.cover, "binding": Binding.get_or_create(args.binding).to_dict() if args.binding else None, "publisher": Publisher.get_or_create(args.publisher).to_dict() if args.publisher else None, "persons": [ Person.get_or_create(person).to_dict() for person in args.person ], "languages": [ Language.get_or_create(language).to_dict() for language in args.language ], "links": [ Link.get_or_create(link).to_dict() for link in args.link ], "files": [{ "path": file } for file in args.file], }, book, ) if created: stdout.write( _('Successfully added edition "%(edition)s" with id "%(pk)d".' ) % { "edition": edition, "pk": edition.pk }, "=", file=file, ) edition.print(file) else: stdout.write( _('The edition "%(edition)s" already exists with id "%(pk)d",' + " aborting...") % { "edition": edition, "pk": edition.pk }, "", file=file, ) elif args.edition_subparser == "edit" and book: edition = Edition.get(args.edition, book) if edition: edition.edit(args.edit_subparser, args.value) stdout.write( _('Successfully edited edition "%(edition)s" with id "%(pk)d".' ) % { "edition": edition, "pk": edition.pk }, "=", file=file, ) edition.print(file) else: stdout.write(_("No edition found."), "", file=file) elif args.edition_subparser == "info" and book: edition = Edition.get(args.edition, book) if edition: edition.print(file) else: stdout.write(_("No edition found."), "", file=file) elif args.edition_subparser == "list" and book: if args.shelf: editions = Edition.list.by_shelf(args.shelf, book) elif args.search: editions = Edition.list.by_term(args.search, book) else: editions = Edition.objects.filter(book=book) stdout.write( [ _("Id"), _("Title"), _("Binding"), _("ISBN"), _("Publishing date"), ], "=", [0.05, 0.55, 0.7, 0.85], file=file, ) for i, has_next in lookahead(editions): stdout.write( [ i.pk, i.get_title(), i.binding, i.isbn, i.publishing_date ], "_" if has_next else "=", [0.05, 0.55, 0.7, 0.85], file=file, ) elif args.edition_subparser == "open" and book: edition = Edition.get(args.edition, book) if edition: edition_file = edition.files.get(pk=args.file) path = settings.MEDIA_ROOT / edition_file.file.path if sys.platform == "linux": os.system(f'xdg-open "{path}"') else: os.system(f'open "{path}"') else: stdout.write(_("No edition found."), "", file=file) elif args.edition_subparser == "read" and book: edition = Edition.get(args.edition, book) read: Optional[Read] = None if args.read_subparser == "add" and edition: read, created = Read.from_dict( { "started": args.started, "finished": args.finished }, edition) if created: stdout.write( _('Successfully added read with id "%(pk)d".') % {"pk": read.pk}, "=", file=file, ) else: stdout.write( _('The read already exists with id "%(pk)d".') % {"pk": read.pk}, "", file=file, ) read.print(file) elif args.read_subparser == "delete" and edition: read = Read.get(args.read, editions=edition) if read: read.delete() stdout.write( _('Successfully deleted read with id "%(pk)d".') % {"pk": read.pk}, "", file=file, ) else: stdout.write(_("No read found."), "", file=file) elif args.read_subparser == "edit" and edition: read = Read.get(args.read, editions=edition) if read: read.edit(args.field, args.value) stdout.write( _('Successfully edited read with id "%(pk)d".') % {"pk": read.pk}, "=", file=file, ) read.info(file) else: stdout.write(_("No read found."), "", file=file) else: stdout.write(_("No edition found."), "", file=file) else: stdout.write(_("No book found."), "", file=file) elif args.subparser == "info": book = Book.get(args.book) if book: book.print(file) else: stdout.write(_("No book found."), "", file=file) elif args.subparser == "list": if args.search: books = Book.search(args.search) elif args.shelf: books = Book.by_shelf(args.shelf) else: books = Book.objects.all() stdout.write( [_("Id"), ("Title"), _("Authors"), _("Series"), _("Volume")], "=", [0.05, 0.5, 0.75, 0.9], file=file, ) for i, has_next in lookahead(books): stdout.write( [ i.pk, i.title, " ,".join(f"{a}" for a in i.authors.all()), i.series.name if i.series else "", i.volume, ], "_" if has_next else "=", [0.05, 0.5, 0.75, 0.9], file=file, )
def _acquisition(args: Namespace, file: TextIO = sys.stdout): acquisition: Optional[Acquisition] = None if args.subparser == "add": edition = Edition.get(args.obj) paper = Paper.get(args.obj) issue = Issue.get(args.obj) obj = None if edition is None and paper is None and issue is None: stdout.write(_("No edition, issue or paper found."), "", file=file) return elif edition is not None and paper is None and issue is None: obj = edition elif edition is None and paper is not None and issue is None: obj = paper elif edition is None and paper is None and issue is not None: obj = issue if obj: acquisition, created = Acquisition.from_dict( { "date": args.date, "price": args.price }, obj) if created: stdout.write( _('Successfully added acquisition with id "%(pk)d" to "%(obj)s".' ) % { "pk": acquisition.pk, "obj": obj }, "=", file=file, ) acquisition.print(file) else: stdout.write( _('The acquisition already exists with id "%(pk)d", aborting...' ) % {"pk": acquisition.pk}, "", file=file, ) else: stdout.write(_("More than one paper, issue or paper found."), "", file=file) elif args.subparser == "delete": acquisition = Acquisition.get(args.acquisition) if acquisition: acquisition.delete() stdout.write( _('Successfully deleted acquisition with id "%(pk)d".') % {"pk": acquisition.pk}, "", file=file, ) else: stdout.write(_("No acquisition found."), "", file=file) elif args.subparser == "edit": acquisition = Acquisition.get(args.acquisition) if acquisition: acquisition.edit(args.edit_subparser, args.value) stdout.write( _('Successfully edited acquisition with id "%(pk)d".') % {"pk": acquisition.pk}, "", file=file, ) acquisition.print(file) else: stdout.write(_("No acquisition found."), "", file=file) elif args.subparser == "info": acquisition = Acquisition.get(args.acquisition) if acquisition: acquisition.print(file) else: stdout.write(_("No acquisition found."), "", file=file)
def _read(args: Namespace, file: TextIO = sys.stdout): read: Optional[Acquisition] = None if args.subparser == "add": edition = Edition.get(args.obj) paper = Paper.get(args.obj) issue = Issue.get(args.obj) obj = None if edition is None and paper is None and issue is None: stdout.write(_("No edition, issue or paper found."), "", file=file) return elif edition is not None and paper is None and issue is None: obj = edition elif edition is None and paper is not None and issue is None: obj = paper elif edition is None and paper is None and issue is not None: obj = issue if obj: read, created = Read.from_dict( { "started": args.started, "finished": args.finished }, obj) if created: stdout.write( _('Successfully added read with id "%(pk)d" to "{obj}".') % { "pk": read.pk, "obj": obj }, "=", file=file, ) read.print(file) else: stdout.write( _('The read already exists with id "%(pk)d", aborting...') % {"pk": read.pk}, "", file=file, ) else: stdout.write(_("More than one paper, issue or paper found."), "", file=file) elif args.subparser == "delete": read = Read.get(args.read) if read: read.delete() stdout.write( _('Successfully deleted read with id "%(pk)d".') % {"pk": read.pk}, "", file=file, ) else: stdout.write(_("No read found."), "", file=file) elif args.subparser == "edit": read = Read.get(args.read) if read: read.edit(args.field, args.value) stdout.write( _('Successfully edited read with id "%(pk)d".') % {"pk": read.pk}, "", file=file, ) read.print(file) else: stdout.write(_("No read found."), "", file=file) elif args.subparser == "info": read = Read.get(args.read) if read: read.print(file) else: stdout.write(_("No read found."), "", file=file)