def post(self): item = None vals = {} try: # get all the incoming values name = self.request.get('name') email = self.request.get('email') website = self.request.get('website') comment = self.request.get('comment') if self.request.get('key'): item = Comment.get( self.request.get('key') ) item.name = name item.email = email item.website = website item.comment = comment else: # we have no ability to add comments, so fail here raise error.RequiresEntityError("Needs a comment key (ie. can't add new comments in the admin interface)") # update and save this comment item.set_derivatives() item.put() # don't need to item.node.regenerate() since the status is _not_ changing self.redirect('.') except Exception, err: vals['item'] = self.request.POST vals['err'] = err vals['sections'] = Section.all() vals['types'] = models.type_choices self.template( 'comment-form.html', vals, 'admin' );
def post(self): item = None vals = {} try: # get all the incoming values section = Section.get( self.request.get('section') ) name = self.request.get('name').strip() title = self.request.get('title').strip() content = self.request.get('content') type = self.request.get('type') label_raw = self.request.get('label_raw').strip() attribute_raw = util.make_attr_raw_string( { 'index-entry' : self.request.get('index_entry'), 'has-comments' : self.request.get('has_comments'), 'comments-open' : self.request.get('comments_open'), } ).strip() # some pre-processing of the input params if name == '': name = util.urlify(self.request.get('title')) if self.request.get('key'): item = Page.get( self.request.get('key') ) item.section = section item.name = name item.title = title item.content = content item.type = type item.label_raw = label_raw item.attribute_raw = attribute_raw else: item = Page( section = section, name = name, title = title, content = content, type = type, label_raw = label_raw, attribute_raw = attribute_raw, ) # update and save this page item.set_derivatives() item.put() # once saved, regenerate certain section properties section.regenerate() # also, check that this section doesn't have duplicate content Task( params={ 'section_key': str(section.key()), 'name': item.name }, countdown=30, ).add( queue_name='section-check-duplicate-nodes' ) self.redirect('.') except Exception, err: vals['item'] = self.request.POST vals['err'] = err vals['sections'] = Section.all() vals['types'] = models.type_choices self.template( 'page-form.html', vals, 'admin' );
class SectionForm(wt.Form): title = wt.StringField(validators=(wt.validators.required(), )) forum = wt.SelectField(choices=[(forum.id, forum.title) for forum in Forum.all()], coerce=int) # TODO(a.telishev): Section relates from forum parent = wt.SelectField(choices=[(section.id, section.title) for section in Section.all()], coerce=int)
def get(self): item = None if self.request.get('key'): item = Page.get( self.request.get('key') ) vals = { 'item' : item, 'sections' : Section.all(), 'types' : models.type_choices } self.template( 'page-form.html', vals, 'admin' );
def get(self): sections = Section.all().fetch(section_count+1) more = True if len(sections) > section_count else False vals = { 'title' : 'Section List', 'sections' : sections, 'section_count' : section_count if more else len(sections), 'more' : more, } self.template( 'section-list.html', vals, 'admin' );
def get(self): item = None if self.request.get('key'): item = Comment.get( self.request.get('key') ) else: raise error.RequiresEntityError("Needs a comment key (ie. can't add new comments in the admin interface)") vals = { 'item' : item, 'sections' : Section.all(), 'types' : models.type_choices } self.template( 'comment-form.html', vals, 'admin' );
def get(self): vals = { 'sections' : Section.all(), 'node_types' : models.node_choices, 'title' : 'Import a node', 'data_types' : [ { 'value' : 'json', 'text' : 'JSON' }, { 'value' : 'yaml', 'text' : 'YAML' }, ], 'node_type' : self.request.get('node_type'), 'section_key' : self.request.get('section_key'), 'data_type' : self.request.get('data_type'), } self.template( 'load-form.html', vals, 'admin' );
def get(self): section = None if self.request.get('section'): try: section = Section.get( self.request.get('section') ) except BadKeyError: # invalid key self.redirect('.') pages = Page.all().filter('section =', section).order('-inserted').fetch(page_count+1) else: pages = Page.all().order('-inserted').fetch(page_count+1) more = True if len(pages) > page_count else False vals = { 'title' : 'Page List', 'sections' : Section.all(), 'section' : section, 'pages' : pages, 'page_count' : page_count if more else len(pages), 'more' : more, } self.template( 'page-list.html', vals, 'admin' );
def get(self): path = urllib.unquote(self.request.path) m = parts.search(path) if m is None: self.error(404) return this_path = m.group(1) this_page = m.group(3) or 'index' this_ext = m.group(4) or 'html' if this_page is None: this_page = 'index' this_ext = 'html' section = Section.all().filter('path =', this_path).get() if section is None: self.error(404) return # if this is an index, call a different template if this_page == 'index' and this_ext == 'html': # index.html vals = { 'page' : 'index.html', 'section' : section, } self.template( section.layout + '-index.html', vals, util.config_value('Theme') ); elif this_page == 'rss20' and this_ext == 'xml': # rss20.xml nodes = self.latest_nodes(section, 'index-entry', 10) vals = { 'page' : 'rss20.xml', 'section' : section, 'nodes' : nodes, } self.response.headers['Content-Type'] = 'application/rss+xml' self.template( 'rss20.xml', vals, 'rss' ); elif this_page == 'sitefeed' and this_ext == 'xml' and section.has('sitefeed'): # sitefeed.xml nodes = Node.all().filter('attribute =', 'index-entry').order('-inserted').fetch(10) vals = { 'page' : 'sitefeed.xml', 'section' : section, 'nodes' : nodes, } self.response.headers['Content-Type'] = 'application/rss+xml' self.template( 'rss20.xml', vals, 'rss' ); elif this_page == 'sitemapindex' and this_ext == 'xml': # sitemapindex.xml vals = { 'page' : 'sitemapindex.xml', 'sections' : Section.all().filter('attribute =', 'sitemap-entry').order('inserted'), } self.response.headers['Content-Type'] = 'text/xml' self.template( 'sitemapindex.xml', vals, 'sitemaps' ); elif this_page == 'urlset' and this_ext == 'xml': # urlset.xml vals = { 'page' : 'urlset.xml', 'section' : section, 'nodes' : Node.all().filter('section =', section.key()).filter('attribute =', 'index-entry').order('inserted') } self.response.headers['Content-Type'] = 'text/xml' self.template( 'urlset.xml', vals, 'sitemaps' ); elif label_page.search(this_page) and this_ext == 'html': # path =~ 'label:something.html' m = label_page.search(this_page) label = m.group(1) vals = { 'page' : 'label:' + label + '.html', 'section' : section, 'nodes' : Node.all().filter('section =', section.key()).filter('label =', label).order('-inserted'), 'label' : label } self.template( 'label-index.html', vals, util.config_value('Theme') ); elif archive_page.search(this_page) and this_ext == 'html': # path =~ 'archive:2009.html' m = archive_page.search(this_page) archive = m.group(1) vals = { 'page' : 'archive:' + archive + '.html', 'section' : section, 'nodes' : Node.all().filter('section =', section.key()).filter('archive =', archive).order('-inserted'), 'archive' : archive } self.template( 'archive-index.html', vals, util.config_value('Theme') ); elif this_page == 'comment' and this_ext == 'html': # get the comment if it exists try: comment = Comment.get( self.request.get('key') ) except db.BadKeyError: self.error(404) return if comment is None: self.error(404) return vals = { 'page' : 'comment.html', 'section' : section, 'node' : comment.node, 'comment' : comment, } self.template( 'comment.html', vals, util.config_value('Theme') ); elif this_ext == 'html': # get the node itself node_query = Node.all().filter('section =', section.key()).filter('name =', this_page) if node_query.count() == 0: self.error(404) return node = node_query.fetch(1)[0] # get the approved comments (but only if we know some are there, save a trip to the datastore) comments = None if node.comment_count: comments = Comment.all().filter('node =', node.key()).filter('status =', 'approved').order('inserted') vals = { 'page' : this_page + '.html', 'section' : section, 'node' : node, 'comments' : comments, } self.template( 'node.html', vals, util.config_value('Theme') ); else: # 404 self.error(404) return
def post(self): path = urllib.unquote(self.request.path) m = parts.search(path) if m is None: self.error(404) return this_path = m.group(1) this_page = m.group(3) or 'index' this_ext = m.group(4) or 'html' # get section and node section = Section.all().filter('path =', this_path).get() node = Node.all().filter('section =', section).get() if section is None or node is None: self.error(404) return self.request.charset = 'utf8' # remove the horribleness from comment if this_page == 'comment' and this_ext == 'html': # firstly, check the 'faux' field and if something is in there, redirect faux = self.request.get('faux') if len(faux) > 0: logging.info('COMMENT: Spam comment detected (Faux field not empty)') self.redirect('/') return # comment submission for each section node = Node.get( self.request.get('node') ) name = self.request.get('name') email = self.request.get('email') website = self.request.get('website') comment_text = re.sub('\r', '', self.request.get('comment')); # if there are more than 4 links (https?://) in the comment, we consider it spam if spammy_links(comment_text): logging.info('COMMENT: Spam comment detected (Too many links)') self.redirect('/') return # now create the comment comment = Comment( node = node, name = name, email = email, website = website, comment = comment_text, ) comment.set_derivatives() comment.put() # send a mail to the admin admin_email = util.config_value('Admin Email') if mail.is_email_valid(admin_email): url_post = util.construct_url() + node.section.path + node.name + '.html' url_mod = util.construct_url() + '/admin/comment/?key=' + str(comment.key()) + ';status=' url_del = util.construct_url() + '/admin/comment/del.html?key='+ str(comment.key()) body = 'From: ' + name + ' <' + email + '>\n' body = body + 'Site: ' + website + '\n\n' body = body + comment_text + '\n\n' body = body + '*** Actions ***\n\n' body = body + 'ViewPost = ' + url_post + '\n\n' body = body + 'Approve = ' + url_mod + 'approve\n' body = body + 'Reject = ' + url_mod + 'reject\n' body = body + 'Delete = ' + url_del + '\n' mail.send_mail(admin_email, admin_email, 'New comment on ' + section.path + node.name + '.html', body) else: # don't do anything logging.info('No valid email set, skipping sending admin an email for new comment') # redirect to the comment page self.redirect('comment.html?key=' + str(comment.key())) return elif this_page == 'message' and this_ext == 'html': # firstly, check the 'faux' field and if something is in there, redirect faux = self.request.get('faux') if len(faux) > 0: logging.info('MESSAGE: Spam detected, not saving') self.redirect('/') return # message submission for each section type = self.request.get('type') subject = self.request.get('subject') message = self.request.POST.items() redirect = self.request.get('redirect') # create the full URL we should be redirecting to full_redirect = util.construct_redirect( redirect ) # now create the message msg = Message( type = type, subject = subject, message = message, ) msg.put() # send a mail to the admin admin_email = util.config_value('Admin Email') if mail.is_email_valid(admin_email): body = 'type : ' + type + '\n' body = body + 'subject : ' + subject + '\n' for k, v in self.request.POST.items(): body = body + k + ' : ' + v + '\n' mail.send_mail(admin_email, admin_email, '[' + type + '] ' + subject, body) else: # don't do anything logging.info('No valid email set, skipping sending admin an email for new message') self.redirect(full_redirect) return else: # not found self.error(404) return
async def read(): return await PydanticSection.from_queryset(Section.all())