Improve search/replace handling of is_multiple fields

This commit is contained in:
Charles Haley 2010-12-25 11:42:38 +00:00
parent 1fa911c8c9
commit c0c4df77ca
2 changed files with 101 additions and 31 deletions

View File

@ -417,6 +417,8 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
self.multiple_separator.setFixedWidth(30)
self.multiple_separator.setText(' ::: ')
self.multiple_separator.textChanged.connect(self.s_r_separator_changed)
self.results_count.valueChanged[int].connect(self.s_r_display_bounds_changed)
self.starting_from.valueChanged[int].connect(self.s_r_display_bounds_changed)
def s_r_get_field(self, mi, field):
if field:
@ -439,6 +441,9 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
val = []
return val
def s_r_display_bounds_changed(self, i):
self.s_r_search_field_changed(self.search_field.currentIndex())
def s_r_template_changed(self):
self.s_r_search_field_changed(self.search_field.currentIndex())
@ -454,6 +459,9 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
mi = self.db.get_metadata(self.ids[i], index_is_id=True)
src = unicode(self.search_field.currentText())
t = self.s_r_get_field(mi, src)
if len(t) > 1:
t = t[self.starting_from.value()-1:
self.starting_from.value()-1 + self.results_count.value()]
w.setText(unicode(self.multiple_separator.text()).join(t))
if self.search_mode.currentIndex() == 0:
@ -466,12 +474,8 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
txt = unicode(txt)
if not txt:
txt = unicode(self.search_field.currentText())
self.comma_separated.setEnabled(True)
if txt and txt in self.writable_fields:
self.destination_field_fm = self.db.metadata_for_field(txt)
if self.destination_field_fm['is_multiple']:
self.comma_separated.setEnabled(False)
self.comma_separated.setChecked(True)
self.s_r_paint_results(None)
def s_r_search_mode_changed(self, val):
@ -542,6 +546,22 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
dest = src
dest_mode = self.replace_mode.currentIndex()
if self.destination_field_fm['is_multiple']:
if self.comma_separated.isChecked():
if dest == 'authors':
splitter = ' & '
else:
splitter = ','
res = []
for v in val:
for x in v.split(splitter):
if x.strip():
res.append(x.strip())
val = res
else:
val = [v.replace(',', '') for v in val]
if dest_mode != 0:
dest_val = mi.get(dest, '')
if dest_val is None:
@ -602,8 +622,9 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
try:
result = self.s_r_do_regexp(mi)
t = self.s_r_do_destination(mi, result)
if len(result) > 1 and self.destination_field_fm is not None and \
self.destination_field_fm['is_multiple']:
if len(t) > 1 and self.destination_field_fm['is_multiple']:
t = t[self.starting_from.value()-1:
self.starting_from.value()-1 + self.results_count.value()]
t = unicode(self.multiple_separator.text()).join(t)
else:
t = self.s_r_replace_mode_separator().join(t)

View File

@ -658,11 +658,12 @@ If blank, the source field is used if the field is modifiable</string>
<item>
<widget class="QCheckBox" name="comma_separated">
<property name="toolTip">
<string>Specifies whether a comma should be put between values when copying from a
multiple-valued field to a single-valued field</string>
<string>Specifies whether result items should be split into multiple values or
left as single values. This option has the most effect when the source field is
not multiple and the destination field is multiple</string>
</property>
<property name="text">
<string>&amp;Use comma</string>
<string>Split &amp;result</string>
</property>
<property name="checked">
<bool>true</bool>
@ -684,28 +685,8 @@ multiple-valued field to a single-valued field</string>
</item>
</layout>
</item>
<item row="8" column="1">
<widget class="QLabel" name="xlabel_3">
<property name="text">
<string>Test text</string>
</property>
<property name="buddy">
<cstring>test_text</cstring>
</property>
</widget>
</item>
<item row="8" column="2">
<item row="8" column="1" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_21">
<item>
<widget class="QLabel" name="label_51">
<property name="text">
<string>Test result</string>
</property>
<property name="buddy">
<cstring>test_result</cstring>
</property>
</widget>
</item>
<item>
<spacer name="HSpacer_347">
<property name="orientation">
@ -719,10 +700,62 @@ multiple-valued field to a single-valued field</string>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="xlabel_412">
<property name="text">
<string>For multiple-valued fields, sho&amp;w</string>
</property>
<property name="buddy">
<cstring>results_count</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="results_count">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999</number>
</property>
<property name="value">
<number>999</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="xlabel_412">
<property name="text">
<string>values starting a&amp;t</string>
</property>
<property name="buddy">
<cstring>starting_from</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="starting_from">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="xlabel_41">
<property name="text">
<string>Multi&amp;ple separator:</string>
<string>with values separated b&amp;y</string>
</property>
<property name="buddy">
<cstring>multiple_separator</cstring>
@ -756,6 +789,20 @@ multiple-valued field to a single-valued field</string>
</rect>
</property>
<layout class="QGridLayout" name="testgrid">
<item row="7" column="1">
<widget class="QLabel" name="xlabel_3">
<property name="text">
<string>Test text</string>
</property>
</widget>
</item>
<item row="7" column="2">
<widget class="QLabel" name="xlabel_3">
<property name="text">
<string>Test result</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_31">
<property name="text">
@ -857,6 +904,8 @@ multiple-valued field to a single-valued field</string>
<tabstop>destination_field</tabstop>
<tabstop>replace_mode</tabstop>
<tabstop>comma_separated</tabstop>
<tabstop>results_count</tabstop>
<tabstop>starting_from</tabstop>
<tabstop>multiple_separator</tabstop>
<tabstop>test_text</tabstop>
<tabstop>test_result</tabstop>