From 1ddcfb584473e6a201db8ed779a37daf6aca1abc Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 27 Feb 2008 22:32:20 +0000 Subject: [PATCH] Implement #537 --- src/libprs500/gui2/dialogs/metadata_single.py | 45 ++++++++++---- src/libprs500/gui2/dialogs/metadata_single.ui | 60 +++++++++++++------ src/libprs500/library/database.py | 35 +++++++++++ 3 files changed, 113 insertions(+), 27 deletions(-) diff --git a/src/libprs500/gui2/dialogs/metadata_single.py b/src/libprs500/gui2/dialogs/metadata_single.py index 389fb04af3..63a40456ce 100644 --- a/src/libprs500/gui2/dialogs/metadata_single.py +++ b/src/libprs500/gui2/dialogs/metadata_single.py @@ -151,7 +151,9 @@ class MetadataSingleDialog(QDialog, Ui_MetadataSingleDialog): QObject.connect(self.fetch_cover_button, SIGNAL('clicked()'), self.fetch_cover) QObject.connect(self.tag_editor_button, SIGNAL('clicked()'), - self.edit_tags) + self.edit_tags) + QObject.connect(self.remove_series_button, SIGNAL('clicked()'), + self.remove_unused_series) self.timeout = float(QSettings().value('network timeout', QVariant(5)).toInt()[0]) self.title.setText(db.title(row)) isbn = db.isbn(self.id) @@ -186,9 +188,19 @@ class MetadataSingleDialog(QDialog, Ui_MetadataSingleDialog): size = self.db.sizeof_format(row, ext) Format(self.formats, ext, size) + self.initialize_series() + + self.series_index.setValue(self.db.series_index(row)) + QObject.connect(self.series, SIGNAL('currentIndexChanged(int)'), self.enable_series_index) + QObject.connect(self.series, SIGNAL('editTextChanged(QString)'), self.enable_series_index) + QObject.connect(self.password_button, SIGNAL('clicked()'), self.change_password) + + self.exec_() + + def initialize_series(self): all_series = self.db.all_series() all_series.sort(cmp=lambda x, y : cmp(x[1], y[1])) - series_id = self.db.series_id(row) + series_id = self.db.series_id(self.row) idx, c = None, 0 for i in all_series: id, name = i @@ -201,14 +213,15 @@ class MetadataSingleDialog(QDialog, Ui_MetadataSingleDialog): if idx is not None: self.series.setCurrentIndex(idx) self.enable_series_index() - - self.series_index.setValue(self.db.series_index(row)) - QObject.connect(self.series, SIGNAL('currentIndexChanged(int)'), self.enable_series_index) - QObject.connect(self.series, SIGNAL('editTextChanged(QString)'), self.enable_series_index) - QObject.connect(self.password_button, SIGNAL('clicked()'), self.change_password) - - self.exec_() - + + pl = self.series.parentWidget().layout() + for i in range(pl.count()): + l = pl.itemAt(i).layout() + if l: + l.invalidate() + l.activate() + + self.layout().activate() def edit_tags(self): d = TagEditor(self, self.db, self.row) @@ -280,6 +293,18 @@ class MetadataSingleDialog(QDialog, Ui_MetadataSingleDialog): def enable_series_index(self, *args): self.series_index.setEnabled(True) + def remove_unused_series(self): + self.db.remove_unused_series() + idx = qstring_to_unicode(self.series.currentText()) + self.series.clear() + self.initialize_series() + if idx: + for i in range(self.series.count()): + if qstring_to_unicode(self.series.itemText(i)) == idx: + self.series.setCurrentIndex(i) + break + + def accept(self): if self.formats_changed: self.sync_formats() diff --git a/src/libprs500/gui2/dialogs/metadata_single.ui b/src/libprs500/gui2/dialogs/metadata_single.ui index f7da657dbe..4e55bbb968 100644 --- a/src/libprs500/gui2/dialogs/metadata_single.ui +++ b/src/libprs500/gui2/dialogs/metadata_single.ui @@ -24,7 +24,7 @@ - + Meta information @@ -195,23 +195,49 @@ - - - List of known series. You can add new series. + + + 5 - - List of known series. You can add new series. - - - true - - - QComboBox::InsertAlphabetically - - - QComboBox::AdjustToContents - - + + + + + 0 + 0 + + + + List of known series. You can add new series. + + + List of known series. You can add new series. + + + true + + + QComboBox::InsertAlphabetically + + + QComboBox::AdjustToContents + + + + + + + Remove unused series (Series that have no books) + + + ... + + + :/images/trash.svg + + + + diff --git a/src/libprs500/library/database.py b/src/libprs500/library/database.py index 2fad57ce2c..6a968da20b 100644 --- a/src/libprs500/library/database.py +++ b/src/libprs500/library/database.py @@ -751,6 +751,33 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; conn.execute('pragma user_version=7') conn.commit() + @staticmethod + def upgrade_version7(conn): + conn.executescript('''\ + DROP TRIGGER fkc_update_books_series_link_b; + CREATE TRIGGER fkc_update_books_series_link_b + BEFORE UPDATE OF series ON books_series_link + BEGIN + SELECT CASE + WHEN (SELECT id from series WHERE id=NEW.series) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: series not in series') + END; + END; + + DROP TRIGGER fkc_delete_books_series_link; + CREATE TRIGGER fkc_delete_books_series_link + BEFORE DELETE ON series + BEGIN + SELECT CASE + WHEN (SELECT COUNT(id) FROM books_series_link WHERE series=OLD.id) > 0 + THEN RAISE(ABORT, 'Foreign key violation: series is still referenced') + END; + END; + ''' + ) + conn.execute('pragma user_version=8') + conn.commit() + def __del__(self): global _lock_file import os @@ -778,6 +805,8 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; LibraryDatabase.upgrade_version5(self.conn) if self.user_version == 6: # Upgrade to 7 LibraryDatabase.upgrade_version6(self.conn) + if self.user_version == 7: # Upgrade to 8 + LibraryDatabase.upgrade_version7(self.conn) def close(self): global _lock_file @@ -1158,6 +1187,12 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; aid = self.conn.execute('INSERT INTO series(name) VALUES (?)', (series,)).lastrowid self.conn.execute('INSERT INTO books_series_link(book, series) VALUES (?,?)', (id, aid)) self.conn.commit() + + def remove_unused_series(self): + for id, in self.conn.execute('SELECT id FROM series').fetchall(): + if not self.conn.execute('SELECT id from books_series_link WHERE series=?', (id,)).fetchone(): + self.conn.execute('DELETE FROM series WHERE id=?', (id,)) + self.conn.commit() def set_series_index(self, id, idx): self.conn.execute('UPDATE books SET series_index=? WHERE id=?', (int(idx), id))