Added in shared/data some copies of external authentic data (iso country codes and belgian cities).
This commit is contained in:
		
							parent
							
								
									605c42d94e
								
							
						
					
					
						commit
						cbd6fbbec5
					
				
					 6 changed files with 3504 additions and 21 deletions
				
			
		|  | @ -4,6 +4,7 @@ from appy.gen.utils import sequenceTypes, PageDescr | |||
| 
 | ||||
| # Default Appy permissions ----------------------------------------------------- | ||||
| r, w, d = ('read', 'write', 'delete') | ||||
| digits = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') | ||||
| 
 | ||||
| # Descriptor classes used for refining descriptions of elements in types | ||||
| # (pages, groups,...) ---------------------------------------------------------- | ||||
|  | @ -138,6 +139,39 @@ class String(Type): | |||
|     ALPHANUMERIC = c('[\w-]+') | ||||
|     URL = c('(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?' \ | ||||
|             '(([0-9]{1,5})?\/.*)?') | ||||
| 
 | ||||
|     # Some predefined functions that may also be used as validators | ||||
|     @staticmethod | ||||
|     def _MODULO_97(obj, value, complement=False): | ||||
|         '''p_value must be a string representing a number, like a bank account. | ||||
|            this function checks that the 2 last digits are the result of | ||||
|            computing the modulo 97 of the previous digits. Any non-digit | ||||
|            character is ignored. If p_complement is True, it does compute the | ||||
|            complement of modulo 97 instead of modulo 97. p_obj is not used; | ||||
|            it will be given by the Appy validation machinery, so it must be | ||||
|            specified as parameter.''' | ||||
|         if not value: return True # Plone calls me erroneously for | ||||
|         # non-mandatory fields. | ||||
|         # First, remove any non-digit char | ||||
|         v = '' | ||||
|         for c in value: | ||||
|             if c in digits: v += c | ||||
|         # There must be at least 3 digits for performing the check | ||||
|         if len(v) < 3: return False | ||||
|         # Separate the real number from the check digits | ||||
|         number = int(v[:-2]) | ||||
|         checkNumber = int(v[-2:]) | ||||
|         # Perform the check | ||||
|         if complement: | ||||
|             return (97 - (number % 97)) == checkNumber | ||||
|         else: | ||||
|             return (number % 97) == checkNumber | ||||
|     @staticmethod | ||||
|     def MODULO_97(obj, value): return String._MODULO_97(obj, value) | ||||
|     @staticmethod | ||||
|     def MODULO_97_COMPLEMENT(obj, value): | ||||
|         return String._MODULO_97(obj, value, True) | ||||
| 
 | ||||
|     # Possible values for "format" | ||||
|     LINE = 0 | ||||
|     TEXT = 1 | ||||
|  |  | |||
|  | @ -343,15 +343,12 @@ class AbstractMixin: | |||
|                 return False | ||||
|         # Evaluate fieldDescr['show'] | ||||
|         if callable(fieldDescr['show']): | ||||
|             obj = self._appy_getWrapper(force=True) | ||||
|             res = fieldDescr['show'](obj) | ||||
|             res = fieldDescr['show'](self.appy()) | ||||
|         else: | ||||
|             res = fieldDescr['show'] | ||||
|         # Take into account possible values 'view' and 'edit' for 'show' param. | ||||
|         if (res == 'view' and isEdit) or (res == 'edit' and not isEdit): | ||||
|             res = False | ||||
|         else: | ||||
|             res = True | ||||
|         return res | ||||
| 
 | ||||
|     def getAppyFields(self, isEdit, page): | ||||
|  | @ -904,7 +901,7 @@ class AbstractMixin: | |||
|         # Apply the custom validator if it exists | ||||
|         validator = appyType['validator'] | ||||
|         if not msgId and (type(validator) in self.validatorTypes): | ||||
|             obj = self._appy_getWrapper(force=True) | ||||
|             obj = self.appy() | ||||
|             if type(validator) == self.validatorTypes[0]: | ||||
|                 # It is a custom function. Execute it. | ||||
|                 try: | ||||
|  |  | |||
|  | @ -68,24 +68,17 @@ class AbstractWrapper: | |||
|         else: | ||||
|             exec "self.o.set%s%s(v)" % (name[0].upper(), name[1:]) | ||||
|     def __cmp__(self, other): | ||||
|         if other: | ||||
|             return cmp(self.o, other.o) | ||||
|         else: | ||||
|             return 1 | ||||
|     def get_tool(self): | ||||
|         return self.o.getTool()._appy_getWrapper(force=True) | ||||
|         if other: return cmp(self.o, other.o) | ||||
|         else:     return 1 | ||||
|     def get_tool(self): return self.o.getTool().appy() | ||||
|     tool = property(get_tool) | ||||
|     def get_flavour(self): | ||||
|         return self.o.getTool().getFlavour(self.o, appy=True) | ||||
|     def get_flavour(self): return self.o.getTool().getFlavour(self.o, appy=True) | ||||
|     flavour = property(get_flavour) | ||||
|     def get_session(self): | ||||
|         return self.o.REQUEST.SESSION | ||||
|     def get_session(self): return self.o.REQUEST.SESSION | ||||
|     session = property(get_session) | ||||
|     def get_typeName(self): | ||||
|         return self.__class__.__bases__[-1].__name__ | ||||
|     def get_typeName(self): return self.__class__.__bases__[-1].__name__ | ||||
|     typeName = property(get_typeName) | ||||
|     def get_id(self): | ||||
|         return self.o.id | ||||
|     def get_id(self): return self.o.id | ||||
|     id = property(get_id) | ||||
|     def get_state(self): | ||||
|         return self.o.portal_workflow.getInfoFor(self.o, 'review_state') | ||||
|  | @ -94,8 +87,7 @@ class AbstractWrapper: | |||
|         appName = self.o.getProductConfig().PROJECTNAME | ||||
|         return self.o.utranslate(self.o.getWorkflowLabel(), domain=appName) | ||||
|     stateLabel = property(get_stateLabel) | ||||
|     def get_klass(self): | ||||
|         return self.__class__.__bases__[1] | ||||
|     def get_klass(self): return self.__class__.__bases__[1] | ||||
|     klass = property(get_klass) | ||||
| 
 | ||||
|     def link(self, fieldName, obj): | ||||
|  | @ -119,6 +111,14 @@ class AbstractWrapper: | |||
|                  sortedRefField | ||||
|         getattr(self.o, sortedRefField).append(obj.UID()) | ||||
| 
 | ||||
|     def sort(self, fieldName): | ||||
|         '''Sorts referred elements linked to p_self via p_fieldName. At | ||||
|            present, it can only sort elements based on their title.''' | ||||
|         sortedUids = getattr(self.o, '_appy_%s' % fieldName) | ||||
|         c = self.o.uid_catalog | ||||
|         sortedUids.sort(lambda x,y: \ | ||||
|            cmp(c(UID=x)[0].getObject().Title(),c(UID=y)[0].getObject().Title())) | ||||
| 
 | ||||
|     def create(self, fieldNameOrClass, **kwargs): | ||||
|         '''If p_fieldNameOfClass is the name of a field, this method allows to | ||||
|            create an object and link it to the current one (self) through | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Gaetan Delannay
						Gaetan Delannay