def _render(self, search_key): self.response.headers['content-type'] = 'application/json; charset="utf-8"' entry = TypeaheadEntry.get_by_id(search_key) if entry is None: return '[]' else: self._last_modified = entry.updated return entry.data_json
def _render(self, search_key): """ Currently, search_key is the first character in the search query entered by the user. If desired, this could be the entire query, but searching by the first letter seems to be good enough for us. """ entry = TypeaheadEntry.get_by_id(search_key) if entry is None: return '[]' else: return entry.data_json
def _render(self, search_key): self.response.headers['Cache-Control'] = 'public, max-age=%d' % self._cache_expiration self.response.headers['Pragma'] = 'Public' self.response.headers['content-type'] = 'application/json; charset="utf-8"' entry = TypeaheadEntry.get_by_id(search_key) if entry is None: return '[]' else: if self._has_been_modified_since(entry.updated): return entry.data_json else: return None
def _render(self, search_key): self.response.headers["Cache-Control"] = "public, max-age=%d" % self._cache_expiration self.response.headers["Pragma"] = "Public" self.response.headers["content-type"] = 'application/json; charset="utf-8"' entry = TypeaheadEntry.get_by_id(search_key) if entry is None: return "[]" else: if self._has_been_modified_since(entry.updated): return entry.data_json else: return None
def _render(self, search_key): self.response.headers[ 'Cache-Control'] = 'public, max-age=%d' % self._cache_expiration self.response.headers['Pragma'] = 'Public' self.response.headers[ 'content-type'] = 'application/json; charset="utf-8"' entry = TypeaheadEntry.get_by_id(search_key) if entry is None: return '[]' else: if self._has_been_modified_since(entry.updated): return entry.data_json else: return None
def get(self): @ndb.tasklet def get_events_async(): event_keys = yield Event.query().order(-Event.year).order(Event.name).fetch_async(keys_only=True) events = yield ndb.get_multi_async(event_keys) raise ndb.Return(events) @ndb.tasklet def get_teams_async(): team_keys = yield Team.query().order(Team.team_number).fetch_async(keys_only=True) teams = yield ndb.get_multi_async(team_keys) raise ndb.Return(teams) @ndb.tasklet def get_districts_async(): district_keys = yield District.query().order(-District.year).fetch_async(keys_only=True) districts = yield ndb.get_multi_async(district_keys) raise ndb.Return(districts) @ndb.toplevel def get_events_teams_districts(): events, teams, districts = yield get_events_async(), get_teams_async(), get_districts_async() raise ndb.Return((events, teams, districts)) events, teams, districts = get_events_teams_districts() results = {} for team in teams: if not team.nickname: nickname = "Team %s" % team.team_number else: nickname = team.nickname data = '%s | %s' % (team.team_number, nickname) if TypeaheadEntry.ALL_TEAMS_KEY in results: results[TypeaheadEntry.ALL_TEAMS_KEY].append(data) else: results[TypeaheadEntry.ALL_TEAMS_KEY] = [data] for district in districts: data = '%s District [%s]' % (district.display_name, district.abbreviation.upper()) # all districts if TypeaheadEntry.ALL_DISTRICTS_KEY in results: if data not in results[TypeaheadEntry.ALL_DISTRICTS_KEY]: results[TypeaheadEntry.ALL_DISTRICTS_KEY].append(data) else: results[TypeaheadEntry.ALL_DISTRICTS_KEY] = [data] for event in events: data = '%s %s [%s]' % (event.year, event.name, event.event_short.upper()) # all events if TypeaheadEntry.ALL_EVENTS_KEY in results: results[TypeaheadEntry.ALL_EVENTS_KEY].append(data) else: results[TypeaheadEntry.ALL_EVENTS_KEY] = [data] # events by year if TypeaheadEntry.YEAR_EVENTS_KEY.format(event.year) in results: results[TypeaheadEntry.YEAR_EVENTS_KEY.format(event.year)].append(data) else: results[TypeaheadEntry.YEAR_EVENTS_KEY.format(event.year)] = [data] # Prepare to remove old entries old_entry_keys_future = TypeaheadEntry.query().fetch_async(keys_only=True) # Add new entries entries = [] for key_name, data in results.items(): entries.append(TypeaheadEntry(id=key_name, data_json=json.dumps(data))) ndb.put_multi(entries) # Remove old entries old_entry_keys = set(old_entry_keys_future.get_result()) new_entry_keys = set([ndb.Key(TypeaheadEntry, key_name) for key_name in results.keys()]) keys_to_delete = old_entry_keys.difference(new_entry_keys) logging.info("Removing the following unused TypeaheadEntries: {}".format([key.id() for key in keys_to_delete])) ndb.delete_multi(keys_to_delete) template_values = {'results': results} path = os.path.join(os.path.dirname(__file__), '../templates/math/typeaheadcalc_do.html') self.response.out.write(template.render(path, template_values))