diff --git a/cps/db.py b/cps/db.py index 33c4f061..b08592a1 100755 --- a/cps/db.py +++ b/cps/db.py @@ -25,99 +25,99 @@ conn.connection.create_function('title_sort', 1, title_sort) Base = declarative_base() books_authors_link = Table('books_authors_link', Base.metadata, - Column('book', Integer, ForeignKey('books.id'), primary_key=True), - Column('author', Integer, ForeignKey('authors.id'), primary_key=True) - ) + Column('book', Integer, ForeignKey('books.id'), primary_key=True), + Column('author', Integer, ForeignKey('authors.id'), primary_key=True) + ) books_tags_link = Table('books_tags_link', Base.metadata, - Column('book', Integer, ForeignKey('books.id'), primary_key=True), - Column('tag', Integer, ForeignKey('tags.id'), primary_key=True) - ) + Column('book', Integer, ForeignKey('books.id'), primary_key=True), + Column('tag', Integer, ForeignKey('tags.id'), primary_key=True) + ) books_series_link = Table('books_series_link', Base.metadata, - Column('book', Integer, ForeignKey('books.id'), primary_key=True), - Column('series', Integer, ForeignKey('series.id'), primary_key=True) - ) + Column('book', Integer, ForeignKey('books.id'), primary_key=True), + Column('series', Integer, ForeignKey('series.id'), primary_key=True) + ) books_ratings_link = Table('books_ratings_link', Base.metadata, - Column('book', Integer, ForeignKey('books.id'), primary_key=True), - Column('rating', Integer, ForeignKey('ratings.id'), primary_key=True) - ) + Column('book', Integer, ForeignKey('books.id'), primary_key=True), + Column('rating', Integer, ForeignKey('ratings.id'), primary_key=True) + ) books_languages_link = Table('books_languages_link', Base.metadata, - Column('book', Integer, ForeignKey('books.id'), primary_key=True), - Column('lang_code', Integer, ForeignKey('languages.id'), primary_key=True) - ) + Column('book', Integer, ForeignKey('books.id'), primary_key=True), + Column('lang_code', Integer, ForeignKey('languages.id'), primary_key=True) + ) class Comments(Base): - __tablename__ = 'comments' + __tablename__ = 'comments' - id = Column(Integer, primary_key=True) - text = Column(String) - book = Column(Integer, ForeignKey('books.id')) + id = Column(Integer, primary_key=True) + text = Column(String) + book = Column(Integer, ForeignKey('books.id')) - def __init__(self, text, book): - self.text = text - self.book = book + def __init__(self, text, book): + self.text = text + self.book = book - def __repr__(self): - return u"".format(self.text) + def __repr__(self): + return u"".format(self.text) class Tags(Base): - __tablename__ = 'tags' + __tablename__ = 'tags' - id = Column(Integer, primary_key=True, autoincrement=True) - name = Column(String) + id = Column(Integer, primary_key=True, autoincrement=True) + name = Column(String) - def __init__(self, name): - self.name = name + def __init__(self, name): + self.name = name - def __repr__(self): - return u"".format(self.name) + def __repr__(self): + return u"".format(self.name) class Authors(Base): - __tablename__ = 'authors' + __tablename__ = 'authors' - id = Column(Integer, primary_key=True) - name = Column(String) - sort = Column(String) - link = Column(String) + id = Column(Integer, primary_key=True) + name = Column(String) + sort = Column(String) + link = Column(String) - def __init__(self, name, sort, link): - self.name = name - self.sort = sort - self.link = link + def __init__(self, name, sort, link): + self.name = name + self.sort = sort + self.link = link - def __repr__(self): - return u"".format(self.name, self.sort, self.link) + def __repr__(self): + return u"".format(self.name, self.sort, self.link) class Series(Base): - __tablename__ = 'series' + __tablename__ = 'series' - id = Column(Integer, primary_key=True) - name = Column(String) - sort = Column(String) + id = Column(Integer, primary_key=True) + name = Column(String) + sort = Column(String) - def __init__(self, name, sort): - self.name = name - self.sort = sort + def __init__(self, name, sort): + self.name = name + self.sort = sort - def __repr__(self): - return u"".format(self.name, self.sort) + def __repr__(self): + return u"".format(self.name, self.sort) class Ratings(Base): - __tablename__ = 'ratings' + __tablename__ = 'ratings' - id = Column(Integer, primary_key=True) - rating = Column(Integer) + id = Column(Integer, primary_key=True) + rating = Column(Integer) - def __init__(self,rating): - self.rating = rating + def __init__(self,rating): + self.rating = rating - def __repr__(self): - return u"".format(self.rating) + def __repr__(self): + return u"".format(self.rating) class Languages(Base): __tablename__ = 'languages' @@ -132,59 +132,58 @@ class Languages(Base): return u"".format(self.lang_code) class Data(Base): - __tablename__ = 'data' + __tablename__ = 'data' - id = Column(Integer, primary_key=True) - book = Column(Integer, ForeignKey('books.id')) - format = Column(String) - uncompressed_size = Column(Integer) - name = Column(String) + id = Column(Integer, primary_key=True) + book = Column(Integer, ForeignKey('books.id')) + format = Column(String) + uncompressed_size = Column(Integer) + name = Column(String) - def __init__(self, book, format, uncompressed_size, name): - self.book = book - self.format = format - self.uncompressed_size = uncompressed_size - self.name = name + def __init__(self, book, format, uncompressed_size, name): + self.book = book + self.format = format + self.uncompressed_size = uncompressed_size + self.name = name - def __repr__(self): - return u"".format(self.book, self.format, self.uncompressed_size, self.name) + def __repr__(self): + return u"".format(self.book, self.format, self.uncompressed_size, self.name) class Books(Base): - __tablename__ = 'books' - - id = Column(Integer,primary_key=True) - title = Column(String) - sort = Column(String) - author_sort = Column(String) - timestamp = Column(String) - pubdate = Column(String) - series_index = Column(String) - last_modified = Column(String) - path = Column(String) - has_cover = Column(Integer) - - authors = relationship('Authors', secondary=books_authors_link, backref='books') - tags = relationship('Tags', secondary=books_tags_link, backref='books') - comments = relationship('Comments', backref='books') - data = relationship('Data', backref='books') - series = relationship('Series', secondary=books_series_link, backref='books') - ratings = relationship('Ratings', secondary=books_ratings_link, backref='books') - languages = relationship('Languages', secondary=books_languages_link, backref='books') - - def __init__(self, title, sort, author_sort, timestamp, pubdate, series_index, last_modified, path, has_cover, authors, tags): - self.title = title - self.sort = sort - self.author_sort = author_sort - self.timestamp = timestamp - self.pubdate = pubdate - self.series_index = series_index - self.last_modified = last_modified - self.path = path - self.has_cover = has_cover - self.tags = tags - - def __repr__(self): - return u"".format(self.title, self.sort, self.author_sort, self.timestamp, self.pubdate, self.series_index, self.last_modified ,self.path, self.has_cover) + __tablename__ = 'books' + + id = Column(Integer,primary_key=True) + title = Column(String) + sort = Column(String) + author_sort = Column(String) + timestamp = Column(String) + pubdate = Column(String) + series_index = Column(String) + last_modified = Column(String) + path = Column(String) + has_cover = Column(Integer) + + authors = relationship('Authors', secondary=books_authors_link, backref='books') + tags = relationship('Tags', secondary=books_tags_link, backref='books') + comments = relationship('Comments', backref='books') + data = relationship('Data', backref='books') + series = relationship('Series', secondary=books_series_link, backref='books') + ratings = relationship('Ratings', secondary=books_ratings_link, backref='books') + languages = relationship('Languages', secondary=books_languages_link, backref='books') + + def __init__(self, title, sort, author_sort, timestamp, pubdate, series_index, last_modified, path, has_cover, authors, tags): + self.title = title + self.sort = sort + self.author_sort = author_sort + self.timestamp = timestamp + self.pubdate = pubdate + self.series_index = series_index + self.last_modified = last_modified + self.path = path + self.has_cover = has_cover + + def __repr__(self): + return u"".format(self.title, self.sort, self.author_sort, self.timestamp, self.pubdate, self.series_index, self.last_modified ,self.path, self.has_cover) Base.metadata.create_all(engine) Session = sessionmaker() diff --git a/cps/helper.py b/cps/helper.py index 704d0bb1..49fddc38 100755 --- a/cps/helper.py +++ b/cps/helper.py @@ -154,7 +154,7 @@ def get_attachment(file_path): 'permissions?') return None -def get_valid_filename(value): +def get_valid_filename(value, replace_whitespace=True): """ Returns the given string converted to a string that can be used for a clean filename. Limits num characters to 128 max. @@ -164,7 +164,9 @@ def get_valid_filename(value): value = unicodedata.normalize('NFKD', value) re_slugify = re.compile('[^\w\s-]', re.UNICODE) value = unicode(re_slugify.sub('', value).strip()) - value = re.sub('[\s]+', '_', value, flags=re.U) + if replace_whitespace: + value = re.sub('[\s]+', '_', value, flags=re.U) + value = value.replace(u"\u00DF", "ss") return value def get_normalized_author(value): @@ -175,3 +177,23 @@ def get_normalized_author(value): value = re.sub('[^\w,\s]', '', value, flags=re.U) value = " ".join(value.split(", ")[::-1]) return value + +def update_dir_stucture(book_id): + db.session.connection().connection.connection.create_function("title_sort",1,db.title_sort) + book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + path = os.path.join(config.DB_ROOT, book.path) + + authordir = book.path.split("/")[0] + new_authordir=get_valid_filename(book.authors[0].name, False) + titledir = book.path.split("/")[1] + new_titledir = get_valid_filename(book.title, False) + " (" + str(book_id) + ")" + + if titledir != new_titledir: + os.rename(path, os.path.join(os.path.dirname(path), new_titledir)) + path = os.path.join(os.path.dirname(path), new_titledir) + book.path = book.path.split("/")[0] + "/" + new_titledir + + if authordir != new_authordir: + os.renames(path, os.path.join(os.path.join(config.DB_ROOT, new_authordir), os.path.basename(path))) + book.path = new_authordir + "/" + book.path.split("/")[1] + db.session.commit() diff --git a/cps/static/css/style.css b/cps/static/css/style.css index 52e2f1e4..814604b1 100644 --- a/cps/static/css/style.css +++ b/cps/static/css/style.css @@ -27,4 +27,7 @@ span.glyphicon.glyphicon-tags {padding-right: 5px;color: #999;vertical-align: te -webkit-box-shadow: 0 5px 8px -6px #777; -moz-box-shadow: 0 5px 8px -6px #777; box-shadow: 0 5px 8px -6px #777; -} \ No newline at end of file +} + +.btn-file {position: relative; overflow: hidden;} +.btn-file input[type=file] {position: absolute; top: 0; right: 0; min-width: 100%; min-height: 100%; font-size: 100px; text-align: right; filter: alpha(opacity=0); opacity: 0; outline: none; background: white; cursor: inherit; display: block;} diff --git a/cps/templates/layout.html b/cps/templates/layout.html index 68fa4b46..9b07bdbd 100644 --- a/cps/templates/layout.html +++ b/cps/templates/layout.html @@ -31,6 +31,13 @@ +