changeset 216:3b517b412f77

fixed problem updating users with new IDs
author casties
date Wed, 02 Oct 2013 14:40:50 +0200
parents c0dcb747cc41
children 2598210ada7a
files MPIWGRoot.py MPIWGStaff.py SrvTxtUtils.py zpt/updatePersonalwww_check.zpt
diffstat 4 files changed, 145 insertions(+), 100 deletions(-) [+]
line wrap: on
line diff
--- a/MPIWGRoot.py	Thu Aug 29 09:10:01 2013 +0200
+++ b/MPIWGRoot.py	Wed Oct 02 14:40:50 2013 +0200
@@ -282,7 +282,7 @@
         
     def generateNewPersonEntry(self,data):
         """generate a new person entry for data, neue personen werden zunaechst nur in der datenbank angelegt """
-        
+        logging.debug("generateNewPersonEntry(%s)"%repr(data))
         #memberFolder=getattr(self,'members')
         #create the object
         
@@ -341,7 +341,6 @@
         """do the update"""
         args=self.REQUEST.form
 
-       
         resultSet=self.REQUEST.SESSION['personal_www']['resultSet']
         news=self.REQUEST.SESSION['personal_www']['news']
         conflicts=self.REQUEST.SESSION['personal_www']['conflicts']
@@ -355,6 +354,7 @@
             ret+="<ul>"
             
         for new in news:
+            logging.debug("updatePersonalwww_doIt: adding %s"%repr(new))
             if args.has_key(new.encode('utf-8')): # entry was selected
                 result,msg=self.generateNewPersonEntry(resultSet[new])
                 if not result:
@@ -364,7 +364,9 @@
                     ret+="<li>OK: %s"%(new.encode('utf-8'))
                     
         if news and (len(news)>0):
+            ret+="</ul>"
             ret+="<p>New entries will be visible on the webpage when an email address has been assigned.</p>"
+        else:
             ret+="</ul>"
         
         # update
@@ -373,7 +375,7 @@
             ret+="<h2>Accepted changes to user entries</h2>"
             ret+="<p>Change Filemaker-db when necessary.</p>"
             
-        # konflicte   
+        # conflicts   
         for conflict in conflicts.keys():
             ignoreEntries=[]
             displayIgnored=[]
@@ -396,13 +398,13 @@
         cl=list(conflicts.keys())
         
         if len(resultSet.keys()) > 0:
-            ret += "<h2>Updating user entries</h2>"
+            ret += "<h2>Updated user entries</h2>"
             ret += "<ul>"
             
         for key in resultSet.keys():
             if key not in cl:
                 self.updatePersonEntry(resultSet[key])
-                ret+="<li>%s</li>"%(key.encode('utf-8'))
+                ret+="<li>%s %s (%s)</li>"%(resultSet[key].get('first_name','').encode('utf-8'), resultSet[key].get('last_name','').encode('utf-8'), key.encode('utf-8'))
                 
         if len(resultSet.keys()) > 0:
             ret += "</ul>"
@@ -411,10 +413,8 @@
         return ret+"</body></html>"
                      
 
-    def updatePersonalwww_html(self):
-        """update form for the homepages web form"""
-        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','updatePersonalwww.zpt')).__of__(self)
-        return pt()
+    """update form for the homepages web form"""
+    updatePersonalwww_html = PageTemplateFile('zpt/updatePersonalwww', globals())
 
     
     def updatePersonalwww(self,uploadfile):
@@ -424,17 +424,27 @@
         dsn=self.getConnectionObj().connection_string
         #dsn="dbname=personalwww"
         resultSetTmp=updatePersonalWWW.importFMPXML(uploadfile)
-        
 
         resultSet={}
         for key in resultSetTmp.keys():
-            resultSet[key.replace("MPIWG:","")]=resultSetTmp[key];
+            # TODO: properly fix MPIWG: id problem
+            if key.startswith('MPIWG:'):
+                # strip MPIWG: from key
+                newkey = key.replace('MPIWG:','')
+                # replace key in data
+                resultSetTmp[key]['key'] = newkey
+                # replace key in resultSet
+                resultSet[newkey]=resultSetTmp[key];
+            
+            else:
+                # copy entry
+                resultSet[key] = resultSetTmp[key]
         
         news,conflicts=updatePersonalWWW.checkImport(dsn, resultSet)
         
         self.REQUEST.SESSION['personal_www'] = {'resultSet': resultSet, 'news': news, 'conflicts': conflicts}
         
-        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','updatePersonalwww_check.zpt')).__of__(self)
+        pt=PageTemplateFile('zpt/updatePersonalwww_check', globals()).__of__(self)
         return pt()
     
 
--- a/MPIWGStaff.py	Thu Aug 29 09:10:01 2013 +0200
+++ b/MPIWGStaff.py	Wed Oct 02 14:40:50 2013 +0200
@@ -403,15 +403,6 @@
             return l
 
     
-    
-    def execute(self,mode,REQUEST=None):
-        method = getattr(self,mode,None)
-        if method is not None:
-            return method(REQUEST);
-        else:
-            return "NOT FOUND"
-        
-        
     getUrl = MPIWGHelper.getUrl
     
     def getTalks(self, published=True, sortBy='priority'):
@@ -459,7 +450,6 @@
     
     def downloadCV(self,REQUEST):
         """download the cv"""
-
         fname="%s_cv.pdf"%self.getUsername().encode('utf-8')
         logging.debug(fname)
         ob=self.folder._getOb("downloadableFiles")._getOb(fname)
@@ -468,8 +458,6 @@
 
     def downloadPublications(self,REQUEST):
         """donwload the publication list"""
-        
-        
         ob=self.folder._getOb("downloadableFiles")._getOb("%s_publications.pdf"%self.getUsername().encode('utf-8'))
         
         REQUEST.RESPONSE.redirect(ob.absolute_url())
@@ -481,7 +469,6 @@
     
     def getPathStyle(self, path, selected, style=""):
         """returns a string with the given style + 'sel' if path == selected."""
-
         if path == selected:
             return style + 'sel'
         else:
--- a/SrvTxtUtils.py	Thu Aug 29 09:10:01 2013 +0200
+++ b/SrvTxtUtils.py	Wed Oct 02 14:40:50 2013 +0200
@@ -7,14 +7,21 @@
 import os
 import stat
 import urllib
-import urllib2
 import logging
 import time
 import re
+import datetime
+try:
+    import httplib2
+    httplib = 'httplib2'
+except:
+    logging.warn("Unable to import httplib2! Falling back to urllib2!")
+    import urllib2
+    httplib = 'urllib2'
 
 import xml.etree.ElementTree as ET
 
-srvTxtUtilsVersion = "1.10.0"
+srvTxtUtilsVersion = "1.12.0"
 
 map_months = {'en': [u"",
                u"January",
@@ -153,7 +160,25 @@
     return ds
         
 
-def getHttpData(url, data=None, num_tries=3, timeout=10, noExceptions=False):
+def getDate(date):
+    """return date object from date or datetime date."""
+    if isinstance(date, datetime.datetime):
+        # strip time
+        return date.date()
+    
+    return date
+
+
+def getDatetime(date):
+    """return datetime object from date or datetime date."""
+    if isinstance(date, datetime.date):
+        # add time 0:00
+        return datetime.datetime.combine(date, datetime.time())
+    
+    return date
+
+
+def getHttpData(url, data=None, num_tries=3, timeout=10, username=None, password=None, cache=None, insecure=False, noExceptions=False):
     """returns result from url+data HTTP request"""
     # we do GET (by appending data to url)
     if isinstance(data, str) or isinstance(data, unicode):
@@ -162,37 +187,55 @@
     elif isinstance(data, dict) or isinstance(data, list) or isinstance(data, tuple):
         # urlencode
         url = "%s?%s"%(url,urllib.urlencode(data))
-    
-    response = None
+
     errmsg = None
-    for cnt in range(num_tries):
-        try:
-            logging.debug("getHttpData(#%s %ss) url=%s"%(cnt+1,timeout,url))
-            if sys.version_info < (2, 6):
-                # set timeout on socket -- ugly :-(
-                import socket
-                socket.setdefaulttimeout(float(timeout))
-                response = urllib2.urlopen(url)
-            else:
-                # timeout as parameter
-                response = urllib2.urlopen(url,timeout=float(timeout))
-            # check result?
-            break
-        except urllib2.HTTPError, e:
-            logging.error("getHttpData: HTTP error(%s): %s"%(e.code,e))
-            errmsg = str(e)
-            # stop trying
-            break
-        except urllib2.URLError, e:
-            logging.error("getHttpData: URLLIB error(%s): %s"%(e.reason,e))
-            errmsg = str(e)
-            # stop trying
-            #break
+    if httplib == 'httplib2':
+        # use httplib2
+        for cnt in range(num_tries):
+            try:
+                logging.debug("getHttp(lib2)Data(#%s %ss) url=%s"%(cnt+1,timeout,url))
+                h = httplib2.Http(cache=cache, timeout=float(timeout), disable_ssl_certificate_validation=insecure)
+                if username:
+                    h.add_credentials(username, password)
+                    
+                resp, data = h.request(url)
+                return data
+            
+            except httplib2.HttpLib2Error, e:
+                logging.error("getHttp(lib2)Data: HTTP error(%s): %s"%(e.code,e))
+                errmsg = str(e)
+                # stop trying
+                break
+    
+    else:
+        # use urllib2 
+        response = None
+        for cnt in range(num_tries):
+            try:
+                logging.debug("getHttpData(#%s %ss) url=%s"%(cnt+1,timeout,url))
+                if sys.version_info < (2, 6):
+                    # set timeout on socket -- ugly :-(
+                    import socket
+                    socket.setdefaulttimeout(float(timeout))
+                    response = urllib2.urlopen(url)
+                else:
+                    # timeout as parameter
+                    response = urllib2.urlopen(url,timeout=float(timeout))
+                # check result?
+                data = response.read()
+                response.close()
+                return data
 
-    if response is not None:
-        data = response.read()
-        response.close()
-        return data
+            except urllib2.HTTPError, e:
+                logging.error("getHttpData: HTTP error(%s): %s"%(e.code,e))
+                errmsg = str(e)
+                # stop trying
+                break
+            except urllib2.URLError, e:
+                logging.error("getHttpData: URLLIB error(%s): %s"%(e.reason,e))
+                errmsg = str(e)
+                # stop trying
+                #break
     
     if noExceptions:
         return None
--- a/zpt/updatePersonalwww_check.zpt	Thu Aug 29 09:10:01 2013 +0200
+++ b/zpt/updatePersonalwww_check.zpt	Wed Oct 02 14:40:50 2013 +0200
@@ -5,50 +5,55 @@
 	<body>
 		<h1>Check upload</h1>
 		<form method="post" action="updatePersonalwww_doIt">
-		<h2>New</h2>
-		<table>
-			<tr tal:repeat="new news">
-				<td><span tal:replace="python:resultSet[new]['first_name']">first</span>
-					<span tal:replace="python:resultSet[new]['last_name']">last</span> 
-				</td>	
-				<td>
-					<input type="checkbox" tal:attributes="name python:new.encode('utf-8')" checked="True" value="new"/>
-				</td>
-			</tr>
-		</table>
+		<tal:block tal:condition="news">
+			<h2>New</h2>
+			<table>
+				<tr tal:repeat="new news">
+					<td><span tal:replace="python:resultSet[new]['first_name']">first</span>
+						<span tal:replace="python:resultSet[new]['last_name']">last</span> 
+					</td>	
+					<td>
+						<input type="checkbox" tal:attributes="name python:new.encode('utf-8')" checked="True" value="new"/>
+					</td>
+				</tr>
+			</table>
+		</tal:block>
 		
-		<h2>Conflicts</h2>
-		<table border="1">
-			<tr tal:repeat="conflict python:conflicts.keys()">
-				<td valign="top"><span tal:replace="python:resultSet[conflict]['first_name']">first</span>
-					<span tal:replace="python:resultSet[conflict]['last_name']">last</span> 
-				</td>	
-				<td>
-						<tal:x repeat="cf python:conflicts[conflict]">
-						<table border="1">
-							<tr>
-								<td bgcolor="green" colspan="3"><span tal:replace="python:cf[0]">feld</span></td>
-							</tr>
-							<tr>
-								<td valign="top"><input type="radio" tal:attributes="name python:conflict+'_'+cf[0]" value="stored" grant all privilege checked="True"></td>
-								<td valign="top">stored:</td>
-								<td><span tal:replace="python:cf[1]">stored value</span></td>
-							</tr>
-							<tr>
-								<td valign="top"><input type="radio" tal:attributes="name python:conflict+'_'+cf[0]" value="xml" ></td>
-								<td valign="top">xml-file:</td>
-								<td><span tal:replace="python:cf[2]">value from xml-file</span></td>
-							</tr>
-							<!--  <tr>
-								<td valign="top"><input type="radio" tal:attributes="name python:conflict+'_'+cf[0]" value="reject"></td>
-								<td valign="top">reject</td>
-								<td>&nbsp;</td>
-							</tr>-->
-						</table>	
-					</tal:x>
-				</td>
-			</tr>
-		</table>
+		<tal:block tal:condition="conflicts">
+			<h2>Conflicts</h2>
+			<table border="1">
+				<tr tal:repeat="conflict python:conflicts.keys()">
+					<td valign="top"><span tal:replace="python:resultSet[conflict]['first_name']">first</span>
+						<span tal:replace="python:resultSet[conflict]['last_name']">last</span> 
+					</td>	
+					<td>
+							<tal:x repeat="cf python:conflicts[conflict]">
+							<table border="1">
+								<tr>
+									<td bgcolor="green" colspan="3"><span tal:replace="python:cf[0]">feld</span></td>
+								</tr>
+								<tr>
+									<td valign="top"><input type="radio" tal:attributes="name python:conflict+'_'+cf[0]" value="stored" grant all privilege checked="True"></td>
+									<td valign="top">stored:</td>
+									<td><span tal:replace="python:cf[1]">stored value</span></td>
+								</tr>
+								<tr>
+									<td valign="top"><input type="radio" tal:attributes="name python:conflict+'_'+cf[0]" value="xml" ></td>
+									<td valign="top">xml-file:</td>
+									<td><span tal:replace="python:cf[2]">value from xml-file</span></td>
+								</tr>
+								<!--  <tr>
+									<td valign="top"><input type="radio" tal:attributes="name python:conflict+'_'+cf[0]" value="reject"></td>
+									<td valign="top">reject</td>
+									<td>&nbsp;</td>
+								</tr>-->
+							</table>	
+						</tal:x>
+					</td>
+				</tr>
+			</table>
+		</tal:block>
+		<p><span tal:content="python:len(resultSet)"/> total entries to change.</p>
 		<input type="submit">
 		</form>
 	</body>