示例#1
0
    def test_delete(self):
        person, created = Person.from_dict({"name": "Hans Müller"})
        self.assertTrue(created)
        self.assertIsNotNone(person.id)

        deleted = person.delete()
        self.assertIsNone(person.id)
        self.assertEquals((1, {"persons.Person": 1}), deleted)

        person, created = Person.from_dict({
            "name":
            "Hans Müller",
            "links": [{
                "url": "https://hans-mueller.de"
            }]
        })
        self.assertTrue(created)
        self.assertIsNotNone(person.id)

        deleted = person.delete()
        self.assertIsNone(person.id)
        self.assertEquals(
            (3, {
                "persons.Person": 1,
                "persons.Person_links": 1,
                "links.Link": 1
            }),
            deleted,
        )
示例#2
0
    def test_search(self):
        person, created = Person.from_dict({"name": "Hans Müller"})
        self.assertTrue(created)
        self.assertIsNotNone(person.id)

        person, created = Person.from_dict({"name": "Maria Müller"})
        self.assertTrue(created)
        self.assertIsNotNone(person.id)

        person, created = Person.from_dict({"name": "Maria Vogel"})
        self.assertTrue(created)
        self.assertIsNotNone(person.id)

        self.assertEquals(3, Person.objects.all().count())
        self.assertEquals(2, Person.search("Maria").count())
        self.assertEquals(2, Person.search("müller").count())
示例#3
0
    def from_dict(cls: Type[T], data: Dict) -> Tuple[T, bool]:
        """Create from dict.

        Returns True if was crated, i. e. was not found in the DB.
        """
        defaults: Dict = {}
        if "series" in data and data["series"]:
            defaults["series"] = Series.from_dict(data["series"])[0]
        if "volume" in data and data["volume"]:
            defaults["volume"] = data["volume"]

        book, created = Book.objects.get_or_create(title=data["title"],
                                                   defaults=defaults)

        if "authors" in data and data["authors"]:
            for i in data["authors"]:
                book.authors.add(Person.from_dict(i)[0])
        if "genres" in data and data["genres"]:
            for i in data["genres"]:
                book.genres.add(Genre.from_dict(i)[0])
        if "links" in data and data["links"]:
            for i in data["links"]:
                book.links.add(Link.from_dict(i)[0])

        return book, created
示例#4
0
    def test_from_to_dict(self):
        link, created = Link.objects.get_or_create(
            link="https://hans-mueller.de")
        self.assertTrue(created)
        self.assertIsNotNone(link.id)

        person, created = Person.objects.get_or_create(name="Hans Müller")
        person.links.add(link)
        self.assertTrue(created)
        self.assertIsNotNone(person.id)
        self.assertEquals(
            {
                "name": "Hans Müller",
                "links": [{
                    "url": "https://hans-mueller.de"
                }]
            },
            person.to_dict(),
        )
        self.assertEquals(
            (person, False),
            Person.from_dict({
                "name": "Hans Müller",
                "links": [{
                    "url": "https://hans-mueller.de"
                }]
            }),
        )
        self.assertEquals((person, False),
                          Person.from_dict({"name": "Hans Müller"}))

        person, created = Person.objects.get_or_create(name="Jane Bond")
        self.assertTrue(created)
        self.assertIsNotNone(person.id)
        self.assertEquals({
            "name": "Jane Bond",
            "links": None
        }, person.to_dict())
        self.assertEquals((person, False),
                          Person.from_dict({
                              "name": "Jane Bond",
                              "links": None
                          }))
        self.assertEquals((person, False),
                          Person.from_dict({"name": "Jane Bond"}))
示例#5
0
    def from_dict(cls: Type[T], data: Dict, book: Book) -> Tuple[T, bool]:
        """Create from dict.

        Returns True if was crated, i. e. was not found in the DB.
        """
        defaults: Dict = {}
        if "alternate_title" in data and data["alternate_title"]:
            defaults["alternate_title"] = data["alternate_title"]
        if "isbn" in data and data["isbn"]:
            defaults["isbn"] = data["isbn"]
        if "publishing_date" in data and data["publishing_date"]:
            defaults["publishing_date"] = datetime.datetime.strptime(
                data["publishing_date"], "%Y-%m-%d").date()
        if "publisher" in data and data["publisher"]:
            defaults["publisher"] = Publisher.from_dict(data["publisher"])[0]
        if "binding" in data and data["binding"]:
            defaults["binding"] = Binding.from_dict(data["binding"])[0]
        if "bibtex" in data and data["bibtex"]:
            defaults["bibtex"] = data["bibtex"]

        edition, created = cls.objects.get_or_create(
            book=book,
            alternate_title=data["alternate_title"]
            if "alternate_title" in data else None,
            isbn=data["isbn"] if "isbn" in data else None,
            publishing_date=data["publishing_date"]
            if "publishing_date" in data else None,
            defaults=defaults,
        )

        if "cover_image" in data and data["cover_image"]:
            edition.cover_image.save(
                os.path.basename(data["cover_image"]),
                DJFile(open(data["cover_image"], "rb")),
            )
        if "languages" in data and data["languages"]:
            for i in data["languages"]:
                edition.languages.add(Language.from_dict(i)[0])
        if "links" in data and data["links"]:
            for i in data["links"]:
                edition.links.add(Link.from_dict(i)[0])
        if "persons" in data and data["persons"]:
            for i in data["persons"]:
                edition.persons.add(Person.from_dict(i)[0])

        if "acquisitions" in data and data["acquisitions"]:
            for i in data["acquisitions"]:
                Acquisition.from_dict(i, edition)
        if "files" in data and data["files"]:
            for i in data["files"]:
                File.from_dict(i, edition)
        if "reads" in data and data["reads"]:
            for i in data["reads"]:
                Read.from_dict(i, edition)
        edition.save()
        return edition, created
示例#6
0
    def test_print(self):
        person, created = Person.from_dict({"name": "Hans Müller"})
        self.assertTrue(created)
        self.assertIsNotNone(person.id)

        with StringIO() as cout:
            person.print(cout)
            self.assertEquals(
                "Field                            Value                              "
                +
                "                                \n=================================="
                +
                "==================================================================\n"
                +
                "Id                               1                                  "
                +
                "                                \n__________________________________"
                +
                "__________________________________________________________________\n"
                +
                "Name                             Hans Müller                        "
                +
                "                                \n__________________________________"
                +
                "__________________________________________________________________\n"
                +
                "Links                                                               "
                +
                "                                \n__________________________________"
                +
                "__________________________________________________________________\n"
                +
                "Books                                                               "
                +
                "                                \n__________________________________"
                +
                "__________________________________________________________________\n"
                +
                "Editions                                                            "
                +
                "                                \n__________________________________"
                +
                "__________________________________________________________________\n"
                +
                "Papers                                                              "
                +
                "                                \n__________________________________"
                +
                "__________________________________________________________________\n",
                cout.getvalue(),
            )
示例#7
0
    def test_get(self):
        person, created = Person.from_dict({"name": "Hans Müller"})
        self.assertTrue(created)
        self.assertIsNotNone(person.id)

        person2 = Person.get("Hans Müller")
        self.assertIsNotNone(person2)
        self.assertEquals(person, person2)

        person2 = Person.get("müller")
        self.assertIsNotNone(person2)
        self.assertEquals(person, person2)

        person2 = Person.get(str(person.id))
        self.assertIsNotNone(person2)
        self.assertEquals(person, person2)
示例#8
0
    def test_get_or_create(self):
        person, created = Person.from_dict({"name": "Hans Müller"})
        self.assertTrue(created)
        self.assertIsNotNone(person.id)
        self.assertEquals(1, Person.objects.count())

        person2 = Person.get_or_create("Hans Müller")
        self.assertIsNotNone(person2)
        self.assertEquals(person, person2)
        self.assertEquals(1, Person.objects.count())

        person2 = Person.get_or_create(str(person.id))
        self.assertIsNotNone(person2)
        self.assertEquals(person, person2)
        self.assertEquals(1, Person.objects.count())

        person2 = Person.get_or_create("Franz Müller")
        self.assertIsNotNone(person2)
        self.assertNotEquals(person, person2)
        self.assertEquals(2, Person.objects.count())
示例#9
0
    def from_dict(cls: Type[T], data: Dict) -> Tuple[T, bool]:
        """Create from dict.

        Returns True if was crated, i. e. was not found in the DB.
        """
        defaults: Dict = {}
        if "journal" in data and data["journal"]:
            defaults["journal"] = Journal.from_dict(data["journal"])[0]
        if "volume" in data and data["volume"]:
            defaults["volume"] = data["volume"]
        if "publishing_date" in data and data["publishing_date"]:
            defaults["publishing_date"] = datetime.datetime.strptime(
                data["publishing_date"], "%Y-%m-%d").date()
        if "bibtex" in data and data["bibtex"]:
            defaults["bibtex"] = data["bibtex"]

        paper, created = Paper.objects.get_or_create(title=data["title"],
                                                     defaults=defaults)

        if "authors" in data and data["authors"]:
            for i in data["authors"]:
                paper.authors.add(Person.from_dict(i)[0])
        if "languages" in data and data["languages"]:
            for i in data["languages"]:
                paper.languages.add(Language.from_dict(i)[0])
        if "links" in data and data["links"]:
            for i in data["links"]:
                paper.links.add(Link.from_dict(i)[0])

        if "acquisitions" in data and data["acquisitions"]:
            for i in data["acquisitions"]:
                Acquisition.from_dict(i, paper)
        if "files" in data and data["files"]:
            for i in data["files"]:
                File.from_dict(i, paper)
        if "reads" in data and data["reads"]:
            for i in data["reads"]:
                Read.from_dict(i, paper)
        paper.save()
        return paper, created
示例#10
0
    def test_from_to_dict(self):
        book, created = Book.objects.get_or_create(title="Cool")
        self.assertTrue(created)
        self.assertIsNotNone(book.id)
        self.assertEquals(
            {
                "title": "Cool",
                "authors": None,
                "series": None,
                "volume": 0,
                "genres": None,
                "links": None,
            },
            book.to_dict(),
        )
        self.assertEquals((book, False), Book.from_dict(book.to_dict()))
        self.assertEquals((book, False), Book.from_dict({"title": "Cool"}))

        author, created = Person.from_dict({"name": "Max Mustermann"})
        self.assertTrue(created)
        self.assertIsNotNone(author.id)

        series, created = Series.from_dict({"name": "Secret Files"})
        self.assertTrue(created)
        self.assertIsNotNone(series.id)

        genre, created = Genre.from_dict({"name": "Fiction"})
        self.assertTrue(created)
        self.assertIsNotNone(genre.id)

        link, created = Link.from_dict({"url": "https://example.com"})
        self.assertTrue(created)
        self.assertIsNotNone(link.id)

        book, created = Book.objects.get_or_create(title="Example",
                                                   series=series,
                                                   volume=1)
        book.authors.add(author)
        book.genres.add(genre)
        book.links.add(link)
        self.assertTrue(created)
        self.assertIsNotNone(book.id)
        self.assertEquals(
            {
                "title": "Example",
                "authors": [{
                    "name": "Max Mustermann",
                    "links": None
                }],
                "series": {
                    "name": "Secret Files",
                    "links": None
                },
                "volume": 1,
                "genres": [{
                    "name": "Fiction"
                }],
                "links": [{
                    "url": "https://example.com"
                }],
            },
            book.to_dict(),
        )
        self.assertEquals((book, False), Book.from_dict(book.to_dict()))
示例#11
0
    def test_edit(self):
        series, created = Series.from_dict({"name": "Test Series"})
        self.assertTrue(created)
        self.assertIsNotNone(series.id)

        person, created = Person.from_dict({"name": "John Do"})
        self.assertTrue(created)
        self.assertIsNotNone(person.id)

        book, created = Book.from_dict({
            "title": "Test2 Book",
            "authors": [person.to_dict()],
            "series": series.to_dict(),
            "volume": 1.0,
            "genres": [{
                "name": "Romance"
            }],
        })
        self.assertTrue(created)
        self.assertIsNotNone(book.id)
        self.assertEquals(series, book.series)
        self.assertEquals(person, book.authors.first())

        book.edit("title", "IEEE Test Book")
        self.assertEquals("IEEE Test Book", book.title)

        book.edit("author", "Jane Do")
        self.assertEquals(2, book.authors.count())
        self.assertEquals("Jane Do", str(book.authors.all()[0]))
        self.assertEquals("John Do", str(book.authors.all()[1]))

        book.edit("author", str(person.id))
        self.assertEquals(1, book.authors.count())
        self.assertEquals("Jane Do", str(book.authors.all()[0]))

        series, created = Series.from_dict({"name": "Space Series"})
        self.assertTrue(created)
        self.assertIsNotNone(series.id)

        book.edit("series", str(series.id))
        self.assertEquals(series, book.series)

        book.edit("volume", 0.75)
        self.assertEquals(0.75, book.volume)

        series, created = Series.from_dict({"name": "Deep Space Series"})
        self.assertTrue(created)
        self.assertIsNotNone(series.id)

        book.edit("series", "Deep Space")
        self.assertEquals(series, book.series)

        book.edit("genre", "SciFi")
        self.assertEquals(2, book.genres.count())
        self.assertEquals("Romance", book.genres.first().name)
        self.assertEquals("SciFi", book.genres.last().name)

        book.edit("genre", "1")
        self.assertEquals(1, book.genres.count())
        self.assertEquals("SciFi", book.genres.first().name)

        book.edit("link", "https://deep.space")
        self.assertEquals(1, book.links.count())
        self.assertEquals("https://deep.space", book.links.first().link)

        book.edit("link", "https://janedo.com/test2book")
        self.assertEquals(2, book.links.count())
        self.assertEquals("https://janedo.com/test2book",
                          book.links.last().link)

        book.edit("link", "https://deep.space")
        self.assertEquals(1, book.links.count())
        self.assertEquals("https://janedo.com/test2book",
                          book.links.first().link)
示例#12
0
    def test_from_to_dict(self):
        author1, created = Person.from_dict({"name": "John Doe"})
        self.assertTrue(created)
        self.assertIsNotNone(author1.id)

        author2, created = Person.from_dict({"name": "Jane Doe"})
        self.assertTrue(created)
        self.assertIsNotNone(author2.id)

        journal, created = Journal.from_dict({"name": "Science Journal"})
        self.assertTrue(created)
        self.assertIsNotNone(journal.id)

        paper, created = Paper.objects.get_or_create(
            title="Random new stuff", journal=journal, volume="1/2021"
        )
        paper.authors.add(author1)
        paper.authors.add(author2)
        self.assertTrue(created)
        self.assertIsNotNone(paper.id)
        self.assertEquals(
            {
                "title": "Random new stuff",
                "authors": [
                    {"name": "Jane Doe", "links": None},
                    {"name": "John Doe", "links": None},
                ],
                "journal": {"name": "Science Journal", "links": None},
                "volume": "1/2021",
                "publishing_date": None,
                "languages": None,
                "files": None,
                "bibtex": None,
                "links": None,
                "acquisitions": None,
                "reads": None,
            },
            paper.to_dict(),
        )
        self.assertEquals(
            (paper, False),
            Paper.from_dict(
                {
                    "title": "Random new stuff",
                    "authors": [
                        {"name": "Jane Doe", "links": None},
                        {"name": "John Doe", "links": None},
                    ],
                    "journal": {"name": "Science Journal", "links": None},
                    "volume": "1/2021",
                    "publishing_date": None,
                    "languages": None,
                    "files": None,
                    "bibtex": None,
                    "links": None,
                    "acquisitions": None,
                    "reads": None,
                }
            ),
        )
        self.assertEquals(
            (paper, False),
            Paper.from_dict(
                {
                    "title": "Random new stuff",
                    "authors": [
                        {"name": "Jane Doe"},
                        {"name": "John Doe"},
                    ],
                    "journal": {"name": "Science Journal"},
                    "volume": "1/2021",
                }
            ),
        )

        language, created = Language.from_dict({"name": "Englisch"})
        self.assertTrue(created)
        self.assertIsNotNone(language.id)

        link, created = Link.from_dict({"url": "https://example.com"})
        self.assertTrue(created)
        self.assertIsNotNone(link.id)

        paper, created = Paper.objects.get_or_create(
            title="Random Science stuff",
            publishing_date=datetime.strptime("2021-01-01", "%Y-%m-%d").date(),
            journal=journal,
            volume="2/2021",
        )
        paper.authors.add(author1)
        paper.authors.add(author2)
        paper.languages.add(language)
        paper.links.add(link)
        self.assertTrue(created)
        self.assertIsNotNone(paper.id)

        acquisition, created = Acquisition.from_dict(
            {"date": "2021-01-02", "price": 10}, paper
        )
        self.assertTrue(created)
        self.assertIsNotNone(acquisition.id)

        read, created = Read.from_dict(
            {"started": "2021-01-02", "finished": "2021-01-03"}, paper
        )
        self.assertTrue(created)
        self.assertIsNotNone(read.id)

        self.assertEquals(
            {
                "title": "Random Science stuff",
                "authors": [
                    {"name": "Jane Doe", "links": None},
                    {"name": "John Doe", "links": None},
                ],
                "journal": {"name": "Science Journal", "links": None},
                "volume": "2/2021",
                "publishing_date": "2021-01-01",
                "languages": [{"name": "Englisch"}],
                "files": None,
                "bibtex": None,
                "links": [{"url": "https://example.com"}],
                "acquisitions": [{"date": "2021-01-02", "price": 10.0}],
                "reads": [{"started": "2021-01-02", "finished": "2021-01-03"}],
            },
            paper.to_dict(),
        )
        self.assertEquals(
            (paper, False),
            Paper.from_dict(
                {
                    "title": "Random Science stuff",
                    "authors": [
                        {"name": "Jane Doe", "links": None},
                        {"name": "John Doe", "links": None},
                    ],
                    "journal": {"name": "Science Journal", "links": None},
                    "volume": "2/2021",
                    "publishing_date": "2021-01-01",
                    "languages": [{"name": "Englisch"}],
                    "files": None,
                    "bibtex": None,
                    "links": [{"url": "https://example.com"}],
                    "acquisitions": [{"date": "2021-01-02", "price": 10.0}],
                    "reads": [{"started": "2021-01-02", "finished": "2021-01-03"}],
                }
            ),
        )
        self.assertEquals(
            (paper, False),
            Paper.from_dict(
                {
                    "title": "Random Science stuff",
                    "authors": [
                        {"name": "Jane Doe"},
                        {"name": "John Doe"},
                    ],
                    "journal": {"name": "Science Journal"},
                    "volume": "2/2021",
                    "publishing_date": "2021-01-01",
                    "languages": [{"name": "Englisch"}],
                    "links": [{"url": "https://example.com"}],
                    "acquisitions": [{"date": "2021-01-02", "price": 10.0}],
                    "reads": [{"started": "2021-01-02", "finished": "2021-01-03"}],
                }
            ),
        )

        with NamedTemporaryFile() as f:
            f.write(b"Lorem ipsum dolorem")

            file, created = File.from_dict({"path": f.name})
            self.assertTrue(created)
            self.assertIsNotNone(file.id)
            self.assertEquals(
                os.path.basename(f.name), os.path.basename(file.file.name)
            )

            paper, created = Paper.objects.get_or_create(
                title="Boring Science stuff",
                publishing_date=datetime.strptime("2021-02-01", "%Y-%m-%d").date(),
                journal=journal,
                volume="2/2021",
            )
            paper.authors.add(author1)
            paper.authors.add(author2)
            paper.languages.add(language)
            paper.links.add(link)
            paper.files.add(file)
            paper.save()
            self.assertTrue(created)
            self.assertIsNotNone(paper.id)
            self.assertEquals(
                {
                    "title": "Boring Science stuff",
                    "authors": [
                        {"name": "Jane Doe", "links": None},
                        {"name": "John Doe", "links": None},
                    ],
                    "journal": {"name": "Science Journal", "links": None},
                    "volume": "2/2021",
                    "publishing_date": "2021-02-01",
                    "languages": [{"name": "Englisch"}],
                    "bibtex": None,
                    "links": [{"url": "https://example.com"}],
                    "files": [
                        {
                            "path": os.path.join(
                                settings.MEDIA_ROOT,
                                "papers",
                                str(paper.pk),
                                os.path.basename(f.name),
                            )
                        }
                    ],
                    "acquisitions": None,
                    "reads": None,
                },
                paper.to_dict(),
            )
示例#13
0
def _person(args: Namespace, file: TextIO = sys.stdout):
    person: Optional[Person] = None
    if args.subparser == "add":
        person, created = Person.from_dict(
            {
                "name": args.name,
                "links": [Link.get_or_create(link).to_dict() for link in args.link],
            }
        )
        if created:
            stdout.write(
                _('Successfully added person "%(name)s" with id "%(pk)d".')
                % {"name": person.name, "pk": person.pk},
                "=",
                file=file,
            )
            person.print(file)
        else:
            stdout.write(
                _('The person "%(name)s" already exists with id "%(pk)d", aborting...')
                % {"name": person.name, "pk": person.pk},
                "",
                file=file,
            )
    elif args.subparser == "delete":
        person = Person.get(args.person)
        if person:
            person.delete()
            stdout.write(
                _('Successfully deleted person with id "%(name)s".')
                % {"name": person.name},
                "",
                file=file,
            )
        else:
            stdout.write(_("No person found."), "", file=file)
    elif args.subparser == "edit":
        person = Person.get(args.person)
        if person:
            person.edit(args.field, args.value)
            stdout.write(
                _('Successfully edited person "%(name)s" with id "%(pk)d".')
                % {"name": person.name, "pk": person.pk},
                "",
                file=file,
            )
            person.print(file)
        else:
            stdout.write(_("No person found."), "", file=file)
    elif args.subparser == "info":
        person = Person.get(args.person)
        if person:
            person.print(file)
        else:
            stdout.write(_("No person found."), "", file=file)
    elif args.subparser == "list":
        if args.search:
            persons = Person.search(args.search)
        else:
            persons = Person.objects.all()
        stdout.write(
            [
                _("Id"),
                _("Name"),
                _("Number of books"),
                _("Number of editions"),
                _("Number of papers"),
            ],
            "=",
            [0.05, 0.4, 0.6, 0.8],
            file=file,
        )
        for i, has_next in lookahead(persons):
            stdout.write(
                [i.id, i.name, i.books.count(), i.editions.count(), i.papers.count()],
                "_" if has_next else "=",
                [0.05, 0.4, 0.6, 0.8],
                file=file,
            )