Guest User

Untitled

a guest
Mar 31st, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.21 KB | None | 0 0
  1. class Ad(db.Model): #change to ndb.model
  2. cities = db.ListProperty(db.Key) #ndb.KeyProperty(repeated=True)
  3. regions = db.ListProperty(db.Key) #ndb.KeyProperty(repeated=True)
  4. blobs = db.ListProperty(db.BlobKey) #ndb.BlobProperty(repeated=True)
  5. videos = db.ListProperty(db.BlobKey)
  6. hasvideo = db.BooleanProperty(default=False,
  7. verbose_name='has_video')
  8. primary_image = blobstore.BlobReferenceProperty()
  9. usr = db.ReferenceProperty() # ndb_model.KeyProperty()
  10. ndb_usr = ndb.KeyProperty()
  11. hasimages = db.BooleanProperty(default=False,
  12. verbose_name='has_images')
  13. trending = db.BooleanProperty(default=False,
  14. verbose_name='trending')
  15. userID = db.StringProperty(verbose_name='User ID')
  16. integer_price = db.IntegerProperty()
  17. ip = ndb.StringProperty(verbose_name='ip')
  18. ipcountry = db.StringProperty(indexed=False, verbose_name='origin')
  19. tags = db.ListProperty(db.Category)
  20. category = db.CategoryProperty(verbose_name='Category')
  21. title = db.StringProperty(verbose_name='title') # required
  22. type = db.StringProperty(verbose_name='ContentType') # sell,wanted,rent,lease,buy
  23. company_ad = db.BooleanProperty(default=False,
  24. verbose_name='company_ad') # false or nothing
  25. user = db.UserProperty(verbose_name='userid')
  26. im = db.IMProperty(verbose_name='nickname') # optional, xmpp
  27. city = db.StringProperty() # postaladdress should work instead
  28. region = db.StringProperty() # postaladdress should work instead
  29. url = db.StringProperty(verbose_name='url')
  30. geopt = db.GeoPtProperty(verbose_name='geopt')
  31. text = db.TextProperty(verbose_name='text')
  32. currency = db.StringProperty(choices=(
  33. 'INR',
  34. 'EUR',
  35. 'ARS',
  36. 'AUD',
  37. 'BRL',
  38. 'GBP',
  39. 'CAD',
  40. 'CZK',
  41. 'DKK',
  42. 'HKD',
  43. 'HUF',
  44. 'ILS',
  45. 'JPY',
  46. 'MXN',
  47. 'NZD',
  48. 'NOK',
  49. 'PLN',
  50. 'PHP',
  51. 'SGD',
  52. 'SEK',
  53. 'SGD',
  54. 'CHF',
  55. 'USD',
  56. 'THB',
  57. 'TWB',
  58. ), verbose_name='Currency')
  59. price = db.StringProperty(verbose_name='price')
  60. phonenumber = db.PhoneNumberProperty(indexed=False,
  61. verbose_name='phonenumber') # viewbit
  62. phoneview = db.BooleanProperty(default=False,
  63. verbose_name='phoneview')
  64. email = db.EmailProperty(verbose_name='Email') # optional
  65. name = db.StringProperty(verbose_name='Name')
  66. published = db.BooleanProperty(default=True,
  67. verbose_name='published')
  68. address = db.StringProperty(verbose_name='address')
  69. number_of_rooms = db.IntegerProperty()
  70. size = db.FloatProperty()
  71. regdate = db.IntegerProperty()
  72. mileage = db.IntegerProperty()
  73. added = db.DateTimeProperty(verbose_name='added', auto_now_add=True) # readonly
  74. modified = db.DateTimeProperty(verbose_name='modified',
  75. auto_now_add=True)
  76. last_modified = db.DateTimeProperty(required=True, auto_now=True)
  77. crypted_password = db.StringProperty() # set default true random
  78. salt = db.StringProperty() # merge with passwrd, set default true random or why even store?
  79. timestamp = db.DateTimeProperty(auto_now=True) #
  80. image_url = db.URLProperty();
  81.  
  82. def __unicode__(self):
  83. return self.title
  84.  
  85. def to_json(self):
  86. data = {}
  87. for prop in self.properties().values():
  88. data[prop.name] = prop.get_value_for_datastore(self)
  89. return json(data)
  90.  
  91. def __encrypt(self, plaintext, salt=''):
  92. """returns the SHA1 hexdigest of a plaintext and salt"""
  93.  
  94. phrase = hashlib.sha1()
  95. phrase.update('%s--%s' % (plaintext, salt))
  96. return phrase.hexdigest()
  97.  
  98. def set_password(self, new_password):
  99. """sets the crypted_password"""
  100.  
  101. if not self.salt:
  102. self.salt = self.__encrypt(str(datetime.now()))
  103. self.crypted_password = self.__encrypt(new_password, self.salt)
  104.  
  105. def set_geography(self):
  106. """sets the ad's region and city"""
  107.  
  108. url = 'http://maps.googleapis.com/maps/api/geocode/json'
  109. + '?latlng={},{}&sensor=false'.format(self.geopt.lat,
  110. self.geopt.lon)
  111. result = urlfetch.fetch(url)
  112. jsondata = json.loads(result.content)
  113.  
  114. for result in jsondata['results']:
  115. for component in result['address_components']:
  116. if 'administrative_area_level_1' in component['types']:
  117. self.region = component['long_name'
  118. ].replace('County', '')
  119. if 'locality' in component['types']:
  120. self.city = component['long_name']
  121. if self.city and self.region:
  122. self.place = self.city + ', ' + self.region
  123. elif self.city:
  124. self.place = self.city
  125. elif self.region:
  126. self.place = self.region
  127.  
  128. def check_password(self, plaintext):
  129. return self.__encrypt(plaintext, self.salt)
  130. == self.crypted_password
  131.  
  132. def next(self):
  133. return (Ad.all().filter('published =', True).filter('modified >'
  134. , self.modified).get() if Ad.all().filter('published ='
  135. , True).filter(
  136. 'modified >',
  137. self.modified).get() else self)
  138.  
  139. def prev(self):
  140. return Ad.all().filter('published =', True).filter('modified <'
  141. , self.modified).get()
  142.  
  143. def get_city(self):
  144. return montaomodel.City.get(self.cities[0])
  145.  
  146. #def get_categoryname(self):
  147. # return CATEGORIES[str(ad.category)]
  148.  
  149. def get_adimage_serving_url(self):
  150. data = memcache.get('img-serv-url' + str(self.key().id()))
  151. if data is not None:
  152. return data
  153. else:
  154. if self.matched_images.get():
  155. try:
  156. data = images.get_serving_url(str(self.matched_images.get().primary_image.key()), size=150).replace('http://', 'https://')
  157. except Exception, e:
  158. logging.exception('exception: %s', str(e))
  159. data = False
  160. else:
  161. data = False
  162. memcache.add('img-serv-url' + str(self.key().id()), data, 36000)
  163. return data
  164.  
  165. def uri2view(self):
  166. try:
  167. return self.get_adimage_serving_url()
  168. except Exception, e:
  169. logging.exception('exception: %s', str(e))
  170. return None
  171.  
  172. @classmethod
  173. def count_all(cls):
  174. """
  175. Count *all* of the rows (without maxing out at 1000)
  176. """
  177.  
  178. count = 0
  179. query = cls.all().order('__key__')
  180.  
  181. while True:
  182. current_count = query.count()
  183. if current_count == 0:
  184. return count
  185. count += current_count
  186.  
  187. if current_count == 1000:
  188. last_key = query.fetch(1, 999)[0].key()
  189. query = query.filter('__key__ > ', last_key)
  190.  
  191. return count
Add Comment
Please, Sign In to add comment