Advertisement
Guest User

Untitled

a guest
Dec 28th, 2014
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.97 KB | None | 0 0
  1. from gcloudorm import model as ndb
  2.  
  3. class DatastoreManager(object):
  4. def __init__(self, model):
  5. assert isinstnace(model, ndb.Model)
  6. self._model = model
  7.  
  8. def update(self, id, data):
  9. # update or replace
  10. obj = self._model.get_by_id(id)
  11. if not obj:
  12. return self.replace(id, data)
  13.  
  14. return self.patch(obj, data)
  15.  
  16. def patch(self, obj, data):
  17. for attr in data:
  18. setattr(obj, attr, data[attr])
  19.  
  20. return obj
  21.  
  22. def replace(self, id, data):
  23. obj = self._model(id=id)
  24. return self.patch(obj, data)
  25.  
  26. def remove(self, id):
  27. obj = self._model(id=id)
  28. obj.delete()
  29.  
  30. class SyncMixin(models.Model):
  31.  
  32. sync_manager = None
  33.  
  34. last_sync = models.DateTimeField(null=True, blank=True, editable=False)
  35.  
  36. class Meta:
  37. abstract = True
  38.  
  39. def to_datastore_id(self):
  40. return self.pk
  41.  
  42. def to_datastore_dict(self):
  43. raise NotImplementedError()
  44.  
  45. def save(self, *args, **kwargs):
  46. assert isinstance(self.sync_manager, DatastoreManager)
  47.  
  48. obj = self.sync_manager.replace(
  49. id=self.to_datastore_id(),
  50. self.to_datastore_dict()
  51. )
  52. obj.put()
  53. self.last_sync = datetime.utcnow()
  54. return super(SyncMixin, self).save(*args, **kwargs)
  55.  
  56. def delete(self):
  57. assert isinstance(self.sync_manager, DatastoreManager)
  58.  
  59. self.sync_manager.remove(self.to_datastore_id())
  60. super(SyncMixin, self).delete()
  61.  
  62. class Publisher(SyncMixin):
  63. name = models.CharField(max_length=255)
  64.  
  65. query_settings = JSONField(null=True, blank=True, default=Publisher.DEFAULT_QUERY_SETTINGS)
  66.  
  67. sync_manager = DatastoreManager(ad.models.Publisher)
  68.  
  69. def to_datastore_dict(self):
  70. return {
  71. "setting": {
  72. "query_setting": self.query_settings,
  73. "limit": self.limit
  74. },
  75. "name": self.name,
  76. "publisher_id": self.pk
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement