Beispiel #1
0
  def get(self):
    def _simple_error(message, code=400):
      self.error(code)
      self.response.out.write(simplejson.dumps({
        'status': 'error',
        'error': { 'message': message },
        'results': []
      }))
      return None
      
    
    self.response.headers['Content-Type'] = 'application/json'
    query_type = self.request.get('type')
    user = self.request.get('user');
    
    if not query_type in ['proximity', 'bounds', 'user', 'default']:
      return _simple_error('type parameter must be '
                           'one of "proximity", "bounds", "user".',
                           code=400)
    
    if query_type == 'proximity':
      try:
        center = geotypes.Point(float(self.request.get('lat')),
                                float(self.request.get('lon')))
      except ValueError:
        return _simple_error('lat and lon parameters must be valid latitude '
                             'and longitude values.')
    elif query_type == 'bounds':
      try:
        bounds = geotypes.Box(float(self.request.get('north')),
                              float(self.request.get('east')),
                              float(self.request.get('south')),
                              float(self.request.get('west')))
      except ValueError:
        return _simple_error('north, south, east, and west parameters must be '
                             'valid latitude/longitude values.')
    
    max_results = 100
    if self.request.get('maxresults'):
      max_results = int(self.request.get('maxresults'))
    
    max_distance = 8000000 # 80 km ~ 50 mi
    if self.request.get('maxdistance'):
      max_distance = float(self.request.get('maxdistance'))

      
    results = []
    try:
      # Can't provide an ordering here in case inequality filters are used.
      base_query = Listing.all()
      
      #if property_type:
        #base_query.filter('property_type =', property_type)
      
      # Natural ordering chosen to be public school enrollment.
      #base_query.order('-')
      
      # Perform proximity or bounds fetch.
      if query_type == 'proximity':
        results = Listing.proximity_fetch(base_query, center, max_results=max_results, max_distance=max_distance)
      
      elif query_type == 'bounds':
        results = Listing.bounding_box_fetch(base_query, bounds, max_results=max_results)
        
      elif query_type == 'user':
          limit = self.request.get("limit")
          offset = self.request.get("offset")
          if not limit:
              limit = 1000
          else:
              limit = int(limit)
          if not offset:
              offset = 0
          else:
              offset = int(offset)
          results = base_query.fetch(limit, offset);
      
      public_attrs = Listing.public_attributes()
      
      results_obj = [
          _merge_dicts({
            'lat': result.location.lat,
            'lng': result.location.lon,
            },
            dict([(attr, getattr(result, attr))
                  for attr in public_attrs]))
          for result in results]

      self.response.out.write(simplejson.dumps({
        'status': 'success',
        'results': results_obj,
      }))
    except:
      return _simple_error(str(sys.exc_info()[1]), code=500)
Beispiel #2
0
    def get(self):
        def _simple_error(message, code=400):
            self.error(code)
            self.response.out.write(
                simplejson.dumps({
                    'status': 'error',
                    'error': {
                        'message': message
                    },
                    'results': []
                }))
            return None

        self.response.headers['Content-Type'] = 'application/json'
        query_type = self.request.get('type')
        user = self.request.get('user')

        if not query_type in ['proximity', 'bounds', 'user', 'default']:
            return _simple_error(
                'type parameter must be '
                'one of "proximity", "bounds", "user".',
                code=400)

        if query_type == 'proximity':
            try:
                center = geotypes.Point(float(self.request.get('lat')),
                                        float(self.request.get('lon')))
            except ValueError:
                return _simple_error(
                    'lat and lon parameters must be valid latitude '
                    'and longitude values.')
        elif query_type == 'bounds':
            try:
                bounds = geotypes.Box(float(self.request.get('north')),
                                      float(self.request.get('east')),
                                      float(self.request.get('south')),
                                      float(self.request.get('west')))
            except ValueError:
                return _simple_error(
                    'north, south, east, and west parameters must be '
                    'valid latitude/longitude values.')

        max_results = 100
        if self.request.get('maxresults'):
            max_results = int(self.request.get('maxresults'))

        max_distance = 8000000  # 80 km ~ 50 mi
        if self.request.get('maxdistance'):
            max_distance = float(self.request.get('maxdistance'))

        results = []
        try:
            # Can't provide an ordering here in case inequality filters are used.
            base_query = Listing.all()

            #if property_type:
            #base_query.filter('property_type =', property_type)

            # Natural ordering chosen to be public school enrollment.
            #base_query.order('-')

            # Perform proximity or bounds fetch.
            if query_type == 'proximity':
                results = Listing.proximity_fetch(base_query,
                                                  center,
                                                  max_results=max_results,
                                                  max_distance=max_distance)

            elif query_type == 'bounds':
                results = Listing.bounding_box_fetch(base_query,
                                                     bounds,
                                                     max_results=max_results)

            elif query_type == 'user':
                limit = self.request.get("limit")
                offset = self.request.get("offset")
                if not limit:
                    limit = 1000
                else:
                    limit = int(limit)
                if not offset:
                    offset = 0
                else:
                    offset = int(offset)
                results = base_query.fetch(limit, offset)

            public_attrs = Listing.public_attributes()

            results_obj = [
                _merge_dicts(
                    {
                        'lat': result.location.lat,
                        'lng': result.location.lon,
                    },
                    dict([(attr, getattr(result, attr))
                          for attr in public_attrs])) for result in results
            ]

            self.response.out.write(
                simplejson.dumps({
                    'status': 'success',
                    'results': results_obj,
                }))
        except:
            return _simple_error(str(sys.exc_info()[1]), code=500)
Beispiel #3
0
    return render_template('edit_contact.html',landlord=landlord,form=form)
>>>>>>> d76fc545aab7b1e1556c2efea62c18d4a20978f6

@account_required
def logout():
    '''Logs a user out'''
    session.pop('logged_in', None)
    session.pop('username', None)
    flash(u'You were logged out!', 'success')
    return redirect(users.create_logout_url(url_for('home')))

'''No authentication required'''

def all_listings():
    '''Get all active listings in database'''
    listings = Listing.all().filter('occupied =', False).order('-timestamp')
    return render_template('listings.html', listings=listings)

def listings_by_parish(id):
    '''Get all active listings by parish'''
    listings = Listing.gql("WHERE parish = :1 AND occupied = False ORDER BY timestamp DESC", id)
    return render_template('listings.html', listings=listings, parish=id)
    
def get_listing(id=None):
    '''View a single listing'''
    if id is None:
        return redirect(url_for('all_listings'))
    else:
        listing = Listing.get_by_id(id)
        return render_template('listing.html', listing=listing)