diff MPIWGFMItem.py @ 0:957bcf42f206

initial
author dwinter
date Thu, 02 May 2013 08:33:53 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MPIWGFMItem.py	Thu May 02 08:33:53 2013 +0200
@@ -0,0 +1,522 @@
+from AccessControl import ClassSecurityInfo
+from OFS.Folder import Folder
+from OFS.PropertyManager import PropertyManager
+import OFS.Image
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
+from ZPublisher.Converters import type_converters
+
+import Acquisition
+
+import datetime
+import random
+import logging
+
+from OFS.Cache import Cacheable
+
+NS ="{http://www.filemaker.com/xml/fmresultset}"
+ 
+class MPIWGFMItem(Folder, PropertyManager, Cacheable):
+    """ 
+    
+    """
+
+    meta_type = 'MPIWGItem'
+    title = ""
+    
+    _properties = ({'id':'title', 'type':'string'},)
+    
+    manage_options = (
+        {'label':'Edit', 'action':'manage_editItemForm'},
+        ) + Folder.manage_options + (
+        {'label':'Edit Item', 'action':'manage_editMPIWGItemForm'},
+        )
+
+    #def __init__(self,id, date=None, cat_en="", cat_de="", title_en="", title_de=""):
+    
+    def findText(self,record,xpath):
+        
+        tmp = record.find(xpath)
+       
+        if tmp is not None:
+            return unicode(tmp[0].text)
+        else:
+            return ""
+        
+    def __init__(self,record,folder):
+        self.id = id
+        #self.Category = (cat_en,cat_de)
+        
+        xpathstr = ".//"+NS+"field[@name='%s']"
+        
+       
+        title_de = self.findText(record,xpathstr%"Titel")
+        
+        title_en = self.findText(record,xpathstr%"EN_Titel")
+        
+
+        self.Title = (title_en,title_de)
+
+        
+        date =  self.findText(record,xpathstr%"TagderVeranstaltung")
+        
+       
+        if date == "" or date is None:
+            date = datetime.date.today().strftime("%d.%m.%Y")
+            
+            
+        
+        self.Date = self.parseDate(date) # sorting date
+        
+        self.Properties = []   # List of 6 Tuples (ID_EN,ID_DE,VALUE_EN,VALUE_DE, WEIGHT,ID)
+                               # Note: ID_EN is the identifier for the getter-methods
+
+        self.title = title_en
+        
+        self.getDataFromRecord(record, folder)
+        
+    def index_html(self):
+        """index method"""
+        # default template is called item_main
+        pt = getattr(self, 'item_main', None)
+        if pt is not None:
+            return pt()
+
+        # else try parent
+        if hasattr(self.aq_parent, 'index_html'):
+            return self.aq_parent.index_html()
+
+
+    def parseDate(self, date):
+        # parse the date from a DD.MM.YYYY string
+        
+        try:
+            digits = [int(x) for x in date.split(".")]
+            return datetime.date(digits[2],digits[1],digits[0])
+        except: #try MM/TT/YYYY
+            digits = [int(x) for x in date.split("/")]
+            return datetime.date(digits[2],digits[0],digits[1])
+        
+    def getDate(self):
+        """ return the date """
+        return self.Date.strftime("%d.%m.%Y")
+
+    def getProperty(self, id):
+        for prop in self.Properties:
+            if len(prop)==5: # add ID to the old format
+                prop = (prop[0],prop[1],prop[2],prop[3],prop[4],prop[0])
+            if prop[5].lower() == id.lower():
+                return prop
+        #if id_en == "category":
+        #    return ("Category","Kategorie",self.Category[0],self.Category[1],0)
+        if id == "title":
+            return ("Title", "Titel", self.Title[0], self.Title[1],0,"title")
+        if id == "date":
+            return ("Date", "Datum",  self.Date.strftime("%d.%m.%Y"), self.Date.strftime("%d.%m.%Y"),0,"date")
+        return None
+
+
+    #def getUrl(self, baseUrl=None):
+     #   """returns URL to this Department"""
+      #  if baseUrl is None:
+       #     return self.absolute_url()
+#
+ #       return '%s/%s'%(baseUrl, self.getId())
+            
+    def getImageIds(self, count=0):
+        """ return the ids of images inside this MPIWGItem-object 
+        not implemented for DB"""
+        #ids = self.objectIds(spec="Image")
+        #if len(ids) > 1:
+        #    if count > 0:
+        #        ids = ids[:count]
+        #    else:
+        #        ids = ids[:]
+        #    ids.sort()
+            
+        return []
+
+    def getImageUrls(self, count=0, baseUrl=None):
+        """ return the urls of images inside this MPIWGItem-object - not implemented for DB"""
+        #ids = self.getImageIds(count=count)
+        #if baseUrl is None:
+        #    baseUrl = self.absolute_url()
+            
+        #return ['%s/%s'%(baseUrl,id) for id in ids]
+        return []
+    def getImageUrl(self, idx=0, baseUrl=None):
+        """ return the url of an image inside this MPIWGItem-object -not impelemted for DB"""
+        #ids = self.getImageIds(count=idx+1)
+        #if len(ids) < idx+1:
+        #    return None
+        #
+        #if baseUrl is None:
+        #    baseUrl = self.absolute_url()
+#
+        #return '%s/%s'%(baseUrl,ids[idx])
+        return ""
+
+    def getFileIds(self, count=0):
+        """ return the ids of files inside this MPIWGItem-object --not impelemted for DB"""
+        #ids = self.objectIds(spec="File")
+        #if len(ids) > 1:
+        #    if count > 0:
+        #        ids = ids[:count]
+        
+            #else:
+            #    ids = ids[:]
+            #ids.sort()
+            
+        #return ids
+        return[]
+
+    def getFileUrls(self, baseUrl=None, count=0):
+        """ return the urls of files inside this MPIWGItem-object -not impelemted for DB"""
+       # ids = self.getFileIds(count=count)
+       # if baseUrl is None:
+       #     baseUrl = self.absolute_url()
+            #    
+        # return ['%s/%s'%(baseUrl,id) for id in ids]
+        return []
+
+    def getPropertyKeys(self):
+        """ """
+        return [x[5] for x in self.Properties if len(x)==6]+[x[0] for x in self.Properties if len(x)==5]
+
+    def getWeight(self, index):
+        """ """
+        return self.Properties[index][4]
+            
+
+    def getByPrefix(self, prefix):
+        """ returns all items with the same prefix in the ID """
+        return [ prop for prop in self.Properties if prop[5].find(prefix)==0 ]
+
+
+    def getValue(self, id, lang="EN"):
+        """ """
+        prop = self.getProperty(id)
+        if prop==None:
+            return None
+        if lang=="DE":
+            return prop[3]
+        else:
+            return prop[2]
+
+    getInfo = getValue # compatibility 
+
+    def getCaption(self, id, lang="EN"):
+        """ """
+        prop = self.getProperty(id)
+        if prop==None:
+            return None
+        if lang=="DE":
+            return prop[1]
+        else:
+            return prop[0]
+        
+    
+    def getItems(self, lang="EN", excepts=[]):
+        """ returns all the key/value pairs """
+
+        if lang=="DE":
+            return [(prop[1],prop[3]) for prop in self.Properties if not prop[0].lower() in excepts]
+        else:
+            return [(prop[0],prop[2]) for prop in self.Properties if not prop[0].lower() in excepts]
+
+    getAllInfo = getItems # compatibility
+
+    def addProperty(self, tup=("","","","",0,"")):
+        """ """
+        self.Properties.append(tup)
+        # force update of the Properties list in the ZopeDB
+        self._p_changed = 1
+
+
+
+    def setProperty(self, tup):
+        """  set the data of a property;  tup is a tuple, structured like the properties  """
+        # find the property
+        num = -1
+        for i in range(len(self.Properties)):
+            if self.Properties[i][5] == tup[5]:
+                num = i
+
+        # List of 6 Tuples (ID_EN,ID_DE,VALUE_EN,VALUE_DE, WEIGHT,ID)
+        # update it
+        if num != -1:
+            self.Properties[num] = tup
+        # force update of the Properties list in the ZopeDB
+        self._p_changed = 1
+
+
+    def delProperty(self, id):
+        """ remove a property """
+        num = -1
+        for i in range(len(self.Properties)):
+            if self.Properties[i][5] == id:
+                del self.Properties[i]
+                # force update of the Properties list in the ZopeDB
+                self._p_changed = 1
+
+                return
+
+    def getNextGroupPropertyIndex(self, prefix):
+        """ returns the logical next id for a property with a certain 'prefix'
+        e.g. if there are properties 'dl_1' and 'dl_2' and the prefix is 'dl_', then the method will yield 'dl_3'.
+        """
+        oldproperties = [x[5] for x in self.Properties if x[5].find(prefix)==0 and x[5].split(prefix)[1].isdigit()]
+        oldproperties.sort()
+        if len(oldproperties)>0:
+            lastparam = int(oldproperties[-1].split(prefix)[1])
+            return prefix+str(lastparam+1)
+        else:
+            return prefix+"1"
+
+    def getHighestGroupPropertyWeight(self, prefix):
+        """ """
+        propWeights = [x[4] for x in self.Properties if x[5].find(prefix)==0]
+        if len(propWeights)>0:
+            return max(propWeights)
+        else:
+            return 0
+
+    def switchPropertyWeights(self, prop1, prop2):
+        """ """
+        p1 = list(self.getProperty(prop1))
+        p2 = list(self.getProperty(prop2))
+
+        w1 = p1[4]
+        w2 = p2[4]
+
+        p1[4] = w2
+        p2[4] = w1
+
+        self.setProperty(tuple(p1))
+        self.setProperty(tuple(p2))
+
+        self._p_changed = 1
+
+    def setTitle(self, title_en, title_de=""):
+        """ set the title """
+        self.Title = (title_en, title_de)
+        # force update of the Properties list in the ZopeDB
+        self._p_changed = 1
+        
+    def setDate(self, dateString, dateObject=None):
+        """ set the date """
+        if dateObject is not None:
+            self.Date = dateObject
+        else:
+            self.Date = self.parseDate(dateString)
+            
+        # force update of the Properties list in the ZopeDB
+        self._p_changed = 1
+        
+
+    def deleteObject(self,id):
+        """ delete an object inside the MPIWGItem """
+        if self.hasObject(id):
+            self._delObject(id)
+
+
+    def manage_addImage(self, id, file, title='', redirect_url=None, precondition='', content_type='', REQUEST=None):
+        """
+        Add a new Image object.
+        Creates a new Image object 'id' with the contents of 'file'.
+        """
+        # we use OFS/Image's method without the request
+        OFS.Image.manage_addImage(self, id, file, title=title, precondition=precondition, content_type=content_type)
+
+        # and do our own redirect
+        if REQUEST is not None:
+            if redirect_url is None:
+                redirect_url = 'manage_editItemForm?rnd=%s'%''.join(random.sample("abcdefuvwxyz",8))
+                
+            REQUEST.RESPONSE.redirect(redirect_url)
+
+    manage_addImageForm = OFS.Image.manage_addImageForm
+    
+    def manage_addFile(self, id, file, title='', redirect_url=None, precondition='', content_type='', REQUEST=None):
+        """
+        Add a new File object.
+        Creates a new File object 'id' with the contents of 'file'.
+        """
+        # we use OFS/Image's method without the request
+        OFS.Image.manage_addFile(self, id, file, title=title, precondition=precondition, content_type=content_type)
+
+        # and do our own redirect
+        if REQUEST is not None:
+            if redirect_url is None:
+                redirect_url = 'manage_editItemForm?rnd=%s'%''.join(random.sample("abcdefuvwxyz",8))
+                
+            REQUEST.RESPONSE.redirect(redirect_url)
+
+    manage_addFileForm = OFS.Image.manage_addFileForm
+    
+
+
+    def manage_editItemForm(self, REQUEST=None):
+        """edit item form"""
+        # default template is called edit_item_form
+        pt = getattr(self, 'edit_item_form', None)
+        if pt is not None:
+            try:
+                return pt()
+            except Exception, e:
+                logging.error("Problem with edit_item_form: "+str(e))
+
+        # else use builtin template
+        return self.manage_editMPIWGItemForm()
+        
+        
+    
+               
+               
+              
+    def getDataFromRecord(self,record,folder):
+        
+        # get predefined properties
+        predef = folder.Properties[:]
+
+      
+
+        for prop in predef:
+            self.addProperty(prop)
+   
+        index =0
+        for property in self.getPropertyKeys():
+            prop = self.Properties[index] # hole alten wert
+              
+            en_value=self.getValueFromRecord(record,property,'en')
+            de_value=self.getValueFromRecord(record,property,'de')
+            self.Properties[index]=(prop[0],prop[1],en_value,de_value,prop[4],prop[5]) #vordefinierte werte lassen ausser fuer die werte
+            
+          
+            index+=1    
+              
+    transform={'Category':'Reihentitel',
+               'Time':'Datum als Text','Presentation':'Titel','Address':'Ort','Notes':'Bemerkungen',
+               'Organizers':'Veranstaltet von','Presenter':'Vortragende Person'}
+    
+    def getValueFromRecord(self,record,propertyID,lang):
+        
+        fieldName = ""
+        if lang == "en":
+            fieldName="EN_"
+            
+        
+        #fieldName+=self.transform[propertyID]
+        fieldName+=propertyID
+            
+        xpathstr = ".//"+NS+"field[@name='%s']"%fieldName
+        
+        val = self.findText(record,xpathstr)
+        
+        if val == "": # leer versuche die andere sprache
+            if lang == "en":
+                fieldName=""
+            else:
+                fieldName="EN_"
+        
+            #fieldName+=self.transform[propertyID]
+            fieldName+=propertyID
+            xpathstr = ".//"+NS+"field[@name='%s']"%fieldName
+        
+            val = self.findText(record,xpathstr)
+       
+        return val
+
+    def manage_editMPIWGItem(self, formdata=None, REQUEST=None):
+        """ """
+        if REQUEST is not None:
+            formdata = REQUEST.form
+
+        # update property names and values and weights
+            # date,title,category
+        try:
+            self.Date = self.parseDate(formdata['date'])
+            self.Title = (formdata["title_en"],formdata["title_de"])
+            self.title = formdata["title_en"]
+        except:
+            pass
+        #self.Category = (formdata["category_en"],formdata["category_de"])
+            # custom data
+        property_ids = [int(x.split('_')[1]) for x in formdata.keys() if x.endswith('_id')]
+        for pid in property_ids:
+            if pid < len(self.Properties):
+                self.Properties[pid] = (formdata["property_%s_en_key"%pid],
+                                        formdata["property_%s_de_key"%pid],
+                                        formdata["property_%s_en_value"%pid],
+                                        formdata["property_%s_de_value"%pid], 
+                                        formdata["property_%s_weight"%pid],
+                                        formdata["property_%s_id"%pid])
+
+        # delete properties
+        # check if properties need to be removed
+        # e.g. "del__property_01"
+        del_keys = [int(x.split('_')[-1]) for x in formdata.keys() if x.find("del__") == 0 and formdata[x] == "on"]
+        del_keys.sort()
+        del_keys.reverse()
+        for k in del_keys:
+            del self.Properties[k]
+
+        # delete images
+        del_keys = [x.split('__')[1] for x in formdata.keys() if x.find("delimg__") == 0 and formdata[x] == "on"]
+        for k in del_keys:
+            self.deleteObject(k)
+
+        # delete files
+        del_keys = [x.split('__')[1] for x in formdata.keys() if x.find("delfil__") == 0 and formdata[x] == "on"]
+        for k in del_keys:
+            self.deleteObject(k)
+
+        # sort
+        try:
+            self.Properties.sort(lambda a,b: cmp(int(a[4]),int(b[4])) )
+        except:
+            pass
+
+        try:
+            # add new properties (empty)
+            add_new = int(formdata['add_new'])
+
+            for x in range(add_new):
+                self.addProperty()
+        except:
+            pass
+
+        # force update of the Properties list in the ZopeDB
+        self._p_changed = 1
+        self.en.index_html.ZCacheable_invalidate()
+        
+        if REQUEST is not None:
+            REQUEST.RESPONSE.redirect('manage_editItemForm?rnd=%s'%''.join(random.sample("abcdefuvwxyz",8)))
+
+
+    manage_editMPIWGItemForm = PageTemplateFile('zpt/editMPIWGItem.pt', globals())
+
+
+def manage_addMPIWGItem(self,REQUEST=None):
+    """ create a new MPIWGItem """
+
+    id = self.getNewID()
+
+    # get predefined properties
+    predef = self.Properties[:]
+
+    newinst = MPIWGItem(id)
+
+    for prop in predef:
+        newinst.addProperty(prop)
+        
+    self._setObject(id, newinst)
+
+    if REQUEST is not None:
+        REQUEST.RESPONSE.redirect('%s/manage_editItemForm'%id)
+        
+    return id
+
+def manage_addMPIWGItemForm(self, REQUEST):
+    """ """
+    manage_addMPIWGItem(self,REQUEST)