Changeset 7268 for main/waeup.sirp/trunk
- Timestamp:
- 4 Dec 2011, 17:40:41 (13 years ago)
- Location:
- main/waeup.sirp/trunk/src/waeup/sirp/applicants
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
main/waeup.sirp/trunk/src/waeup/sirp/applicants/batching.py
r7264 r7268 18 18 """Batch processing for applicants. 19 19 """ 20 import csv 20 21 import grok 21 22 from zope.interface import Interface 22 from waeup.sirp.interfaces import IBatchProcessor 23 from zope.component import queryUtility 24 from zope.catalog.interfaces import ICatalog 25 from waeup.sirp.interfaces import IBatchProcessor, IObjectConverter 23 26 from waeup.sirp.utils.batching import BatchProcessor 24 27 from waeup.sirp.applicants.interfaces import ( 25 IApplicantsContainer, IApplicant )28 IApplicantsContainer, IApplicant, IApplicantUpdateByRegNo) 26 29 27 30 class ApplicantsContainerImporter(BatchProcessor): … … 78 81 location_fields = [] 79 82 factory_name = 'waeup.Applicant' 80 location_fields = ['container_code' , 'application_number']83 location_fields = ['container_code'] 81 84 82 85 mode = None 83 86 84 87 @property 85 def req(self): 86 result = dict( 87 create = ['container_code'] + self.required_fields, 88 update = self.location_fields, 89 remove = self.location_fields, 90 ) 91 return result 88 def available_fields(self): 89 return sorted(list(set( 90 ['application_number','reg_no'] + getFields( 91 self.iface).keys()))) 92 93 def checkHeaders(self, headerfields, mode='create'): 94 if not 'reg_no' in headerfields and not 'application_number' \ 95 in headerfields: 96 raise FatalCSVError( 97 "Need at least columns application_number or reg_no ") 98 if mode == 'create': 99 for field in self.required_fields: 100 if not field in headerfields: 101 raise FatalCSVError( 102 "Need at least columns %s for import!" % 103 ', '.join(["'%s'" % x for x in self.required_fields])) 104 # Check for fields to be ignored... 105 not_ignored_fields = [x for x in headerfields 106 if not x.startswith('--')] 107 if len(set(not_ignored_fields)) < len(not_ignored_fields): 108 raise FatalCSVError( 109 "Double headers: each column name may only appear once.") 110 return True 111 112 def getLocator(self, row): 113 #if 'application_number' in row.keys() and row['application_number']: 114 if row.get('application_number',None): 115 return 'application_number' 116 elif 'reg_no' in row.keys() and row['reg_no']: 117 return 'reg_no' 118 else: 119 return None 120 121 def getParent(self, row, site): 122 if not 'applicants' in site.keys(): 123 return False 124 return site['applicants'][row['container_code']] 92 125 93 126 def parentsExist(self, row, site): 94 if not 'applicants' in site.keys(): 95 return False 96 return row['container_code'] in site['applicants'].keys() 97 98 def entryExists(self, row, site): 99 return self.getEntry(row, site) is not None 100 101 def getParent(self, row, site): 102 return site['applicants'][row['container_code']] 127 return self.getParent(row, site) is not None 103 128 104 129 def getEntry(self, row, site): … … 106 131 return None 107 132 parent = self.getParent(row, site) 108 return parent.get(row.get('application_number', None), None) 133 if self.getLocator(row) == 'application_number': 134 if row['application_number'] in parent: 135 applicant = parent[row['application_number']] 136 return applicant 137 elif self.getLocator(row) == 'reg_no': 138 reg_no = row['reg_no'] 139 cat = queryUtility(ICatalog, name='applicants_catalog') 140 results = list( 141 cat.searchResults(reg_no=(reg_no, reg_no))) 142 if results: 143 return results[0] 144 return None 145 146 def entryExists(self, row, site): 147 return self.getEntry(row, site) is not None 109 148 110 149 def addEntry(self, obj, row, site): … … 114 153 115 154 def delEntry(self, row, site): 116 if self.entryExists(row, site): 155 applicant = self.getEntry(row, site) 156 if applicant is not None: 117 157 parent = self.getParent(row, site) 118 del parent[ row['application_number']]158 del parent[applicant.application_number] 119 159 pass 160 161 def getMapping(self, path, headerfields, mode): 162 """Get a mapping from CSV file headerfields to actually used fieldnames. 163 """ 164 result = dict() 165 reader = csv.reader(open(path, 'rb')) 166 raw_header = reader.next() 167 for num, field in enumerate(headerfields): 168 if field not in ['container_code', 169 'application_number', 'reg_no'] and mode == 'remove': 170 continue 171 if field == u'--IGNORE--': 172 # Skip ignored columns in failed and finished data files. 173 continue 174 result[raw_header[num]] = field 175 return result 176 177 def checkConversion(self, row, mode='create'): 178 """Validates all values in row. 179 """ 180 if mode in ['update', 'remove']: 181 if self.getLocator(row) == 'reg_no': 182 iface = IApplicantUpdateByRegNo 183 else: 184 iface = self.iface 185 converter = IObjectConverter(iface) 186 errs, inv_errs, conv_dict = converter.fromStringDict( 187 row, self.factory_name) 188 return errs, inv_errs, conv_dict -
main/waeup.sirp/trunk/src/waeup/sirp/applicants/interfaces.py
r7263 r7268 443 443 ) 444 444 445 class IApplicantUpdateByRegNo(IApplicant): 446 """Representation of an applicant. 447 448 Skip regular reg_no validation if reg_no is used for finding 449 the applicant object. 450 """ 451 reg_no = schema.TextLine( 452 title = u'Registration Number', 453 default = None, 454 required = False, 455 ) 456 445 457 class IApplicantOnlinePayment(IOnlinePayment): 446 458 """An applicant payment via payment gateways.
Note: See TracChangeset for help on using the changeset viewer.