Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from gcloudorm import model as ndb
- class DatastoreManager(object):
- def __init__(self, model):
- assert isinstnace(model, ndb.Model)
- self._model = model
- def update(self, id, data):
- # update or replace
- obj = self._model.get_by_id(id)
- if not obj:
- return self.replace(id, data)
- return self.patch(obj, data)
- def patch(self, obj, data):
- for attr in data:
- setattr(obj, attr, data[attr])
- return obj
- def replace(self, id, data):
- obj = self._model(id=id)
- return self.patch(obj, data)
- def remove(self, id):
- obj = self._model(id=id)
- obj.delete()
- class SyncMixin(models.Model):
- sync_manager = None
- last_sync = models.DateTimeField(null=True, blank=True, editable=False)
- class Meta:
- abstract = True
- def to_datastore_id(self):
- return self.pk
- def to_datastore_dict(self):
- raise NotImplementedError()
- def save(self, *args, **kwargs):
- assert isinstance(self.sync_manager, DatastoreManager)
- obj = self.sync_manager.replace(
- id=self.to_datastore_id(),
- self.to_datastore_dict()
- )
- obj.put()
- self.last_sync = datetime.utcnow()
- return super(SyncMixin, self).save(*args, **kwargs)
- def delete(self):
- assert isinstance(self.sync_manager, DatastoreManager)
- self.sync_manager.remove(self.to_datastore_id())
- super(SyncMixin, self).delete()
- class Publisher(SyncMixin):
- name = models.CharField(max_length=255)
- query_settings = JSONField(null=True, blank=True, default=Publisher.DEFAULT_QUERY_SETTINGS)
- sync_manager = DatastoreManager(ad.models.Publisher)
- def to_datastore_dict(self):
- return {
- "setting": {
- "query_setting": self.query_settings,
- "limit": self.limit
- },
- "name": self.name,
- "publisher_id": self.pk
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement