def initialize(self, request, response): webapp.RequestHandler.initialize(self, request, response) # If requested, set the clock before doing anything clock-related. # Only works on localhost for testing. Specify ?utcnow=1293840000 to # set the clock to 2011-01-01, or ?utcnow=real to revert to real time. utcnow = request.get('utcnow') if request.remote_addr == '127.0.0.1' and utcnow: if utcnow == 'real': utils.set_utcnow_for_test(None) else: utils.set_utcnow_for_test(float(utcnow)) # If requested, flush caches before we touch anything that uses them. flush_caches(*request.get('flush', '').split(',')) # check for legacy redirect: # TODO(lschumacher|kpy): remove support for legacy URLS Q1 2012. if legacy_redirect.do_redirect(self): # stub out get/head to prevent failures. self.get = self.head = lambda *args: None return legacy_redirect.redirect(self) # Gather commonly used information into self.env. self.env = setup_env(request) # Force a redirect if requested, except where https is not supported: # - for cron jobs # - for task queue jobs # - in development if (self.env.force_https and self.env.scheme == 'http' and not is_cron_task(self.request) and not is_task_queue_task(self.request) and not is_development_server()): self.redirect(self.env.url.replace('http:', 'https:')) # Activate the selected language. response.headers['Content-Language'] = self.env.lang response.headers['Set-Cookie'] = \ 'django_language=%s; path=/' % self.env.lang django_setup.activate(self.env.lang) # Activate the appropriate resource bundle. resources.set_active_bundle_name(self.env.resource_bundle)
def post(self): if not (self.auth and self.auth.search_permission and self.auth.domain_write_permission == '*'): self.info( 403, message= '"key" URL parameter is either missing, invalid or ' 'lacks required permissions. The key\'s repo must be "*", ' 'search_permission must be True, and it must have write ' 'permission with domain name "*".', style='plain') return body = self.request.body_file.read() doc = xml.dom.minidom.parseString(body) message_text = self.get_element_text(doc, 'message_text') receiver_phone_number = self.get_element_text( doc, 'receiver_phone_number') if message_text is None: self.info( 400, message='message_text element is required.', style='plain') return if receiver_phone_number is None: self.info( 400, message='receiver_phone_number element is required.', style='plain') return repo = ( self.config.sms_number_to_repo and self.config.sms_number_to_repo.get(receiver_phone_number)) if not repo: self.info( 400, message= 'The given receiver_phone_number is not found in ' 'sms_number_to_repo config.', style='plain') return query_lang = None query_action = None match = None for lang, action, regex in HandleSMS.QUERY_PATTERNS: match = re.search(regex, message_text.strip(), re.I) if match: query_lang = lang query_action = action break if query_lang: # Use the language for the following calls of _(). django_setup.activate(query_lang) responses = [] if query_action == 'search': query_string = match.group(1).strip() query = TextQuery(query_string) persons = indexing.search(repo, query, HandleSMS.MAX_RESULTS) if persons: for person in persons: responses.append(self.render_person(person)) else: responses.append( _('No results found for: %(query)s') % {'query': query_string}) responses.append( _('More at: %(url)s') % {'url': 'google.org/personfinder/%s?ui=light' % repo}) responses.append( _('All data entered in Person Finder is available to the ' 'public and usable by anyone. Google does not review or ' 'verify the accuracy of this data ' 'google.org/personfinder/global/tos')) elif self.config.enable_sms_record_input and query_action == 'add': name_string = match.group(1).strip() person = Person.create_original( repo, entry_date=utils.get_utcnow(), full_name=name_string, family_name='', given_name='') person.update_index(['old', 'new']) note = Note.create_original( repo, entry_date=utils.get_utcnow(), source_date=utils.get_utcnow(), person_record_id=person.record_id, author_name=name_string, author_made_contact=True, status='is_note_author', text=message_text) db.put(note) model.UserActionLog.put_new('add', note, copy_properties=False) person.update_from_note(note) db.put(person) model.UserActionLog.put_new('add', person, copy_properties=False) responses.append(_('Added a record for: %(person_name)s') % {'person_name': name_string}) else: usage_str = 'Usage: "Search John"' if self.config.enable_sms_record_input: usage_str += ' OR "I am John"' responses.append(usage_str) # Convert the response into ASCII because the SMS pipeline doesn't # support UTF-8. # e.g., It removes diacritics such as "ú" -> "u". # This seems acceptable for Spanish, but may not be for other # languages. ascii_response = unidecode(u' ## '.join(responses)) self.response.headers['Content-Type'] = 'application/xml; charset=utf-8' self.write( '<?xml version="1.0" encoding="utf-8"?>\n' '<response>\n' ' <message_text>%s</message_text>\n' '</response>\n' % django.utils.html.escape(ascii_response))