1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 import logging 6 import traceback 7 8 from data_source import DataSource 9 from extensions_paths import EXAMPLES 10 from future import All, Future 11 from platform_util import GetPlatforms 12 13 14 def _GetSampleId(sample_name): 15 return sample_name.lower().replace(' ', '-') 16 17 18 def GetAcceptedLanguages(request): 19 if request is None: 20 return [] 21 accept_language = request.headers.get('Accept-Language', None) 22 if accept_language is None: 23 return [] 24 return [lang_with_q.split(';')[0].strip() 25 for lang_with_q in accept_language.split(',')] 26 27 28 def CreateSamplesView(samples_list, request): 29 return_list = [] 30 for dict_ in samples_list: 31 name = dict_['name'] 32 description = dict_['description'] 33 if description is None: 34 description = '' 35 if name.startswith('__MSG_') or description.startswith('__MSG_'): 36 try: 37 # Copy the sample dict so we don't change the dict in the cache. 38 sample_data = dict_.copy() 39 name_key = name[len('__MSG_'):-len('__')] 40 description_key = description[len('__MSG_'):-len('__')] 41 locale = sample_data['default_locale'] 42 for lang in GetAcceptedLanguages(request): 43 if lang in sample_data['locales']: 44 locale = lang 45 break 46 locale_data = sample_data['locales'][locale] 47 sample_data['name'] = locale_data[name_key]['message'] 48 sample_data['description'] = locale_data[description_key]['message'] 49 sample_data['id'] = _GetSampleId(sample_data['name']) 50 except Exception: 51 logging.error(traceback.format_exc()) 52 # Revert the sample to the original dict. 53 sample_data = dict_ 54 return_list.append(sample_data) 55 else: 56 dict_['id'] = _GetSampleId(name) 57 return_list.append(dict_) 58 return return_list 59 60 61 class SamplesDataSource(DataSource): 62 '''Constructs a list of samples and their respective files and api calls. 63 ''' 64 def __init__(self, server_instance, request): 65 self._platform_bundle = server_instance.platform_bundle 66 self._request = request 67 68 def _GetImpl(self, platform): 69 cache = self._platform_bundle.GetSamplesModel(platform).GetCache() 70 create_view = lambda samp_list: CreateSamplesView(samp_list, self._request) 71 return cache.GetFromFileListing('' if platform == 'apps' 72 else EXAMPLES).Then(create_view) 73 74 def get(self, platform): 75 return self._GetImpl(platform).Get() 76 77 def GetRefreshPaths(self): 78 return [platform for platform in GetPlatforms()] 79 80 def Refresh(self, path): 81 return self._GetImpl(path) 82