diff --git a/cps/static/js/edit_books.js b/cps/static/js/edit_books.js index 1d182887..35515aa1 100644 --- a/cps/static/js/edit_books.js +++ b/cps/static/js/edit_books.js @@ -142,6 +142,17 @@ var languages = new Bloodhound({ } }); +var publishers = new Bloodhound({ + name: "publisher", + datumTokenizer: function datumTokenizer(datum) { + return [datum.name]; + }, + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: { + url: getPath() + "/get_publishers_json?q=%QUERY" + } +}); + function sourceSplit(query, cb, split, source) { var bhAdapter = source.ttAdapter(); @@ -224,6 +235,20 @@ promiseLanguages.done(function() { ); }); +var promisePublishers = publishers.initialize(); +promisePublishers.done(function() { + $("#publisher").typeahead( + { + highlight: true, minLength: 0, + hint: true + }, { + name: "publishers", + displayKey: "name", + source: publishers.ttAdapter() + } + ); +}); + $("#search").on("change input.typeahead:selected", function() { var form = $("form").serialize(); $.getJSON( getPath() + "/get_matching_tags", form, function( data ) { diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index 5be6ac9d..5ba021c1 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -101,7 +101,7 @@
- {{_('Publisher')}}:{% for publisher in entry.publishers %} {{publisher.name}}{% if not loop.last %},{% endif %}{% endfor %} -
++ {{_('Publisher')}}: + {{entry.publishers[0].name}} + +
{{_('Publishing date')}}: {{entry.pubdate|formatdate}}
{% endif %} diff --git a/cps/templates/feed.xml b/cps/templates/feed.xml index 9454187b..82e92416 100644 --- a/cps/templates/feed.xml +++ b/cps/templates/feed.xml @@ -43,6 +43,9 @@\n"
"Language: ru\n"
@@ -16,10 +16,10 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.5.1\n"
+"Generated-By: Babel 2.6.0\n"
-#: cps/book_formats.py:128 cps/book_formats.py:132 cps/book_formats.py:136
-#: cps/converter.py:11 cps/converter.py:27
+#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134
+#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27
msgid "not installed"
msgstr "не уÑтановлено"
@@ -27,6 +27,10 @@ msgstr "не уÑтановлено"
msgid "Excecution permissions missing"
msgstr "ОтÑутÑтвуют Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° выполнение"
+#: cps/converter.py:48
+msgid "not configured"
+msgstr ""
+
#: cps/helper.py:57
#, python-format
msgid "%(format)s format not found for book id: %(book)d"
@@ -114,560 +118,587 @@ msgstr "Ошибка Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ UnRar"
msgid "Unrar binary file not found"
msgstr "Unrar двочиный файл не найден"
-#: cps/web.py:1112 cps/web.py:2778
+#: cps/web.py:1171 cps/web.py:2889
msgid "Unknown"
msgstr "ÐеизвеÑтно"
-#: cps/web.py:1121 cps/web.py:1152
+#: cps/web.py:1180 cps/web.py:1211
msgid "HTTP Error"
msgstr "Ошибка HTTP"
-#: cps/web.py:1123 cps/web.py:1154
+#: cps/web.py:1182 cps/web.py:1213
msgid "Connection error"
msgstr "Ошибка ÑоединениÑ"
-#: cps/web.py:1125 cps/web.py:1156
+#: cps/web.py:1184 cps/web.py:1215
msgid "Timeout while establishing connection"
msgstr "Таймаут при уÑтановлении ÑоединениÑ"
-#: cps/web.py:1127 cps/web.py:1158
+#: cps/web.py:1186 cps/web.py:1217
msgid "General error"
msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
-#: cps/web.py:1133
+#: cps/web.py:1192
msgid "Unexpected data while reading update information"
msgstr "Ðекорректные данные при чтении информации об обновлении"
-#: cps/web.py:1140
+#: cps/web.py:1199
msgid "No update available. You already have the latest version installed"
msgstr "Обновление недоÑтупно. Ð’Ñ‹ иÑпользуете Ñамую поÑледнюю верÑию"
-#: cps/web.py:1165
+#: cps/web.py:1224
msgid "A new update is available. Click on the button below to update to the latest version."
msgstr "ДоÑтупно обновление. Ðажмите на кнопку, что бы обновитьÑÑ Ð´Ð¾ поÑледней верÑии."
-#: cps/web.py:1215
+#: cps/web.py:1274
msgid "Could not fetch update information"
msgstr "Ðе удалоÑÑŒ получить информацию об обновлении"
-#: cps/web.py:1230
+#: cps/web.py:1289
msgid "Requesting update package"
msgstr "Проверка обновлений"
-#: cps/web.py:1231
+#: cps/web.py:1290
msgid "Downloading update package"
msgstr "Загрузка обновлений"
-#: cps/web.py:1232
+#: cps/web.py:1291
msgid "Unzipping update package"
msgstr "РаÑпаковка обновлений"
-#: cps/web.py:1233
+#: cps/web.py:1292
msgid "Files are replaced"
msgstr "Файлы заменены"
-#: cps/web.py:1234
+#: cps/web.py:1293
msgid "Database connections are closed"
msgstr "Ð¡Ð¾ÐµÐ´Ð½Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð±Ð°Ð·Ð¾Ð¹ данных закрыты"
-#: cps/web.py:1235
+#: cps/web.py:1294
msgid "Server is stopped"
msgstr "Сервер оÑтановлен"
-#: cps/web.py:1236
+#: cps/web.py:1295
msgid "Update finished, please press okay and reload page"
msgstr "ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑтановлены, нажмите okay и перезагрузите Ñтраницу"
-#: cps/web.py:1256
+#: cps/web.py:1315
msgid "Recently Added Books"
msgstr "Ðедавно Добавленные Книги"
-#: cps/web.py:1266
+#: cps/web.py:1325
msgid "Newest Books"
msgstr "Ðовые Книги"
-#: cps/web.py:1278
+#: cps/web.py:1337
msgid "Oldest Books"
msgstr "Старые Книги"
-#: cps/web.py:1290
+#: cps/web.py:1349
msgid "Books (A-Z)"
msgstr "Книги (Ð-Я)"
-#: cps/web.py:1301
+#: cps/web.py:1360
msgid "Books (Z-A)"
msgstr "Книги (Я-Ð)"
-#: cps/web.py:1330
+#: cps/web.py:1389
msgid "Hot Books (most downloaded)"
msgstr "ПопулÑрные книги (чаÑто загружаемые)"
-#: cps/web.py:1343
+#: cps/web.py:1402
msgid "Best rated books"
msgstr "Книги Ñ Ð½Ð°Ð¸Ð²Ñ‹Ñшим рейтингом"
-#: cps/templates/index.xml:36 cps/web.py:1355
+#: cps/templates/index.xml:36 cps/web.py:1415
msgid "Random Books"
msgstr "Случайный выбор"
-#: cps/web.py:1370
+#: cps/web.py:1430
msgid "Author list"
msgstr "Ðвторы"
-#: cps/web.py:1382 cps/web.py:1445 cps/web.py:1600 cps/web.py:2152
+#: cps/web.py:1442 cps/web.py:1533 cps/web.py:1695 cps/web.py:2253
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Ðевозможно открыть книгу. Файл не ÑущеÑтвует или недоÑтупен."
-#: cps/templates/index.xml:73 cps/web.py:1429
+#: cps/web.py:1470
+msgid "Publisher list"
+msgstr ""
+
+#: cps/web.py:1484
+#, python-format
+msgid "Publisher: %(name)s"
+msgstr ""
+
+#: cps/templates/index.xml:80 cps/web.py:1516
msgid "Series list"
msgstr "Серии"
-#: cps/web.py:1443
+#: cps/web.py:1531
#, python-format
msgid "Series: %(serie)s"
msgstr "Серии: %(serie)s"
-#: cps/web.py:1470
+#: cps/web.py:1560
msgid "Available languages"
msgstr "ДоÑтупные Ñзыки"
-#: cps/web.py:1487
+#: cps/web.py:1580
#, python-format
msgid "Language: %(name)s"
msgstr "Язык: %(name)s"
-#: cps/templates/index.xml:66 cps/web.py:1498
+#: cps/templates/index.xml:73 cps/web.py:1591
msgid "Category list"
msgstr "Категории"
-#: cps/web.py:1512
+#: cps/web.py:1605
#, python-format
msgid "Category: %(name)s"
msgstr "КатегориÑ: %(name)s"
-#: cps/templates/layout.html:71 cps/web.py:1651
+#: cps/templates/layout.html:71 cps/web.py:1746
msgid "Tasks"
msgstr "ЗаданиÑ"
-#: cps/web.py:1681
+#: cps/web.py:1780
msgid "Statistics"
msgstr "СтатиÑтика"
-#: cps/web.py:1786
+#: cps/web.py:1887
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr "Ðе удалоÑÑŒ проверить домен обратного вызова, пожалуйÑта, выполните шаги Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ домена в конÑоли разработчика Google."
-#: cps/web.py:1861
+#: cps/web.py:1962
msgid "Server restarted, please reload page"
msgstr "Сервер перезагружен, пожалуйÑта, перезагрузите Ñтраницу"
-#: cps/web.py:1864
+#: cps/web.py:1965
msgid "Performing shutdown of server, please close window"
msgstr "ПроизводитÑÑ Ð¾Ñтановка Ñервера, пожалуйÑта, закройте окно"
-#: cps/web.py:1883
+#: cps/web.py:1984
msgid "Update done"
msgstr "Обновление закончено"
-#: cps/web.py:1953
+#: cps/web.py:2054
msgid "Published after "
msgstr "Опубликовано до "
-#: cps/web.py:1960
+#: cps/web.py:2061
msgid "Published before "
msgstr "Опубликовано поÑле "
-#: cps/web.py:1974
+#: cps/web.py:2075
#, python-format
msgid "Rating <= %(rating)s"
msgstr "Рейтинг <= %(rating)s"
-#: cps/web.py:1976
+#: cps/web.py:2077
#, python-format
msgid "Rating >= %(rating)s"
msgstr "Рейтинг >= %(rating)s"
-#: cps/web.py:2035 cps/web.py:2044
+#: cps/web.py:2136 cps/web.py:2145
msgid "search"
msgstr "поиÑк"
#: cps/templates/index.xml:44 cps/templates/index.xml:48
-#: cps/templates/layout.html:146 cps/web.py:2111
+#: cps/templates/layout.html:146 cps/web.py:2212
msgid "Read Books"
msgstr "Прочитанные Книги"
#: cps/templates/index.xml:52 cps/templates/index.xml:56
-#: cps/templates/layout.html:148 cps/web.py:2114
+#: cps/templates/layout.html:148 cps/web.py:2215
msgid "Unread Books"
msgstr "Ðепрочитанные Книги"
-#: cps/web.py:2162 cps/web.py:2164 cps/web.py:2166 cps/web.py:2178
+#: cps/web.py:2263 cps/web.py:2265 cps/web.py:2267 cps/web.py:2279
msgid "Read a Book"
msgstr "Читать Книгу"
-#: cps/web.py:2244 cps/web.py:3129
+#: cps/web.py:2345 cps/web.py:3248
msgid "Please fill out all fields!"
msgstr "ПожалуйÑта, заполните вÑе полÑ!"
-#: cps/web.py:2245 cps/web.py:2266 cps/web.py:2270 cps/web.py:2275
-#: cps/web.py:2277
+#: cps/web.py:2346 cps/web.py:2367 cps/web.py:2371 cps/web.py:2376
+#: cps/web.py:2378
msgid "register"
msgstr "региÑтрациÑ"
-#: cps/web.py:2265 cps/web.py:3345
+#: cps/web.py:2366 cps/web.py:3464
msgid "An unknown error occurred. Please try again later."
msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°. Попробуйте позже."
-#: cps/web.py:2268
+#: cps/web.py:2369
msgid "Your e-mail is not allowed to register"
msgstr "Ваш e-mail не подходит Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации"
-#: cps/web.py:2271
+#: cps/web.py:2372
msgid "Confirmation e-mail was send to your e-mail account."
msgstr "ПиÑьмо Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼ отправлено вам на e-mail"
-#: cps/web.py:2274
+#: cps/web.py:2375
msgid "This username or e-mail address is already in use."
msgstr "Ðтот никнейм или e-mail уже иÑпользуютÑÑ"
-#: cps/web.py:2291 cps/web.py:2387
+#: cps/web.py:2392 cps/web.py:2488
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Вы вошли как пользователь '%(nickname)s'"
-#: cps/web.py:2296
+#: cps/web.py:2397
msgid "Wrong Username or Password"
msgstr "Ошибка в имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ пароле"
-#: cps/web.py:2302 cps/web.py:2323
+#: cps/web.py:2403 cps/web.py:2424
msgid "login"
msgstr "войти"
-#: cps/web.py:2335 cps/web.py:2366
+#: cps/web.py:2436 cps/web.py:2467
msgid "Token not found"
msgstr "Ключ не найден"
-#: cps/web.py:2343 cps/web.py:2374
+#: cps/web.py:2444 cps/web.py:2475
msgid "Token has expired"
msgstr "Ключ проÑрочен"
-#: cps/web.py:2351
+#: cps/web.py:2452
msgid "Success! Please return to your device"
msgstr "УÑпешно! ПожалуйÑта, проверьте Ñвое уÑтройÑтво"
-#: cps/web.py:2401
+#: cps/web.py:2502
msgid "Please configure the SMTP mail settings first..."
msgstr "ПожалуйÑта, Ñначала Ñконфигурируйте параметры SMTP"
-#: cps/web.py:2405
+#: cps/web.py:2506
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "Книга уÑпешно поÑтавлена в очередь Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ на %(kindlemail)s"
-#: cps/web.py:2409
+#: cps/web.py:2510
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Ошибка при отправке книги: %(res)s"
-#: cps/web.py:2411 cps/web.py:3183
+#: cps/web.py:2512 cps/web.py:3302
msgid "Please configure your kindle e-mail address first..."
msgstr "ПожалуйÑта, Ñначала наÑтройте e-mail на вашем kindle..."
-#: cps/web.py:2455
+#: cps/web.py:2523 cps/web.py:2575
+msgid "Invalid shelf specified"
+msgstr "Указана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð»ÐºÐ°"
+
+#: cps/web.py:2530
+#, python-format
+msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s"
+msgstr ""
+
+#: cps/web.py:2538
+msgid "You are not allowed to edit public shelves"
+msgstr ""
+
+#: cps/web.py:2547
+#, python-format
+msgid "Book is already part of the shelf: %(shelfname)s"
+msgstr ""
+
+#: cps/web.py:2561
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "Книга добавлена на книжную полку: %(sname)s"
-#: cps/web.py:2466
-msgid "Invalid shelf specified"
-msgstr "Указана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð»ÐºÐ°"
-
-#: cps/web.py:2471
+#: cps/web.py:2580
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr "Вам не разрешено добавлÑÑ‚ÑŒ книгу на полку: %(name)s"
-#: cps/web.py:2476
+#: cps/web.py:2585
msgid "User is not allowed to edit public shelves"
msgstr "Пользователь не может редактировать общедоÑтупные полки"
-#: cps/web.py:2494
+#: cps/web.py:2603
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr "Книги уже размещены на полке: %(name)s"
-#: cps/web.py:2508
+#: cps/web.py:2617
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr "Книги добавлены в полку: %(sname)s"
-#: cps/web.py:2510
+#: cps/web.py:2619
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr "Ðе удалоÑÑŒ добавить книги на полку: %(sname)s"
-#: cps/web.py:2547
+#: cps/web.py:2656
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "Книга удалена Ñ Ð¿Ð¾Ð»ÐºÐ¸: %(sname)s"
-#: cps/web.py:2553
+#: cps/web.py:2662
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr "Извините, вы не можете удалить книгу Ñ Ð¿Ð¾Ð»ÐºÐ¸: %(sname)s"
-#: cps/web.py:2573 cps/web.py:2597
+#: cps/web.py:2682 cps/web.py:2706
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "Полка Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ '%(title)s' уже ÑущеÑтвует."
-#: cps/web.py:2578
+#: cps/web.py:2687
#, python-format
msgid "Shelf %(title)s created"
msgstr "Создана полка %(title)s"
-#: cps/web.py:2580 cps/web.py:2608
+#: cps/web.py:2689 cps/web.py:2717
msgid "There was an error"
msgstr "Произошла ошибка"
-#: cps/web.py:2581 cps/web.py:2583
+#: cps/web.py:2690 cps/web.py:2692
msgid "create a shelf"
msgstr "Ñоздать полку"
-#: cps/web.py:2606
+#: cps/web.py:2715
#, python-format
msgid "Shelf %(title)s changed"
msgstr "Колка %(title)s изменена"
-#: cps/web.py:2609 cps/web.py:2611
+#: cps/web.py:2718 cps/web.py:2720
msgid "Edit a shelf"
msgstr "Изменить полку"
-#: cps/web.py:2632
+#: cps/web.py:2741
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "удачно удалена полка %(name)s"
-#: cps/web.py:2659
+#: cps/web.py:2768
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "Полка: '%(name)s'"
-#: cps/web.py:2662
+#: cps/web.py:2771
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr "Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ ÐŸÐ¾Ð»ÐºÐ¸. Полка не ÑущеÑтвует или недоÑтупна"
-#: cps/web.py:2693
+#: cps/web.py:2802
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "Изменить раÑположение полки '%(name)s'"
-#: cps/web.py:2722 cps/web.py:3135
+#: cps/web.py:2831 cps/web.py:3254
msgid "E-mail is not from valid domain"
msgstr "E-mail не из ÑущеÑтвующей доменной зоны"
-#: cps/web.py:2724 cps/web.py:2765 cps/web.py:2768
+#: cps/web.py:2833 cps/web.py:2876 cps/web.py:2879
#, python-format
msgid "%(name)s's profile"
msgstr "Профиль %(name)s"
-#: cps/web.py:2763
+#: cps/web.py:2874
msgid "Found an existing account for this e-mail address."
msgstr "Ðтот Ð°Ð´Ñ€ÐµÑ Ñлектронной почты уже зарегиÑтрирован."
-#: cps/web.py:2766
+#: cps/web.py:2877
msgid "Profile updated"
msgstr "Профиль обновлён"
-#: cps/web.py:2794
+#: cps/web.py:2905
msgid "Admin page"
msgstr "ÐдминиÑтрирование"
-#: cps/web.py:2872 cps/web.py:3045
+#: cps/web.py:2985 cps/web.py:3159
msgid "Calibre-Web configuration updated"
msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Calibre-Web обновлена"
-#: cps/templates/admin.html:100 cps/web.py:2885
+#: cps/templates/admin.html:100 cps/web.py:2998
msgid "UI Configuration"
msgstr "ÐаÑтройка интерфейÑа"
-#: cps/web.py:2903
+#: cps/web.py:3016
msgid "Import of optional Google Drive requirements missing"
msgstr "Импорт дополнительных требований к Google ДиÑку отÑутÑтвует"
-#: cps/web.py:2906
+#: cps/web.py:3019
msgid "client_secrets.json is missing or not readable"
msgstr "client_secrets.json отÑутÑтвует или его невозможно прочеÑÑ‚ÑŒ"
-#: cps/web.py:2911 cps/web.py:2938
+#: cps/web.py:3024 cps/web.py:3051
msgid "client_secrets.json is not configured for web application"
msgstr "client_secrets.json не наÑтроен Ð´Ð»Ñ Ð²ÐµÐ±-приложениÑ"
-#: cps/templates/admin.html:99 cps/web.py:2941 cps/web.py:2967 cps/web.py:2979
-#: cps/web.py:3021 cps/web.py:3036 cps/web.py:3053 cps/web.py:3060
-#: cps/web.py:3077
+#: cps/templates/admin.html:99 cps/web.py:3054 cps/web.py:3080 cps/web.py:3092
+#: cps/web.py:3135 cps/web.py:3150 cps/web.py:3167 cps/web.py:3174
+#: cps/web.py:3189
msgid "Basic Configuration"
msgstr "ÐаÑтройки Ñервера"
-#: cps/web.py:2964
+#: cps/web.py:3077
msgid "Keyfile location is not valid, please enter correct path"
msgstr "Ðеверное раÑположение файла-ключа, введите правильный путь"
-#: cps/web.py:2976
+#: cps/web.py:3089
msgid "Certfile location is not valid, please enter correct path"
msgstr "Ðеверное раÑположение Ñертификата, введите правильный путь"
-#: cps/web.py:3018
+#: cps/web.py:3132
msgid "Logfile location is not valid, please enter correct path"
msgstr "Ðеверное раÑположение лог-файла, введите правильный путь"
-#: cps/web.py:3057
+#: cps/web.py:3171
msgid "DB location is not valid, please enter correct path"
msgstr "Ðеверное раÑположение базы данных, введите правильный путь"
-#: cps/templates/admin.html:33 cps/web.py:3131 cps/web.py:3137 cps/web.py:3153
+#: cps/templates/admin.html:33 cps/web.py:3250 cps/web.py:3256 cps/web.py:3272
msgid "Add new user"
msgstr "Добавить пользователÑ"
-#: cps/web.py:3143
+#: cps/web.py:3262
#, python-format
msgid "User '%(user)s' created"
msgstr "Пользователь '%(user)s' добавлен"
-#: cps/web.py:3147
+#: cps/web.py:3266
msgid "Found an existing account for this e-mail address or nickname."
msgstr "Ð”Ð»Ñ Ñтого адреÑа Ñлектронной почты или логина уже еÑÑ‚ÑŒ аккаунт."
-#: cps/web.py:3171 cps/web.py:3185
+#: cps/web.py:3290 cps/web.py:3304
msgid "E-mail server settings updated"
msgstr "ÐаÑтройки E-mail Ñервера обновлены"
-#: cps/web.py:3178
+#: cps/web.py:3297
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr "ТеÑтовое пиÑьмо уÑпешно отправлено на %(kindlemail)s"
-#: cps/web.py:3181
+#: cps/web.py:3300
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr "Произошла ошибка при отправке теÑтового пиÑьма на: %(res)s"
-#: cps/web.py:3186
+#: cps/web.py:3305
msgid "Edit e-mail server settings"
msgstr "Изменить наÑтройки e-mail Ñервера"
-#: cps/web.py:3211
+#: cps/web.py:3330
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "Пользователь '%(nick)s' удалён"
-#: cps/web.py:3320
+#: cps/web.py:3439
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Пользователь '%(nick)s' обновлён"
-#: cps/web.py:3323
+#: cps/web.py:3442
msgid "An unknown error occured."
msgstr "Произошла неизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°."
-#: cps/web.py:3325
+#: cps/web.py:3444
#, python-format
msgid "Edit User %(nick)s"
msgstr "Изменить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %(nick)s"
-#: cps/web.py:3342
+#: cps/web.py:3461
#, python-format
msgid "Password for user %(user)s reset"
msgstr "Пароль Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %(user)s Ñброшен"
-#: cps/web.py:3362
+#: cps/web.py:3475 cps/web.py:3676
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr "Ошибка при открытии eBook. Файл не ÑущеÑтвует или файл недоÑтупен"
-#: cps/web.py:3390 cps/web.py:3667 cps/web.py:3672 cps/web.py:3827
+#: cps/web.py:3500 cps/web.py:3959
msgid "edit metadata"
msgstr "изменить метаданные"
-#: cps/web.py:3401 cps/web.py:3697
+#: cps/web.py:3593 cps/web.py:3829
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr "Запрещена загрузка файлов Ñ Ñ€Ð°Ñширением '%(ext)s'"
-#: cps/web.py:3405 cps/web.py:3701
+#: cps/web.py:3597 cps/web.py:3833
msgid "File to be uploaded must have an extension"
msgstr "Загружаемый файл должен иметь раÑширение"
-#: cps/web.py:3417 cps/web.py:3721
+#: cps/web.py:3609 cps/web.py:3853
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr "Ошибка при Ñоздании пути %(path)s (ДоÑтуп запрещён)."
-#: cps/web.py:3422
+#: cps/web.py:3614
#, python-format
msgid "Failed to store file %(file)s."
msgstr "Ðе удалоÑÑŒ Ñохранить файл %(file)s."
-#: cps/web.py:3438
+#: cps/web.py:3630
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr "Формат файла %(ext)s добавлен в %(book)s"
-#: cps/web.py:3455
+#: cps/web.py:3648
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr "Ðе удалоÑÑŒ Ñоздать путь Ð´Ð»Ñ Ð¾Ð±Ð»Ð¾Ð¶ÐºÐ¸ %(path)s (ДоÑтуп запрещён)."
-#: cps/web.py:3462
+#: cps/web.py:3655
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr "Ðе удалоÑÑŒ Ñохранить файл обложки %(cover)s."
-#: cps/web.py:3465
+#: cps/web.py:3658
msgid "Cover-file is not a valid image file"
msgstr "Файл обложки не ÑоответÑтвует изображению"
-#: cps/web.py:3482 cps/web.py:3486
+#: cps/web.py:3688 cps/web.py:3697 cps/web.py:3701
msgid "unknown"
msgstr "неизвеÑтно"
-#: cps/web.py:3508
+#: cps/web.py:3720
msgid "Cover is not a jpg file, can't save"
msgstr "Обложка не jpg файл, невозможно Ñохранить"
-#: cps/web.py:3554
+#: cps/web.py:3768
#, python-format
msgid "%(langname)s is not a valid language"
msgstr "%(langname)s не допуÑтимый Ñзык"
-#: cps/web.py:3676
+#: cps/web.py:3799
+msgid "Metadata successfully updated"
+msgstr ""
+
+#: cps/web.py:3808
msgid "Error editing book, please check logfile for details"
msgstr "Ошибка Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ½Ð¸Ð³Ð¸. ПожалуйÑта, проверьте лог-файл Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации"
-#: cps/web.py:3726
+#: cps/web.py:3858
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr "Ошибка запиÑи файла %(file)s (ДоÑтуп запрещён)."
-#: cps/web.py:3731
+#: cps/web.py:3863
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr "Ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° %(file)s (ДоÑтуп запрещён)."
-#: cps/web.py:3813
+#: cps/web.py:3945
#, python-format
msgid "File %(file)s uploaded"
msgstr "Файл %(file)s загружен"
-#: cps/web.py:3843
+#: cps/web.py:3975
msgid "Source or destination format for conversion missing"
msgstr "ИÑходный или целевой формат Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ÑутÑтвует"
-#: cps/web.py:3853
+#: cps/web.py:3985
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr "Книга уÑпешно поÑтавлена в очередь Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² %(book_format)s"
-#: cps/web.py:3857
+#: cps/web.py:3989
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr "Произошла ошибка при ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтой книги: %(res)s"
@@ -853,16 +884,16 @@ msgid "Do you really want to restart Calibre-Web?"
msgstr "Ð’Ñ‹ дейÑтвительно хотите перезагрузить Calibre-Web?"
#: cps/templates/admin.html:150 cps/templates/admin.html:164
-#: cps/templates/admin.html:184 cps/templates/shelf.html:59
+#: cps/templates/admin.html:184 cps/templates/shelf.html:61
msgid "Ok"
msgstr "Ok"
#: cps/templates/admin.html:151 cps/templates/admin.html:165
#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200
-#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:164
+#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75
-#: cps/templates/shelf.html:60 cps/templates/shelf_edit.html:19
-#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:153
+#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19
+#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155
msgid "Back"
msgstr "Ðазад"
@@ -958,17 +989,17 @@ msgstr "URL обложки(jpg, обложка загружаетÑÑ Ð¸ Ñох
msgid "Upload Cover from local drive"
msgstr "Загрузить обложку Ñ Ð´Ð¸Ñка"
-#: cps/templates/book_edit.html:96 cps/templates/detail.html:131
+#: cps/templates/book_edit.html:96 cps/templates/detail.html:135
msgid "Publishing date"
msgstr "Опубликовано"
#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261
-#: cps/templates/book_edit.html:278 cps/templates/detail.html:126
+#: cps/templates/book_edit.html:278 cps/templates/detail.html:127
#: cps/templates/search_form.html:14
msgid "Publisher"
msgstr "Издатель"
-#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:33
+#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31
msgid "Language"
msgstr "Язык"
@@ -993,9 +1024,9 @@ msgid "Get metadata"
msgstr "Получить метаданные"
#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210
-#: cps/templates/config_view_edit.html:163 cps/templates/login.html:20
+#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20
#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17
-#: cps/templates/user_edit.html:151
+#: cps/templates/user_edit.html:153
msgid "Submit"
msgstr "Отправить"
@@ -1031,7 +1062,7 @@ msgstr "Ðажмите на обложку, чтобы получить мета
msgid "Loading..."
msgstr "Загрузка..."
-#: cps/templates/book_edit.html:239 cps/templates/layout.html:221
+#: cps/templates/book_edit.html:239 cps/templates/layout.html:224
msgid "Close"
msgstr "Закрыть"
@@ -1213,31 +1244,31 @@ msgstr "Теги Ð´Ð»Ñ Ð—Ñ€ÐµÐ»Ð¾Ð³Ð¾ Контента"
msgid "Default settings for new users"
msgstr "ÐаÑтройки по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… пользователей"
-#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:108
+#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110
msgid "Admin user"
msgstr "Управление Ñервером"
-#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:117
+#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119
msgid "Allow Downloads"
msgstr "Разрешить Ñкачивание Ñ Ñервера"
-#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:121
+#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123
msgid "Allow Uploads"
msgstr "Разрешить загрузку на Ñервер"
-#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:125
+#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127
msgid "Allow Edit"
msgstr "Разрешить редактирование книг"
-#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:129
+#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131
msgid "Allow Delete books"
msgstr "Разрешить удаление книг"
-#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:134
+#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136
msgid "Allow Changing Password"
msgstr "Разрешить Ñмену паролÑ"
-#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:138
+#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140
msgid "Allow Editing Public Shelfs"
msgstr "Разрешить редактирование публичных книжных полок"
@@ -1245,51 +1276,55 @@ msgstr "Разрешить редактирование публичных кн
msgid "Default visibilities for new users"
msgstr "ВидимоÑÑ‚ÑŒ Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… пользователей(по умолчанию)"
-#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:60
+#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58
msgid "Show random books"
msgstr "Показывать Ñлучайные книги"
-#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:64
+#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62
msgid "Show recent books"
msgstr "Показывать недавние книги"
-#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:68
+#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66
msgid "Show sorted books"
msgstr "Показывать отÑортированные книги"
-#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:72
+#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70
msgid "Show hot books"
msgstr "Показывать популÑрные книги"
-#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:76
+#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74
msgid "Show best rated books"
msgstr "Показывать книги Ñ Ð½Ð°Ð¸Ð²Ñ‹Ñшим рейтингом"
-#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:80
+#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78
msgid "Show language selection"
msgstr "Показывать выбор Ñзыка"
-#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:84
+#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82
msgid "Show series selection"
msgstr "Показывать выбор Ñерии"
-#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:88
+#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86
msgid "Show category selection"
msgstr "Показывать выбор категории"
-#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:92
+#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90
msgid "Show author selection"
msgstr "Показывать выбор автора"
-#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:96
+#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94
+msgid "Show publisher selection"
+msgstr ""
+
+#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98
msgid "Show read and unread"
msgstr "Показывать прочитанные и непрочитанные"
-#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:100
+#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102
msgid "Show random books in detail view"
msgstr "Показывать Ñлучайные книги при проÑмотре деталей"
-#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:113
+#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115
msgid "Show mature content"
msgstr "Показывать взроÑлый контент"
@@ -1309,19 +1344,19 @@ msgstr "из"
msgid "language"
msgstr "Язык"
-#: cps/templates/detail.html:168
+#: cps/templates/detail.html:172
msgid "Read"
msgstr "Прочитано"
-#: cps/templates/detail.html:177
+#: cps/templates/detail.html:182
msgid "Description:"
msgstr "ОпиÑание:"
-#: cps/templates/detail.html:189 cps/templates/search.html:14
+#: cps/templates/detail.html:195 cps/templates/search.html:14
msgid "Add to shelf"
msgstr "Добавить на книжную полку"
-#: cps/templates/detail.html:251
+#: cps/templates/detail.html:257
msgid "Edit metadata"
msgstr "Редактировать метаданные"
@@ -1381,7 +1416,7 @@ msgstr "Добавить"
msgid "Do you really want to delete this domain rule?"
msgstr "Ð’Ñ‹ дейÑтвительно желаете удалить Ñто правило домена?"
-#: cps/templates/feed.xml:21 cps/templates/layout.html:205
+#: cps/templates/feed.xml:21 cps/templates/layout.html:208
msgid "Next"
msgstr "Дальше"
@@ -1434,27 +1469,35 @@ msgstr "Ðвторы"
msgid "Books ordered by Author"
msgstr "Книги, отÑортированные по Ðвтору"
+#: cps/templates/index.xml:66 cps/templates/layout.html:163
+msgid "Publishers"
+msgstr ""
+
#: cps/templates/index.xml:70
+msgid "Books ordered by publisher"
+msgstr ""
+
+#: cps/templates/index.xml:77
msgid "Books ordered by category"
msgstr "Книги, отÑортированные по категории"
-#: cps/templates/index.xml:77
+#: cps/templates/index.xml:84
msgid "Books ordered by series"
msgstr "Книги, отÑортированные по Ñерии"
-#: cps/templates/index.xml:80 cps/templates/layout.html:166
+#: cps/templates/index.xml:87 cps/templates/layout.html:169
msgid "Public Shelves"
msgstr "Общие полки"
-#: cps/templates/index.xml:84
+#: cps/templates/index.xml:91
msgid "Books organized in public shelfs, visible to everyone"
msgstr "Книги размещены на полках, и доÑтупны вÑем"
-#: cps/templates/index.xml:88 cps/templates/layout.html:170
+#: cps/templates/index.xml:95 cps/templates/layout.html:173
msgid "Your Shelves"
msgstr "Ваши полки"
-#: cps/templates/index.xml:92
+#: cps/templates/index.xml:99
msgid "User's own shelfs, only visible to the current user himself"
msgstr "ПользовательÑкие полки, видимые только Ñамому пользователю"
@@ -1470,7 +1513,7 @@ msgstr "РаÑширенный поиÑк"
msgid "Logout"
msgstr "Выход"
-#: cps/templates/layout.html:83 cps/templates/register.html:18
+#: cps/templates/layout.html:83 cps/templates/register.html:14
msgid "Register"
msgstr "ЗарегиÑтрироватьÑÑ"
@@ -1523,23 +1566,23 @@ msgstr "Обзор"
msgid "Categories"
msgstr "Категории"
-#: cps/templates/layout.html:163 cps/templates/search_form.html:74
+#: cps/templates/layout.html:166 cps/templates/search_form.html:74
msgid "Languages"
msgstr "Языки"
-#: cps/templates/layout.html:175
+#: cps/templates/layout.html:178
msgid "Create a Shelf"
msgstr "Создать книжную полку"
-#: cps/templates/layout.html:176 cps/templates/stats.html:3
+#: cps/templates/layout.html:179 cps/templates/stats.html:3
msgid "About"
msgstr "О программе"
-#: cps/templates/layout.html:190
+#: cps/templates/layout.html:193
msgid "Previous"
msgstr "Предыдущий"
-#: cps/templates/layout.html:217
+#: cps/templates/layout.html:220
msgid "Book Details"
msgstr "Подробнее о книге"
@@ -1549,7 +1592,7 @@ msgid "Username"
msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
#: cps/templates/login.html:12 cps/templates/login.html:13
-#: cps/templates/register.html:11 cps/templates/user_edit.html:21
+#: cps/templates/user_edit.html:21
msgid "Password"
msgstr "Пароль"
@@ -1614,7 +1657,7 @@ msgstr "Повернуть Влево"
msgid "Flip Image"
msgstr "Перевернуть изображение"
-#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:41
+#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39
msgid "Theme"
msgstr "Тема"
@@ -1678,15 +1721,11 @@ msgstr "ЗарегиÑтрировать новую учётную запиÑÑŒ"
msgid "Choose a username"
msgstr "Выберите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
-#: cps/templates/register.html:12
-msgid "Choose a password"
-msgstr "Выберите пароль"
-
-#: cps/templates/register.html:15 cps/templates/user_edit.html:13
+#: cps/templates/register.html:11 cps/templates/user_edit.html:13
msgid "E-mail address"
msgstr "E-mail адреÑ"
-#: cps/templates/register.html:16
+#: cps/templates/register.html:12
msgid "Your email address"
msgstr "Ваш email-адреÑ"
@@ -1754,11 +1793,11 @@ msgstr "Изменить Полку"
msgid "Change order"
msgstr "Изменить порÑдок"
-#: cps/templates/shelf.html:54
+#: cps/templates/shelf.html:56
msgid "Do you really want to delete the shelf?"
msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить Ñту книжную полку?"
-#: cps/templates/shelf.html:57
+#: cps/templates/shelf.html:59
msgid "Shelf will be lost for everybody and forever!"
msgstr "ÐšÐ½Ð¸Ð¶Ð½Ð°Ñ Ð¿Ð¾Ð»ÐºÐ° будет безвозвратно удалена Ð´Ð»Ñ Ð²Ñех"
@@ -1842,31 +1881,31 @@ msgstr "Скрыть вÑе задачи"
msgid "Reset user Password"
msgstr "СброÑить пароль пользователÑ"
-#: cps/templates/user_edit.html:29
+#: cps/templates/user_edit.html:27
msgid "Kindle E-Mail"
msgstr "ÐÐ´Ñ€ÐµÑ Ð¿Ð¾Ñ‡Ñ‚Ñ‹ Kindle"
-#: cps/templates/user_edit.html:43
+#: cps/templates/user_edit.html:41
msgid "Standard Theme"
msgstr "Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð°"
-#: cps/templates/user_edit.html:44
+#: cps/templates/user_edit.html:42
msgid "caliBlur! Dark Theme (Beta)"
msgstr "caliBlur! Ð¢ÐµÐ¼Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° (Бета)"
-#: cps/templates/user_edit.html:49
+#: cps/templates/user_edit.html:47
msgid "Show books with language"
msgstr "Показать книги на Ñзыках"
-#: cps/templates/user_edit.html:51
+#: cps/templates/user_edit.html:49
msgid "Show all"
msgstr "Показать вÑе"
-#: cps/templates/user_edit.html:145
+#: cps/templates/user_edit.html:147
msgid "Delete this user"
msgstr "Удалить Ñтого пользователÑ"
-#: cps/templates/user_edit.html:160
+#: cps/templates/user_edit.html:162
msgid "Recent Downloads"
msgstr "Ðедавние ÑкачиваниÑ"
@@ -1879,3 +1918,6 @@ msgstr "Ðедавние ÑкачиваниÑ"
#~ msgid "Newest commit timestamp"
#~ msgstr "ÐÐ¾Ð²Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° фикÑации"
+#~ msgid "Choose a password"
+#~ msgstr "Выберите пароль"
+
diff --git a/cps/ub.py b/cps/ub.py
index f1b19d02..57dbde6e 100644
--- a/cps/ub.py
+++ b/cps/ub.py
@@ -41,6 +41,7 @@ SIDEBAR_READ_AND_UNREAD = 256
SIDEBAR_RECENT = 512
SIDEBAR_SORTED = 1024
MATURE_CONTENT = 2048
+SIDEBAR_PUBLISHER = 4096
DEFAULT_PASS = "admin123"
DEFAULT_PORT = int(os.environ.get("CALIBRE_PORT", 8083))
@@ -136,6 +137,9 @@ class UserBase:
def show_author(self):
return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_AUTHOR == SIDEBAR_AUTHOR))
+ def show_publisher(self):
+ return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_PUBLISHER == SIDEBAR_PUBLISHER))
+
def show_best_rated_books(self):
return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_BEST_RATED == SIDEBAR_BEST_RATED))
@@ -297,7 +301,7 @@ class Settings(Base):
config_anonbrowse = Column(SmallInteger, default=0)
config_public_reg = Column(SmallInteger, default=0)
config_default_role = Column(SmallInteger, default=0)
- config_default_show = Column(SmallInteger, default=2047)
+ config_default_show = Column(SmallInteger, default=6143)
config_columns_to_ignore = Column(String)
config_use_google_drive = Column(Boolean)
config_google_drive_folder = Column(String)
@@ -485,6 +489,10 @@ class Config:
return bool((self.config_default_show is not None) and
(self.config_default_show & SIDEBAR_AUTHOR == SIDEBAR_AUTHOR))
+ def show_publisher(self):
+ return bool((self.config_default_show is not None) and
+ (self.config_default_show & SIDEBAR_PUBLISHER == SIDEBAR_PUBLISHER))
+
def show_best_rated_books(self):
return bool((self.config_default_show is not None) and
(self.config_default_show & SIDEBAR_BEST_RATED == SIDEBAR_BEST_RATED))
@@ -740,7 +748,7 @@ def create_admin_user():
user.role = ROLE_USER + ROLE_ADMIN + ROLE_DOWNLOAD + ROLE_UPLOAD + ROLE_EDIT + ROLE_DELETE_BOOKS + ROLE_PASSWD
user.sidebar_view = DETAIL_RANDOM + SIDEBAR_LANGUAGE + SIDEBAR_SERIES + SIDEBAR_CATEGORY + SIDEBAR_HOT + \
SIDEBAR_RANDOM + SIDEBAR_AUTHOR + SIDEBAR_BEST_RATED + SIDEBAR_READ_AND_UNREAD + SIDEBAR_RECENT + \
- SIDEBAR_SORTED + MATURE_CONTENT
+ SIDEBAR_SORTED + MATURE_CONTENT + SIDEBAR_PUBLISHER
user.password = generate_password_hash(DEFAULT_PASS)
diff --git a/cps/web.py b/cps/web.py
index 5d6e766c..c0646b1d 100644
--- a/cps/web.py
+++ b/cps/web.py
@@ -529,6 +529,10 @@ def fill_indexpage(page, database, db_filter, order, *join):
# Modifies different Database objects, first check if elements have to be added to database, than check
# if elements have to be deleted, because they are no longer used
def modify_database_object(input_elements, db_book_object, db_object, db_session, db_type):
+ # passing input_elements not as a list may lead to undesired results
+ if not isinstance(input_elements, list):
+ raise TypeError(str(input_elements) + " should be passed as a list")
+
input_elements = [x for x in input_elements if x != '']
# we have all input element (authors, series, tags) names now
# 1. search for elements to remove
@@ -542,13 +546,13 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session
else:
type_elements = c_elements.name
for inp_element in input_elements:
- if inp_element == type_elements:
+ if inp_element.lower() == type_elements.lower():
found = True
break
# if the element was not found in the new list, add it to remove list
if not found:
del_elements.append(c_elements)
- # 2. search for elements that need to be added
+ # 2. search for elements that need to be added
add_elements = []
for inp_element in input_elements:
found = False
@@ -580,20 +584,46 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session
db_filter = db_object.name
for add_element in add_elements:
# check if a element with that name exists
- new_element = db_session.query(db_object).filter(db_filter == add_element).first()
+ db_element = db_session.query(db_object).filter(db_filter == add_element).first()
# if no element is found add it
- if new_element is None:
- if db_type == 'author':
- new_element = db_object(add_element, add_element.replace('|', ','), "")
- elif db_type == 'series':
- new_element = db_object(add_element, add_element)
- elif db_type == 'custom':
- new_element = db_object(value=add_element)
- else: # db_type should be tag, language or publisher
- new_element = db_object(add_element)
+ # if new_element is None:
+ if db_type == 'author':
+ new_element = db_object(add_element, add_element.replace('|', ','), "")
+ elif db_type == 'series':
+ new_element = db_object(add_element, add_element)
+ elif db_type == 'custom':
+ new_element = db_object(value=add_element)
+ elif db_type == 'publisher':
+ new_element = db_object(add_element, None)
+ else: # db_type should be tag or language
+ new_element = db_object(add_element)
+ if db_element is None:
db_session.add(new_element)
- # add element to book
- db_book_object.append(new_element)
+ db_book_object.append(new_element)
+ else:
+ if db_type == 'custom' and db_element.value != add_element:
+ new_element.value = add_element
+ # new_element = db_element
+ elif db_type == 'language' and db_element.lang_code != add_element:
+ db_element.lang_code = add_element
+ # new_element = db_element
+ elif db_type == 'series' and db_element.name != add_element:
+ db_element.name = add_element # = add_element # new_element = db_object(add_element, add_element)
+ db_element.sort = add_element
+ # new_element = db_element
+ elif db_type == 'author' and db_element.name != add_element:
+ db_element.name = add_element
+ db_element.sort = add_element.replace('|', ',')
+ # new_element = db_element
+ if db_type == 'publisher' and db_element.name != add_element:
+ db_element.name = add_element
+ db_element.sort = None
+ # new_element = db_element
+ elif db_element.name != add_element:
+ db_element.name = add_element
+ # new_element = db_element
+ # add element to book
+ db_book_object.append(db_element)
# read search results from calibre-database and return it (function is used for feed and simple search
@@ -745,6 +775,26 @@ def feed_author(book_id):
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
+@app.route("/opds/publisher")
+@requires_basic_auth_if_no_ano
+def feed_publisherindex():
+ off = request.args.get("offset") or 0
+ entries = db.session.query(db.Publishers).join(db.books_publishers_link).join(db.Books).filter(common_filters())\
+ .group_by('books_publishers_link.publisher').order_by(db.Publishers.sort).limit(config.config_books_per_page).offset(off)
+ pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
+ len(db.session.query(db.Publishers).all()))
+ return render_xml_template('feed.xml', listelements=entries, folder='feed_publisher', pagination=pagination)
+
+
+@app.route("/opds/publisher/ Start Time: 2018-10-03 13:01:23.133262 Start Time: 2018-10-28 21:05:48.274095 Stop Time: 2018-10-03 13:24:03.908667 Stop Time: 2018-10-28 21:23:52.450214 Duration: 0:22:40.775405 Duration: 0:18:04.176119
ft1.6: Traceback (most recent call last): - File "/home/matthias/calibre-web-test/test/test_shelf.py", line 310, in test_shelf_database_change + File "/home/matthias/Entwicklung/calibre-web-test/test/test_shelf.py", line 310, in test_shelf_database_change self.assertIsNone('Not Implemented', 'Database change') AssertionError: Database change
ft2.4: Traceback (most recent call last): - File "/home/matthias/calibre-web-test/test/test_logging.py", line 154, in test_logfile_recover - self.assertTrue(os.path.isfile(os.path.join(CALIBRE_WEB_PATH, 'calibre-web.log'))) -AssertionError: False is not true+ File "/home/matthias/Entwicklung/calibre-web-test/test/test_logging.py", line 159, in test_logfile_recover + self.assertTrue(logpath=="", "logfile config value is not empty after reseting to default") +AssertionError: logfile config value is not empty after reseting to default