Enabled editing of "number" custom_columns in books list
This commit is contained in:
		
							parent
							
								
									6f1e78b9a3
								
							
						
					
					
						commit
						9d5e9b28ae
					
				|  | @ -395,7 +395,7 @@ class AlchemyEncoder(json.JSONEncoder): | ||||||
|         if isinstance(o.__class__, DeclarativeMeta): |         if isinstance(o.__class__, DeclarativeMeta): | ||||||
|             # an SQLAlchemy class |             # an SQLAlchemy class | ||||||
|             fields = {} |             fields = {} | ||||||
|             for field in [x for x in dir(o) if not x.startswith('_') and x != 'metadata' and x!="password"]: |             for field in [x for x in dir(o) if not x.startswith('_') and x != 'metadata' and x != "password"]: | ||||||
|                 if field == 'books': |                 if field == 'books': | ||||||
|                     continue |                     continue | ||||||
|                 data = o.__getattribute__(field) |                 data = o.__getattribute__(field) | ||||||
|  | @ -404,8 +404,11 @@ class AlchemyEncoder(json.JSONEncoder): | ||||||
|                         data = data.replace("'", "\'") |                         data = data.replace("'", "\'") | ||||||
|                     elif isinstance(data, InstrumentedList): |                     elif isinstance(data, InstrumentedList): | ||||||
|                         el = list() |                         el = list() | ||||||
|  |                         # ele = None | ||||||
|                         for ele in data: |                         for ele in data: | ||||||
|                             if ele.get: |                             if hasattr(ele, 'value'):       # converter for custom_column values | ||||||
|  |                                 el = [str(ele.value)] | ||||||
|  |                             elif ele.get: | ||||||
|                                 el.append(ele.get()) |                                 el.append(ele.get()) | ||||||
|                             else: |                             else: | ||||||
|                                 el.append(json.dumps(ele, cls=AlchemyEncoder)) |                                 el.append(json.dumps(ele, cls=AlchemyEncoder)) | ||||||
|  |  | ||||||
|  | @ -573,10 +573,19 @@ def edit_cc_data_string(book, c, to_save, cc_db_value, cc_string): | ||||||
|         getattr(book, cc_string).append(new_cc) |         getattr(book, cc_string).append(new_cc) | ||||||
|     return changed, to_save |     return changed, to_save | ||||||
| 
 | 
 | ||||||
|  | def edit_single_cc_data(book_id, book, column_id, to_save): | ||||||
|  |     cc = (calibre_db.session.query(db.Custom_Columns) | ||||||
|  |           .filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)) | ||||||
|  |           .filter(db.Custom_Columns.id == column_id) | ||||||
|  |           .all()) | ||||||
|  |     return edit_cc_data(book_id, book, to_save, cc) | ||||||
| 
 | 
 | ||||||
| def edit_cc_data(book_id, book, to_save): | def edit_all_cc_data(book_id, book, to_save): | ||||||
|     changed = False |  | ||||||
|     cc = calibre_db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all() |     cc = calibre_db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all() | ||||||
|  |     return edit_cc_data(book_id, book, to_save, cc) | ||||||
|  | 
 | ||||||
|  | def edit_cc_data(book_id, book, to_save, cc): | ||||||
|  |     changed = False | ||||||
|     for c in cc: |     for c in cc: | ||||||
|         cc_string = "custom_column_" + str(c.id) |         cc_string = "custom_column_" + str(c.id) | ||||||
|         if not c.is_multiple: |         if not c.is_multiple: | ||||||
|  | @ -811,7 +820,7 @@ def edit_book(book_id): | ||||||
|             # handle book ratings |             # handle book ratings | ||||||
|             modif_date |= edit_book_ratings(to_save, book) |             modif_date |= edit_book_ratings(to_save, book) | ||||||
|             # handle cc data |             # handle cc data | ||||||
|             modif_date |= edit_cc_data(book_id, book, to_save) |             modif_date |= edit_all_cc_data(book_id, book, to_save) | ||||||
| 
 | 
 | ||||||
|             if to_save["pubdate"]: |             if to_save["pubdate"]: | ||||||
|                 try: |                 try: | ||||||
|  | @ -1131,10 +1140,6 @@ def edit_list_book(param): | ||||||
|             lang_names = list() |             lang_names = list() | ||||||
|             for lang in book.languages: |             for lang in book.languages: | ||||||
|                 lang_names.append(isoLanguages.get_language_name(get_locale(), lang.lang_code)) |                 lang_names.append(isoLanguages.get_language_name(get_locale(), lang.lang_code)) | ||||||
|                 #try: |  | ||||||
|                 #    lang_names.append(LC.parse(lang.lang_code).get_language_name(get_locale())) |  | ||||||
|                 #except UnknownLocaleError: |  | ||||||
|                 #    lang_names.append(_(isoLanguages.get(part3=lang.lang_code).name)) |  | ||||||
|             ret =  Response(json.dumps({'success': True, 'newValue':  ', '.join(lang_names)}), |             ret =  Response(json.dumps({'success': True, 'newValue':  ', '.join(lang_names)}), | ||||||
|                             mimetype='application/json') |                             mimetype='application/json') | ||||||
|     elif param =='author_sort': |     elif param =='author_sort': | ||||||
|  | @ -1157,6 +1162,13 @@ def edit_list_book(param): | ||||||
|         ret = Response(json.dumps({'success': True, |         ret = Response(json.dumps({'success': True, | ||||||
|                                    'newValue':  ' & '.join([author.replace('|',',') for author in input_authors])}), |                                    'newValue':  ' & '.join([author.replace('|',',') for author in input_authors])}), | ||||||
|                        mimetype='application/json') |                        mimetype='application/json') | ||||||
|  |     elif param.startswith("custom_column_"): | ||||||
|  |         new_val = dict() | ||||||
|  |         new_val[param] = vals['value'] | ||||||
|  |         edit_single_cc_data(book.id, book, param[14:], new_val) | ||||||
|  |         ret = Response(json.dumps({'success': True, 'newValue': vals['value']}), | ||||||
|  |                        mimetype='application/json') | ||||||
|  | 
 | ||||||
|     book.last_modified = datetime.utcnow() |     book.last_modified = datetime.utcnow() | ||||||
|     try: |     try: | ||||||
|         calibre_db.session.commit() |         calibre_db.session.commit() | ||||||
|  |  | ||||||
|  | @ -639,6 +639,10 @@ function singlecheckboxFormatter(value, row){ | ||||||
|         return '<input type="checkbox" class="chk" data-pk="' + row.id + '" data-name="' + this.field + '" onchange="checkboxChange(this, ' + row.id + ', \'' + this.name + '\', 0)">'; |         return '<input type="checkbox" class="chk" data-pk="' + row.id + '" data-name="' + this.field + '" onchange="checkboxChange(this, ' + row.id + ', \'' + this.name + '\', 0)">'; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | function ratingFormatter(value, row) { | ||||||
|  |     return (value/2); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| /* Do some hiding disabling after user list is loaded */ | /* Do some hiding disabling after user list is loaded */ | ||||||
| function loadSuccess() { | function loadSuccess() { | ||||||
|  |  | ||||||
|  | @ -59,6 +59,17 @@ | ||||||
|             {{ text_table_row('languages', _('Enter Languages'),_('Languages'), false, true) }} |             {{ text_table_row('languages', _('Enter Languages'),_('Languages'), false, true) }} | ||||||
|             <!--th data-field="pubdate" data-type="date" data-visible="{{visiblility.get('pubdate')}}" data-viewformat="dd.mm.yyyy" id="pubdate" data-sortable="true">{{_('Publishing Date')}}</th--> |             <!--th data-field="pubdate" data-type="date" data-visible="{{visiblility.get('pubdate')}}" data-viewformat="dd.mm.yyyy" id="pubdate" data-sortable="true">{{_('Publishing Date')}}</th--> | ||||||
|             {{ text_table_row('publishers', _('Enter Publishers'),_('Publishers'), false, true) }} |             {{ text_table_row('publishers', _('Enter Publishers'),_('Publishers'), false, true) }} | ||||||
|  |             {% for c in cc %} | ||||||
|  |               {% if c.datatype == "int" %} | ||||||
|  |                 <th data-field="custom_column_{{ c.id|string }}" id="custom_column_{{ c.id|string }}" data-visible="{{visiblility.get('custom_column_'+ c.id|string)}}" data-sortable="false" {% if g.user.role_edit() %} data-editable-type="number" data-editable-placeholder="1" data-editable-step="1" data-editable-url="{{ url_for('editbook.edit_list_book', param='custom_column_'+ c.id|string)}}" data-edit="true" data-editable-title="{{_('Enter ') + c.name}}"{% endif %}>{{c.name}}</th> | ||||||
|  |               {% elif c.datatype == "rating" %} | ||||||
|  |                 <th data-field="custom_column_{{ c.id|string }}" id="custom_column_{{ c.id|string }}" data-formatter="ratingFormatter" data-visible="{{visiblility.get('custom_column_'+ c.id|string)}}" data-sortable="false" {% if g.user.role_edit() %} data-editable-type="number" data-editable-placeholder="1" data-editable-step="1" data-editable-min="0" data-editable-max="10" data-editable-url="{{ url_for('editbook.edit_list_book', param='custom_column_'+ c.id|string)}}" data-edit="true" data-editable-title="{{_('Enter ') + c.name}}"{% endif %}>{{c.name}}</th> | ||||||
|  |               {% elif c.datatype == "float" %} | ||||||
|  |                 <th data-field="custom_column_{{ c.id|string }}" id="custom_column_{{ c.id|string }}" data-visible="{{visiblility.get('custom_column_'+ c.id|string)}}" data-sortable="false" {% if g.user.role_edit() %} data-editable-type="number" data-editable-placeholder="1" data-editable-step="0.01" data-editable-url="{{ url_for('editbook.edit_list_book', param='custom_column_'+ c.id|string)}}" data-edit="true" data-editable-title="{{_('Enter ') + c.name}}"{% endif %}>{{c.name}}</th> | ||||||
|  |               {% else %} | ||||||
|  |                 <!--{{ text_table_row('custom_column_' + c.id|string, _('Enter ') + c.name, c.name, false, false) }} --> | ||||||
|  |               {% endif %} | ||||||
|  |             {% endfor %} | ||||||
|           {% if g.user.role_delete_books() and g.user.role_edit()%} |           {% if g.user.role_delete_books() and g.user.role_edit()%} | ||||||
|             <th data-align="right" data-formatter="EbookActions" data-switchable="false">{{_('Delete')}}</th> |             <th data-align="right" data-formatter="EbookActions" data-switchable="false">{{_('Delete')}}</th> | ||||||
|           {% endif %} |           {% endif %} | ||||||
|  |  | ||||||
|  | @ -765,7 +765,8 @@ def books_list(data, sort_param, book_id, page): | ||||||
| @login_required | @login_required | ||||||
| def books_table(): | def books_table(): | ||||||
|     visibility = current_user.view_settings.get('table', {}) |     visibility = current_user.view_settings.get('table', {}) | ||||||
|     return render_title_template('book_table.html', title=_(u"Books List"), page="book_table", |     cc = get_cc_columns(filter_config_custom_read=True) | ||||||
|  |     return render_title_template('book_table.html', title=_(u"Books List"), cc=cc, page="book_table", | ||||||
|                                  visiblility=visibility) |                                  visiblility=visibility) | ||||||
| 
 | 
 | ||||||
| @web.route("/ajax/listbooks") | @web.route("/ajax/listbooks") | ||||||
|  | @ -822,12 +823,6 @@ def list_books(): | ||||||
|         for index in range(0, len(entry.languages)): |         for index in range(0, len(entry.languages)): | ||||||
|             entry.languages[index].language_name = isoLanguages.get_language_name(get_locale(), entry.languages[ |             entry.languages[index].language_name = isoLanguages.get_language_name(get_locale(), entry.languages[ | ||||||
|                 index].lang_code) |                 index].lang_code) | ||||||
|             #try: |  | ||||||
|             #    entry.languages[index].language_name = LC.parse(entry.languages[index].lang_code)\ |  | ||||||
|             #        .get_language_name(get_locale()) |  | ||||||
|             #except UnknownLocaleError: |  | ||||||
|             #    entry.languages[index].language_name = _( |  | ||||||
|             #        isoLanguages.get(part3=entry.languages[index].lang_code).name) |  | ||||||
|     table_entries = {'totalNotFiltered': total_count, 'total': filtered_count, "rows": entries} |     table_entries = {'totalNotFiltered': total_count, 'total': filtered_count, "rows": entries} | ||||||
|     js_list = json.dumps(table_entries, cls=db.AlchemyEncoder) |     js_list = json.dumps(table_entries, cls=db.AlchemyEncoder) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user