mirror of https://gitlab.com/bashrc2/epicyon
				
				
				
			Assign product Ids to shared items
							parent
							
								
									ef21e1e329
								
							
						
					
					
						commit
						84bcc6d103
					
				|  | @ -13664,7 +13664,8 @@ class PubServer(BaseHTTPRequestHandler): | |||
|                          fields['location'], | ||||
|                          durationStr, | ||||
|                          self.server.debug, | ||||
|                          city) | ||||
|                          city, | ||||
|                          self.server.systemLanguage) | ||||
|                 if filename: | ||||
|                     if os.path.isfile(filename): | ||||
|                         os.remove(filename) | ||||
|  |  | |||
|  | @ -2332,7 +2332,7 @@ if args.testdata: | |||
|              "mechanical", | ||||
|              "City", | ||||
|              "2 months", | ||||
|              debug, city) | ||||
|              debug, city, args.language) | ||||
|     addShare(baseDir, | ||||
|              httpPrefix, nickname, domain, port, | ||||
|              "witch hat", | ||||
|  | @ -2342,7 +2342,7 @@ if args.testdata: | |||
|              "clothing", | ||||
|              "City", | ||||
|              "3 months", | ||||
|              debug, city) | ||||
|              debug, city, args.language) | ||||
| 
 | ||||
|     deleteAllPosts(baseDir, nickname, domain, 'inbox') | ||||
|     deleteAllPosts(baseDir, nickname, domain, 'outbox') | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -0,0 +1,28 @@ | |||
| { | ||||
|   "@context":{ | ||||
|     "dfc-p": "http://static.datafoodconsortium.org/ontologies/dfc_ProductGlossary.owl#", | ||||
|     "dfc-u":"http://static.datafoodconsortium.org/data/units.rdf#" | ||||
|   }, | ||||
|   "@graph":[ | ||||
|     { | ||||
|       "@id":"dfc-u:kg", | ||||
|       "@type":"dfc-p:Unit", | ||||
|       "rdfs:label":"kilogramme" | ||||
|     }, | ||||
|     { | ||||
|       "@id":"dfc-u:u", | ||||
|       "@type":"dfc-p:Unit", | ||||
|       "rdfs:label":"unité" | ||||
|     }, | ||||
|     { | ||||
|       "@id":"dfc-u:g", | ||||
|       "@type":"dfc-p:Unit", | ||||
|       "rdfs:label":"gramme" | ||||
|     }, | ||||
|     { | ||||
|       "@id":"dfc-u:l", | ||||
|       "@type":"dfc-p:Unit", | ||||
|       "rdfs:label":"litre" | ||||
|     } | ||||
|   ] | ||||
| } | ||||
|  | @ -548,9 +548,8 @@ def postMessageToOutbox(session, translate: {}, | |||
| 
 | ||||
|     if debug: | ||||
|         print('DEBUG: handle share uploads') | ||||
|     outboxShareUpload(baseDir, httpPrefix, | ||||
|                       postToNickname, domain, | ||||
|                       port, messageJson, debug, city) | ||||
|     outboxShareUpload(baseDir, httpPrefix, postToNickname, domain, | ||||
|                       port, messageJson, debug, city, systemLanguage) | ||||
| 
 | ||||
|     if debug: | ||||
|         print('DEBUG: handle undo share uploads') | ||||
|  |  | |||
							
								
								
									
										88
									
								
								shares.py
								
								
								
								
							
							
						
						
									
										88
									
								
								shares.py
								
								
								
								
							|  | @ -26,6 +26,51 @@ from utils import acctDir | |||
| from media import processMetaData | ||||
| 
 | ||||
| 
 | ||||
| def _loadProductIds(baseDir: str, systemLanguage: str) -> {}: | ||||
|     """Loads the product types ontology | ||||
|     This is used to add an id to shared items | ||||
|     """ | ||||
|     productTypesFilename = baseDir + '/ontology/customProductTypes.json' | ||||
|     if not os.path.isfile(productTypesFilename): | ||||
|         productTypesFilename = baseDir + '/ontology/productTypes.json' | ||||
|     productTypes = loadJson(productTypesFilename) | ||||
|     if not productTypes: | ||||
|         return None | ||||
|     if not productTypes.get('@graph'): | ||||
|         return None | ||||
|     if len(productTypes['@graph']) == 0: | ||||
|         return None | ||||
|     if not productTypes['@graph'][0].get('rdfs:label'): | ||||
|         return None | ||||
|     languageExists = False | ||||
|     for label in productTypes['@graph'][0]['rdfs:label']: | ||||
|         if not label.get('@language'): | ||||
|             continue | ||||
|         if productTypes['@graph'][0]['rdfs:label']['@language'] == \ | ||||
|            systemLanguage: | ||||
|             languageExists = True | ||||
|             break | ||||
|     if not languageExists: | ||||
|         print('productTypes ontology does not contain the language ' + | ||||
|               systemLanguage) | ||||
|         return None | ||||
|     productIds = {} | ||||
|     for item in productTypes['@graph']: | ||||
|         if not item.get('@id'): | ||||
|             continue | ||||
|         if not item.get('rdfs:label'): | ||||
|             continue | ||||
|         for label in item['rdfs:label']: | ||||
|             if not label.get('@language'): | ||||
|                 continue | ||||
|             if not label.get('@value'): | ||||
|                 continue | ||||
|             if label['@language'] == systemLanguage: | ||||
|                 productIds[label['@value'].lower()] = item['@id'] | ||||
|                 break | ||||
|     return productIds | ||||
| 
 | ||||
| 
 | ||||
| def getValidSharedItemID(displayName: str) -> str: | ||||
|     """Removes any invalid characters from the display name to | ||||
|     produce an item ID | ||||
|  | @ -94,11 +139,45 @@ def _addShareDurationSec(duration: str, published: str) -> int: | |||
|     return 0 | ||||
| 
 | ||||
| 
 | ||||
| def _getshareProductId(baseDir: str, systemLanguage: str, | ||||
|                        itemType: str) -> str: | ||||
|     """Attempts to obtain an Id for the shared item, | ||||
|     based upon productTypes ontology. | ||||
|     See https://github.com/datafoodconsortium/ontology | ||||
|     """ | ||||
|     productIds = _loadProductIds(baseDir, systemLanguage) | ||||
|     if not productIds: | ||||
|         return '' | ||||
|     itemTypeLower = itemType.lower() | ||||
|     matchName = '' | ||||
|     matchId = '' | ||||
|     for name, uri in productIds.items(): | ||||
|         if name not in itemTypeLower: | ||||
|             continue | ||||
|         if len(name) > len(matchName): | ||||
|             matchName = name | ||||
|             matchId = uri | ||||
|     if not matchId: | ||||
|         # bag of words match | ||||
|         maxMatchedWords = 0 | ||||
|         for name, uri in productIds.items(): | ||||
|             words = name.split(' ') | ||||
|             score = 0 | ||||
|             for wrd in words: | ||||
|                 if wrd in itemTypeLower: | ||||
|                     score += 1 | ||||
|             if score > maxMatchedWords: | ||||
|                 maxMatchedWords = score | ||||
|                 matchId = uri | ||||
|     return matchId | ||||
| 
 | ||||
| 
 | ||||
| def addShare(baseDir: str, | ||||
|              httpPrefix: str, nickname: str, domain: str, port: int, | ||||
|              displayName: str, summary: str, imageFilename: str, | ||||
|              itemQty: int, itemType: str, itemCategory: str, location: str, | ||||
|              duration: str, debug: bool, city: str) -> None: | ||||
|              duration: str, debug: bool, city: str, | ||||
|              systemLanguage: str) -> None: | ||||
|     """Adds a new share | ||||
|     """ | ||||
|     sharesFilename = acctDir(baseDir, nickname, domain) + '/shares.json' | ||||
|  | @ -111,6 +190,7 @@ def addShare(baseDir: str, | |||
|     durationSec = _addShareDurationSec(duration, published) | ||||
| 
 | ||||
|     itemID = getValidSharedItemID(displayName) | ||||
|     productId = _getshareProductId(baseDir, systemLanguage, itemType) | ||||
| 
 | ||||
|     # has an image for this share been uploaded? | ||||
|     imageUrl = None | ||||
|  | @ -152,6 +232,7 @@ def addShare(baseDir: str, | |||
|         "summary": summary, | ||||
|         "imageUrl": imageUrl, | ||||
|         "itemQty": itemQty, | ||||
|         "productId": productId, | ||||
|         "itemType": itemType, | ||||
|         "category": itemCategory, | ||||
|         "location": location, | ||||
|  | @ -522,7 +603,8 @@ def sendUndoShareViaServer(baseDir: str, session, | |||
| 
 | ||||
| def outboxShareUpload(baseDir: str, httpPrefix: str, | ||||
|                       nickname: str, domain: str, port: int, | ||||
|                       messageJson: {}, debug: bool, city: str) -> None: | ||||
|                       messageJson: {}, debug: bool, city: str, | ||||
|                       systemLanguage: str) -> None: | ||||
|     """ When a shared item is received by the outbox from c2s | ||||
|     """ | ||||
|     if not messageJson.get('type'): | ||||
|  | @ -577,7 +659,7 @@ def outboxShareUpload(baseDir: str, httpPrefix: str, | |||
|              messageJson['object']['itemCategory'], | ||||
|              messageJson['object']['location'], | ||||
|              messageJson['object']['duration'], | ||||
|              debug, city) | ||||
|              debug, city, systemLanguage) | ||||
|     if debug: | ||||
|         print('DEBUG: shared item received via c2s') | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue