Merge branch 'preview'
authorJan Szejko <janek37@gmail.com>
Tue, 5 Jun 2018 14:46:14 +0000 (16:46 +0200)
committerJan Szejko <janek37@gmail.com>
Tue, 5 Jun 2018 15:11:50 +0000 (17:11 +0200)
# Conflicts:
# src/api/handlers.py
# src/catalogue/models/book.py
# src/catalogue/templates/catalogue/book_short.html

1  2 
src/ajaxable/utils.py
src/api/handlers.py
src/catalogue/migrations/0025_merge.py
src/catalogue/models/book.py
src/catalogue/templates/catalogue/book_short.html
src/wolnelektury/urls.py
src/wolnelektury/views.py

Simple merge
@@@ -161,7 -164,7 +164,8 @@@ class BookDetailHandler(BaseHandler, Bo
      """
      allowed_methods = ['GET']
      fields = ['title', 'parent', 'children'] + Book.formats + [
-         'media', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'simple_cover', 'fragment_data', 'audio_length'] + [
 -        'media', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'simple_cover', 'fragment_data', 'preview'] + [
++        'media', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'simple_cover', 'fragment_data', 'audio_length',
++        'preview'] + [
              category_plural[c] for c in book_tag_categories]
  
      @piwik_track
@@@ -307,8 -322,14 +323,14 @@@ class QuerySetProxy(models.QuerySet)
  
  class FilterBooksHandler(AnonymousBooksHandler):
      fields = book_tag_categories + [
 -        'href', 'title', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'slug', 'key']
 +        'href', 'title', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'has_audio', 'slug', 'key']
  
+     def parse_bool(self, s):
+         if s in ('true', 'false'):
+             return s == 'true'
+         else:
+             return None
      def read(self, request):
          key_sep = '$'
          search_string = request.GET.get('search')
@@@ -415,6 -433,6 +434,7 @@@ def add_file_getters()
      for book_format in Book.formats:
          setattr(BookDetails, book_format, _file_getter(book_format))
  
++
  add_file_getters()
  
  
@@@ -606,7 -624,7 +626,7 @@@ class FragmentsHandler(BaseHandler, Fra
  
          """
          try:
--            tags, ancestors = read_tags(tags, allowed=self.categories)
++            tags, ancestors = read_tags(tags, request, allowed=self.categories)
          except ValueError:
              return rc.NOT_FOUND
          fragments = Fragment.tagged.with_all(tags).select_related('book')
@@@ -632,3 -650,62 +652,63 @@@ class PictureHandler(BaseHandler)
              return rc.CREATED
          else:
              return rc.NOT_FOUND
 -        ids = BookUserData.objects.filter(user=request.user, complete=state == 'complete').values_list('book_id', flat=True)
+ class UserDataHandler(BaseHandler):
+     model = BookUserData
+     fields = ('state',)
+     allowed_methods = ('GET', 'POST')
+     def read(self, request, slug):
+         try:
+             book = Book.objects.get(slug=slug)
+         except Book.DoesNotExist:
+             return rc.NOT_FOUND
+         if not request.user.is_authenticated():
+             return rc.FORBIDDEN
+         try:
+             data = BookUserData.objects.get(book=book, user=request.user)
+         except BookUserData.DoesNotExist:
+             return {'state': 'not_started'}
+         return data
+     def create(self, request, slug, state):
+         try:
+             book = Book.objects.get(slug=slug)
+         except Book.DoesNotExist:
+             return rc.NOT_FOUND
+         if not request.user.is_authenticated():
+             return rc.FORBIDDEN
+         if state not in ('reading', 'complete'):
+             return rc.NOT_FOUND
+         data, created = BookUserData.objects.get_or_create(book=book, user=request.user)
+         data.state = state
+         data.save()
+         return data
+ class UserShelfHandler(BookDetailHandler):
+     fields = book_tag_categories + [
+         'href', 'title', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'slug', 'key']
+     def parse_bool(self, s):
+         if s in ('true', 'false'):
+             return s == 'true'
+         else:
+             return None
+     def read(self, request, state):
+         if not request.user.is_authenticated():
+             return rc.FORBIDDEN
+         if state not in ('reading', 'complete'):
+             return rc.NOT_FOUND
+         after = request.GET.get('after')
+         count = int(request.GET.get('count', 50))
++        ids = BookUserData.objects.filter(user=request.user, complete=state == 'complete')\
++            .values_list('book_id', flat=True)
+         books = Book.objects.filter(id__in=list(ids)).distinct().order_by('slug')
+         if after:
+             books = books.filter(slug__gt=after)
+         if count:
+             books = books[:count]
+         return books
index 0000000,0000000..66c8c8f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,15 @@@
++# -*- coding: utf-8 -*-
++from __future__ import unicode_literals
++
++from django.db import migrations, models
++
++
++class Migration(migrations.Migration):
++
++    dependencies = [
++        ('catalogue', '0024_book_audio_length'),
++        ('catalogue', '0024_auto_20180510_1407'),
++    ]
++
++    operations = [
++    ]
@@@ -71,7 -72,8 +72,9 @@@ class Book(models.Model)
      wiki_link = models.CharField(blank=True, max_length=240)
      print_on_demand = models.BooleanField(_('print on demand'), default=False)
      recommended = models.BooleanField(_('recommended'), default=False)
 +    audio_length = models.CharField(_('audio length'), blank=True, max_length=8)
+     preview = models.BooleanField(_('preview'), default=False)
+     preview_until = models.DateField(_('preview until'), blank=True, null=True)
  
      # files generated during publication
      cover = EbookField(
@@@ -748,6 -762,6 +788,7 @@@ def add_file_fields()
              default=''
          ).contribute_to_class(Book, field_name)
  
++
  add_file_fields()
  
  
        </div>
        {% book_shelf_tags book.pk %}
  
-       <ul class="book-box-tools">
-         <li class="book-box-read">
-           {% if book.html_file %}
-             <a href="{% url 'book_text' book.slug %}" class="downarrow">{% trans "Read online" %}</a>
-           {% endif %}
-           {% if book.print_on_demand %}
-             <a href="{{ book.ridero_link }}" class="downarrow print tlite-tooltip" title="{% trans "Cena książki w druku cyfrowym jest zależna od liczby stron.<br>Przed zakupem upewnij się, że cena druku na żądanie jest dla Ciebie odpowiednia.<br>Wszystkie nasze zasoby w wersji elektronicznej są zawsze dostępne bezpłatnie." %}">{% trans "Print on demand –" %}
-                 <img src="{% static 'img/ridero.png' %}" style="height: 0.8em;"/></a>
-           {% endif %}
-         </li>
-         <li class="book-box-download">
-           <a class="downarrow">{% trans "Download" %}:</a>
-           <div class="book-box-formats">
-             {% if book.pdf_file %}
-               <span><a href="{{ book.pdf_file.url}}">PDF</a></span>
-             {% endif %}
-             {% if book.epub_file %}
-               <span><a href="{{ book.epub_file.url}}">EPUB</a></span>
+       {% if book|status:user != 'closed' %}
+         <ul class="book-box-tools">
+           <li class="book-box-read">
+             {% if book.html_file %}
+               <a href="{% url 'book_text' book.slug %}" class="downarrow">{% trans "Read online" %}</a>
              {% endif %}
-             {% if book.mobi_file %}
-               <span><a href="{{ book.mobi_file.url}}">MOBI</a></span>
+             {% if book.print_on_demand %}
+               <a href="{{ book.ridero_link }}" class="downarrow print tlite-tooltip" title="{% trans "Cena książki w druku cyfrowym jest zależna od liczby stron.<br>Przed zakupem upewnij się, że cena druku na żądanie jest dla Ciebie odpowiednia.<br>Wszystkie nasze zasoby w wersji elektronicznej są zawsze dostępne bezpłatnie." %}">{% trans "Print on demand –" %}
+                   <img src="{% static 'img/ridero.png' %}" style="height: 0.8em;"/></a>
              {% endif %}
-             {% if book.has_audio %}
-               <span><a href="{% url 'download_zip_mp3' book.slug %}">MP3</a></span>
-             {% endif %}
-             <a class="read-more-show hide" href="#">{% trans "more" %}</a>
-             <span class="read-more-content">
-               {% if  book.fb2_file %}
-                 <span><a href="{{ book.fb2_file.url}}">FB2</a></span>
+           </li>
+           <li class="book-box-download">
+             <a class="downarrow">{% trans "Download" %}:</a>
+             <div class="book-box-formats">
+               {% if book.pdf_file %}
+                 <span><a href="{{ book.pdf_url}}">PDF</a></span>
                {% endif %}
-               {% if  book.txt_file %}
-                 <span><a href="{{ book.txt_file.url}}">TXT</a></span>
+               {% if book.epub_file %}
+                 <span><a href="{{ book.epub_url}}">EPUB</a></span>
                {% endif %}
-               {% download_audio book mp3=False %}
-               <br>
-               {% custom_pdf_link_li book %}
-               <a class="read-more-hide hide" href="#">{% trans "less" %}</a>
-             </span>
-           </div>
-         </li>
-       </ul>
+               {% if book.mobi_file %}
+                 <span><a href="{{ book.mobi_url}}">MOBI</a></span>
+               {% endif %}
+               {% if book.has_audio %}
+                 <span><a href="{% url 'download_zip_mp3' book.slug %}">MP3</a></span>
+               {% endif %}
+               <a class="read-more-show hide" href="#">{% trans "more" %}</a>
+               <span class="read-more-content">
+                 {% if  book.fb2_file %}
+                   <span><a href="{{ book.fb2_url}}">FB2</a></span>
+                 {% endif %}
+                 {% if  book.txt_file %}
+                   <span><a href="{{ book.txt_url}}">TXT</a></span>
+                 {% endif %}
+                 {% download_audio book mp3=False %}
+                 <br>
+                 {% custom_pdf_link_li book %}
+                 <a class="read-more-hide hide" href="#">{% trans "less" %}</a>
+               </span>
+             </div>
+           </li>
+         </ul>
+       {% else %}
+         <p class="book-box-tools">{% trans "For now this work is only available for our subscribers." %}</p>
+       {% endif %}
 -      <div class="clearboth"></div>
 -      {% if book.abstract %}
 -        <div class="abstract more">
 -          {{ book.abstract|safe }}
 -        </div>
 -      {% endif %}
        {% block book-box-extra-info %}{% endblock %}
 -      {% block box-append %}
 -      {% endblock %}
 +      {% block box-append %}{% endblock %}
      </div>
 +    {% if book.abstract %}
 +      <div class="abstract more">
 +        {{ book.abstract|safe }}
 +      </div>
 +    {% endif %}
      {% endwith %}
  
      {% block right-column %}
Simple merge
Simple merge