def confirm_email(hashid, key): # If post is in pending state and email key is correct, convert to published # and update post.datetime to utcnow() so it'll show on top of the stack # This function expects key to be email_verify_key, not edit_key like the others post = JobPost.query.filter_by(hashid=hashid).first_or_404() if post.status in POSTSTATUS.GONE: abort(410) elif post.status in POSTSTATUS.LISTED: flash("This job listing has already been confirmed and published", "interactive") return redirect(url_for('jobdetail', hashid=post.hashid), code=302) elif post.status == POSTSTATUS.DRAFT: # This should not happen. The user doesn't have this URL until they # pass the confirm form return redirect(url_for('confirm', hashid=post.hashid), code=302) elif post.status == POSTSTATUS.PENDING: if key != post.email_verify_key: abort(403) else: if app.config.get('THROTTLE_LIMIT', 0) > 0: post_count = JobPost.query.filter( JobPost.email_domain == post.email_domain).filter( JobPost.status.in_(POSTSTATUS.POSTPENDING)).filter( JobPost.datetime > datetime.utcnow() - timedelta(days=1)).count() if post_count > app.config['THROTTLE_LIMIT']: flash( u"We have received too many listings with %s addresses in the last 24 hours. " u"Listings are rate-limited per domain, so yours was not confirmed for now. " u"Please try confirming again in a few hours." % post.email_domain, category='info') return redirect(url_for('index')) post.email_verified = True post.status = POSTSTATUS.CONFIRMED post.datetime = datetime.utcnow() db.session.commit() if app.config['TWITTER_ENABLED']: try: tweet.delay( post.headline, url_for('jobdetail', hashid=post.hashid, _external=True), post.location) flash( "Congratulations! Your job listing has been published", "interactive") except: # FIXME: Catch-all flash( "Congratulations! Your job listing has been published " "(Twitter was not reachable for tweeting)", "interactive") else: flash("Congratulations! Your job listing has been published", "interactive") return redirect(url_for('jobdetail', hashid=post.hashid), code=302)
def confirm_email(hashid, key): # If post is in pending state and email key is correct, convert to published # and update post.datetime to utcnow() so it'll show on top of the stack # This function expects key to be email_verify_key, not edit_key like the others post = JobPost.query.filter_by(hashid=hashid).first_or_404() if post.status in POSTSTATUS.GONE: abort(410) elif post.status in POSTSTATUS.LISTED: flash("This job listing has already been confirmed and published", "interactive") return redirect(url_for('jobdetail', hashid=post.hashid), code=302) elif post.status == POSTSTATUS.DRAFT: # This should not happen. The user doesn't have this URL until they # pass the confirm form return redirect(url_for('confirm', hashid=post.hashid), code=302) elif post.status == POSTSTATUS.PENDING: if key != post.email_verify_key: abort(403) else: if app.config.get('THROTTLE_LIMIT', 0) > 0: post_count = JobPost.query.filter(JobPost.email_domain == post.email_domain).filter( JobPost.status.in_(POSTSTATUS.POSTPENDING)).filter( JobPost.datetime > datetime.utcnow() - timedelta(days=1)).count() if post_count > app.config['THROTTLE_LIMIT']: flash(u"We have received too many listings with %s addresses in the last 24 hours. " u"Listings are rate-limited per domain, so yours was not confirmed for now. " u"Please try confirming again in a few hours." % post.email_domain, category='info') return redirect(url_for('index')) post.email_verified = True post.status = POSTSTATUS.CONFIRMED post.datetime = datetime.utcnow() if g.board: post.add_to(g.board) db.session.commit() if app.config['TWITTER_ENABLED']: try: tweet.delay(post.headline, url_for('jobdetail', hashid=post.hashid, _external=True), post.location) flash("Congratulations! Your job listing has been published and tweeted", "interactive") except: # FIXME: Catch-all flash("Congratulations! Your job listing has been published " "(Twitter was not reachable for tweeting)", "interactive") else: flash("Congratulations! Your job listing has been published", "interactive") return redirect(url_for('jobdetail', hashid=post.hashid), code=302)
def confirm_email(domain, hashid, key): # If post is in pending state and email key is correct, convert to published # and update post.datetime to utcnow() so it'll show on top of the stack # This function expects key to be email_verify_key, not edit_key like the others post = JobPost.query.filter_by(hashid=hashid).first_or_404() if post.status in POSTSTATUS.GONE: abort(410) elif post.status in POSTSTATUS.LISTED: flash("This job post has already been confirmed and published", "interactive") return redirect(post.url_for(), code=302) elif post.status == POSTSTATUS.DRAFT: # This should not happen. The user doesn't have this URL until they # pass the confirm form return redirect(post.url_for('confirm'), code=302) elif post.status == POSTSTATUS.PENDING: if key != post.email_verify_key: return render_template('403.html', description=u"This link has expired or is malformed. Check if you have received a newer email from us.") else: if app.config.get('THROTTLE_LIMIT', 0) > 0: post_count = JobPost.query.filter(JobPost.email_domain == post.email_domain).filter( JobPost.status.in_(POSTSTATUS.POSTPENDING)).filter( JobPost.datetime > datetime.utcnow() - timedelta(days=1)).count() if post_count > app.config['THROTTLE_LIMIT']: flash(u"We have received too many posts with %s addresses in the last 24 hours. " u"Posts are rate-limited per domain, so yours was not confirmed for now. " u"Please try confirming again in a few hours." % post.email_domain, category='info') return redirect(url_for('index')) post.email_verified = True post.status = POSTSTATUS.CONFIRMED post.datetime = datetime.utcnow() db.session.commit() if app.config['TWITTER_ENABLED']: if post.headlineb: tweet.delay(post.headline, post.url_for(b=0, _external=True), post.location, dict(post.parsed_location or {}), username=post.twitter) tweet.delay(post.headlineb, post.url_for(b=1, _external=True), post.location, dict(post.parsed_location or {}), username=post.twitter) else: tweet.delay(post.headline, post.url_for(_external=True), post.location, dict(post.parsed_location or {}), username=post.twitter) add_to_boards.delay(post.id) flash("Congratulations! Your job post has been published. As a bonus for being an employer on Hasjob, " "you can now see how your post is performing relative to others. Look in the sidebar of any post.", "interactive") # cache bust dogpile.invalidate_region('hasjob_index') return redirect(post.url_for(), code=302)
def confirm_email(domain, hashid, key): # If post is in pending state and email key is correct, convert to published # and update post.datetime to utcnow() so it'll show on top of the stack # This function expects key to be email_verify_key, not edit_key like the others post = JobPost.query.filter_by(hashid=hashid).first_or_404() if post.state.GONE: abort(410) elif post.state.PUBLIC: flash("This job post has already been confirmed and published", "interactive") return redirect(post.url_for(), code=302) elif post.state.DRAFT: # This should not happen. The user doesn't have this URL until they # pass the confirm form return redirect(post.url_for('confirm'), code=302) elif post.state.PENDING: if key != post.email_verify_key: return render_template('403.html.jinja2', description=u"This link has expired or is malformed. Check if you have received a newer email from us.") else: if app.config.get('THROTTLE_LIMIT', 0) > 0: post_count = JobPost.query.filter( JobPost.email_domain == post.email_domain ).filter(~JobPost.state.UNPUBLISHED).filter( JobPost.datetime > datetime.utcnow() - timedelta(days=1) ).count() if post_count > app.config['THROTTLE_LIMIT']: flash(u"We have received too many posts with %s addresses in the last 24 hours. " u"Posts are rate-limited per domain, so yours was not confirmed for now. " u"Please try confirming again in a few hours." % post.email_domain, category='info') return redirect(url_for('index')) post.confirm() db.session.commit() if app.config['TWITTER_ENABLED']: if post.headlineb: tweet.delay(post.headline, post.url_for(b=0, _external=True), post.location, dict(post.parsed_location or {}), username=post.twitter) tweet.delay(post.headlineb, post.url_for(b=1, _external=True), post.location, dict(post.parsed_location or {}), username=post.twitter) else: tweet.delay(post.headline, post.url_for(_external=True), post.location, dict(post.parsed_location or {}), username=post.twitter) add_to_boards.delay(post.id) flash("Congratulations! Your job post has been published. As a bonus for being an employer on Hasjob, " "you can now see how your post is performing relative to others. Look in the footer of any post.", "interactive") # cache bust # dogpile.invalidate_region('hasjob_index') return redirect(post.url_for(), code=302)