我们从Python开源项目中,提取了以下49个代码示例,用于说明如何使用flask.current_app.config()。
def get_chapter(book_id): # chapters = Chapter.query.filter_by(book_id=book_id).all() page = request.args.get('page', 1, type=int) pagination = Chapter.query.filter_by(book_id=book_id).paginate( page, per_page=current_app.config['CHAPTER_PER_PAGE'], error_out=False ) chapters = pagination.items prev = None if pagination.has_prev: prev = url_for('api.get_chapter', book_id=book_id, page=page-1, _external=True) next = None if pagination.has_next: next = url_for('api.get_chapter', book_id=book_id, page=page+1, _external=True) return jsonify({ 'chapters': [chapter.to_json() for chapter in chapters], 'prev': prev, 'next': next })
def get_export_task_jobs(queue): """Export tasks to zip.""" from pybossa.core import project_repo import pybossa.cache.projects as cached_projects from pybossa.pro_features import ProFeatureHandler feature_handler = ProFeatureHandler(current_app.config.get('PRO_FEATURES')) timeout = current_app.config.get('TIMEOUT') if feature_handler.only_for_pro('updated_exports'): if queue == 'high': projects = cached_projects.get_from_pro_user() else: projects = (p.dictize() for p in project_repo.filter_by(published=True) if p.owner.pro is False) else: projects = (p.dictize() for p in project_repo.filter_by(published=True)) for project in projects: project_id = project.get('id') job = dict(name=project_export, args=[project_id], kwargs={}, timeout=timeout, queue=queue) yield job
def get_autoimport_jobs(queue='low'): """Get autoimport jobs.""" from pybossa.core import project_repo import pybossa.cache.projects as cached_projects from pybossa.pro_features import ProFeatureHandler feature_handler = ProFeatureHandler(current_app.config.get('PRO_FEATURES')) timeout = current_app.config.get('TIMEOUT') if feature_handler.only_for_pro('autoimporter'): projects = cached_projects.get_from_pro_user() else: projects = (p.dictize() for p in project_repo.get_all()) for project_dict in projects: project = project_repo.get(project_dict['id']) if project.has_autoimporter(): job = dict(name=import_tasks, args=[project.id, True], kwargs=project.get_autoimporter(), timeout=timeout, queue=queue) yield job # The following are the actual jobs (i.e. tasks performed in the background)
def import_tasks(project_id, from_auto=False, **form_data): """Import tasks for a project.""" from pybossa.core import project_repo project = project_repo.get(project_id) report = importer.create_tasks(task_repo, project_id, **form_data) if from_auto: form_data['last_import_meta'] = report.metadata project.set_autoimporter(form_data) project_repo.save(project) msg = report.message + ' to your project %s!' % project.name subject = 'Tasks Import to your project %s' % project.name body = 'Hello,\n\n' + msg + '\n\nAll the best,\nThe %s team.'\ % current_app.config.get('BRAND') mail_dict = dict(recipients=[project.owner.email_addr], subject=subject, body=body) send_mail(mail_dict) return msg
def index(page=1): """Index page for all PYBOSSA registered users.""" update_feed = get_update_feed() per_page = 24 count = cached_users.get_total_users() accounts = cached_users.get_users_page(page, per_page) if not accounts and page != 1: abort(404) pagination = Pagination(page, per_page, count) if current_user.is_authenticated(): user_id = current_user.id else: user_id = None top_users = cached_users.get_leaderboard(current_app.config['LEADERBOARD'], user_id) tmp = dict(template='account/index.html', accounts=accounts, total=count, top_users=top_users, title="Community", pagination=pagination, update_feed=update_feed) return handle_content_type(tmp)
def confirm_email(): """Send email to confirm user email.""" acc_conf_dis = current_app.config.get('ACCOUNT_CONFIRMATION_DISABLED') if acc_conf_dis: return abort(404) if current_user.valid_email is False: user = user_repo.get(current_user.id) account = dict(fullname=current_user.fullname, name=current_user.name, email_addr=current_user.email_addr) confirm_url = get_email_confirmation_url(account) subject = ('Verify your email in %s' % current_app.config.get('BRAND')) msg = dict(subject=subject, recipients=[current_user.email_addr], body=render_template('/account/email/validate_email.md', user=account, confirm_url=confirm_url)) msg['html'] = render_template('/account/email/validate_email.html', user=account, confirm_url=confirm_url) mail_queue.enqueue(send_mail, msg) msg = gettext("An e-mail has been sent to \ validate your e-mail address.") flash(msg, 'info') user.confirmation_email_sent = True user_repo.update(user) return redirect_content_type(url_for('.profile', name=current_user.name))
def index(window=0): """Get the last activity from users and projects.""" if current_user.is_authenticated(): user_id = current_user.id else: user_id = None if window >= 10: window = 10 top_users = cached_users.get_leaderboard(current_app.config['LEADERBOARD'], user_id=user_id, window=window) response = dict(template='/stats/index.html', title="Community Leaderboard", top_users=top_users) return handle_content_type(response)
def password_required(short_name): (project, owner, n_tasks, n_task_runs, overall_progress, last_activity, n_results) = project_by_shortname(short_name) form = PasswordForm(request.form) if request.method == 'POST' and form.validate(): password = request.form.get('password') cookie_exp = current_app.config.get('PASSWD_COOKIE_TIMEOUT') passwd_mngr = ProjectPasswdManager(CookieHandler(request, signer, cookie_exp)) if passwd_mngr.validates(password, project): response = make_response(redirect(request.args.get('next'))) return passwd_mngr.update_response(response, project, get_user_id_or_ip()) flash(gettext('Sorry, incorrect password')) return render_template('projects/password.html', project=project, form=form, short_name=short_name, next=request.args.get('next'))
def get_disqus_sso_payload(user): """Return remote_auth_s3 and api_key for user.""" DISQUS_PUBLIC_KEY = current_app.config.get('DISQUS_PUBLIC_KEY') DISQUS_SECRET_KEY = current_app.config.get('DISQUS_SECRET_KEY') if DISQUS_PUBLIC_KEY and DISQUS_SECRET_KEY: if user: data = simplejson.dumps({ 'id': user.id, 'username': user.name, 'email': user.email_addr, }) else: data = simplejson.dumps({}) # encode the data to base64 message = base64.b64encode(data) # generate a timestamp for signing the message timestamp = int(time.time()) # generate our hmac signature sig = hmac.HMAC(DISQUS_SECRET_KEY, '%s %s' % (message, timestamp), hashlib.sha1).hexdigest() return message, timestamp, sig, DISQUS_PUBLIC_KEY else: return None, None, None, None
def test_register_json_errors_get(self): """Test WEB register errors JSON works""" with patch.dict(self.flask_app.config, {'WTF_CSRF_ENABLED': True}): csrf = self.get_csrf('/account/register') userdict = {'fullname': 'a', 'name': 'name', 'email_addr': None, 'password': 'p'} res = self.app.post('/account/register', data=json.dumps(userdict), content_type='application/json', headers={'X-CSRFToken': csrf}) # The output should have a mime-type: application/json errors = json.loads(res.data).get('form').get('errors') assert res.mimetype == 'application/json', res.data err_msg = "There should be an error with the email" assert errors.get('email_addr'), err_msg err_msg = "There should be an error with fullname" assert errors.get('fullname'), err_msg err_msg = "There should be an error with password" assert errors.get('password'), err_msg err_msg = "There should NOT be an error with name" assert errors.get('name') is None, err_msg
def get_job_results(job_id): """Get data from previous jobs :param job_id: ID number to get results of job :return: results_path - path to the job data This checks to see if the job that you are looking for exists, and returns the path to that job's data """ if not os.path.exists(os.path.join(app.config['BOOMERANG_FETCH_DIR'], str(job_id))): raise ValueError("Job Does not Exist") results_path = os.path.join(app.config['BOOMERANG_FETCH_DIR'], str(job_id), "results.zip") if not os.path.isfile(results_path): raise ValueError("Results not there...") return results_path
def get_connection(self, bind=None): """Return a py2neo.Graph object based on config settings""" # assume default if no bind specified if bind is None: bind = self.DEFAULT_GRAPH_KEY # credentials are bound to the application context ctx = stack.top if ctx is not None: if not hasattr(ctx, 'ogm_graphs'.format(bind)): ctx.ogm_graphs = {} if bind not in ctx.ogm_graphs: ctx.ogm_graphs[bind] = self.connect(bind=bind) return ctx.ogm_graphs[bind] raise OutOfApplicationContextError()
def change_email(self, token): s = Serializer(current_app.config['SECRET_KEY']) try: data = s.loads(token) except: return False if data.get('change_email') != self.id: return False new_email = data.get('new_email') if new_email is None: return False if self.query.filter_by(email=new_email).first() is not None: return False self.email = new_email self.avatar_hash = hashlib.md5( self.email.encode('utf-8')).hexdigest() db.session.add(self) return True
def get_posts(): page = request.args.get('page', 1, type=int) pagination = Post.query.paginate( page, per_page=current_app.config['CIRCULATE_POSTS_PER_PAGE'], error_out=False) posts = pagination.items prev = None if pagination.has_prev: prev = url_for('api.get_posts', page=page-1, _external=True) next = None if pagination.has_next: next = url_for('api.get_posts', page=page+1, _external=True) return jsonify({ 'posts': [post.to_json() for post in posts], 'prev': prev, 'next': next, 'count': pagination.total })
def get_user_posts(id): user = User.query.get_or_404(id) page = request.args.get('page', 1, type=int) pagination = user.posts.order_by(Post.timestamp.desc()).paginate( page, per_page=current_app.config['CIRCULATE_POSTS_PER_PAGE'], error_out=False) posts = pagination.items prev = None if pagination.has_prev: prev = url_for('api.get_user_posts', page=page-1, _external=True) next = None if pagination.has_next: next = url_for('api.get_user_posts', page=page+1, _external=True) return jsonify({ 'posts': [post.to_json() for post in posts], 'prev': prev, 'next': next, 'count': pagination.total })
def get_comments(): page = request.args.get('page', 1, type=int) pagination = Comment.query.order_by(Comment.timestamp.desc()).paginate( page, per_page=current_app.config['CIRCULATE_COMMENTS_PER_PAGE'], error_out=False) comments = pagination.items prev = None if pagination.has_prev: prev = url_for('api.get_comments', page=page-1, _external=True) next = None if pagination.has_next: next = url_for('api.get_comments', page=page+1, _external=True) return jsonify({ 'comments': [comment.to_json() for comment in comments], 'prev': prev, 'next': next, 'count': pagination.total })
def get_post_comments(id): post = Post.query.get_or_404(id) page = request.args.get('page', 1, type=int) pagination = post.comments.order_by(Comment.timestamp.asc()).paginate( page, per_page=current_app.config['CIRCULATE_COMMENTS_PER_PAGE'], error_out=False) comments = pagination.items prev = None if pagination.has_prev: prev = url_for('api.get_post_comments', page=page-1, _external=True) next = None if pagination.has_next: next = url_for('api.get_post_comments', page=page+1, _external=True) return jsonify({ 'comments': [comment.to_json() for comment in comments], 'prev': prev, 'next': next, 'count': pagination.total })
def _get_config( value, config_name, default=None, required=True, message='CSRF is not configured.' ): """Find config value based on provided value, Flask config, and default value. :param value: already provided config value :param config_name: Flask ``config`` key :param default: default value if not provided or configured :param required: whether the value must not be ``None`` :param message: error message if required config is not found :raises KeyError: if required config is not found """ if value is None: value = current_app.config.get(config_name, default) if required and value is None: raise KeyError(message) return value
def _get_csrf_token(self): # find the ``csrf_token`` field in the subitted form # if the form had a prefix, the name will be # ``{prefix}-csrf_token`` field_name = current_app.config['WTF_CSRF_FIELD_NAME'] for key in request.form: if key.endswith(field_name): csrf_token = request.form[key] if csrf_token: return csrf_token for header_name in current_app.config['WTF_CSRF_HEADERS']: csrf_token = request.headers.get(header_name) if csrf_token: return csrf_token return None
def protect(self): if request.method not in current_app.config['WTF_CSRF_METHODS']: return try: validate_csrf(self._get_csrf_token()) except ValidationError as e: logger.info(e.args[0]) self._error_response(e.args[0]) if request.is_secure and current_app.config['WTF_CSRF_SSL_STRICT']: if not request.referrer: self._error_response('The referrer header is missing.') good_referrer = 'https://{0}/'.format(request.host) if not same_origin(request.referrer, good_referrer): self._error_response('The referrer does not match the host.') g.csrf_valid = True # mark this request as CSRF valid
def create_standard_claims(expire=None): """Return standard payload for JWT.""" expire = expire or JWT_EXPIRATION_DELTA iat = datetime.utcnow() exp = iat + timedelta(seconds=expire) jti = str(uuid.uuid4()).replace("-", "") iss = current_app.config["name"] standard_claims = { # JWT standard fields 'iat': iat, 'exp': exp, 'jti': jti, 'iss': iss, # Drift fields 'tier': g.driftenv["tier_name"], 'tenant': g.driftenv["name"], } return standard_claims
def sendmail(addr, text): if get_config('mg_api_key') and app.config['ADMINS']: ctf_name = get_config('ctf_name') mg_api_key = get_config('mg_api_key') return requests.post( "https://api.mailgun.net/v2/mail"+app.config['HOST']+"/messages", auth=("api", mg_api_key), data={"from": "{} Admin <{}>".format(ctf_name, app.config['ADMINS'][0]), "to": [addr], "subject": "Message from {0}".format(ctf_name), "text": text}) elif app.config['MAIL_SERVER'] and app.config['MAIL_PORT'] and app.config['ADMINS']: try: msg = Message("Message from {0}".format(get_config('ctf_name')), sender=app.config['ADMINS'][0], recipients=[addr]) msg.body = text mail.send(msg) return True except: return False else: return False
def _ldap_authenticate(username, password): """Performs a search bind to authenticate a user. LDAP server details are defined in :doc:`config`. :param username: LDAP username :param password: LDAP password :return: Returns a tuple of user_info and authentication status :rtype: tuple """ user = ldap3_manager.get_user_info_for_username(username) ldap_auth = ldap3_manager.authenticate_search_bind(username, password) if ldap_auth.status is AuthenticationResponseStatus.success: authenticated = True else: authenticated = False return user, authenticated
def send_email(subject, recipients, template, **kwargs): if not isinstance(recipients, list): recipients = list(recipients) msg = Message(subject, reply_to=current_app.config['MAIL_DEFAULT_SENDER'], recipients=recipients) msg.body = render_template(template + '.txt', **kwargs) msg.html = render_template(template + '.html', **kwargs) attachments = kwargs.get('attachments', []) mimes = MimeTypes() for file in attachments: path_ = os.path.join(current_app.config['APP_UPLOADS'], file) with current_app.open_resource(path_) as fp: mime = mimes.guess_type(fp.name) msg.attach(path_, mime[0], fp.read()) app = current_app._get_current_object() t = Thread(target=send_async_email, args=[app, msg]) t.start() return t
def reset_password(self, token, new_pass): """Reset password. Token is generated by :meth:`~User.generate_reset_token` :param token: :param new_pass: :return: """ s = TimedJSONWebSignatureSerializer(current_app.config['SECRET_KEY']) try: data = s.loads(token) except: return False if data.get('user_id') == self.id: self.password = new_pass db.session.add(self) db.session.commit() return True return False
def load_into_pgsql(self, capture_stderr=True): if not os.path.exists(self.overpass_filename): return 'no data from overpass to load with osm2pgsql' if os.stat(self.overpass_filename).st_size == 0: return 'no data from overpass to load with osm2pgsql' cmd = self.osm2pgsql_cmd() if not capture_stderr: p = subprocess.run(cmd, env={'PGPASSWORD': current_app.config['DB_PASS']}) return p = subprocess.run(cmd, stderr=subprocess.PIPE, env={'PGPASSWORD': current_app.config['DB_PASS']}) if p.returncode != 0: if b'Out of memory' in p.stderr: return 'out of memory' else: return p.stderr.decode('utf-8')
def lookup_with_params(**kwargs): url = 'http://nominatim.openstreetmap.org/search' params = { 'format': 'jsonv2', 'addressdetails': 1, 'email': current_app.config['ADMIN_EMAIL'], 'extratags': 1, 'limit': 20, 'namedetails': 1, 'accept-language': 'en', 'polygon_text': 1, } params.update(kwargs) r = requests.get(url, params=params, headers=user_agent_headers()) if r.status_code == 500: raise SearchError try: return json.loads(r.text, object_pairs_hook=OrderedDict) except json.decoder.JSONDecodeError: raise SearchError(r)
def search(keyword): Blog.update() pt = request.args.get('page') if pt is None: page = 1 else: page = int(pt) try: keywords = keyword.split() from sqlalchemy import and_, or_ rules = and_( *[or_(Post.title.ilike('%%%s%%' % k), Post.summary.ilike('%%%s%%' % k), Post.content.ilike('%%%s%%' % k)) for k in keywords]) pagination = Post.query.filter(rules).order_by(Post.date.desc()).paginate( page=page, per_page=current_app.config['FMBLOG_PER_PAGE']) except Exception: return render_template('404.html', e='Error: Empty Keyword', site=current_app.config['FMBLOG_SITE'], value={}), 404 return render_template('search.html', value={'keyword': keyword}, pagination=pagination, endpoint='main.search', page_list=get_page_list(pagination, page), tags=Tag.query.order_by(Tag.count.desc()).all(), cats=Category.query.order_by(Category.count.desc()).all(), site=current_app.config['FMBLOG_SITE'])
def sync_repo_hook(self, repo_id): """Sync a GitHub repo's hook with the locally stored repo.""" # Get the hook that we may have set in the past gh_repo = self.api.repository_with_id(repo_id) hooks = (hook.id for hook in gh_repo.hooks() if hook.config.get('url', '') == self.webhook_url) hook_id = next(hooks, None) # If hook on GitHub exists, get or create corresponding db object and # enable the hook. Otherwise remove the old hook information. if hook_id: Repository.enable(user_id=self.user_id, github_id=gh_repo.id, name=gh_repo.full_name, hook=hook_id) else: Repository.disable(user_id=self.user_id, github_id=gh_repo.id, name=gh_repo.full_name)
def chapter(book_id): page = request.args.get('page', 1, type=int) all_chapter = Chapter.query.filter_by(book_id=book_id).first() # print(type(pagination)) if all_chapter: pagination = Chapter.query.filter_by(book_id=book_id).paginate( page, per_page=current_app.config['CHAPTER_PER_PAGE'], error_out=False ) chapters = pagination.items book = Novel.query.filter_by(id=book_id).first() return render_template('chapter.html', book=book, chapters=chapters, pagination=pagination) spider = DdSpider() book = Novel.query.filter_by(id=book_id).first() for data in spider.get_chapter(book.book_url): chapter = Chapter(chapter=data['chapter'], chapter_url=data['url'], book_id=book_id) db.session.add(chapter) pagination2 = Chapter.query.filter_by(book_id=book_id).paginate( page, per_page=current_app.config['CHAPTER_PER_PAGE'], error_out=False ) chapters = pagination2.items return render_template('chapter.html', book=book, chapters=chapters, pagination=pagination2)
def get_default_jobs(): # pragma: no cover """Return default jobs.""" timeout = current_app.config.get('TIMEOUT') yield dict(name=warm_up_stats, args=[], kwargs={}, timeout=timeout, queue='high') yield dict(name=warn_old_project_owners, args=[], kwargs={}, timeout=timeout, queue='low') yield dict(name=warm_cache, args=[], kwargs={}, timeout=timeout, queue='super') yield dict(name=news, args=[], kwargs={}, timeout=timeout, queue='low')
def get_maintenance_jobs(): """Return mantainance jobs.""" timeout = current_app.config.get('TIMEOUT') yield dict(name=check_failed, args=[], kwargs={}, timeout=timeout, queue='maintenance')
def get_project_jobs(queue='super'): """Return a list of jobs based on user type.""" from pybossa.cache import projects as cached_projects timeout = current_app.config.get('TIMEOUT') return create_dict_jobs(cached_projects.get_from_pro_user(), get_project_stats, timeout=timeout, queue=queue)
def get_inactive_users_jobs(queue='quaterly'): """Return a list of inactive users that have contributed to a project.""" from sqlalchemy.sql import text from pybossa.model.user import User from pybossa.core import db # First users that have participated once but more than 3 months ago sql = text('''SELECT user_id FROM task_run WHERE user_id IS NOT NULL AND to_date(task_run.finish_time, 'YYYY-MM-DD\THH24:MI:SS.US') >= NOW() - '12 month'::INTERVAL AND to_date(task_run.finish_time, 'YYYY-MM-DD\THH24:MI:SS.US') < NOW() - '3 month'::INTERVAL GROUP BY user_id ORDER BY user_id;''') results = db.slave_session.execute(sql) timeout = current_app.config.get('TIMEOUT') for row in results: user = User.query.get(row.user_id) if user.subscribed: subject = "We miss you!" body = render_template('/account/email/inactive.md', user=user.dictize(), config=current_app.config) html = render_template('/account/email/inactive.html', user=user.dictize(), config=current_app.config) mail_dict = dict(recipients=[user.email_addr], subject=subject, body=body, html=html) job = dict(name=send_mail, args=[mail_dict], kwargs={}, timeout=timeout, queue=queue) yield job
def get_leaderboard_jobs(queue='super'): # pragma: no cover """Return leaderboard jobs.""" timeout = current_app.config.get('TIMEOUT') yield dict(name=leaderboard.leaderboard, args=[], kwargs={}, timeout=timeout, queue=queue)
def get_non_contributors_users_jobs(queue='quaterly'): """Return a list of users that have never contributed to a project.""" from sqlalchemy.sql import text from pybossa.model.user import User from pybossa.core import db # Second users that have created an account but never participated sql = text('''SELECT id FROM "user" WHERE NOT EXISTS (SELECT user_id FROM task_run WHERE task_run.user_id="user".id)''') results = db.slave_session.execute(sql) timeout = current_app.config.get('TIMEOUT') for row in results: user = User.query.get(row.id) if user.subscribed: subject = "Why don't you help us?!" body = render_template('/account/email/noncontributors.md', user=user.dictize(), config=current_app.config) html = render_template('/account/email/noncontributors.html', user=user.dictize(), config=current_app.config) mail_dict = dict(recipients=[user.email_addr], subject=subject, body=body, html=html) job = dict(name=send_mail, args=[mail_dict], kwargs={}, timeout=timeout, queue=queue) yield job
def get_project_stats(_id, short_name): # pragma: no cover """Get stats for project.""" import pybossa.cache.projects as cached_projects import pybossa.cache.project_stats as stats from flask import current_app cached_projects.get_project(short_name) cached_projects.n_tasks(_id) cached_projects.n_task_runs(_id) cached_projects.overall_progress(_id) cached_projects.last_activity(_id) cached_projects.n_completed_tasks(_id) cached_projects.n_volunteers(_id) cached_projects.browse_tasks(_id) stats.get_stats(_id, current_app.config.get('GEO'))
def webhook(url, payload=None, oid=None): """Post to a webhook.""" from flask import current_app from readability.readability import Document try: import json from pybossa.core import sentinel, webhook_repo, project_repo project = project_repo.get(payload['project_id']) headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} if oid: webhook = webhook_repo.get(oid) else: webhook = Webhook(project_id=payload['project_id'], payload=payload) if url: response = requests.post(url, data=json.dumps(payload), headers=headers) webhook.response = Document(response.text).summary() webhook.response_status_code = response.status_code else: raise requests.exceptions.ConnectionError('Not URL') if oid: webhook_repo.update(webhook) webhook = webhook_repo.get(oid) else: webhook_repo.save(webhook) except requests.exceptions.ConnectionError: webhook.response = 'Connection Error' webhook.response_status_code = None webhook_repo.save(webhook) finally: if project.published and webhook.response_status_code != 200 and current_app.config.get('ADMINS'): subject = "Broken: %s webhook failed" % project.name body = 'Sorry, but the webhook failed' mail_dict = dict(recipients=current_app.config.get('ADMINS'), subject=subject, body=body, html=webhook.response) send_mail(mail_dict) if current_app.config.get('SSE'): publish_channel(sentinel, payload['project_short_name'], data=webhook.dictize(), type='webhook', private=True) return webhook
def get_weekly_stats_update_projects(): """Return email jobs with weekly stats update for project owner.""" from sqlalchemy.sql import text from pybossa.core import db from pybossa.pro_features import ProFeatureHandler feature_handler = ProFeatureHandler(current_app.config.get('PRO_FEATURES')) only_pros = feature_handler.only_for_pro('project_weekly_report') only_pros_sql = 'AND "user".pro=true' if only_pros else '' send_emails_date = current_app.config.get('WEEKLY_UPDATE_STATS') today = datetime.today().strftime('%A').lower() timeout = current_app.config.get('TIMEOUT') if today.lower() == send_emails_date.lower(): sql = text(''' SELECT project.id FROM project, "user", task WHERE "user".id=project.owner_id %s AND "user".subscribed=true AND task.project_id=project.id AND task.state!='completed' UNION SELECT project.id FROM project WHERE project.featured=true; ''' % only_pros_sql) results = db.slave_session.execute(sql) for row in results: job = dict(name=send_weekly_stats_project, args=[row.id], kwargs={}, timeout=timeout, queue='low') yield job
def check_failed(): """Check the jobs that have failed and requeue them.""" from rq import Queue, get_failed_queue, requeue_job from pybossa.core import sentinel fq = get_failed_queue() job_ids = fq.job_ids count = len(job_ids) FAILED_JOBS_RETRIES = current_app.config.get('FAILED_JOBS_RETRIES') for job_id in job_ids: KEY = 'pybossa:job:failed:%s' % job_id job = fq.fetch_job(job_id) if sentinel.slave.exists(KEY): sentinel.master.incr(KEY) else: ttl = current_app.config.get('FAILED_JOBS_MAILS')*24*60*60 sentinel.master.setex(KEY, ttl, 1) if int(sentinel.slave.get(KEY)) < FAILED_JOBS_RETRIES: requeue_job(job_id) else: KEY = 'pybossa:job:failed:mailed:%s' % job_id if (not sentinel.slave.exists(KEY) and current_app.config.get('ADMINS')): subject = "JOB: %s has failed more than 3 times" % job_id body = "Please, review the background jobs of your server." body += "\n This is the trace error\n\n" body += "------------------------------\n\n" body += job.exc_info mail_dict = dict(recipients=current_app.config.get('ADMINS'), subject=subject, body=body) send_mail(mail_dict) ttl = current_app.config.get('FAILED_JOBS_MAILS')*24*60*60 sentinel.master.setex(KEY, ttl, True) if count > 0: return "JOBS: %s You have failed the system." % job_ids else: return "You have not failed the system"
def push_notification(project_id, **kwargs): """Send push notification.""" from pybossa.core import project_repo project = project_repo.get(project_id) if project.info.get('onesignal'): app_id = current_app.config.get('ONESIGNAL_APP_ID') api_key = current_app.config.get('ONESIGNAL_API_KEY') client = PybossaOneSignal(app_id=app_id, api_key=api_key) filters = [{"field": "tag", "key": project_id, "relation": "exists"}] return client.push_msg(contents=kwargs['contents'], headings=kwargs['headings'], launch_url=kwargs['launch_url'], web_buttons=kwargs['web_buttons'], filters=filters)
def confirm_account(): """Confirm account endpoint.""" key = request.args.get('key') if key is None: abort(403) try: timeout = current_app.config.get('ACCOUNT_LINK_EXPIRATION', 3600) userdict = signer.loads(key, max_age=timeout, salt='account-validation') except BadData: abort(403) # First check if the user exists user = user_repo.get_by_name(userdict['name']) if user is not None: return _update_user_with_valid_email(user, userdict['email_addr']) return _create_account(userdict)
def _handle_avatar_update(user, avatar_form): if avatar_form.validate_on_submit(): _file = request.files['avatar'] coordinates = (avatar_form.x1.data, avatar_form.y1.data, avatar_form.x2.data, avatar_form.y2.data) prefix = time.time() _file.filename = "%s_avatar.png" % prefix container = "user_%s" % user.id uploader.upload_file(_file, container=container, coordinates=coordinates) # Delete previous avatar from storage if user.info.get('avatar'): uploader.delete_file(user.info['avatar'], container) upload_method = current_app.config.get('UPLOAD_METHOD') avatar_url = get_avatar_url(upload_method, _file.filename, container) user.info = {'avatar': _file.filename, 'container': container, 'avatar_url': avatar_url} user_repo.update(user) cached_users.delete_user_summary(user.name) flash(gettext('Your avatar has been updated! It may \ take some minutes to refresh...'), 'success') return True else: flash("You have to provide an image file to update your avatar", "error") return False
def _handle_profile_update(user, update_form): acc_conf_dis = current_app.config.get('ACCOUNT_CONFIRMATION_DISABLED') if update_form.validate_on_submit(): user.id = update_form.id.data user.fullname = update_form.fullname.data user.name = update_form.name.data if (user.email_addr != update_form.email_addr.data and acc_conf_dis is False): user.valid_email = False user.newsletter_prompted = False account = dict(fullname=update_form.fullname.data, name=update_form.name.data, email_addr=update_form.email_addr.data) confirm_url = get_email_confirmation_url(account) subject = ('You have updated your email in %s! Verify it' % current_app.config.get('BRAND')) msg = dict(subject=subject, recipients=[update_form.email_addr.data], body=render_template( '/account/email/validate_email.md', user=account, confirm_url=confirm_url)) msg['html'] = markdown(msg['body']) mail_queue.enqueue(send_mail, msg) user.confirmation_email_sent = True fls = gettext('An email has been sent to verify your \ new email: %s. Once you verify it, it will \ be updated.' % account['email_addr']) flash(fls, 'info') return True if acc_conf_dis: user.email_addr = update_form.email_addr.data user.privacy_mode = update_form.privacy_mode.data user.locale = update_form.locale.data user.subscribed = update_form.subscribed.data user_repo.update(user) cached_users.delete_user_summary(user.name) flash(gettext('Your profile has been updated!'), 'success') return True else: flash(gettext('Please correct the errors'), 'error') return False
def reset_password(): """ Reset password method. Returns a Jinja2 template. """ key = request.args.get('key') if key is None: abort(403) userdict = {} try: timeout = current_app.config.get('ACCOUNT_LINK_EXPIRATION', 3600) userdict = signer.loads(key, max_age=timeout, salt='password-reset') except BadData: abort(403) username = userdict.get('user') if not username or not userdict.get('password'): abort(403) user = user_repo.get_by_name(username) if user.passwd_hash != userdict.get('password'): abort(403) form = ChangePasswordForm(request.body) if form.validate_on_submit(): user.set_password(form.new_password.data) user_repo.update(user) flash(gettext('You reset your password successfully!'), 'success') return _sign_in_user(user) if request.method == 'POST' and not form.validate(): flash(gettext('Please correct the errors'), 'error') response = dict(template='/account/password_reset.html', form=form) return handle_content_type(response)
def pro_features(owner=None): feature_handler = ProFeatureHandler(current_app.config.get('PRO_FEATURES')) pro = { 'auditlog_enabled': feature_handler.auditlog_enabled_for(current_user), 'autoimporter_enabled': feature_handler.autoimporter_enabled_for(current_user), 'webhooks_enabled': feature_handler.webhooks_enabled_for(current_user) } if owner: pro['better_stats_enabled'] = feature_handler.better_stats_enabled_for( current_user, owner) return pro