def _update_content_all(self, body, base_revision, comment, user, force_update, dont_create_rev, dont_defer): # do not update if the body is not changed if not force_update and self.body == body: return False # validate and prepare new contents new_data, new_md = self.validate_new_content(base_revision, body, user) new_body = self._merge_if_needed(base_revision, body) # get old data and metadata old_md = self.metadata.copy() old_data = self.data.copy() # delete caches caching.del_rendered_body(self.title) caching.del_hashbangs(self.title) caching.del_metadata(self.title) caching.del_data(self.title) # update model and save self.body = new_body self.modifier = user self.description = PageOperationMixin.make_description(new_body) self.acl_read = new_md.get('read', '') self.acl_write = new_md.get('write', '') self.comment = comment self.itemtype_path = schema.get_itemtype_path(new_md['schema']) self._update_pub_state(new_md, old_md) if not dont_create_rev: self.revision += 1 if not force_update: self.updated_at = datetime.now() self.put() # create revision if not dont_create_rev: rev_key = self._rev_key() rev = WikiPageRevision(parent=rev_key, title=self.title, body=self.body, created_at=self.updated_at, revision=self.revision, comment=self.comment, modifier=self.modifier, acl_read=self.acl_read, acl_write=self.acl_write) rev.put() # update inlinks, outlinks and schema data index self.update_links_and_data(old_md.get('redirect'), new_md.get('redirect'), old_data, new_data, dont_defer) # delete config cache if self.title == '.config': caching.del_config() # delete title cache if it's a new page if self.revision == 1: caching.del_titles() return True
def delete(self, user=None): if not is_admin_user(user): raise RuntimeError('Only admin can delete pages.') self.update_content('', self.revision, user=user, dont_create_rev=True, dont_defer=True) self._update_inlinks({}, {'relatedTo': [p[0] for p in self.paths[:-1]]}) self.related_links = {} self.modifier = None self.updated_at = None self.revision = 0 self.put() ndb.delete_multi(r.key for r in self.revisions) caching.del_titles()
def delete(self, user=None): if not user or user.is_anonymous() or not user.is_superuser: raise RuntimeError('Only admin can delete pages.') self.update_content('', self.revision, user=user, dont_create_rev=True) self._update_inlinks({}, {'relatedTo': [p[0] for p in self.paths[:-1]]}) self.related_links = {} self.modifier = None self.updated_at = None self.revision = 0 self.save() for r in self.revisions.all(): r.delete() caching.del_titles()
def _update_content_all(self, body, base_revision, comment, user, force_update, dont_create_rev): # do not update if the body is not changed if not force_update and self.body == body: return False now = datetime.utcnow().replace(tzinfo=utc) # validate and prepare new contents new_data, new_md = self.validate_new_content(base_revision, body, user) new_body = self._merge_if_needed(base_revision, body) # get old data and metadata try: old_md = self.metadata.copy() except ValueError: old_md = {} try: old_data = self.data.copy() except ValueError: old_data = {} # delete caches caching.del_rendered_body(self.title) caching.del_hashbangs(self.title) caching.del_metadata(self.title) caching.del_data(self.title) # update model and save self.body = new_body if user and not user.is_anonymous(): self.modifier = user self.description = PageOperationMixin.make_description(new_body) self.acl_read = new_md.get('read', '') self.acl_write = new_md.get('write', '') self.comment = comment self.itemtype_path = schema.get_itemtype_path(new_md['schema']) self._update_pub_state(new_md, old_md) if not dont_create_rev: self.revision += 1 if not force_update: self.updated_at = now self.save() # create revision if not dont_create_rev: rev = WikiPageRevision(page=self, title=self.title, body=self.body, created_at=self.updated_at, revision=self.revision, comment=self.comment, modifier=self.modifier) rev.save() self.update_links_and_data(old_md.get('redirect'), new_md.get('redirect'), old_data, new_data) # delete config cache if self.title == '.config': caching.del_config() # delete title cache if it's a new page if self.revision == 1: caching.del_titles() return True
def _update_content_all(self, body, base_revision, comment, user, force_update, dont_create_rev, dont_defer): # do not update if the body is not changed if not force_update and self.body == body: return False now = datetime.now() # validate and prepare new contents new_data, new_md = self.validate_new_content(base_revision, body, user) new_body = self._merge_if_needed(base_revision, body) # get old data and metadata try: old_md = self.metadata.copy() except ValueError: old_md = {} try: old_data = self.data.copy() except ValueError: old_data = {} # delete caches caching.del_rendered_body(self.title) caching.del_hashbangs(self.title) caching.del_metadata(self.title) caching.del_data(self.title) # update model and save self.body = new_body self.modifier = user self.description = PageOperationMixin.make_description(new_body) self.acl_read = new_md.get('read', '') self.acl_write = new_md.get('write', '') self.comment = comment self.itemtype_path = schema.get_itemtype_path(new_md['schema']) self._update_pub_state(new_md, old_md) if not dont_create_rev: self.revision += 1 if not force_update: self.updated_at = now self.put() # create revision if not dont_create_rev: rev_key = self._rev_key() rev = WikiPageRevision(parent=rev_key, title=self.title, body=self.body, created_at=self.updated_at, revision=self.revision, comment=self.comment, modifier=self.modifier, acl_read=self.acl_read, acl_write=self.acl_write) rev.put() # update inlinks, outlinks and schema data index self.update_links_and_data(old_md.get('redirect'), new_md.get('redirect'), old_data, new_data, dont_defer) # delete config cache if self.title == '.config': caching.del_config() # delete title cache if it's a new page if self.revision == 1: caching.del_titles() return True