Added series like custom columns #1501
This commit is contained in:
		
							parent
							
								
									b309c1fc91
								
							
						
					
					
						commit
						94ad93ebd7
					
				
							
								
								
									
										58
									
								
								cps/db.py
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								cps/db.py
									
									
									
									
									
								
							| 
						 | 
					@ -34,6 +34,7 @@ from sqlalchemy.ext.declarative import declarative_base
 | 
				
			||||||
from sqlalchemy.exc import OperationalError
 | 
					from sqlalchemy.exc import OperationalError
 | 
				
			||||||
from flask_login import current_user
 | 
					from flask_login import current_user
 | 
				
			||||||
from sqlalchemy.sql.expression import and_, true, false, text, func, or_
 | 
					from sqlalchemy.sql.expression import and_, true, false, text, func, or_
 | 
				
			||||||
 | 
					from sqlalchemy.ext.associationproxy import association_proxy
 | 
				
			||||||
from babel import Locale as LC
 | 
					from babel import Locale as LC
 | 
				
			||||||
from babel.core import UnknownLocaleError
 | 
					from babel.core import UnknownLocaleError
 | 
				
			||||||
from flask_babel import gettext as _
 | 
					from flask_babel import gettext as _
 | 
				
			||||||
| 
						 | 
					@ -48,7 +49,7 @@ except ImportError:
 | 
				
			||||||
    use_unidecode = False
 | 
					    use_unidecode = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cc_exceptions = ['datetime', 'comments', 'composite', 'series']
 | 
					cc_exceptions = ['datetime', 'comments', 'composite']
 | 
				
			||||||
cc_classes = {}
 | 
					cc_classes = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Base = declarative_base()
 | 
					Base = declarative_base()
 | 
				
			||||||
| 
						 | 
					@ -406,33 +407,45 @@ class CalibreDB(threading.Thread):
 | 
				
			||||||
            books_custom_column_links = {}
 | 
					            books_custom_column_links = {}
 | 
				
			||||||
            for row in cc:
 | 
					            for row in cc:
 | 
				
			||||||
                if row.datatype not in cc_exceptions:
 | 
					                if row.datatype not in cc_exceptions:
 | 
				
			||||||
                    books_custom_column_links[row.id] = Table('books_custom_column_' + str(row.id) + '_link', Base.metadata,
 | 
					                    if row.datatype == 'series':
 | 
				
			||||||
 | 
					                        dicttable = {'__tablename__': 'books_custom_column_' + str(row.id) + '_link',
 | 
				
			||||||
 | 
					                                     'id': Column(Integer, primary_key=True),
 | 
				
			||||||
 | 
					                                     'book': Column(Integer, ForeignKey('books.id'),
 | 
				
			||||||
 | 
					                                                    primary_key=True),
 | 
				
			||||||
 | 
					                                     'map_value': Column('value', Integer,
 | 
				
			||||||
 | 
					                                                     ForeignKey('custom_column_' +
 | 
				
			||||||
 | 
					                                                                str(row.id) + '.id'),
 | 
				
			||||||
 | 
					                                                     primary_key=True),
 | 
				
			||||||
 | 
					                                     'extra': Column(Float),
 | 
				
			||||||
 | 
					                                     'asoc' : relationship('Custom_Column_' + str(row.id), uselist=False),
 | 
				
			||||||
 | 
					                                     'value' : association_proxy('asoc', 'value')
 | 
				
			||||||
 | 
					                                     }
 | 
				
			||||||
 | 
					                        books_custom_column_links[row.id] = type(str('Books_Custom_Column_' + str(row.id) + '_link'),
 | 
				
			||||||
 | 
					                                                                 (Base,), dicttable)
 | 
				
			||||||
 | 
					                    else:
 | 
				
			||||||
 | 
					                        books_custom_column_links[row.id] = Table('books_custom_column_' + str(row.id) + '_link',
 | 
				
			||||||
 | 
					                                                                  Base.metadata,
 | 
				
			||||||
                                                                  Column('book', Integer, ForeignKey('books.id'),
 | 
					                                                                  Column('book', Integer, ForeignKey('books.id'),
 | 
				
			||||||
                                                                         primary_key=True),
 | 
					                                                                         primary_key=True),
 | 
				
			||||||
                                                                  Column('value', Integer,
 | 
					                                                                  Column('value', Integer,
 | 
				
			||||||
                                                                     ForeignKey('custom_column_' + str(row.id) + '.id'),
 | 
					                                                                         ForeignKey('custom_column_' +
 | 
				
			||||||
 | 
					                                                                                    str(row.id) + '.id'),
 | 
				
			||||||
                                                                         primary_key=True)
 | 
					                                                                         primary_key=True)
 | 
				
			||||||
                                                                  )
 | 
					                                                                  )
 | 
				
			||||||
                    cc_ids.append([row.id, row.datatype])
 | 
					                    cc_ids.append([row.id, row.datatype])
 | 
				
			||||||
                    if row.datatype == 'bool':
 | 
					
 | 
				
			||||||
                    ccdict = {'__tablename__': 'custom_column_' + str(row.id),
 | 
					                    ccdict = {'__tablename__': 'custom_column_' + str(row.id),
 | 
				
			||||||
                                  'id': Column(Integer, primary_key=True),
 | 
					                              'id': Column(Integer, primary_key=True)}
 | 
				
			||||||
                                  'book': Column(Integer, ForeignKey('books.id')),
 | 
					                    if row.datatype == 'float':
 | 
				
			||||||
                                  'value': Column(Boolean)}
 | 
					                        ccdict['value'] = Column(Float)
 | 
				
			||||||
                    elif row.datatype == 'int':
 | 
					                    elif row.datatype == 'int':
 | 
				
			||||||
                        ccdict = {'__tablename__': 'custom_column_' + str(row.id),
 | 
					                        ccdict['value'] = Column(Integer)
 | 
				
			||||||
                                  'id': Column(Integer, primary_key=True),
 | 
					                    elif row.datatype == 'bool':
 | 
				
			||||||
                                  'book': Column(Integer, ForeignKey('books.id')),
 | 
					                        ccdict['value'] = Column(Boolean)
 | 
				
			||||||
                                  'value': Column(Integer)}
 | 
					 | 
				
			||||||
                    elif row.datatype == 'float':
 | 
					 | 
				
			||||||
                        ccdict = {'__tablename__': 'custom_column_' + str(row.id),
 | 
					 | 
				
			||||||
                                  'id': Column(Integer, primary_key=True),
 | 
					 | 
				
			||||||
                                  'book': Column(Integer, ForeignKey('books.id')),
 | 
					 | 
				
			||||||
                                  'value': Column(Float)}
 | 
					 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        ccdict = {'__tablename__': 'custom_column_' + str(row.id),
 | 
					                        ccdict['value'] = Column(String)
 | 
				
			||||||
                                  'id': Column(Integer, primary_key=True),
 | 
					                    if row.datatype in ['float', 'int', 'bool']:
 | 
				
			||||||
                                  'value': Column(String)}
 | 
					                        ccdict['book'] = Column(Integer, ForeignKey('books.id'))
 | 
				
			||||||
                    cc_classes[row.id] = type(str('Custom_Column_' + str(row.id)), (Base,), ccdict)
 | 
					                    cc_classes[row.id] = type(str('Custom_Column_' + str(row.id)), (Base,), ccdict)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for cc_id in cc_ids:
 | 
					            for cc_id in cc_ids:
 | 
				
			||||||
| 
						 | 
					@ -440,9 +453,14 @@ class CalibreDB(threading.Thread):
 | 
				
			||||||
                    setattr(Books,
 | 
					                    setattr(Books,
 | 
				
			||||||
                            'custom_column_' + str(cc_id[0]),
 | 
					                            'custom_column_' + str(cc_id[0]),
 | 
				
			||||||
                            relationship(cc_classes[cc_id[0]],
 | 
					                            relationship(cc_classes[cc_id[0]],
 | 
				
			||||||
                                         primaryjoin=(
 | 
					                                         primaryjoin=(                              # ToDo: Check Remove
 | 
				
			||||||
                                         Books.id == cc_classes[cc_id[0]].book),
 | 
					                                         Books.id == cc_classes[cc_id[0]].book),
 | 
				
			||||||
                                         backref='books'))
 | 
					                                         backref='books'))
 | 
				
			||||||
 | 
					                elif (cc_id[1] == 'series'):
 | 
				
			||||||
 | 
					                    setattr(Books,
 | 
				
			||||||
 | 
					                            'custom_column_' + str(cc_id[0]),
 | 
				
			||||||
 | 
					                            relationship(books_custom_column_links[cc_id[0]],
 | 
				
			||||||
 | 
					                                         backref='books'))
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    setattr(Books,
 | 
					                    setattr(Books,
 | 
				
			||||||
                            'custom_column_' + str(cc_id[0]),
 | 
					                            'custom_column_' + str(cc_id[0]),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,3 +111,10 @@ def timestamptodate(date, fmt=None):
 | 
				
			||||||
@jinjia.app_template_filter('yesno')
 | 
					@jinjia.app_template_filter('yesno')
 | 
				
			||||||
def yesno(value, yes, no):
 | 
					def yesno(value, yes, no):
 | 
				
			||||||
    return yes if value else no
 | 
					    return yes if value else no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@jinjia.app_template_filter('formatfloat')
 | 
				
			||||||
 | 
					def formatfloat(value, decimals=1):
 | 
				
			||||||
 | 
					    formatedstring = '%d' % value
 | 
				
			||||||
 | 
					    if (value % 1) != 0:
 | 
				
			||||||
 | 
					        formatedstring = ('%s.%d' % (formatedstring, (value % 1) * 10**decimals)).rstrip('0')
 | 
				
			||||||
 | 
					    return formatedstring
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -132,19 +132,20 @@
 | 
				
			||||||
	    <input type="number" step="{% if c.datatype == 'float' %}0.01{% else %}1{% endif %}" class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}" value="{% if book['custom_column_' ~ c.id]|length > 0 %}{{ book['custom_column_' ~ c.id][0].value }}{% endif %}">
 | 
						    <input type="number" step="{% if c.datatype == 'float' %}0.01{% else %}1{% endif %}" class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}" value="{% if book['custom_column_' ~ c.id]|length > 0 %}{{ book['custom_column_' ~ c.id][0].value }}{% endif %}">
 | 
				
			||||||
            {% endif %}
 | 
					            {% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            {% if c.datatype in ['text', 'series'] and not c.is_multiple %}
 | 
					            {% if c.datatype == 'text' %}
 | 
				
			||||||
              <input type="text" class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}"
 | 
					 | 
				
			||||||
              {% if book['custom_column_' ~ c.id]|length > 0 %}
 | 
					 | 
				
			||||||
                value="{{ book['custom_column_' ~ c.id][0].value }}"
 | 
					 | 
				
			||||||
              {% endif %}>
 | 
					 | 
				
			||||||
            {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            {% if c.datatype in ['text', 'series'] and c.is_multiple %}
 | 
					 | 
				
			||||||
              <input type="text" class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}"
 | 
					              <input type="text" class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}"
 | 
				
			||||||
              {% if book['custom_column_' ~ c.id]|length > 0 %}
 | 
					              {% if book['custom_column_' ~ c.id]|length > 0 %}
 | 
				
			||||||
              value="{% for column in book['custom_column_' ~ c.id] %}{{ column.value.strip() }}{% if not loop.last %}, {% endif %}{% endfor %}"{% endif %}>
 | 
					              value="{% for column in book['custom_column_' ~ c.id] %}{{ column.value.strip() }}{% if not loop.last %}, {% endif %}{% endfor %}"{% endif %}>
 | 
				
			||||||
            {% endif %}
 | 
					            {% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            {% if c.datatype == 'series' %}
 | 
				
			||||||
 | 
					              <input type="text" class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}"
 | 
				
			||||||
 | 
					              {% if book['custom_column_' ~ c.id]|length > 0 %}
 | 
				
			||||||
 | 
					                value="{% for column in book['custom_column_' ~ c.id] %} {{ '%s [%s]' % (book['custom_column_' ~ c.id][0].value, book['custom_column_' ~ c.id][0].extra|formatfloat(2)) }}{% if not loop.last %}, {% endif %}{% endfor %}"
 | 
				
			||||||
 | 
					              {% endif %}>
 | 
				
			||||||
 | 
					            {% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            {% if c.datatype == 'enumeration' %}
 | 
					            {% if c.datatype == 'enumeration' %}
 | 
				
			||||||
              <select class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}">
 | 
					              <select class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}">
 | 
				
			||||||
                  <option></option>
 | 
					                  <option></option>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -174,7 +174,7 @@
 | 
				
			||||||
            {{ c.name }}:
 | 
					            {{ c.name }}:
 | 
				
			||||||
            {% for column in entry['custom_column_' ~ c.id] %}
 | 
					            {% for column in entry['custom_column_' ~ c.id] %}
 | 
				
			||||||
              {% if c.datatype == 'rating' %}
 | 
					              {% if c.datatype == 'rating' %}
 | 
				
			||||||
                {{ '%d' % (column.value / 2) }}{% if ((column.value /2) % 1) != 0 %}{{ '.%d' % (((column.value /2) % 1)*10) }} {% endif %}
 | 
					                {{ (column.value / 2)|formatfloat }}
 | 
				
			||||||
              {% else %}
 | 
					              {% else %}
 | 
				
			||||||
                {% if c.datatype == 'bool' %}
 | 
					                {% if c.datatype == 'bool' %}
 | 
				
			||||||
                  {% if column.value == true %}
 | 
					                  {% if column.value == true %}
 | 
				
			||||||
| 
						 | 
					@ -184,12 +184,16 @@
 | 
				
			||||||
                  {% endif %}
 | 
					                  {% endif %}
 | 
				
			||||||
                {% else %}
 | 
					                {% else %}
 | 
				
			||||||
                {% if c.datatype == 'float' %}
 | 
					                {% if c.datatype == 'float' %}
 | 
				
			||||||
                  {{ '%d' % (column.value) }}{% if (column.value % 1) != 0 %}{{ '.%d' % ((column.value % 1)*100) }} {% endif %}
 | 
					                  {{ column.value|formatfloat(2) }}
 | 
				
			||||||
 | 
					                {% else %}
 | 
				
			||||||
 | 
					                {% if c.datatype == 'series' %}
 | 
				
			||||||
 | 
					                  {{ '%s [%s]' % (column.value, column.extra|formatfloat(2)) }}
 | 
				
			||||||
                {% else %}
 | 
					                {% else %}
 | 
				
			||||||
                  {{ column.value }}
 | 
					                  {{ column.value }}
 | 
				
			||||||
                {% endif %}
 | 
					                {% endif %}
 | 
				
			||||||
                {% endif %}
 | 
					                {% endif %}
 | 
				
			||||||
                {% endif %}
 | 
					                {% endif %}
 | 
				
			||||||
 | 
					              {% endif %}
 | 
				
			||||||
            {% endfor %}
 | 
					            {% endfor %}
 | 
				
			||||||
          {% endif %}
 | 
					          {% endif %}
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user