diff --git a/CalibreWebCompanion/CalibreWebCompanion/settings.py b/CalibreWebCompanion/CalibreWebCompanion/settings.py index d7fef39..40a5ea8 100644 --- a/CalibreWebCompanion/CalibreWebCompanion/settings.py +++ b/CalibreWebCompanion/CalibreWebCompanion/settings.py @@ -65,6 +65,7 @@ TEMPLATES = [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', + "library.context_processors.filters" ], }, }, diff --git a/CalibreWebCompanion/library/_models.py b/CalibreWebCompanion/library/_models.py deleted file mode 100644 index f9320a5..0000000 --- a/CalibreWebCompanion/library/_models.py +++ /dev/null @@ -1,265 +0,0 @@ -# This is an auto-generated Django model module. -# You'll have to do the following manually to clean this up: -# * Rearrange models' order -# * Make sure each model has one field with primary_key=True -# * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior -# * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table -# Feel free to rename the models, but don't rename db_table values or field names. -from django.db import models - - -class Authors(models.Model): - name = models.TextField() - sort = models.TextField(blank=True, null=True) - link = models.TextField() - - class Meta: - managed = False - db_table = 'authors' - - -class Comments(models.Model): - book = models.ForeignField("Book") - text = models.TextField() - - class Meta: - managed = False - db_table = 'comments' - - -class Data(models.Model): - book = models.IntegerField() - format = models.TextField() - uncompressed_size = models.IntegerField() - name = models.TextField() - - class Meta: - managed = False - db_table = 'data' - - -class Identifiers(models.Model): - book = models.IntegerField() - type = models.TextField() - val = models.TextField() - - class Meta: - managed = False - db_table = 'identifiers' - - -class Languages(models.Model): - lang_code = models.TextField() - - class Meta: - managed = False - db_table = 'languages' - - -class Publishers(models.Model): - name = models.TextField() - sort = models.TextField(blank=True, null=True) - - class Meta: - managed = False - db_table = 'publishers' - - -class Ratings(models.Model): - rating = models.IntegerField(blank=True, null=True) - - class Meta: - managed = False - db_table = 'ratings' - - -class Series(models.Model): - name = models.TextField() - sort = models.TextField(blank=True, null=True) - - class Meta: - managed = False - db_table = 'series' - - -class Tags(models.Model): - name = models.TextField() - - class Meta: - managed = False - db_table = 'tags' - - -class Books(models.Model): - title = models.TextField() - sort = models.TextField(blank=True, null=True) - # This field type is a guess. - timestamp = models.TextField(blank=True, null=True) - # This field type is a guess. - pubdate = models.TextField(blank=True, null=True) - series_index = models.FloatField() - author_sort = models.TextField(blank=True, null=True) - isbn = models.TextField(blank=True, null=True) - lccn = models.TextField(blank=True, null=True) - path = models.TextField() - flags = models.IntegerField() - uuid = models.TextField(blank=True, null=True) - has_cover = models.BooleanField(blank=True, null=True) - last_modified = models.TextField() # This field type is a guess. - authors = models.ManyToManyField( - Authors, - through='BooksAuthorsLink', - through_fields=('book', 'author')) - languages = models.ManyToManyField( - Languages, - through='BooksLanguagesLink', - through_fields=('book', 'lang_code')) - publishers = models.ManyToManyField( - Publishers, - through='BooksPublishersLink', - through_fields=('book', 'publisher')) - series = models.ManyToManyField( - Series, - through='BooksSeriesLink', - through_fields=('book', 'series')) - tags = models.ManyToManyField( - Tags, - through='BooksTagsLink', - through_fields=('book', 'tag')) - - class Meta: - managed = False - db_table = 'books' - - -class BooksAuthorsLink(models.Model): - book = models.ForeignKey(db_column="book") - author = models.ForeignKey(db_column="author") - - class Meta: - managed = False - db_table = 'books_authors_link' - - -class BooksLanguagesLink(models.Model): - book = models.ForeignKey(db_colum="book") - lang_code = models.ForeignKey(db_column="lang_code") - item_order = models.IntegerField() - - class Meta: - managed = False - db_table = 'books_languages_link' - - -class BooksPublishersLink(models.Model): - book = models.ForeignKey(db_column="book") - publisher = models.ForeignKey(db_column="publisher") - - class Meta: - managed = False - db_table = 'books_publishers_link' - - -# class BooksRatingsLink(models.Model): # TODO add this somehow -# book = models.ForeignKey(db_column="book") -# rating = models.IntegerField() -# class Meta: -# managed = False -# db_table = 'books_ratings_link' - - -class BooksSeriesLink(models.Model): - book = models.ForeignKey(db_column="book") - series = models.ForeignKey(db_column="series") - - class Meta: - managed = False - db_table = 'books_series_link' - - -class BooksTagsLink(models.Model): - book = models.ForeignKey(db_column="book") - tag = models.ForeignKey(db_column="tag") - - class Meta: - managed = False - db_table = 'books_tags_link' - - -# class BooksPluginData(models.Model): -# book = models.IntegerField() -# name = models.TextField() -# val = models.TextField() - -# class Meta: -# managed = False -# db_table = 'books_plugin_data' - - -# class ConversionOptions(models.Model): -# format = models.TextField() -# book = models.IntegerField(blank=True, null=True) -# data = models.BinaryField() -# -# class Meta: -# managed = False -# db_table = 'conversion_options' -# -# class LibraryId(models.Model): -# uuid = models.TextField() -# -# class Meta: -# managed = False -# db_table = 'library_id' -# -# class CustomColumns(models.Model): -# label = models.TextField() -# name = models.TextField() -# datatype = models.TextField() -# mark_for_delete = models.BooleanField() -# editable = models.BooleanField() -# display = models.TextField() -# is_multiple = models.BooleanField() -# normalized = models.BooleanField() -# -# class Meta: -# managed = False -# db_table = 'custom_columns' -# -# class Preferences(models.Model): -# key = models.TextField() -# val = models.TextField() -# -# class Meta: -# managed = False -# db_table = 'preferences' -# -# class Feeds(models.Model): -# title = models.TextField() -# script = models.TextField() -# -# class Meta: -# managed = False -# db_table = 'feeds' -# -# -# class LastReadPositions(models.Model): -# book = models.IntegerField() -# format = models.TextField() -# user = models.TextField() -# device = models.TextField() -# cfi = models.TextField() -# epoch = models.FloatField() -# pos_frac = models.FloatField() -# -# class Meta: -# managed = False -# db_table = 'last_read_positions' - - -# class MetadataDirtied(models.Model): -# book = models.IntegerField() - -# class Meta: -# managed = False -# db_table = 'metadata_dirtied' diff --git a/CalibreWebCompanion/library/context_processors.py b/CalibreWebCompanion/library/context_processors.py new file mode 100644 index 0000000..b523dfc --- /dev/null +++ b/CalibreWebCompanion/library/context_processors.py @@ -0,0 +1,19 @@ +from .models import Authors, Tags, Publishers, Languages, Ratings, Series + + +def filters(request): + unique_authors = Authors.objects.all().order_by('sort') + unique_tags = Tags.objects.all().order_by('name') + unique_publishers = Publishers.objects.all().order_by('name') + unique_languages = Languages.objects.all() + unique_ratings = Ratings.objects.all().order_by('rating') + unique_series = Series.objects.all().order_by('sort') + + return { + "unique_authors": unique_authors, + "unique_tags": unique_tags, + "unique_publishers": unique_publishers, + "unique_languages": unique_languages, + "unique_ratings": unique_ratings, + "unique_series": unique_series + } diff --git a/CalibreWebCompanion/library/forms.py b/CalibreWebCompanion/library/forms.py new file mode 100644 index 0000000..23ce394 --- /dev/null +++ b/CalibreWebCompanion/library/forms.py @@ -0,0 +1,7 @@ +from django import forms + +class SearchForm(forms.Form): + title = forms.CharField(label="Title", max_length=200) + author = forms.CharField(label='Author', max_length=100) + # identifier = forms.CharField(label='Identifier(ISBN, Google-id, amazon id)', max_length=20) + diff --git a/CalibreWebCompanion/library/static/css/styles.css b/CalibreWebCompanion/library/static/css/styles.css index b49e6a5..2a56dc8 100644 --- a/CalibreWebCompanion/library/static/css/styles.css +++ b/CalibreWebCompanion/library/static/css/styles.css @@ -55,4 +55,24 @@ .fa-caret-down { float: right; padding-right: 8px; - } \ No newline at end of file + } + + + table { + border-spacing: 0; + width: 100%; + border: 1px solid #ddd; + } + + th { + cursor: pointer; + } + + th, td { + text-align: left; + padding: 16px; + } + + tr:nth-child(even) { + background-color: #f2f2f2 + } \ No newline at end of file diff --git a/CalibreWebCompanion/library/templates/base.html b/CalibreWebCompanion/library/templates/base.html index fb8494f..b5bce2d 100644 --- a/CalibreWebCompanion/library/templates/base.html +++ b/CalibreWebCompanion/library/templates/base.html @@ -1,55 +1,142 @@ + {% block title %}Local Library{% endblock %} - + {% load static %} +
- {% block sidebar %} -
- Books - Authors - Publishers - Ratings - - -
- {% endblock %} + {% block sidebar %} +
+ Books + + + + + + + + + + + +
+ {% endblock %}
{% block content %}{% endblock %}
+ + + \ No newline at end of file diff --git a/CalibreWebCompanion/library/templates/library/authors_detail.html b/CalibreWebCompanion/library/templates/library/authors_detail.html index d3e832e..85ca59c 100644 --- a/CalibreWebCompanion/library/templates/library/authors_detail.html +++ b/CalibreWebCompanion/library/templates/library/authors_detail.html @@ -3,15 +3,33 @@ {% block content %} {% load static %}

{{authors}}

- {% if books %} - - {% else %} - {%endif%} + + + + + + + + + + {% for book in books %} + + + + + + + + {% endfor %} +
TitleAuthorRatingTagsAdded
{{ book.title }}{{book.author_sort}} {% for rating in book.ratings.all %} + {{rating}} + {% endfor %} + + {% for tag in book.tags.all %} + {{tag}}, + {% endfor %} + {{book.timestamp}}
diff --git a/CalibreWebCompanion/library/templates/library/books_list.html b/CalibreWebCompanion/library/templates/library/books_list.html index 81c97f8..147c59a 100644 --- a/CalibreWebCompanion/library/templates/library/books_list.html +++ b/CalibreWebCompanion/library/templates/library/books_list.html @@ -2,16 +2,39 @@ {% block content %} {% load static %} -

Book List

- {% if books_list %} - - {% else %} -

There are no books in the library.

- {% endif %} +

Book List

+ + + + + + + + + + + {% for book in books_list %} + + + + + + + + {% endfor %} +
TitleAuthorRatingTagsAdded
{{ book.title }}{{book.author_sort}} {% for rating in book.ratings.all %} + {{rating}} + {% endfor %} + + {% for tag in book.tags.all %} + {{tag}}, + {% endfor %} + {{book.timestamp}}
+ + + + + + + {% endblock %} \ No newline at end of file diff --git a/CalibreWebCompanion/library/templates/library/publishers_detail.html b/CalibreWebCompanion/library/templates/library/publishers_detail.html index 834da20..ff23d0b 100644 --- a/CalibreWebCompanion/library/templates/library/publishers_detail.html +++ b/CalibreWebCompanion/library/templates/library/publishers_detail.html @@ -2,17 +2,37 @@ {% block content %} {% load static %} -

{{authors}}

+

{{publishers}}

- {% if publishers.released %} - - {% else %} - {%endif%} +{% if publishers.released %} + + + + + + + + + + {% for book in publishers.released.all %} + + + + + + + + {% endfor %} +
TitleAuthorRatingTagsAdded
{{ book.title }}{{book.author_sort}} {% for rating in book.ratings.all %} + {{rating}} + {% endfor %} + + {% for tag in book.tags.all %} + {{tag}}, + {% endfor %} + {{book.timestamp}}
+{% else %} +{%endif%} {% endblock %} \ No newline at end of file diff --git a/CalibreWebCompanion/library/templates/library/ratings_detail.html b/CalibreWebCompanion/library/templates/library/ratings_detail.html index 4cfcb26..d1b6c4e 100644 --- a/CalibreWebCompanion/library/templates/library/ratings_detail.html +++ b/CalibreWebCompanion/library/templates/library/ratings_detail.html @@ -4,15 +4,35 @@ {% load static %}

{{ratings}}

- {% if books %} - - {% else %} - {%endif%} +{% if books %} + + + + + + + + + + {% for book in books %} + + + + + + + + {% endfor %} +
TitleAuthorRatingTagsAdded
{{ book.title }}{{book.author_sort}} {% for rating in book.ratings.all %} + {{rating}} + {% endfor %} + + {% for tag in book.tags.all %} + {{tag}}, + {% endfor %} + {{book.timestamp}}
+{% else %} +{%endif%} diff --git a/CalibreWebCompanion/library/templates/library/tags_detail.html b/CalibreWebCompanion/library/templates/library/tags_detail.html index 8b8edbc..662baa1 100644 --- a/CalibreWebCompanion/library/templates/library/tags_detail.html +++ b/CalibreWebCompanion/library/templates/library/tags_detail.html @@ -4,15 +4,35 @@ {% load static %}

{{tags}}

- {% if books %} - - {% else %} - {%endif%} +{% if books %} + + + + + + + + + + {% for book in books %} + + + + + + + + {% endfor %} +
TitleAuthorRatingTagsAdded
{{ book.title }}{{book.author_sort}} {% for rating in book.ratings.all %} + {{rating}} + {% endfor %} + + {% for tag in book.tags.all %} + {{tag}}, + {% endfor %} + {{book.timestamp}}
+{% else %} +{%endif%} diff --git a/CalibreWebCompanion/library/views.py b/CalibreWebCompanion/library/views.py index d4d724e..074dac3 100644 --- a/CalibreWebCompanion/library/views.py +++ b/CalibreWebCompanion/library/views.py @@ -1,8 +1,31 @@ from django.shortcuts import render from django.views import generic from .models import Authors, Books, Comments, Ratings, BooksAuthorsLink, Publishers, Tags, BooksTagsLink, BooksRatingsLink, Data +from django.http import HttpResponseRedirect +# from .forms import SearchForms +# def get_results(request): # TODO this might not be what i want +# # if this is a POST request we need to process the form data +# if request.method == 'POST': +# # create a form instance and populate it with data from the request: +# form = SearchForm(request.POST) +# # check whether it's valid: +# if form.is_valid(): +# books = Books.objects.all() +# if form.title: +# books.filter(sort_icontains=form.title) +# if form.author: +# books.filter(author_sort_icontains=form.author) + +# return HttpResponseRedirect('/results/') + +# # if a GET (or any other method) we'll create a blank form +# else: +# form = NameForm() + +# return render(request, 'name.html', {'form': form}) + class AuthorListView(generic.ListView): model = Authors diff --git a/README.md b/README.md index 9fc27c8..b0ec19b 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ Django 3.0 # how to use: -Edit `./CalibreWebCompanion/CalibreWebCompanion/settings`. -Set CALIBREPATH to the path of your library -`./CalibreWebCompanion` -run `./manage.py runserver` +Edit `./CalibreWebCompanion/CalibreWebCompanion/settings`. +Set CALIBREPATH to the path of your library +`./CalibreWebCompanion` +run `./manage.py runserver` -this is in development mode. don't actually use it or release it like this. The debug info it shows is spicy. \ No newline at end of file +this is in development mode. don't actually use it or release it like this. The debug info it shows is spicy. \ No newline at end of file