Package: luma
Version: 2.4-2
Severity: wishlist
Tags: patch

Hi,

the luma 2.4-2 Browser plugin derives the attrbrutes to be shown in the search
result list from the attributes used in the filter.

This is sometimes a bit pointless as one often shows the values used in the 
filter
[e.g. with the filter "(sn=Marschall)", the value of the sn attribute gets 
shown,
which always contains at least the value "Marschall"]

The attached patch tries to be a bit more flexible:
It adds an "Attributes:" input box that allows entering attribute names, 
separated
by space or comma and dispalys these attributes instead of the ones from the 
filter.
If the "Attributes" input field is empty, the original behaviour is used.

Thanks for maintaining luma in Debian
Peter


-- System Information:
Debian Release: squeeze/sid
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.26-2-amd64 (SMP w/2 CPU cores)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages luma depends on:
ii  python                        2.5.4-4    An interactive high-level object-o
ii  python-ldap                   2.3.10-1   LDAP interface module for Python
ii  python-qt3                    3.18.1-2   Qt3 bindings for Python
ii  python-support                1.0.6      automated rebuilding support for P

luma recommends no packages.

luma suggests no packages.

-- no debconf information
#! /bin/sh /usr/share/dpatch/dpatch-run
## luma-2.4-search.patch
## DP: allow searching with attributes
# From: Peter Marschall <pe...@adpm.de>
# Subject: allow searching with attributes


--- luma-2.4/lib/luma/base/backend/SmartDataObject.py
+++ luma-2.4/lib/luma/base/backend/SmartDataObject.py
@@ -33,17 +33,19 @@ class SmartDataObject (object):
         self.doSchemaChecks = True
         self.isValid = False
         self.checkErrorMessageList = ["No error checking done yet."]
+        self.attributeMap = {}
         
         self.dn = data[0]
         self.data = data[1]
         
         # This is the string representing our key for the objectclasses.
         # Important for lower- and uppercase variants
+        # also add a map for lowercase attribute names to real ones
         self.objectClassName = None
         for x in self.data.keys():
+                self.attributeMap[x.lower()] = x
                 if "objectclass" == x.lower():
                     self.objectClassName = x
-                    break
         
         # Set server meta information
         self.serverMeta = serverMeta
@@ -170,6 +172,8 @@ class SmartDataObject (object):
         if None == attributeName:
             raise FunctionArgumentException("Function getAttributeValueList( attributeName ) called without a parameter.")
             
+        attributeName = self.attributeMap[attributeName.lower()]
+
         if self.data.has_key(attributeName):
             # Binary values are returned normally.
             # String values have to be decoded from utf-8 to unicode.
@@ -195,7 +199,8 @@ class SmartDataObject (object):
         if (None == attributeName) or (None == valueIndex):
             raise FunctionArgumentException("Function getAttributeValue( attributeName, valueIndex ) called without correct parameters.")
             
-            
+        attributeName = self.attributeMap[attributeName.lower()]
+
         if self.data.has_key(attributeName):
             # Is the data length of the attribute compatible with the given index?
             if valueIndex < len(self.data[attributeName]):
@@ -238,6 +243,8 @@ class SmartDataObject (object):
         if None == attributeName:
             raise FunctionArgumentException("Function  addAttributeValue( attributeName, valueList) called without correct parameters.")
          
+        attributeName = self.attributeMap[attributeName.lower()]
+
         # Do we work on an existing attribute?
         if self.data.has_key(attributeName):
             
@@ -359,6 +366,8 @@ class SmartDataObject (object):
         if (None == attributeName) or (None == valueIndex) or (None == newValue):
             raise FunctionArgumentException("Function setAttributeValue( attributeName, valueIndex, newValue ) called without correct parameters.")
             
+        attributeName = self.attributeMap[attributeName.lower()]
+
         if self.data.has_key(attributeName):
             # Is the data length of the attribute compatible with the given index?
             if valueIndex < len(self.data[attributeName]):
--- luma-2.4/lib/luma/base/utils/gui/SearchForm.py
+++ luma-2.4/lib/luma/base/utils/gui/SearchForm.py
@@ -144,11 +144,16 @@ class SearchForm(SearchFormDesign):
 ###############################################################################
 
     def getSearchCriteria(self):
-        filterString = unicode(self.searchEdit.currentText()).encode('utf-8')
-        filterPattern = re.compile("\(\w*=")
-        tmpList = filterPattern.findall(filterString)
-
-        return map(lambda x: x[1:-1], tmpList)
+        attributeString = unicode(self.attributeEdit.currentText()).encode('utf-8')
+        if attributeString:
+            attributeString = attributeString.replace(",", " ")
+            return attributeString.split()
+        else:
+            filterPattern = re.compile("\(\w*=")
+            filterString = unicode(self.searchEdit.currentText()).encode('utf-8')
+            filterPattern = re.compile("\(\w*=")
+            tmpList = filterPattern.findall(filterString)
+            return map(lambda x: x[1:-1], tmpList)
 
 ###############################################################################
 
--- luma-2.4/lib/luma/base/utils/gui/SearchResultView.py
+++ luma-2.4/lib/luma/base/utils/gui/SearchResultView.py
@@ -30,7 +30,6 @@ from base.utils import getSortedDnList
 
 
 
-
 class SearchResultView(SearchResultViewDesign):
 
     def __init__(self, parent=None, name=None, fl=0):
@@ -145,7 +144,7 @@ class SearchResultView(SearchResultViewD
         
         while self.resultListView.columns():
             self.resultListView.removeColumn(0)
-            
+
         self.FILTER_COLUMN_POS = {}
         position = self.resultListView.addColumn("dn")
         self.FILTER_COLUMN_POS["dn"] = position
@@ -179,6 +178,7 @@ class SearchResultView(SearchResultViewD
             self.resultListView.insertItem(listItem)
             
         self.resultListView.setColumnWidth(0, 250)
+        self.resultListView.setResizeMode(QListView.AllColumns)
         self.resultListView.triggerUpdate()
 
 
--- luma-2.4/lib/luma/base/utils/gui/SearchFormDesign.ui
+++ luma-2.4/lib/luma/base/utils/gui/SearchFormDesign.ui
@@ -98,6 +98,22 @@
                         <bool>true</bool>
                     </property>
                 </widget>
+                <widget class="QComboBox" row="2" column="1" rowspan="1" colspan="4">
+                    <property name="name">
+                        <cstring>attributeEdit</cstring>
+                    </property>
+                    <property name="sizePolicy">
+                        <sizepolicy>
+                            <hsizetype>7</hsizetype>
+                            <vsizetype>0</vsizetype>
+                            <horstretch>0</horstretch>
+                            <verstretch>0</verstretch>
+                        </sizepolicy>
+                    </property>
+                    <property name="editable">
+                        <bool>true</bool>
+                    </property>
+                </widget>
                 <widget class="QLabel" row="0" column="2">
                     <property name="name">
                         <cstring>textLabel1</cstring>
@@ -135,6 +151,22 @@
                         <string>Filter:</string>
                     </property>
                 </widget>
+                <widget class="QLabel" row="2" column="0">
+                    <property name="name">
+                        <cstring>textLabel7</cstring>
+                    </property>
+                    <property name="sizePolicy">
+                        <sizepolicy>
+                            <hsizetype>0</hsizetype>
+                            <vsizetype>5</vsizetype>
+                            <horstretch>0</horstretch>
+                            <verstretch>0</verstretch>
+                        </sizepolicy>
+                    </property>
+                    <property name="text">
+                        <string>Attributes:</string>
+                    </property>
+                </widget>
                 <widget class="QLabel" row="0" column="0">
                     <property name="name">
                         <cstring>textLabel2</cstring>
@@ -203,8 +235,9 @@
 <tabstops>
     <tabstop>serverBox</tabstop>
     <tabstop>baseBox</tabstop>
-    <tabstop>searchEdit</tabstop>
     <tabstop>filterWizardButton</tabstop>
+    <tabstop>searchEdit</tabstop>
+    <tabstop>attributeEdit</tabstop>
     <tabstop>startButton</tabstop>
 </tabstops>
 <slots>
--- luma-2.4/lib/luma/base/utils/gui/SearchFormDesign.py
+++ luma-2.4/lib/luma/base/utils/gui/SearchFormDesign.py
@@ -44,6 +44,12 @@
 
         groupFrameLayout.addMultiCellWidget(self.searchEdit,1,1,1,4)
 
+        self.attributeEdit = QComboBox(0,self.groupFrame,"attributeEdit")
+        self.attributeEdit.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,QSizePolicy.Fixed,0,0,self.attributeEdit.sizePolicy().hasHeightForWidth()))
+        self.attributeEdit.setEditable(1)
+
+        groupFrameLayout.addMultiCellWidget(self.attributeEdit,2,2,1,4)
+
         self.textLabel1 = QLabel(self.groupFrame,"textLabel1")
         self.textLabel1.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Preferred,0,0,self.textLabel1.sizePolicy().hasHeightForWidth()))
 
@@ -58,6 +64,11 @@
 
         groupFrameLayout.addWidget(self.textLabel6,1,0)
 
+        self.textLabel7 = QLabel(self.groupFrame,"textLabel7")
+        self.textLabel7.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Preferred,0,0,self.textLabel7.sizePolicy().hasHeightForWidth()))
+
+        groupFrameLayout.addWidget(self.textLabel7,2,0)
+
         self.textLabel2 = QLabel(self.groupFrame,"textLabel2")
         self.textLabel2.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Preferred,0,0,self.textLabel2.sizePolicy().hasHeightForWidth()))
 
@@ -81,9 +92,10 @@
         self.connect(self.serverBox,SIGNAL("activated(const QString&)"),self.serverChanged)
 
         self.setTabOrder(self.serverBox,self.baseBox)
-        self.setTabOrder(self.baseBox,self.searchEdit)
-        self.setTabOrder(self.searchEdit,self.filterWizardButton)
-        self.setTabOrder(self.filterWizardButton,self.startButton)
+        self.setTabOrder(self.baseBox,self.filterWizardButton)
+        self.setTabOrder(self.filterWizardButton,self.searchEdit)
+        self.setTabOrder(self.searchEdit,self.attributeEdit)
+        self.setTabOrder(self.attributeEdit,self.startButton)
 
 
     def languageChange(self):
@@ -92,6 +104,7 @@
         self.filterWizardButton.setAccel(self.__tr("Alt+F"))
         self.textLabel1.setText(self.__tr("Base DN:"))
         self.textLabel6.setText(self.__tr("Filter:"))
+        self.textLabel7.setText(self.__tr("Attributes:"))
         self.textLabel2.setText(self.__tr("Server:"))
         self.startButton.setText(self.__tr("&Search"))
         self.startButton.setAccel(self.__tr("Alt+S"))

Reply via email to