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