From b2146ba4b993df47bcdaca9bdc3a26df46d3bcf2 Mon Sep 17 00:00:00 2001 From: Cervinko Cera Date: Thu, 21 Apr 2016 19:18:52 +0200 Subject: [PATCH] add support for is_multiple custom columns --- cps/templates/edit_book.html | 12 +++-- cps/web.py | 94 +++++++++++++++++++++++++++--------- 2 files changed, 79 insertions(+), 27 deletions(-) diff --git a/cps/templates/edit_book.html b/cps/templates/edit_book.html index b553db18..2c7b8a37 100644 --- a/cps/templates/edit_book.html +++ b/cps/templates/edit_book.html @@ -47,11 +47,17 @@ {% for c in cc %}
- {% if c.datatype in ['text', 'series'] %} + {% if c.datatype in ['text', 'series'] and not c.is_multiple %} 0 %} - {% for column in book['custom_column_' ~ c.id] %} - value="{{ column.value }}{% if not loop.last %}, {% endif %}{% endfor %}"{% endif %}> + 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' %} diff --git a/cps/web.py b/cps/web.py index 9ac0441a..05a94793 100755 --- a/cps/web.py +++ b/cps/web.py @@ -840,37 +840,83 @@ def edit_book(book_id): for c in cc: cc_string = "custom_column_" + str(c.id) - if len(getattr(book, cc_string)) > 0: - cc_db_value = getattr(book, cc_string)[0].value - else: - cc_db_value = None - if to_save[cc_string].strip(): - if c.datatype == 'rating': - to_save[cc_string] = str(int(float(to_save[cc_string]) *2)) - print to_save[cc_string] - if to_save[cc_string].strip() != cc_db_value: + if not c.is_multiple: + if len(getattr(book, cc_string)) > 0: + cc_db_value = getattr(book, cc_string)[0].value + else: + cc_db_value = None + if to_save[cc_string].strip(): + if c.datatype == 'rating': + to_save[cc_string] = str(int(float(to_save[cc_string]) *2)) + print to_save[cc_string] + if to_save[cc_string].strip() != cc_db_value: + if cc_db_value != None: + #remove old cc_val + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + if len(del_cc.books) == 0: + db.session.delete(del_cc) + cc_class = db.cc_classes[c.id] + new_cc = db.session.query(cc_class).filter(cc_class.value == to_save[cc_string].strip()).first() + # if no cc val is found add it + if new_cc == None: + new_cc = cc_class(value=to_save[cc_string].strip()) + db.session.add(new_cc) + new_cc = db.session.query(cc_class).filter(cc_class.value == to_save[cc_string].strip()).first() + # add cc value to book + getattr(book, cc_string).append(new_cc) + else: if cc_db_value != None: #remove old cc_val del_cc = getattr(book, cc_string)[0] getattr(book, cc_string).remove(del_cc) if len(del_cc.books) == 0: db.session.delete(del_cc) - cc_class = db.cc_classes[c.id] - new_cc = db.session.query(cc_class).filter(cc_class.value == to_save[cc_string].strip()).first() - # if no cc val is found add it - if new_cc == None: - new_cc = cc_class(value=to_save[cc_string].strip()) - db.session.add(new_cc) - new_cc = db.session.query(cc_class).filter(cc_class.value == to_save[cc_string].strip()).first() - # add cc value to book - getattr(book, cc_string).append(new_cc) else: - if cc_db_value != None: - #remove old cc_val - del_cc = getattr(book, cc_string)[0] - getattr(book, cc_string).remove(del_cc) - if len(del_cc.books) == 0: - db.session.delete(del_cc) + input_tags = to_save[cc_string].split(',') + input_tags = map(lambda it: it.strip(), input_tags) + input_tags = [x for x in input_tags if x != ''] + # we have all author names now + # 1. search for tags to remove + del_tags = [] + for c_tag in getattr(book, cc_string): + found = False + for inp_tag in input_tags: + if inp_tag == c_tag.value: + found = True + break; + # if the tag was not found in the new list, add him to remove list + if not found: + del_tags.append(c_tag) + # 2. search for tags that need to be added + add_tags = [] + for inp_tag in input_tags: + found = False + for c_tag in getattr(book, cc_string): + if inp_tag == c_tag.value: + found = True + break; + if not found: + add_tags.append(inp_tag) + # if there are tags to remove, we remove them now + if len(del_tags) > 0: + for del_tag in del_tags: + getattr(book, cc_string).remove(del_tag) + if len(del_tag.books) == 0: + db.session.delete(del_tag) + # if there are tags to add, we add them now! + if len(add_tags) > 0: + for add_tag in add_tags: + # check if a tag with that name exists + new_tag = db.session.query(db.cc_classes[c.id]).filter(db.cc_classes[c.id].value == add_tag).first() + # if no tag is found add it + if new_tag == None: + print add_tag + new_tag = db.cc_classes[c.id](value=add_tag) + db.session.add(new_tag) + new_tag = db.session.query(db.cc_classes[c.id]).filter(db.cc_classes[c.id].value == add_tag).first() + # add tag to book + getattr(book, cc_string).append(new_tag) db.session.commit() author_names = []