From d6dd28e70358676fcdc58143a8454450afca6653 Mon Sep 17 00:00:00 2001 From: idalin Date: Fri, 24 Feb 2017 14:29:44 +0800 Subject: [PATCH 1/7] limit search results to 20 --- cps/static/js/douban_meta.js | 1 + 1 file changed, 1 insertion(+) diff --git a/cps/static/js/douban_meta.js b/cps/static/js/douban_meta.js index 773939f9..b7935145 100644 --- a/cps/static/js/douban_meta.js +++ b/cps/static/js/douban_meta.js @@ -68,6 +68,7 @@ $(document).ready(function () { '' + ''; $("#book-list").append(book); + if(i>20){break;} } } }, From 2f1fdab9de713e2050de19e12667621fd03cfdc7 Mon Sep 17 00:00:00 2001 From: idalin Date: Fri, 24 Feb 2017 14:34:08 +0800 Subject: [PATCH 2/7] delete douban_meta.js in master.(This is for Chinese user only) --- cps/static/js/douban_meta.js | 87 ------------------------------------ 1 file changed, 87 deletions(-) delete mode 100644 cps/static/js/douban_meta.js diff --git a/cps/static/js/douban_meta.js b/cps/static/js/douban_meta.js deleted file mode 100644 index 773939f9..00000000 --- a/cps/static/js/douban_meta.js +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Get Metadata from Douban api - * Created by idalin - */ - -$(document).ready(function () { - var get_meta_btn = '
  • ' + - '' + - '获取Meta
  • '; - $('#main-nav').prepend(get_meta_btn); - var douban = 'https://api.douban.com'; - var search = '/v2/book/search'; - var get_info = '/v2/book/'; - var get_info_by_isbn = '/v2/book/isbn/ '; - - $.ajaxSetup({ - type: "GET", - dataType: "jsonp", - jsonp: 'callback', - async: false - }); - - get_meta = function (id) { - var url = douban + get_info + id; - console.log('getting book meta:' + id); - $.ajax({ - url: url, - success: function (meta) { - console.log(meta); - //$('#metaModal').modal('hide'); - $('#description').val(meta.summary); - $('#bookAuthor').val(meta.author.join(' & ')); - $('#book_title').val(meta.title); - var tags = ''; - for (var i = 0; i < meta.tags.length; i++) { - tags = tags + meta.tags[i].title + ','; - } - $('#tags').val(tags); - $('#rating').val(Math.round(meta.rating.average / 4)); - } - }); - } - - get_meta_by_isbn = function (isbn) { - var url = douban + get_info_by_isbn + isbn; - } - - search_book = function (title) { - var url = douban + search + '?q=' + title + '&fields=id,title,author,publisher,isbn13,image,summary'; - $.ajax({ - url: url, - success: function (data) { - if (data.books.length < 1) { - $('#meta-info').html('

    搜索不到对应的书籍

    '); - } else { - $('#meta-info').html('
      '); - for (var i = 0; i < data.books.length; i++) { - var book = '
    • ' + - 'Cover' + - '
      ' + - '

      ' + data.books[i].title + '

      ' + - '

      作者:' + data.books[i].author + '

      ' + - '

      出版社:' + data.books[i].publisher + '

      ' + - '

      简介:' + data.books[i].summary + '

      ' + - '
      ' + - '
    • '; - $("#book-list").append(book); - } - } - }, - error: function () { - $('#meta-info').html('

      搜索出错

      '); - } - }); - } - - $('#get_meta').click(function () { - var book_title = $('#book_title').val(); - if (book_title) { - // console.log(book_title); - search_book(book_title); - } - }); -}); \ No newline at end of file From e1007023458566d2c57535cbe19a2f7eac8be4a1 Mon Sep 17 00:00:00 2001 From: idalin Date: Tue, 28 Feb 2017 14:52:55 +0800 Subject: [PATCH 3/7] get metadata from douban and google while editing. --- cps/static/js/douban_meta.js | 88 ----------------- cps/static/js/get_meta.js | 179 +++++++++++++++++++++++++++++++++++ cps/templates/book_edit.html | 122 +++++++++++------------- 3 files changed, 232 insertions(+), 157 deletions(-) delete mode 100644 cps/static/js/douban_meta.js create mode 100644 cps/static/js/get_meta.js diff --git a/cps/static/js/douban_meta.js b/cps/static/js/douban_meta.js deleted file mode 100644 index b7935145..00000000 --- a/cps/static/js/douban_meta.js +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Get Metadata from Douban api - * Created by idalin - */ - -$(document).ready(function () { - var get_meta_btn = '
    • ' + - '' + - '获取Meta
    • '; - $('#main-nav').prepend(get_meta_btn); - var douban = 'https://api.douban.com'; - var search = '/v2/book/search'; - var get_info = '/v2/book/'; - var get_info_by_isbn = '/v2/book/isbn/ '; - - $.ajaxSetup({ - type: "GET", - dataType: "jsonp", - jsonp: 'callback', - async: false - }); - - get_meta = function (id) { - var url = douban + get_info + id; - console.log('getting book meta:' + id); - $.ajax({ - url: url, - success: function (meta) { - console.log(meta); - //$('#metaModal').modal('hide'); - $('#description').val(meta.summary); - $('#bookAuthor').val(meta.author.join(' & ')); - $('#book_title').val(meta.title); - var tags = ''; - for (var i = 0; i < meta.tags.length; i++) { - tags = tags + meta.tags[i].title + ','; - } - $('#tags').val(tags); - $('#rating').val(Math.round(meta.rating.average / 4)); - } - }); - } - - get_meta_by_isbn = function (isbn) { - var url = douban + get_info_by_isbn + isbn; - } - - search_book = function (title) { - var url = douban + search + '?q=' + title + '&fields=id,title,author,publisher,isbn13,image,summary'; - $.ajax({ - url: url, - success: function (data) { - if (data.books.length < 1) { - $('#meta-info').html('

      搜索不到对应的书籍

      '); - } else { - $('#meta-info').html('
        '); - for (var i = 0; i < data.books.length; i++) { - var book = '
      • ' + - 'Cover' + - '
        ' + - '

        ' + data.books[i].title + '

        ' + - '

        作者:' + data.books[i].author + '

        ' + - '

        出版社:' + data.books[i].publisher + '

        ' + - '

        简介:' + data.books[i].summary + '

        ' + - '
        ' + - '
      • '; - $("#book-list").append(book); - if(i>20){break;} - } - } - }, - error: function () { - $('#meta-info').html('

        搜索出错

        '); - } - }); - } - - $('#get_meta').click(function () { - var book_title = $('#book_title').val(); - if (book_title) { - // console.log(book_title); - search_book(book_title); - } - }); -}); \ No newline at end of file diff --git a/cps/static/js/get_meta.js b/cps/static/js/get_meta.js new file mode 100644 index 00000000..59b5523c --- /dev/null +++ b/cps/static/js/get_meta.js @@ -0,0 +1,179 @@ +/* + * Get Metadata from Douban Books api and Google Books api + * Created by idalin + * Google Books api document: https://developers.google.com/books/docs/v1/using + * Douban Books api document: https://developers.douban.com/wiki/?title=book_v2 (Chinese Only) + */ + +$(document).ready(function () { + var douban = 'https://api.douban.com'; + var db_search = '/v2/book/search'; + var db_get_info = '/v2/book/'; + var db_get_info_by_isbn = '/v2/book/isbn/ '; + var db_done = false; + + var google = 'https://www.googleapis.com/'; + var gg_search = '/books/v1/volumes'; + var gg_get_info = '/books/v1/volumes/'; + var gg_done = false; + + var db_results = []; + var gg_results = []; + var show_flag = 0; + String.prototype.replaceAll = function (s1, s2) {   + return this.replace(new RegExp(s1, "gm"), s2);   + } + + $.ajaxSetup({ + type: "GET", + dataType: "jsonp", + jsonp: 'callback', + }); + + gg_search_book = function (title) { + title = title.replaceAll(/\s+/, '+'); + var url = google + gg_search + '?q=' + title; + $.ajax({ + url: url, + success: function (data) { + gg_results = data.items; + }, + complete: function () { + gg_done = true; + show_result(); + } + }); + } + + get_meta = function (source, id) { + var meta; + if (source == 'google') {; + meta = gg_results[id]; + $('#description').val(meta.volumeInfo.description); + $('#bookAuthor').val(meta.volumeInfo.authors.join(' & ')); + $('#book_title').val(meta.volumeInfo.title); + if (meta.volumeInfo.categories) { + var tags = meta.volumeInfo.categories.join(','); + $('#tags').val(tags); + } + if (meta.volumeInfo.averageRating) { + $('#rating').val(Math.round(meta.volumeInfo.averageRating)); + } + return; + } + if (source == 'douban') { + meta = db_results[id]; + $('#description').val(meta.summary); + $('#bookAuthor').val(meta.author.join(' & ')); + $('#book_title').val(meta.title); + var tags = ''; + for (var i = 0; i < meta.tags.length; i++) { + tags = tags + meta.tags[i].title + ','; + } + $('#tags').val(tags); + $('#rating').val(Math.round(meta.rating.average / 2)); + return; + } + } + do_search = function (keyword) { + show_flag = 0; + $('#meta-info').text('Loading...'); + var keyword = $('#keyword').val(); + if (keyword) { + db_search_book(keyword); + gg_search_book(keyword); + } + } + + db_search_book = function (title) { + var url = douban + db_search + '?q=' + title + '&fields=all&count=10'; + $.ajax({ + url: url, + success: function (data) { + db_results = data.books; + }, + error: function () { + $('#meta-info').html('

        Search error!

        '); + }, + complete: function () { + db_done = true; + show_result(); + } + }); + } + + show_result = function () { + show_flag++; + if (show_flag == 1) { + $('#meta-info').html('
          '); + } + if (gg_done && db_done) { + if (gg_results.length < 1 && db_results.length < 1) { + $('#meta-info').html('

          No Result! Please try anonther keyword.

          '); + return; + } + } + if (gg_done && gg_results.length > 0) { + for (var i = 0; i < gg_results.length; i++) { + var book = gg_results[i]; + var book_cover; + if (book.volumeInfo.imageLinks) { + book_cover = book.volumeInfo.imageLinks.thumbnail; + } else { + book_cover = '/static/generic_cover.jpg'; + } + var book_html = '
        • ' + + 'Cover' + + '
          ' + + '

          ' + book.volumeInfo.title + '

          ' + + '

          Author:' + book.volumeInfo.authors + '

          ' + + '

          Publisher:' + book.volumeInfo.publisher + '

          ' + + '

          Description:' + book.volumeInfo.description + '

          ' + + '

          Source:Google Books

          ' + + '
          ' + + '
        • '; + $("#book-list").append(book_html); + } + gg_done = false; + } + if (db_done && db_results.length > 0) { + for (var i = 0; i < db_results.length; i++) { + var book = db_results[i]; + var book_html = '
        • ' + + 'Cover' + + '
          ' + + '

          ' + book.title + '

          ' + + '

          Author:' + book.author + '

          ' + + '

          Publisher:' + book.publisher + '

          ' + + '

          Description:' + book.summary + '

          ' + + '

          Source:Douban Books

          ' + + '
          ' + + '
        • '; + $("#book-list").append(book_html); + } + db_done = false; + } + } + + $('#do-search').click(function () { + var keyword = $('#keyword').val(); + if (keyword) { + do_search(keyword); + } + }); + + $('#get_meta').click(function () { + var book_title = $('#book_title').val(); + if (book_title) { + $('#keyword').val(book_title); + do_search(book_title); + } + }); + +}); \ No newline at end of file diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index 16e1c0b9..fe1407c9 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -1,13 +1,9 @@ -{% extends "layout.html" %} -{% block body %} -{% if book %} +{% extends "layout.html" %} {% block body %} {% if book %}
          {% if book.has_cover %} - - {% else %} - - {% endif %} + {% else %} + {% endif %}
          @@ -29,54 +25,43 @@
          -
          - - -
          -
          - - -
          -
          - - -
          -
          - - -
          - +
          + + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          - - {% if cc|length > 0 %} - {% for c in cc %} -
          - - {% if c.datatype == 'bool' %} - - - {% endif %} - {% if c.datatype in ['text', 'series'] and not c.is_multiple %} - 0 %} - value="{{ book['custom_column_' ~ c.id][0].value }}" - {% endif %}> - {% endif %} - - {% if c.datatype in ['text', 'series'] and c.is_multiple %} - 0 %} - value="{% for column in book['custom_column_' ~ c.id] %}{{ column.value.strip() }}{% if not loop.last %}, {% endif %}{% endfor %}"{% endif %}> - {% endif %} - - {% if c.datatype == 'enumeration' %} - {% endif %} {% if c.datatype in ['text', 'series'] and not c.is_multiple %} + 0 %} value="{{ book['custom_column_' ~ c.id][0].value }}" {% endif %}> {% endif %} {% if c.datatype + in ['text', 'series'] and c.is_multiple %} + 0 %} value="{% for column in book['custom_column_' ~ c.id] %}{{ column.value.strip() }}{% if + not loop.last %}, {% endif %}{% endfor %}"{% endif %}> {% endif %} {% if c.datatype == 'enumeration' %} + - {% endif %} + {% endif %} {% if c.datatype == 'rating' %} + 0 %} value="{{ '%d' % (book['custom_column_' ~ c.id][0].value / + 2) }}" {% endif %}> {% endif %} +
          + {% endfor %} {% endif %} + - {% if c.datatype == 'rating' %} - 0 %} - value="{{ '%d' % (book['custom_column_' ~ c.id][0].value / 2) }}" - {% endif %}> - {% endif %} - - {% endfor %} - {% endif %} - -
          + {{_('Get Meta Data')}} {{_('Back')}} @@ -115,6 +95,14 @@ -{% endblock %} - -{% block js %} +{% endblock %} {% block js %} - -{% endblock %} -{% block header %} - -{% endblock %} + +{% endblock %} {% block header %} + {% endblock %} \ No newline at end of file From f44574af67797b77f01eebba27fdbd707ca5899a Mon Sep 17 00:00:00 2001 From: idalin Date: Tue, 28 Feb 2017 15:05:14 +0800 Subject: [PATCH 4/7] update Chinese translation. --- .../zh_Hans_CN/LC_MESSAGES/messages.mo | Bin 300036 -> 300023 bytes .../zh_Hans_CN/LC_MESSAGES/messages.po | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo index c4c7af273df39ce97deb2bcde99894a7d299097a..43ea4912cd952bd685b64114c5dc1793157036a4 100644 GIT binary patch delta 49117 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 delta 48975 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 diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po index 1dca04ac..1bc17782 100644 --- a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po +++ b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po @@ -325,7 +325,7 @@ msgstr "发送测试邮件时发生错误: %(res)s" #: cps/web.py:1816 msgid "E-Mail settings updated" -msgstr "" +msgstr "E-Mail 设置已更新" #: cps/web.py:1817 msgid "Edit mail settings" @@ -357,11 +357,11 @@ msgstr "编辑元数据" #: cps/web.py:2162 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" -msgstr "" +msgstr "不能上传后缀为 \"%s\" 的文件到此服务器" #: cps/web.py:2168 msgid "File to be uploaded must have an extension" -msgstr "" +msgstr "要上传的文件必须有一个后缀" #: cps/web.py:2185 #, python-format From 338ca61cf912e06e216485da51254a40b420608f Mon Sep 17 00:00:00 2001 From: idalin Date: Tue, 28 Feb 2017 15:17:37 +0800 Subject: [PATCH 5/7] fixed douban api not working in some cases --- cps/static/js/get_meta.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cps/static/js/get_meta.js b/cps/static/js/get_meta.js index 59b5523c..f2b8fda3 100644 --- a/cps/static/js/get_meta.js +++ b/cps/static/js/get_meta.js @@ -24,17 +24,14 @@ $(document).ready(function () { return this.replace(new RegExp(s1, "gm"), s2);   } - $.ajaxSetup({ - type: "GET", - dataType: "jsonp", - jsonp: 'callback', - }); - gg_search_book = function (title) { title = title.replaceAll(/\s+/, '+'); var url = google + gg_search + '?q=' + title; $.ajax({ url: url, + type: "GET", + dataType: "jsonp", + jsonp: 'callback', success: function (data) { gg_results = data.items; }, @@ -89,6 +86,9 @@ $(document).ready(function () { var url = douban + db_search + '?q=' + title + '&fields=all&count=10'; $.ajax({ url: url, + type: "GET", + dataType: "jsonp", + jsonp: 'callback', success: function (data) { db_results = data.books; }, From a6b2977286b61affc8e5795879a2703a8bcc366e Mon Sep 17 00:00:00 2001 From: idalin Date: Tue, 7 Mar 2017 09:46:09 +0800 Subject: [PATCH 6/7] add i18n message for getmeta feature. --- cps/static/js/get_meta.js | 25 +++---- cps/templates/book_edit.html | 128 ++++++++++++++++++++++------------- 2 files changed, 93 insertions(+), 60 deletions(-) diff --git a/cps/static/js/get_meta.js b/cps/static/js/get_meta.js index f2b8fda3..2ee182bc 100644 --- a/cps/static/js/get_meta.js +++ b/cps/static/js/get_meta.js @@ -6,6 +6,7 @@ */ $(document).ready(function () { + var msg = i18n_msg; var douban = 'https://api.douban.com'; var db_search = '/v2/book/search'; var db_get_info = '/v2/book/'; @@ -74,7 +75,7 @@ $(document).ready(function () { } do_search = function (keyword) { show_flag = 0; - $('#meta-info').text('Loading...'); + $('#meta-info').text(msg.loading); var keyword = $('#keyword').val(); if (keyword) { db_search_book(keyword); @@ -93,7 +94,7 @@ $(document).ready(function () { db_results = data.books; }, error: function () { - $('#meta-info').html('

          Search error!

          '); + $('#meta-info').html('

          '+ msg.search_error+'!

          '); }, complete: function () { db_done = true; @@ -108,8 +109,8 @@ $(document).ready(function () { $('#meta-info').html('
            '); } if (gg_done && db_done) { - if (gg_results.length < 1 && db_results.length < 1) { - $('#meta-info').html('

            No Result! Please try anonther keyword.

            '); + if (!gg_results || !db_results) { + $('#meta-info').html('

            '+ msg.no_result +'

            '); return; } } @@ -129,10 +130,10 @@ $(document).ready(function () { '
            ' + '

            ' + book.volumeInfo.title + '

            ' + - '

            Author:' + book.volumeInfo.authors + '

            ' + - '

            Publisher:' + book.volumeInfo.publisher + '

            ' + - '

            Description:' + book.volumeInfo.description + '

            ' + - '

            Source:Google Books

            ' + + '

            '+ msg.author +':' + book.volumeInfo.authors + '

            ' + + '

            '+ msg.publisher + ':' + book.volumeInfo.publisher + '

            ' + + '

            '+ msg.description + ':' + book.volumeInfo.description + '

            ' + + '

            '+ msg.source + ':Google Books

            ' + '
            ' + ''; $("#book-list").append(book_html); @@ -149,10 +150,10 @@ $(document).ready(function () { '
            ' + '

            ' + book.title + '

            ' + - '

            Author:' + book.author + '

            ' + - '

            Publisher:' + book.publisher + '

            ' + - '

            Description:' + book.summary + '

            ' + - '

            Source:Douban Books

            ' + + '

            ' + msg.author + ':' + book.author + '

            ' + + '

            ' + msg.publisher + ':' + book.publisher + '

            ' + + '

            ' + msg.description + ':' + book.summary + '

            ' + + '

            ' + msg.source + ':Douban Books

            ' + '
            ' + ''; $("#book-list").append(book_html); diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index 3db04558..d35812e6 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -1,9 +1,13 @@ -{% extends "layout.html" %} {% block body %} {% if book %} +{% extends "layout.html" %} +{% block body %} +{% if book %}
            {% if book.has_cover %} - {% else %} - {% endif %} + + {% else %} + + {% endif %}
            @@ -25,43 +29,54 @@
            -
            - - -
            -
            - - -
            -
            - - -
            -
            - - -
            - +
            + + +
            +
            + + +
            +
            + + +
            +
            + + +
            +
            - - {% if cc|length > 0 %} {% for c in cc %} -
            - {% if c.datatype == 'bool' %} - - {% endif %} {% if c.datatype in ['text', 'series'] and not c.is_multiple %} - 0 %} value="{{ book['custom_column_' ~ c.id][0].value }}" {% endif %}> {% endif %} {% if c.datatype - in ['text', 'series'] and c.is_multiple %} - 0 %} value="{% for column in book['custom_column_' ~ c.id] %}{{ column.value.strip() }}{% if - not loop.last %}, {% endif %}{% endfor %}"{% endif %}> {% endif %} {% if c.datatype == 'enumeration' %} - + {% endif %} + {% if c.datatype in ['text', 'series'] and not c.is_multiple %} + 0 %} + value="{{ book['custom_column_' ~ c.id][0].value }}" + {% endif %}> + {% endif %} + + {% if c.datatype in ['text', 'series'] and c.is_multiple %} + 0 %} + value="{% for column in book['custom_column_' ~ c.id] %}{{ column.value.strip() }}{% if not loop.last %}, {% endif %}{% endfor %}"{% endif %}> + {% endif %} + + {% if c.datatype == 'enumeration' %} + {% endif %} {% if c.datatype == 'rating' %} - 0 %} value="{{ '%d' % (book['custom_column_' ~ c.id][0].value / - 2) }}" {% endif %}> {% endif %} -
            - {% endfor %} {% endif %} - + + {% endif %} + {% if c.datatype == 'rating' %} + 0 %} + value="{{ '%d' % (book['custom_column_' ~ c.id][0].value / 2) }}" + {% endif %}> + {% endif %} + + {% endfor %} + {% endif %} + +
            - {{_('Get Meta Data')}} + {{_('Get Metadata')}} {{_('Back')}} @@ -94,14 +115,14 @@ -{% endblock %} +{% endblock %} {% block js %} + -{% endblock %} +{% endblock %} {% block header %} - -{% endblock %} \ No newline at end of file + +{% endblock %} From bdf28e1475d4aa8aa2e48b73444be2440207cc05 Mon Sep 17 00:00:00 2001 From: idalin Date: Tue, 7 Mar 2017 09:49:59 +0800 Subject: [PATCH 7/7] fix bug for metadata searching result. --- cps/static/js/get_meta.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cps/static/js/get_meta.js b/cps/static/js/get_meta.js index 2ee182bc..2cec1252 100644 --- a/cps/static/js/get_meta.js +++ b/cps/static/js/get_meta.js @@ -109,7 +109,7 @@ $(document).ready(function () { $('#meta-info').html('
              '); } if (gg_done && db_done) { - if (!gg_results || !db_results) { + if (!gg_results && !db_results) { $('#meta-info').html('

              '+ msg.no_result +'

              '); return; }