Esempio n. 1
0
    def test_delete(self):
        series, created = Series.from_dict({"name": "Secret Files"})
        self.assertTrue(created)
        self.assertIsNotNone(series.id)

        deleted = series.delete()
        self.assertIsNone(series.id)
        self.assertEquals((1, {"series.Series": 1}), deleted)

        series, created = Series.from_dict({
            "name":
            "Secret Files",
            "links": [{
                "url": "https://secrectfiles.com"
            }]
        })
        self.assertTrue(created)
        self.assertIsNotNone(series.id)

        deleted = series.delete()
        self.assertIsNone(series.id)
        self.assertEquals(
            (3, {
                "series.Series": 1,
                "series.Series_links": 1,
                "links.Link": 1
            }),
            deleted,
        )
Esempio n. 2
0
    def create_series(self, form):
        """Set the creator_id of the newly created series to the user that's 
        currently logged in and also fills in the title and description fields
        """

        series = Series(title=form.cleaned_data['title'], description=form.cleaned_data['description'],
                        creator_id=self.request.user.id, site_id=self.kwargs['website_id'])
        series.save()
        return series
Esempio n. 3
0
	def test_reading_days_ahead_by_month_one(self):
		from datetime import date
		FakeDate.today = classmethod(lambda cls: date(2011, 7, 4))
		s = Series()
		s.day_of_week = DayOfWeek()
		s.day_of_week.day = "SU"
		s.week_within_month = WeekWithinMonth()
		s.week_within_month.week_within_month = "1" # Test first Sunday
		self.assertEquals(s.reading_days_ahead_by_month(1), [date(2011, 8, 7)])
Esempio n. 4
0
	def test_next_reading_day_thismonth(self):
		from datetime import date
		FakeDate.today = classmethod(lambda cls: date(2011, 7, 4))
		s = Series()
		s.day_of_week = DayOfWeek()
		s.day_of_week.day = "MO"
		s.week_within_month = WeekWithinMonth()
		s.week_within_month.week_within_month = "1" # Test first Sunday after Monday July 4, 2011
		self.assertEquals(s.next_reading_day(), date(2011, 7, 4))
Esempio n. 5
0
    def create_series(self, form):
        """Set the creator_id of the newly created series to the user that's 
        currently logged in and also fills in the title and description fields
        """

        series = Series(title=form.cleaned_data['title'],
                        description=form.cleaned_data['description'],
                        creator_id=self.request.user.id,
                        site_id=self.kwargs['website_id'])
        series.save()
        return series
Esempio n. 6
0
    def edit(self: T, field: str, value: Union[str, float], *args, **kwargs):
        """Change field by given value."""
        assert field in [
            "title", "author", "series", "volume", "genre", "link"
        ]

        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 == "series" and isinstance(value, str):
            self.series = Series.get_or_create(value)
        elif field == "volume":
            self.volume = value
        elif field == "genre" and isinstance(value, str):
            genre = Genre.get_or_create(value)
            if self.genres.filter(pk=genre.pk).exists():
                self.genres.remove(genre)
            else:
                self.genres.add(genre)
        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)
        self.save(*args, **kwargs)
Esempio n. 7
0
    def test_get(self):
        series, created = Series.from_dict({"name": "Secret Files"})
        self.assertTrue(created)
        self.assertIsNotNone(series.id)

        series2 = Series.get("Secret Files")
        self.assertIsNotNone(series2)
        self.assertEquals(series, series2)

        series2 = Series.get("files")
        self.assertIsNotNone(series2)
        self.assertEquals(series, series2)

        series2 = Series.get(str(series.id))
        self.assertIsNotNone(series2)
        self.assertEquals(series, series2)
Esempio n. 8
0
    def test_search(self):
        series, created = Series.from_dict({"name": "Secret Files"})
        self.assertTrue(created)
        self.assertIsNotNone(series.id)

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

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

        self.assertEquals(3, Series.objects.all().count())
        self.assertEquals(2, Series.search("files").count())
        self.assertEquals(2, Series.search("ran").count())
Esempio n. 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 "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
Esempio n. 10
0
    def test_save(self):
        series = Series(name="Some Series")
        series.save()
        self.assertIsNotNone(series.id)
        self.assertEquals("some-series", series.slug)

        series = Series(name="Deep Space")
        series.save()
        self.assertIsNotNone(series.id)
        self.assertEquals("deep-space", series.slug)
Esempio n. 11
0
    def mutate_and_get_payload(cls, root, info, **input):
        # проверяет токен
        token = input.get('token', None)
        if token != '******************':
            return "Invalid token"

        series = Series(title=input.get('title'),
                        description=input.get('description'),
                        image=input.get('image'),
                        rating=input.get('rating', 0),
                        show_counter=input.get('show_counter', 0),
                        date_create=input.get('date_create', 0),
                        date_update=datetime.datetime.utcnow())
        if input.get('pk'):
            series.pk = input.get('pk')
        series.save()

        return AddSeries(series=series)
Esempio n. 12
0
    def test_from_to_dict(self):
        link, created = Link.objects.get_or_create(
            link="https://secrectfiles.com")
        self.assertTrue(created)
        self.assertIsNotNone(link.id)

        series, created = Series.objects.get_or_create(name="Secret Files")
        series.links.add(link)
        self.assertTrue(created)
        self.assertIsNotNone(series.id)
        self.assertEquals(
            {
                "name": "Secret Files",
                "links": [{
                    "url": "https://secrectfiles.com"
                }]
            },
            series.to_dict(),
        )
        self.assertEquals(
            (series, False),
            Series.from_dict({
                "name": "Secret Files",
                "links": [{
                    "url": "https://secrectfiles.com"
                }]
            }),
        )
        self.assertEquals((series, False),
                          Series.from_dict({"name": "Secret Files"}))

        series, created = Series.objects.get_or_create(name="Random")
        self.assertTrue(created)
        self.assertIsNotNone(series.id)
        self.assertEquals({"name": "Random", "links": None}, series.to_dict())
        self.assertEquals((series, False),
                          Series.from_dict({
                              "name": "Random",
                              "links": None
                          }))
        self.assertEquals((series, False), Series.from_dict({"name":
                                                             "Random"}))
Esempio n. 13
0
    def test_get_or_create(self):
        series, created = Series.from_dict({"name": "Secret Files"})
        self.assertTrue(created)
        self.assertIsNotNone(series.id)
        self.assertEquals(1, Series.objects.count())

        series2 = Series.get_or_create("Secret Files")
        self.assertIsNotNone(series2)
        self.assertEquals(series, series2)
        self.assertEquals(1, Series.objects.count())

        series2 = Series.get_or_create(str(series.id))
        self.assertIsNotNone(series2)
        self.assertEquals(series, series2)
        self.assertEquals(1, Series.objects.count())

        series2 = Series.get_or_create("Secret Papers")
        self.assertIsNotNone(series2)
        self.assertNotEquals(series, series2)
        self.assertEquals(2, Series.objects.count())
Esempio n. 14
0
    def save(self):
        name = self.validated_data['name']
        alt_id = self.validated_data['alt_id']
        publisher = self.validated_data['publisher']
        imprint = self.validated_data['imprint']
        genre = self.validated_data['genre']
        years = self.validated_data['years']
        is_one_shot = self.validated_data['is_one_shot']
        is_mini_series = self.validated_data['is_mini_series']
        mini_series_limit = self.validated_data['mini_series_limit']
        series = Series(alt_id=alt_id,
                        name=name,
                        publisher=publisher,
                        imprint=imprint,
                        genre=genre,
                        years=years,
                        is_one_shot=is_one_shot,
                        is_mini_series=is_mini_series,
                        mini_series_limit=mini_series_limit)
        series.save()

        return series
Esempio n. 15
0
	def test_reading_days_ahead_by_month_twelve(self):
		from datetime import date
		FakeDate.today = classmethod(lambda cls: date(2011, 7, 4))
		s = Series()
		s.day_of_week = DayOfWeek()
		s.day_of_week.day = "SU"
		s.week_within_month = WeekWithinMonth()
		s.week_within_month.week_within_month = "1" # Test first Sunday
		self.assertEquals(s.reading_days_ahead_by_month(12), [ 
																date(2011, 8, 7),
																date(2011, 9, 4),
																date(2011, 10, 2),
																date(2011, 11, 6),
																date(2011, 12, 4),
																date(2012, 1, 1),
																date(2012, 2, 5),
																date(2012, 3, 4),
																date(2012, 4, 1),
																date(2012, 5, 6),
																date(2012, 6, 3),
																date(2012, 7, 1),
																date(2012, 8, 5),
															])
Esempio n. 16
0
    def test_print(self):
        series, created = Series.from_dict({"name": "Secret Files"})
        self.assertTrue(created)
        self.assertIsNotNone(series.id)

        with StringIO() as cout:
            series.print(cout)
            self.assertEquals(
                "Field                            Value                              "
                +
                "                                \n=================================="
                +
                "==================================================================\n"
                +
                "Id                               1                                  "
                +
                "                                \n__________________________________"
                +
                "__________________________________________________________________\n"
                +
                "Name                             Secret Files                       "
                +
                "                                \n__________________________________"
                +
                "__________________________________________________________________\n"
                +
                "Links                                                               "
                +
                "                                \n__________________________________"
                +
                "__________________________________________________________________\n"
                +
                "Books                                                               "
                +
                "                                \n__________________________________"
                +
                "__________________________________________________________________\n",
                cout.getvalue(),
            )
Esempio n. 17
0
def _series(args: Namespace, file: TextIO = sys.stdout):
    series: Optional[Series] = None
    if args.subparser == "add":
        series, created = Series.from_dict({
            "name":
            args.name,
            "links":
            [Link.get_or_create(link).to_dict() for link in args.link],
        })
        if created:
            stdout.write(
                _('Successfully added series "%(name)s" with id "%(pk)d".') % {
                    "name": series.name,
                    "pk": series.pk
                },
                "=",
                file=file,
            )
            series.print(file)
        else:
            stdout.write(
                _('The series "%(name)s" already exists with id "%(pk)d", aborting...'
                  ) % {
                      "name": series.name,
                      "pk": series.pk
                  },
                "",
                file=file,
            )
    elif args.subparser == "delete":
        series = Series.get(args.series)
        if series:
            series.delete()
            stdout.write(
                _('Successfully deleted series with id "%(pk)d".') %
                {"pk": series.pk},
                "",
                file=file,
            )
        else:
            stdout.write(_("No series found."), "", file=file)
    elif args.subparser == "edit":
        series = Series.get(args.series)
        if series:
            series.edit(args.field, args.value)
            stdout.write(
                _('Successfully edited series "%(name)s" with id "%(pk)d".') %
                {
                    "name": series.name,
                    "pk": series.pk
                },
                "",
                file=file,
            )
            series.print(file)
        else:
            stdout.write(_("No series found."), "", file=file)
    elif args.subparser == "info":
        series = Series.get(args.series)
        if series:
            series.print(file)
        else:
            stdout.write(_("No series found."), "", file=file)
    elif args.subparser == "list":
        if args.search:
            series = Series.search(args.search)
        else:
            series = Series.objects.all()
        stdout.write(
            [_("Id"), _("Name"), _("Number of books")],
            "=", [0.05, 0.8],
            file=file)
        for i, has_next in lookahead(series):
            stdout.write(
                [i.id, i.name, i.books.count()],
                "_" if has_next else "=",
                [0.05, 0.8],
                file=file,
            )
Esempio n. 18
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()))
Esempio n. 19
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)
Esempio n. 20
0
def post_create(request):
    form = PostForm()
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.score += 1  # self upvote
            post.save()

            # request.user.upvoted.add(post)

            # Add tags
            tags = request.POST.get('tags')
            if tags:
                tags = tags.split(",")
                for tag in tags:
                    title = tag.strip()
                    slug = slugify(title)
                    # Get tag by slug. Create tag if it doesn't exist.
                    try:
                        tag = Tag.objects.get(slug=slug)
                    except:
                        tag = Tag.objects.create(title=tag)
                    post.tags.add(tag)

            # Add category
            category = request.POST.get('post_category')
            if category:
                category = Category.objects.get(slug=category)
                post.category = category

            # Add series
            series = request.GET.get('series')
            if series == "new":
                # If I'm being sent from a post that doesn't have series
                # (by clicking "Add Chapter")
                # I create series
                first_chapter = Post.objects.get(slug=request.GET.get('post'))
                series_title = first_chapter.body.splitlines()[0][:100]
                series = Series(slug=first_chapter.slug, title=series_title)
                series.save()
                # Add the original post to it
                first_chapter.series = series
                first_chapter.save()
                # Add the post I've just created to it
                post.series = series
            elif series:
                series = Series.objects.get(pk=series)
                post.series = series

            post.save()

            wordcount = len(re.findall(r'\w+', post.body))
            update_wordcount(wordcount, post.author)
            # post.hubs.add(*form.cleaned_data['tags'])
            # hubs = post.hubs.all()

            return HttpResponseRedirect('/post/' + post.slug + '/edit')

    else:
        form = PostForm()
        categories = Category.objects.all()

        today = time.strftime("%Y-%m-%d")
        if today in request.user.calendar:
            wordcount = eval(request.user.calendar)[today]
        else:
            wordcount = 0

        return render(request, 'posts/edit.html', {
            'form': form,
            'wordcount': wordcount,
            'categories': categories
        })
Esempio n. 21
0
def post_create(request):
    form = PostForm()
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.score += 1 # self upvote
            post.save()

            # request.user.upvoted.add(post)

            # Add tags
            tags = request.POST.get('tags')
            if tags:
                tags = tags.split(",")
                for tag in tags:
                    title = tag.strip()
                    slug = slugify(title)
                    # Get tag by slug. Create tag if it doesn't exist.
                    try: 
                        tag = Tag.objects.get(slug=slug)
                    except:
                        tag = Tag.objects.create(title=tag)
                    post.tags.add(tag)

            # Add category
            category = request.POST.get('post_category')
            if category:
                category = Category.objects.get(slug=category)
                post.category = category

            # Add series
            series = request.GET.get('series')
            if series == "new":
                # If I'm being sent from a post that doesn't have series
                # (by clicking "Add Chapter")
                # I create series
                first_chapter = Post.objects.get(slug=request.GET.get('post'))
                series_title = first_chapter.body.splitlines()[0][:100]
                series = Series(slug = first_chapter.slug, title = series_title)
                series.save()
                # Add the original post to it
                first_chapter.series = series
                first_chapter.save()
                # Add the post I've just created to it
                post.series = series
            elif series:
                series = Series.objects.get(pk=series)
                post.series = series

            post.save()

            wordcount = len(re.findall(r'\w+', post.body))
            update_wordcount(wordcount, post.author)
            # post.hubs.add(*form.cleaned_data['tags'])
            # hubs = post.hubs.all()
            
            return HttpResponseRedirect('/post/'+post.slug+'/edit')

    else:
        form = PostForm()
        categories =  Category.objects.all()

        today = time.strftime("%Y-%m-%d")
        if today in request.user.calendar:
            wordcount = eval(request.user.calendar)[today]
        else:
            wordcount = 0
        
        return render(request, 'posts/edit.html', {
            'form':form,
            'wordcount':wordcount,            
            'categories': categories
        })
Esempio n. 22
0
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,
            )
Esempio n. 23
0
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)
Esempio n. 24
0
        # Find parent
        for p in posts:
            if p["pk"] == post["fields"]["parent"]:
                parent = p
        # Modify slug to parent-slug-chapter-slug.
        slug = parent["fields"]["slug"] + "-" + slug

        # Create series for a parent
        series_title = parent["fields"]["title"]
        series_slug = parent["fields"]["slug"]

        # Get or create series
        try:
            series = Series.objects.get(slug=series_slug)
        except:
            series = Series(title=series_title, slug=series_slug)
            series.save()
    # If the story is a parent, find series with matching slug and add it to it.
    try:
        series = Series.objects.get(slug=slug)
    except:
        pass

    try:
        # Check if post already exists
        post = Post.objects.get(slug=slug)
        # On a second run, making sure to add series to parent posts
        post.series = series
        post.save()
    except:
        # Create post if it doesnt exist yet