def show_issue(number): """Route to display a single issue.""" push('/dist/webcompat.css', **{ 'as': 'style', 'rel': 'preload' }) push(bust_cache('/dist/vendor.js'), **{ 'as': 'script', 'rel': 'preload' }) push(bust_cache('/dist/webcompat.js'), **{ 'as': 'script', 'rel': 'preload' }) push(bust_cache('/dist/issue-page.js'), **{ 'as': 'script', 'rel': 'preload' }) if g.user: get_user_info() if session.get('show_thanks'): flash(number, 'thanks') session.pop('show_thanks') issue_data = proxy_issue(number) return render_template('issue.html', issue_data=json.loads(issue_data[0]), json_data=to_str(issue_data[0]))
def index(): """Set the main view where people come to report issues.""" push('/dist/webcompat.css', **{ 'as': 'style', 'rel': 'preload' }) push(bust_cache('/dist/vendor.js'), **{ 'as': 'script', 'rel': 'preload' }) push(bust_cache('/dist/webcompat.js'), **{ 'as': 'script', 'rel': 'preload' }) push(bust_cache('/dist/index.js'), **{ 'as': 'script', 'rel': 'preload' }) ua_header = request.headers.get('User-Agent') # browser_name is used in topbar.html to show the right add-on link browser_name = get_browser_name(ua_header) # GET means you want to file a report. if g.user: get_user_info() return render_template('index.html', browser=browser_name)
def index(): """Set the main view where people come to report issues.""" push('/css/dist/webcompat.min.css', **{ 'as': 'style', 'rel': 'preload' }) push(bust_cache('/js/dist/webcompat.min.js'), **{ 'as': 'script', 'rel': 'preload' }) push('/img/svg/icons/svg-leaf_right.svg', **{ 'as': 'img', 'rel': 'preload' }) push('/img/svg/icons/svg-leaf_left.svg', **{ 'as': 'img', 'rel': 'preload' }) ua_header = request.headers.get('User-Agent') bug_form = get_form({'user_agent': ua_header}) # browser_name is used in topbar.html to show the right add-on link browser_name = get_browser_name(ua_header) # GET means you want to file a report. if g.user: get_user_info() return render_template('index.html', form=bug_form, browser=browser_name)
def user_issues(): """API endpoint to return issues filed by the logged in user. Not cached. """ get_user_info() path = "repos/{0}?creator={1}&state=all".format(ISSUES_PATH, session["username"]) request_headers = get_request_headers(g.request_headers) issues = github.raw_request("GET", path, headers=request_headers) return (issues.content, issues.status_code, get_headers(issues))
def user_issues(): '''API endpoint to return issues filed by the logged in user. Not cached. ''' get_user_info() path = 'repos/{0}?creator={1}&state=all'.format(REPO_URI, session['username']) issues = github.raw_request('GET', path) return (issues.content, issues.status_code, get_headers(issues))
def user_issues(): '''API endpoint to return issues filed by the logged in user. Not cached. ''' get_user_info() path = 'repos/{0}?creator={1}&state=all'.format( REPO_URI, session['username'] ) issues = github.raw_request('GET', path) return (issues.content, issues.status_code, get_headers(issues))
def show_issues(): """Route to display global issues view.""" push('/css/dist/webcompat.min.css', **{'as': 'style', 'rel': 'preload'}) push(bust_cache('/js/dist/webcompat.min.js'), **{ 'as': 'script', 'rel': 'preload' }) push(bust_cache('/js/dist/issues.min.js'), **{ 'as': 'script', 'rel': 'preload' }) if g.user: get_user_info() categories = app.config['CATEGORIES'] return render_template('list-issue.html', categories=categories)
def show_issue(number): """Route to display a single issue.""" push('/css/dist/webcompat.min.css', **{'as': 'style', 'rel': 'preload'}) push(bust_cache('/js/dist/webcompat.min.js'), **{ 'as': 'script', 'rel': 'preload' }) push(bust_cache('/js/dist/issues.min.js'), **{ 'as': 'script', 'rel': 'preload' }) if g.user: get_user_info() if session.get('show_thanks'): flash(number, 'thanks') session.pop('show_thanks') return render_template('issue.html', number=number)
def show_user_page(username): """Set the route for user activity. (this dupes some of the functionality of /me, but allows directly visiting this endpoint via a bookmark) If the user is not logged in, send back a 401. Make sure we have username and avatar details from Github If the username matches, render the template as expected. If it doesn't match, abort with 403 until we support looking at *other* users activity. """ if not g.user: abort(401) get_user_info() if username == session['username']: return render_template('user-activity.html', user=username) else: abort(403)
def contributors_bug_diagnosis(): """Route to display contributors/diagnose-bug page.""" if g.user: get_user_info() return render_template('contributors/diagnose-bug.html')
def contributors_bug_reproduce(): """Route to display contributors/reproduce-bug page.""" if g.user: get_user_info() return render_template('contributors/reproduce-bug.html')
def contributors(): """Route to display contributors page.""" if g.user: get_user_info() return render_template('contributors.html')
def contact(): """Route to display contact page.""" if g.user: get_user_info() return render_template('contact.html')
def privacy(): """Route to display privacy page.""" if g.user: get_user_info() return render_template('privacy.html')
def about(): """Route to display about page.""" if g.user: get_user_info() return render_template('about.html')
def contributors_other_research(): """Route to display contributors/web-platform-research page.""" if g.user: get_user_info() return render_template('contributors/web-platform-research.html')
def contributors_bug_outreach(): """Route to display contributors/site-outreach page.""" if g.user: get_user_info() return render_template('contributors/site-outreach.html')
def alumni(): """Route to display contributors alumni page.""" if g.user: get_user_info() return render_template('contributors/alumni.html')
def terms(): """Route to display terms of service page.""" if g.user: get_user_info() return render_template('terms.html')
def contributors_other_tools(): """Route to display contributors/build-tools page.""" if g.user: get_user_info() return render_template('contributors/build-tools.html')
def create_issue(): """Create a new issue or prefill a form for submission. * HTTP GET with (optional) parameters * create a form with prefilled data. * parameters: * url: URL of the Web site * src: source of the request (web, addon, etc.) * label: controled list of labels * HTTP POST with a JSON payload * create a form with prefilled data * content-type is application/json * json may include: * title * User agent string * OS identification * labels list * type of bugs * short summary * full description * tested in another browser * body * utm_ params for Google Analytics * HTTP POST with an attached form * submit a form to GitHub to create a new issue * form submit type: * authenticated: Github authentification * anonymous: handled by webcompat-bot Any deceptive requests will be ended as a 400. See https://tools.ietf.org/html/rfc7231#section-6.5.1 """ push('/css/dist/webcompat.min.css', **{ 'as': 'style', 'rel': 'preload' }) push(bust_cache('/js/dist/webcompat.min.js'), **{ 'as': 'script', 'rel': 'preload' }) # Starting a logger log = app.logger log.setLevel(logging.INFO) if g.user: get_user_info() # We define which type of requests we are dealing with. request_type = form_type(request) # Form Prefill section if request_type == 'prefill': form_data = prepare_form(request) if ab_active('exp') == 'form-v2': bug_form = get_form(form_data, form=FormWizard) # TODO: remove this when the experiment has ended form_data['extra_labels'].append('form-v2-experiment') else: bug_form = get_form(form_data) session['extra_labels'] = form_data['extra_labels'] source = form_data.pop('utm_source', None) campaign = form_data.pop('utm_campaign', None) return render_template('new-issue.html', form=bug_form, source=source, campaign=campaign, nonce=request.nonce) # Issue Creation section elif request_type == 'create': # Check if there is a form if not request.form: log.info('POST request without form.') abort(400) # Adding parameters to the form form = request.form.copy() extra_labels = session.pop('extra_labels', None) if extra_labels: form['extra_labels'] = extra_labels # Logging the ip and url for investigation log.info('{ip} {url}'.format( ip=request.remote_addr, url=form['url'].encode('utf-8'))) # Check if the form is valid if not is_valid_issue_form(form): log.info('Invalid issue form request') abort(400) if form.get('submit_type') == PROXY_REPORT: # Checking blacklisted domains domain = urllib.parse.urlsplit(form['url']).hostname if is_blacklisted_domain(domain): msg = app.config['IS_BLACKLISTED_DOMAIN'].format(form['url']) flash(msg, 'notimeout') return redirect(url_for('index')) # Anonymous reporting json_response = report_issue(form, proxy=True) session['show_thanks'] = True return redirect( url_for('show_issue', number=json_response.get('number'))) # Authenticated reporting if form.get('submit_type') == AUTH_REPORT: if g.user: # If you're already authed, submit the bug. json_response = report_issue(form) session['show_thanks'] = True return redirect(url_for('show_issue', number=json_response.get('number'))) else: # Stash form data into session, go do GitHub auth session['form'] = form return redirect(url_for('login')) else: log.info('No idea. Abort from /issues/new') abort(400)
def contributors_other_events(): """Route to display contributors/organize-webcompat-events page.""" if g.user: get_user_info() return render_template('contributors/organize-webcompat-events.html')
def me_redirect(): """Set a redirect to /activity/<username>, for logged in users.""" if not g.user: abort(401) get_user_info() return redirect(url_for('show_user_page', username=session['username']))