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 account, domain = update_form.email_addr.data.split('@') if (user.email_addr != update_form.email_addr.data and acc_conf_dis is False and domain not in current_app.config.get('SPAM')): 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 is False and domain in current_app.config.get('SPAM'): fls = gettext('Use a valid email account') flash(fls, 'info') return False if acc_conf_dis: user.email_addr = update_form.email_addr.data user.privacy_mode = fuzzyboolean(update_form.privacy_mode.data) user.restrict = fuzzyboolean(update_form.restrict.data) user.locale = update_form.locale.data user.subscribed = fuzzyboolean(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 _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 account, domain = update_form.email_addr.data.split('@') if (user.email_addr != update_form.email_addr.data and acc_conf_dis is False and domain not in current_app.config.get('SPAM')): 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 is False and domain in current_app.config.get('SPAM'): fls = gettext('Use a valid email account') flash(fls, 'info') return False if acc_conf_dis: user.email_addr = update_form.email_addr.data user.privacy_mode = fuzzyboolean(update_form.privacy_mode.data) user.restrict = fuzzyboolean(update_form.restrict.data) user.locale = update_form.locale.data user.subscribed = fuzzyboolean(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 get(self, oid): """Return all the tasks favorited by current user.""" try: if current_user.is_anonymous(): raise abort(401) uid = current_user.id limit, offset, orderby = self._set_limit_and_offset() last_id = request.args.get('last_id') print last_id desc = request.args.get('desc') if request.args.get('desc') else False desc = fuzzyboolean(desc) tasks = task_repo.filter_tasks_by_user_favorites(uid, limit=limit, offset=offset, orderby=orderby, desc=desc, last_id=last_id) data = self._create_json_response(tasks, oid) return Response(data, 200, mimetype='application/json') except Exception as e: return error.format_exception( e, target=self.__class__.__name__.lower(), action='GET')
def _filter_query(self, repo_info, limit, offset, orderby): filters = {} for k in request.args.keys(): if k not in [ 'limit', 'offset', 'api_key', 'last_id', 'all', 'fulltextsearch', 'desc', 'orderby', 'related' ]: # Raise an error if the k arg is not a column getattr(self.__class__, k) filters[k] = request.args[k] repo = repo_info['repo'] filters = self.api_context(all_arg=request.args.get('all'), **filters) query_func = repo_info['filter'] filters = self._custom_filter(filters) last_id = request.args.get('last_id') fulltextsearch = request.args.get('fulltextsearch') desc = request.args.get('desc') if request.args.get('desc') else False desc = fuzzyboolean(desc) if last_id: results = getattr(repo, query_func)(limit=limit, last_id=last_id, fulltextsearch=fulltextsearch, desc=False, orderby=orderby, **filters) else: results = getattr(repo, query_func)(limit=limit, offset=offset, fulltextsearch=fulltextsearch, desc=desc, orderby=orderby, **filters) return results
def _filter_query(self, repo_info, limit, offset, orderby): filters = {} for k in request.args.keys(): if k not in ['limit', 'offset', 'api_key', 'last_id', 'all', 'fulltextsearch', 'desc', 'orderby', 'related', 'participated', 'full']: # Raise an error if the k arg is not a column if self.__class__ == Task and k == 'external_uid': pass else: getattr(self.__class__, k) filters[k] = request.args[k] repo = repo_info['repo'] filters = self.api_context(all_arg=request.args.get('all'), **filters) query_func = repo_info['filter'] filters = self._custom_filter(filters) last_id = request.args.get('last_id') if request.args.get('participated'): filters['participated'] = get_user_id_or_ip() fulltextsearch = request.args.get('fulltextsearch') desc = request.args.get('desc') if request.args.get('desc') else False desc = fuzzyboolean(desc) if last_id: results = getattr(repo, query_func)(limit=limit, last_id=last_id, fulltextsearch=fulltextsearch, desc=False, orderby=orderby, **filters) else: results = getattr(repo, query_func)(limit=limit, offset=offset, fulltextsearch=fulltextsearch, desc=desc, orderby=orderby, **filters) return results
def get(self, oid): """Return all the tasks favorited by current user.""" try: if current_user.is_anonymous(): raise abort(401) uid = current_user.id limit, offset, orderby = self._set_limit_and_offset() last_id = request.args.get('last_id') print last_id desc = request.args.get('desc') if request.args.get('desc') else False desc = fuzzyboolean(desc) tasks = task_repo.filter_tasks_by_user_favorites(uid, limit=limit, offset=offset, orderby=orderby, desc=desc, last_id=last_id) data = self._create_json_response(tasks, oid) return Response(data, 200, mimetype='application/json') except Exception as e: return error.format_exception( e, target=self.__class__.__name__.lower(), action='GET')
def _retrieve_new_task(project_id): project = project_repo.get(project_id) if project is None: raise NotFound if not project.allow_anonymous_contributors and current_user.is_anonymous( ): info = dict(error="This project does not allow anonymous contributors") error = [model.task.Task(info=info)] return error if request.args.get('external_uid'): resp = jwt_authorize_project(project, request.headers.get('Authorization')) if resp != True: return resp if request.args.get('limit'): limit = int(request.args.get('limit')) else: limit = 1 if limit > 100: limit = 100 if request.args.get('offset'): offset = int(request.args.get('offset')) else: offset = 0 if request.args.get('orderby'): orderby = request.args.get('orderby') else: orderby = 'id' if request.args.get('desc'): desc = fuzzyboolean(request.args.get('desc')) else: desc = False user_id = None if current_user.is_anonymous() else current_user.id user_ip = (anonymizer.ip(request.remote_addr or '127.0.0.1') if current_user.is_anonymous() else None) external_uid = request.args.get('external_uid') task = sched.new_task(project_id, project.info.get('sched'), user_id, user_ip, external_uid, offset, limit, orderby=orderby, desc=desc) return task
def _retrieve_new_task(project_id): project = project_repo.get(project_id) if project is None: raise NotFound if not project.allow_anonymous_contributors and current_user.is_anonymous(): info = dict( error="This project does not allow anonymous contributors") error = [model.task.Task(info=info)] return error if request.args.get('external_uid'): resp = jwt_authorize_project(project, request.headers.get('Authorization')) if resp != True: return resp if request.args.get('limit'): limit = int(request.args.get('limit')) else: limit = 1 if limit > 100: limit = 100 if request.args.get('offset'): offset = int(request.args.get('offset')) else: offset = 0 if request.args.get('orderby'): orderby = request.args.get('orderby') else: orderby = 'id' if request.args.get('desc'): desc = fuzzyboolean(request.args.get('desc')) else: desc = False user_id = None if current_user.is_anonymous() else current_user.id user_ip = (anonymizer.ip(request.remote_addr or '127.0.0.1') if current_user.is_anonymous() else None) external_uid = request.args.get('external_uid') task = sched.new_task(project_id, project.info.get('sched'), user_id, user_ip, external_uid, offset, limit, orderby=orderby, desc=desc) return task
def _filter_query(self, repo_info, limit, offset, orderby): filters = {} for k in request.args.keys(): if k not in [ 'limit', 'offset', 'api_key', 'last_id', 'all', 'fulltextsearch', 'desc', 'orderby', 'related', 'participated', 'full', 'stats', 'from_finish_time', 'to_finish_time', 'created_from', 'created_to' ]: # Raise an error if the k arg is not a column if self.__class__ == Task and k == 'external_uid': pass else: getattr(self.__class__, k) filters[k] = request.args[k] repo = repo_info['repo'] filters = self.api_context(all_arg=request.args.get('all'), **filters) query_func = repo_info['filter'] filters = self._custom_filter(filters) last_id = request.args.get('last_id') if request.args.get('participated'): filters['participated'] = get_user_id_or_ip() fulltextsearch = request.args.get('fulltextsearch') desc = request.args.get('desc') if request.args.get('desc') else False desc = fuzzyboolean(desc) if request.args.get('created_from'): filters['created_from'] = request.args.get('created_from') if request.args.get('created_to'): filters['created_to'] = request.args.get('created_to') if last_id: results = getattr(repo, query_func)(limit=limit, last_id=last_id, fulltextsearch=fulltextsearch, desc=False, orderby=orderby, **filters) else: results = getattr(repo, query_func)(limit=limit, offset=offset, fulltextsearch=fulltextsearch, desc=desc, orderby=orderby, **filters) return results
def _filter_query(self, repo_info, limit, offset, orderby): filters = {} for k in list(request.args.keys()): # if k not in ['limit', 'offset', 'api_key', 'last_id', 'all', # 'fulltextsearch', 'desc', 'orderby', 'related', # 'participated', 'full', 'stats']: if k not in ['limit', 'offset', 'last_id', 'all', 'fulltextsearch', 'desc', 'orderby', 'related', 'participated', 'full', 'stats']: if (self.__class__ == Task or self.__class__ == TaskRun) and (k == 'external_uid' or k=='api_key'): continue else: getattr(self.__class__, k) filters[k] = request.args[k] repo = repo_info['repo'] filters = self.api_context(all_arg=request.args.get('all'), **filters) query_func = repo_info['filter'] filters = self._custom_filter(filters) last_id = request.args.get('last_id') if request.args.get('participated'): filters['participated'] = get_user_id_or_ip() fulltextsearch = request.args.get('fulltextsearch') desc = request.args.get('desc') if request.args.get('desc') else False desc = fuzzyboolean(desc) if last_id: results = getattr(repo, query_func)(limit=limit, last_id=last_id, fulltextsearch=fulltextsearch, desc=False, orderby=orderby, **filters) else: results = getattr(repo, query_func)(limit=limit, offset=offset, fulltextsearch=fulltextsearch, desc=desc, orderby=orderby, **filters) return results
def _retrieve_new_task(project_id): project = project_repo.get(project_id) if project is None or not (project.published or current_user.admin or current_user.id in project.owners_ids): raise NotFound if current_user.is_anonymous: info = dict(error="This project does not allow anonymous contributors") error = [model.task.Task(info=info)] return error, None, lambda x: x if current_user.get_quiz_failed(project): # User is blocked from project so don't return a task return None, None, None # check cookie pwd_manager = get_pwd_manager(project) user_id_or_ip = get_user_id_or_ip() if pwd_manager.password_needed(project, user_id_or_ip): raise Forbidden("No project password provided") if request.args.get('external_uid'): resp = jwt_authorize_project(project, request.headers.get('Authorization')) if resp != True: return resp, lambda x: x if request.args.get('limit'): limit = int(request.args.get('limit')) else: limit = 1 if limit > 100: limit = 100 if request.args.get('offset'): offset = int(request.args.get('offset')) else: offset = 0 if request.args.get('orderby'): orderby = request.args.get('orderby') else: orderby = 'id' if request.args.get('desc'): desc = fuzzyboolean(request.args.get('desc')) else: desc = False user_id = None if current_user.is_anonymous else current_user.id user_ip = (anonymizer.ip(request.remote_addr or '127.0.0.1') if current_user.is_anonymous else None) external_uid = request.args.get('external_uid') sched_rand_within_priority = project.info.get('sched_rand_within_priority', False) user = user_repo.get(user_id) if (user.get_quiz_not_started(project) and user.get_quiz_enabled(project) and not task_repo.get_user_has_task_run_for_project( project_id, user_id)): user.set_quiz_status(project, 'in_progress') user_repo.update(user) task = sched.new_task(project.id, project.info.get('sched'), user_id, user_ip, external_uid, offset, limit, orderby=orderby, desc=desc, rand_within_priority=sched_rand_within_priority, gold_only=user.get_quiz_in_progress(project)) handler = partial(pwd_manager.update_response, project=project, user=user_id_or_ip) return task, project.info.get('timeout'), handler
def _retrieve_new_task(project_id): project = project_repo.get(project_id) if project is None or not (project.published or current_user.admin or current_user.id in project.owners_ids): raise NotFound if current_user.is_anonymous: info = dict(error="This project does not allow anonymous contributors") error = [model.task.Task(info=info)] return error, None, lambda x: x if current_user.get_quiz_failed(project): # User is blocked from project so don't return a task return None, None, None # check cookie pwd_manager = get_pwd_manager(project) user_id_or_ip = get_user_id_or_ip() if pwd_manager.password_needed(project, user_id_or_ip): raise Forbidden("No project password provided") if request.args.get('external_uid'): resp = jwt_authorize_project(project, request.headers.get('Authorization')) if resp != True: return resp, lambda x: x if request.args.get('limit'): limit = int(request.args.get('limit')) else: limit = 1 if limit > 100: limit = 100 if request.args.get('offset'): offset = int(request.args.get('offset')) else: offset = 0 if request.args.get('orderby'): orderby = request.args.get('orderby') else: orderby = 'id' if request.args.get('desc'): desc = fuzzyboolean(request.args.get('desc')) else: desc = False user_id = None if current_user.is_anonymous else current_user.id user_ip = (anonymizer.ip(request.remote_addr or '127.0.0.1') if current_user.is_anonymous else None) external_uid = request.args.get('external_uid') sched_rand_within_priority = project.info.get('sched_rand_within_priority', False) user = user_repo.get(user_id) if (project.published and user_id != project.owner_id and user_id not in project.owners_ids and user.get_quiz_not_started(project) and user.get_quiz_enabled(project) and not task_repo.get_user_has_task_run_for_project( project_id, user_id)): user.set_quiz_status(project, 'in_progress') # We always update the user even if we didn't change the quiz status. # The reason for that is the user.<?quiz?> methods take a snapshot of the project's quiz # config the first time it is accessed for a user and save that snapshot # with the user. So we want to commit that snapshot if this is the first access. user_repo.update(user) # Allow scheduling a gold-only task if quiz mode is enabled for the user and the project. quiz_mode_enabled = user.get_quiz_in_progress( project) and project.info["quiz"]["enabled"] task = sched.new_task(project.id, project.info.get('sched'), user_id, user_ip, external_uid, offset, limit, orderby=orderby, desc=desc, rand_within_priority=sched_rand_within_priority, gold_only=quiz_mode_enabled) handler = partial(pwd_manager.update_response, project=project, user=user_id_or_ip) return task, project.info.get('timeout'), handler
def _retrieve_new_task(project_id): project = project_repo.get(project_id) if project is None: raise NotFound if current_user.is_anonymous(): info = dict(error="This project does not allow anonymous contributors") error = [model.task.Task(info=info)] return error, None, lambda x: x # check cookie pwd_manager = get_pwd_manager(project) user_id_or_ip = get_user_id_or_ip() if pwd_manager.password_needed(project, user_id_or_ip): raise Forbidden("No project password provided") if request.args.get('external_uid'): resp = jwt_authorize_project(project, request.headers.get('Authorization')) if resp != True: return resp, lambda x: x if request.args.get('limit'): limit = int(request.args.get('limit')) else: limit = 1 if limit > 100: limit = 100 if request.args.get('offset'): offset = int(request.args.get('offset')) else: offset = 0 if request.args.get('orderby'): orderby = request.args.get('orderby') else: orderby = 'id' if request.args.get('desc'): desc = fuzzyboolean(request.args.get('desc')) else: desc = False user_id = None if current_user.is_anonymous() else current_user.id user_ip = (anonymizer.ip(request.remote_addr or '127.0.0.1') if current_user.is_anonymous() else None) external_uid = request.args.get('external_uid') sched_rand_within_priority = project.info.get('sched_rand_within_priority', False) task = sched.new_task(project.id, project.info.get('sched'), user_id, user_ip, external_uid, offset, limit, orderby=orderby, desc=desc, rand_within_priority=sched_rand_within_priority) handler = partial(pwd_manager.update_response, project=project, user=user_id_or_ip) return task, project.info.get('timeout'), handler