def test_entity_to_dict(self): """Converts a datastore.Entity instance to a JSON encodable dict.""" from datetime import datetime from gaesynkit import handlers from google.appengine.api import datastore from google.appengine.api import datastore_types from google.appengine.api import users from google.appengine.ext import db entity = datastore.Entity("Test") entity.update({ "string": "A string.", "byte_string": datastore_types.ByteString("Byte String"), "boolean": True, "int": 42, "float": 1.82, "date": datetime(2011, 01, 06), "list": [1, 2, 3, 4], "key": db.Key.from_path("Kind", "name"), "user": users.User("*****@*****.**"), "email": db.Email("*****@*****.**"), "location": db.GeoPt(52.500556, 13.398889), "category": db.Category("coding"), "link": db.Link("http://www.google.com"), "im": db.IM("sip", "foobar"), "phone": db.PhoneNumber("1 (206) 555-1212"), "address": db.PostalAddress("Address"), "rating": db.Rating(99) })
def hook(dct): clsType = dct[CLASS_TYPE_STR] if clsType == 'date': return datetime.date.fromtimestamp(dct[CLASS_VALUE_STR]) if clsType == 'email': return db.Email(dct[CLASS_VALUE_STR]) if clsType == 'phone': return db.PhoneNumber(dct[CLASS_VALUE_STR]) elif clsType == 'rating': return db.Rating(dct[CLASS_VALUE_STR]) # The constructor can't handle the clsType tag, so delete it! dictCopy = dict((key, value) for key, value in dct.iteritems() if not key.startswith('__')) return globals()[clsType](**dictCopy).put()
def harvest_yelp_reviews(self, social_account): """ Harvest yelp reviews and put into data model """ # Build connector yelp_connector = connectors.yelp.YelpConnector() last_review_date = None review_id_list = [] # Get most recent review date q = datamodel.SocialReview.gql('WHERE social_account = :1 ORDER BY review_date DESC LIMIT 1', social_account) last_social_review = q.get() # Do we have data... then pull from last post if last_social_review: last_review_date = last_social_review.review_date # Load reviews on that review_date so we can check to see if we reloaded them in this last harvest q = db.GqlQuery("SELECT __key__ FROM SocialReview WHERE social_account = :1 AND review_date = :2", social_account, last_review_date) for review_key in q: review_id_list.append(datamodel.SocialReview.get(review_key).social_account_item_id) # Call Yelp review_list = yelp_connector.get_reviews(social_account.user_id, last_review_date) # Iterate through and store in db... lets check against for review in review_list: if (review.review_id not in review_id_list): social_review = datamodel.SocialReview(user = social_account.user, social_account = social_account, social_account_item_id = review.review_id, full_business_name = review.business_name, business_address = db.PostalAddress(review.business_address), social_account_business_id = review.business_id, review_rating = db.Rating(review.rating*4), review_date = review.review_date, review_text = review.review) # Build category list for c in review.category_list: social_review.business_category_list.append(c) social_review.put()
def post(self): self.log.info(self.request.POST) if self.request.get('winery_submit'): m = self.toTime(self.request.get('monday')) t = self.toTime(self.request.get('tuesday')) w = self.toTime(self.request.get('wednesday')) th = self.toTime(self.request.get('thursday')) f = self.toTime(self.request.get('friday')) s = self.toTime(self.request.get('saturday')) su = self.toTime(self.request.get('sunday')) h = WeeklyHours(monday=m, tuesday=t, wednesday=w, thursday=th, friday=f, saturday=s, sunday=su).put() lat_long = self.request.get('location').split(',') loc = db.GeoPt(float(lat_long[0].strip()), float(lat_long[1].strip())) blb = db.Blob(self.request.get('picture').encode('base64')) Winery(name=self.request.get('name'), description=self.request.get('description'), email=self.request.get('email'), phone=self.request.get('phone'), location=loc, hours=h, image=blb, address=db.PostalAddress(self.request.get('address')), rating=db.Rating(int(self.request.get('rating')))).put() else: wineryKey = db.Key.from_path('Winery', int(self.request.get("winery_id"))) sdate = datetime.datetime.strptime(self.request.get("start_date"), '%Y/%m/%d') edate = datetime.datetime.strptime(self.request.get("end_date"), '%Y/%m/%d') Event(name=self.request.get("name"), description=self.request.get("description"), winery=wineryKey, startDate=sdate, startTime=self.request.get("start_time").strip(), endDate=edate, endTime=self.request.get("end_time").strip()).put() self.redirect('/')
def HandleRequest(self): template_data = { 'logout_url': users.create_logout_url("/"), 'message': '', } responder = common.LookupModelFromRequest(self.request) rating = self.request.get('rating') if responder is not None and rating is not None: rating_int = StringToInt(rating, False) if rating_int >= 0 and rating_int <= 100: template_data['message'] = ( 'Set rating of %s to %d' % (responder.model_description, rating_int)) responder.rdm_responder_rating = db.Rating(rating_int) responder.put() self.response.headers['Content-Type'] = 'text/html' self.response.out.write( template.render('templates/admin-adjust-test-score.tmpl', template_data))
datetime=d, date=d.date(), time=d.time(), list=[1, 2, 3], strlist=["hello", u'world'], user=users.User("*****@*****.**"), blob=db.Blob("somerandomdata"), text=db.Text("some random text"), category=db.Category("awesome"), link=db.Link("http://www.10gen.com"), email=db.Email("*****@*****.**"), geopt=db.GeoPt(40.74067, -73.99367), im=db.IM("http://aim.com/", "example"), phonenumber=db.PhoneNumber("1 (999) 123-4567"), postaladdress=db.PostalAddress("40 W 20th St., New York, NY"), rating=db.Rating(99), ) out = db.get(e1.put()) def failIfNot(reference, value, type): assert value == reference assert isinstance(value, type) failIfNot(e1.str, out.str, types.UnicodeType) failIfNot(e1.bool, out.bool, types.BooleanType) # TODO on AE this would always be types.LongType # This gets difficult with our database, as longs are stored as doubles.
def getproperty(kind, p, key=False): if key: input_name = 'input__p__key__%s' % p else: input_name = 'input__p__%s' % p v = getattr(request.forms, input_name) if not key: property_class = kind._properties[p] else: property_class = db.StringProperty() logging.info("p = %s" % p) logging.info("v = %s" % v) logging.info("property_class = %s" % property_class) if not v: v = None else: if isinstance(property_class, db.BooleanProperty): if v.lower() in ['false', 'no']: v = False else: v = bool(v) elif isinstance(property_class, db.IntegerProperty): v = long(v) elif isinstance(property_class, db.FloatProperty): v = float(v) elif isinstance(property_class, db.DateTimeProperty): v = datetime.datetime.strptime(v, '%Y-%m-%d %H:%M:%S.%f') elif isinstance(property_class, db.LinkProperty): v = db.Link(v) elif isinstance(property_class, db.TextProperty): v = db.Text(v) elif isinstance(property_class, db.BlobProperty): v = db.Blob(v) elif isinstance(property_class, db.EmailProperty): v = db.Email(v) elif isinstance(property_class, db.GeoPtProperty): lat, lon = [float(x) for x in v.split(',', 1).strip()] v = db.GeoPt(lat, lon) elif isinstance(property_class, db.RatingProperty): v = db.Rating(int(v)) elif isinstance(property_class, db.CategoryProperty): v = db.Category(v) elif isinstance(property_class, (db.ListProperty, db.StringListProperty)): # todo assumes list of strings v = list([v.strip() for v in v.split(",")]) elif isinstance(property_class, db.ReferenceProperty): kindname = property_class.reference_class.__name__ v = db.Key(kindname, v) elif isinstance(property_class, blobstore.BlobReferenceProperty): v = blobstore.BlobKey(v) elif isinstance( property_class, (db.IMProperty, db.PhoneNumberProperty, db.PostalAddressProperty)): abort( 500, 'Unsupported property type %s for model %s' % (property_class, kind.__name__)) if key and v is None: abort( 400, 'Property %s is part of the key for model %s so is required' % (p, kind.__name__)) return v