Esempio n. 1
0
    def test_from_to_dict(self):
        file, created = File.objects.get_or_create(
            file=SimpleUploadedFile("test.txt", b"Lorem ipsum dolorem"))
        self.assertTrue(created)
        self.assertIsNotNone(file.id)
        self.assertEquals(
            {"path": os.path.join(settings.MEDIA_ROOT, "files/test.txt")},
            file.to_dict(),
        )

        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))
            self.assertEquals(f"files/{os.path.basename(f.name)}",
                              file.file.name)
            self.assertEquals(
                {
                    "path":
                    os.path.join(settings.MEDIA_ROOT, "files",
                                 os.path.basename(f.name))
                },
                file.to_dict(),
            )
            self.assertEquals((file, False), File.from_dict(file.to_dict()))
Esempio n. 2
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
Esempio n. 3
0
    def edit(self: T, field: str, value: str, *args, **kwargs):
        """Change field by given value."""
        assert field in [
            "alternate_title",
            "alternate-title",
            "binding",
            "cover",
            "isbn",
            "person",
            "publishing_date",
            "publishing-date",
            "publisher",
            "language",
            "link",
            "file",
        ]

        if field == "alternate_title" or field == "alternate-title":
            self.alternate_title = value
        elif field == "binding":
            self.binding = Binding.get_or_create(value)
        elif field == "cover":
            self.cover_image.save(os.path.basename(str(value)),
                                  DJFile(open(str(value), "rb")))
        elif field == "isbn":
            self.isbn = value
        elif field == "person":
            person = Person.get_or_create(value)
            if self.persons.filter(pk=person.pk).exists():
                self.persons.remove(person)
            else:
                self.persons.add(person)
        elif field == "publishing_date" or field == "publishing-date":
            self.publishing_date = value
        elif field == "publisher":
            self.publisher = Publisher.get_or_create(value)
        elif field == "language":
            language = Language.get_or_create(value)
            if self.languages.filter(pk=language.pk).exists():
                self.languages.remove(language)
            else:
                self.languages.add(language)
        elif field == "link":
            link = Link.get_or_create(value)
            if self.links.filter(pk=link.pk).exists():
                self.links.remove(link)
            else:
                self.links.add(link)
        elif field == "file":
            file, created = File.from_dict({"path": value})
            if self.files.filter(pk=file.pk).exists():
                self.files.remove(file)
                file.delete()
            else:
                self.files.add(file)
        self.save(*args, **kwargs)
Esempio n. 4
0
    def from_dict(cls: Type[T], data: Dict, magazine: Magazine) -> Tuple[T, bool]:
        """Create from dict.

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

        issue, created = cls.objects.get_or_create(
            issue=data["issue"], magazine=magazine, defaults=defaults
        )

        if "cover_image" in data and data["cover_image"]:
            issue.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"]:
                if type(i) == dict:
                    issue.languages.add(Language.from_dict(i)[0])
                else:
                    issue.languages.add(Language.get_or_create(i))
        if "links" in data and data["links"]:
            for i in data["links"]:
                issue.links.add(Link.from_dict(i)[0])

        if "acquisitions" in data and data["acquisitions"]:
            for i in data["acquisitions"]:
                Acquisition.from_dict(i, issue)
        if "files" in data and data["files"]:
            for i in data["files"]:
                File.from_dict(i, issue)
        if "reads" in data and data["reads"]:
            for i in data["reads"]:
                Read.from_dict(i, issue)
        issue.save()
        return issue, created
Esempio n. 5
0
    def edit(self: T, field: str, value: Union[str, datetime.date], *args,
             **kwargs):
        """Change field by given value."""
        fields = [
            "title",
            "author",
            "publishing_date",
            "publishing-date",
            "journal",
            "volume",
            "language",
            "file",
            "link",
            "bibtex",
        ]
        assert field in fields

        if field == "title":
            self.title = value
        elif field == "author" and isinstance(value, str):
            author = Person.get_or_create(value)
            if self.authors.filter(pk=author.pk).exists():
                self.authors.remove(author)
            else:
                self.authors.add(author)
        elif field == "publishing_date" or field == "publishing-date":
            self.publishing_date = value
        elif field == "journal" and isinstance(value, str):
            self.journal = Journal.get_or_create(value)
        elif field == "volume":
            self.volume = value
        elif field == "bibtex":
            self.bibtex = value
        elif field == "language" and isinstance(value, str):
            language = Language.get_or_create(value)
            if self.languages.filter(pk=language.pk).exists():
                self.languages.remove(language)
            else:
                self.languages.add(language)
        elif field == "link" and isinstance(value, str):
            link = Link.get_or_create(value)
            if self.links.filter(pk=link.pk).exists():
                self.links.remove(link)
            else:
                self.links.add(link)
        elif field == "file":
            file, created = File.from_dict({"path": value})
            if self.files.filter(pk=file.pk).exists():
                self.files.remove(file)
                file.delete()
            else:
                self.files.add(file)
        self.save(*args, **kwargs)
Esempio n. 6
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
Esempio n. 7
0
    def edit(self: T, field: str, value: Union[str, datetime.date], *args, **kwargs):
        """Change field by given value."""
        fields = [
            "issue",
            "publishing_date",
            "publishing-date",
            "cover",
            "language",
            "file",
            "link",
        ]
        assert field in fields

        if field == "issue":
            self.issue = value
        elif field == "publishing_date" or field == "publishing-date":
            self.publishing_date = value
        elif field == "cover":
            self.cover_image.save(
                os.path.basename(str(value)), DJFile(open(str(value), "rb"))
            )
        elif field == "language" and isinstance(value, str):
            language = Language.get_or_create(value)
            if self.languages.filter(pk=language.pk).exists():
                self.languages.remove(language)
            else:
                self.languages.add(language)
        elif field == "link" and isinstance(value, str):
            link = Link.get_or_create(value)
            if self.links.filter(pk=link.pk).exists():
                self.links.remove(link)
            else:
                self.links.add(link)
        elif field == "file" and isinstance(value, str):
            file, created = File.from_dict({"path": value})
            if self.files.filter(pk=file.pk).exists():
                self.files.remove(file)
                file.delete()
            else:
                self.files.add(file)
        self.save(*args, **kwargs)
Esempio n. 8
0
    def from_bibtex(cls: Type[T],
                    bibtex: str,
                    files: List[str] = [],
                    bibfile: Optional[str] = None) -> List[Tuple[T, bool]]:
        """Create from bibtext."""
        bib_database = BibTexParser(common_strings=True,
                                    homogenize_fields=True).parse(bibtex)

        if len(files) < len(bib_database.entries):
            for i in range(len(files), len(bib_database.entries)):
                files.append("")

        papers = []
        for entry, file in zip(bib_database.entries, files):
            title = entry["title"].strip() if "title" in entry else ""

            authors = []
            entry["author"] = re.sub(r"\s*\n\s*",
                                     " ",
                                     entry["author"],
                                     flags=re.S)
            for author in re.compile(r"\s+and\s+").split(entry["author"]):
                if "," in author:
                    s = author.split(",")
                    authors.append({"name": f"{s[1].strip()} {s[0].strip()}"})
                else:
                    authors.append({"name": author.strip()})

            journal = {
                "name": entry["journal"].strip()
            } if "journal" in entry else None

            volume = entry["volume"].strip() if "volume" in entry else None
            if "number" in entry:
                volume = f"{volume}.{entry['number']}"
            if "eprint" in entry and not volume:
                volume = entry["eprint"].strip()

            publisher = ({
                "name": entry["publisher"].strip()
            } if "publisher" in entry else None)

            year = int(entry["year"].strip()) if "year" in entry else None
            month = entry["month"].strip() if "month" in entry else None
            day = entry["day"].strip() if "day" in entry else None
            if year and month and day:
                date = datetime.datetime.strptime(f"{day} {month} {year}",
                                                  "%d %B %Y")
            elif year and month:
                try:
                    date = datetime.datetime.strptime(f"{month} {year}",
                                                      "%B %Y")
                except ValueError:
                    date = datetime.datetime.strptime(f"{month} {year}",
                                                      "%b %Y")
            elif year:
                date = datetime.datetime(year, 1, 1)

            pub_date = None
            if "timestamp" in entry:
                pub_date = (datetime.datetime.strptime(
                    entry["timestamp"].strip(),
                    "%a, %d %b %Y %H:%M:%S %z").date().strftime("%Y-%m-%d"))
            elif date:
                pub_date = date.date().strftime("%Y-%m-%d")

            if "link" in entry:
                url: Optional[Dict] = {"url": entry["link"].strip()}
            elif "url" in entry:
                url = {"url": entry["url"].strip()}
            else:
                url = None

            papers.append(
                cls.from_dict({
                    "title": title,
                    "authors": authors,
                    "journal": journal,
                    "volume": volume,
                    "publisher": publisher,
                    "publishing_date": pub_date,
                    "links": [url],
                    "bibtex": bibtex,
                }))

            if file:
                papers[-1][0].files.add(File.from_dict({"path": file})[0])
                papers[-1][0].save()
            if bibfile:
                papers[-1][0].files.add(File.from_dict({"path": bibfile})[0])
                papers[-1][0].save()
        return papers
Esempio n. 9
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(),
            )