mirror of
				https://github.com/janeczku/calibre-web
				synced 2025-10-31 15:23:02 +00:00 
			
		
		
		
	First fix for #2325 (edit book table with readonly database)
This commit is contained in:
		
							
								
								
									
										152
									
								
								cps/editbooks.py
									
									
									
									
									
								
							
							
						
						
									
										152
									
								
								cps/editbooks.py
									
									
									
									
									
								
							| @@ -1152,80 +1152,81 @@ def edit_list_book(param): | |||||||
|     vals = request.form.to_dict() |     vals = request.form.to_dict() | ||||||
|     book = calibre_db.get_book(vals['pk']) |     book = calibre_db.get_book(vals['pk']) | ||||||
|     # ret = "" |     # ret = "" | ||||||
|     if param == 'series_index': |  | ||||||
|         edit_book_series_index(vals['value'], book) |  | ||||||
|         ret = Response(json.dumps({'success': True, 'newValue': book.series_index}), mimetype='application/json') |  | ||||||
|     elif param == 'tags': |  | ||||||
|         edit_book_tags(vals['value'], book) |  | ||||||
|         ret = Response(json.dumps({'success': True, 'newValue': ', '.join([tag.name for tag in book.tags])}), |  | ||||||
|                        mimetype='application/json') |  | ||||||
|     elif param == 'series': |  | ||||||
|         edit_book_series(vals['value'], book) |  | ||||||
|         ret = Response(json.dumps({'success': True, 'newValue':  ', '.join([serie.name for serie in book.series])}), |  | ||||||
|                        mimetype='application/json') |  | ||||||
|     elif param == 'publishers': |  | ||||||
|         edit_book_publisher(vals['value'], book) |  | ||||||
|         ret = Response(json.dumps({'success': True, |  | ||||||
|                                     'newValue': ', '.join([publisher.name for publisher in book.publishers])}), |  | ||||||
|                        mimetype='application/json') |  | ||||||
|     elif param == 'languages': |  | ||||||
|         invalid = list() |  | ||||||
|         edit_book_languages(vals['value'], book, invalid=invalid) |  | ||||||
|         if invalid: |  | ||||||
|             ret = Response(json.dumps({'success': False, |  | ||||||
|                                        'msg': 'Invalid languages in request: {}'.format(','.join(invalid))}), |  | ||||||
|                            mimetype='application/json') |  | ||||||
|         else: |  | ||||||
|             lang_names = list() |  | ||||||
|             for lang in book.languages: |  | ||||||
|                 lang_names.append(isoLanguages.get_language_name(get_locale(), lang.lang_code)) |  | ||||||
|             ret = Response(json.dumps({'success': True, 'newValue':  ', '.join(lang_names)}), |  | ||||||
|                             mimetype='application/json') |  | ||||||
|     elif param == 'author_sort': |  | ||||||
|         book.author_sort = vals['value'] |  | ||||||
|         ret = Response(json.dumps({'success': True, 'newValue':  book.author_sort}), |  | ||||||
|                        mimetype='application/json') |  | ||||||
|     elif param == 'title': |  | ||||||
|         sort = book.sort |  | ||||||
|         handle_title_on_edit(book, vals.get('value', "")) |  | ||||||
|         helper.update_dir_structure(book.id, config.config_calibre_dir) |  | ||||||
|         ret = Response(json.dumps({'success': True, 'newValue':  book.title}), |  | ||||||
|                        mimetype='application/json') |  | ||||||
|     elif param == 'sort': |  | ||||||
|         book.sort = vals['value'] |  | ||||||
|         ret = Response(json.dumps({'success': True, 'newValue':  book.sort}), |  | ||||||
|                        mimetype='application/json') |  | ||||||
|     elif param == 'comments': |  | ||||||
|         edit_book_comments(vals['value'], book) |  | ||||||
|         ret = Response(json.dumps({'success': True, 'newValue':  book.comments[0].text}), |  | ||||||
|                        mimetype='application/json') |  | ||||||
|     elif param == 'authors': |  | ||||||
|         input_authors, __, renamed = handle_author_on_edit(book, vals['value'], vals.get('checkA', None) == "true") |  | ||||||
|         helper.update_dir_structure(book.id, config.config_calibre_dir, input_authors[0], renamed_author=renamed) |  | ||||||
|         ret = Response(json.dumps({'success': True, |  | ||||||
|                                    'newValue':  ' & '.join([author.replace('|',',') for author in input_authors])}), |  | ||||||
|                        mimetype='application/json') |  | ||||||
|     elif param == 'is_archived': |  | ||||||
|         change_archived_books(book.id, vals['value'] == "True") |  | ||||||
|         ret = "" |  | ||||||
|     elif param == 'read_status': |  | ||||||
|         ret = helper.edit_book_read_status(book.id, vals['value'] == "True") |  | ||||||
|         if ret: |  | ||||||
|             return ret, 400 |  | ||||||
|     elif param.startswith("custom_column_"): |  | ||||||
|         new_val = dict() |  | ||||||
|         new_val[param] = vals['value'] |  | ||||||
|         edit_single_cc_data(book.id, book, param[14:], new_val) |  | ||||||
|         # ToDo: Very hacky find better solution |  | ||||||
|         if vals['value'] in ["True", "False"]: |  | ||||||
|             ret = "" |  | ||||||
|         else: |  | ||||||
|             ret = Response(json.dumps({'success': True, 'newValue': vals['value']}), |  | ||||||
|                            mimetype='application/json') |  | ||||||
|     else: |  | ||||||
|         return _("Parameter not found"), 400 |  | ||||||
|     book.last_modified = datetime.utcnow() |  | ||||||
|     try: |     try: | ||||||
|  |         if param == 'series_index': | ||||||
|  |             edit_book_series_index(vals['value'], book) | ||||||
|  |             ret = Response(json.dumps({'success': True, 'newValue': book.series_index}), mimetype='application/json') | ||||||
|  |         elif param == 'tags': | ||||||
|  |             edit_book_tags(vals['value'], book) | ||||||
|  |             ret = Response(json.dumps({'success': True, 'newValue': ', '.join([tag.name for tag in book.tags])}), | ||||||
|  |                            mimetype='application/json') | ||||||
|  |         elif param == 'series': | ||||||
|  |             edit_book_series(vals['value'], book) | ||||||
|  |             ret = Response(json.dumps({'success': True, 'newValue':  ', '.join([serie.name for serie in book.series])}), | ||||||
|  |                            mimetype='application/json') | ||||||
|  |         elif param == 'publishers': | ||||||
|  |             edit_book_publisher(vals['value'], book) | ||||||
|  |             ret = Response(json.dumps({'success': True, | ||||||
|  |                                         'newValue': ', '.join([publisher.name for publisher in book.publishers])}), | ||||||
|  |                            mimetype='application/json') | ||||||
|  |         elif param == 'languages': | ||||||
|  |             invalid = list() | ||||||
|  |             edit_book_languages(vals['value'], book, invalid=invalid) | ||||||
|  |             if invalid: | ||||||
|  |                 ret = Response(json.dumps({'success': False, | ||||||
|  |                                            'msg': 'Invalid languages in request: {}'.format(','.join(invalid))}), | ||||||
|  |                                mimetype='application/json') | ||||||
|  |             else: | ||||||
|  |                 lang_names = list() | ||||||
|  |                 for lang in book.languages: | ||||||
|  |                     lang_names.append(isoLanguages.get_language_name(get_locale(), lang.lang_code)) | ||||||
|  |                 ret = Response(json.dumps({'success': True, 'newValue':  ', '.join(lang_names)}), | ||||||
|  |                                 mimetype='application/json') | ||||||
|  |         elif param == 'author_sort': | ||||||
|  |             book.author_sort = vals['value'] | ||||||
|  |             ret = Response(json.dumps({'success': True, 'newValue':  book.author_sort}), | ||||||
|  |                            mimetype='application/json') | ||||||
|  |         elif param == 'title': | ||||||
|  |             sort = book.sort | ||||||
|  |             handle_title_on_edit(book, vals.get('value', "")) | ||||||
|  |             helper.update_dir_structure(book.id, config.config_calibre_dir) | ||||||
|  |             ret = Response(json.dumps({'success': True, 'newValue':  book.title}), | ||||||
|  |                            mimetype='application/json') | ||||||
|  |         elif param == 'sort': | ||||||
|  |             book.sort = vals['value'] | ||||||
|  |             ret = Response(json.dumps({'success': True, 'newValue':  book.sort}), | ||||||
|  |                            mimetype='application/json') | ||||||
|  |         elif param == 'comments': | ||||||
|  |             edit_book_comments(vals['value'], book) | ||||||
|  |             ret = Response(json.dumps({'success': True, 'newValue':  book.comments[0].text}), | ||||||
|  |                            mimetype='application/json') | ||||||
|  |         elif param == 'authors': | ||||||
|  |             input_authors, __, renamed = handle_author_on_edit(book, vals['value'], vals.get('checkA', None) == "true") | ||||||
|  |             helper.update_dir_structure(book.id, config.config_calibre_dir, input_authors[0], renamed_author=renamed) | ||||||
|  |             ret = Response(json.dumps({'success': True, | ||||||
|  |                                        'newValue':  ' & '.join([author.replace('|',',') for author in input_authors])}), | ||||||
|  |                            mimetype='application/json') | ||||||
|  |         elif param == 'is_archived': | ||||||
|  |             change_archived_books(book.id, vals['value'] == "True") | ||||||
|  |             ret = "" | ||||||
|  |         elif param == 'read_status': | ||||||
|  |             ret = helper.edit_book_read_status(book.id, vals['value'] == "True") | ||||||
|  |             if ret: | ||||||
|  |                 return ret, 400 | ||||||
|  |         elif param.startswith("custom_column_"): | ||||||
|  |             new_val = dict() | ||||||
|  |             new_val[param] = vals['value'] | ||||||
|  |             edit_single_cc_data(book.id, book, param[14:], new_val) | ||||||
|  |             # ToDo: Very hacky find better solution | ||||||
|  |             if vals['value'] in ["True", "False"]: | ||||||
|  |                 ret = "" | ||||||
|  |             else: | ||||||
|  |                 ret = Response(json.dumps({'success': True, 'newValue': vals['value']}), | ||||||
|  |                                mimetype='application/json') | ||||||
|  |         else: | ||||||
|  |             return _("Parameter not found"), 400 | ||||||
|  |         book.last_modified = datetime.utcnow() | ||||||
|  |  | ||||||
|         calibre_db.session.commit() |         calibre_db.session.commit() | ||||||
|         # revert change for sort if automatic fields link is deactivated |         # revert change for sort if automatic fields link is deactivated | ||||||
|         if param == 'title' and vals.get('checkT') == "false": |         if param == 'title' and vals.get('checkT') == "false": | ||||||
| @@ -1233,7 +1234,10 @@ def edit_list_book(param): | |||||||
|             calibre_db.session.commit() |             calibre_db.session.commit() | ||||||
|     except (OperationalError, IntegrityError) as e: |     except (OperationalError, IntegrityError) as e: | ||||||
|         calibre_db.session.rollback() |         calibre_db.session.rollback() | ||||||
|         log.error("Database error: %s", e) |         log.error("Database error: {}".format(e)) | ||||||
|  |         ret = Response(json.dumps({'success': False, | ||||||
|  |                                    'msg': 'Database error: {}'.format(e.orig)}), | ||||||
|  |                        mimetype='application/json') | ||||||
|     return ret |     return ret | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Ozzie Isaacs
					Ozzie Isaacs