Package coprs :: Package rest_api :: Module common
[hide private]
[frames] | no frames]

Source Code for Module coprs.rest_api.common

  1  # coding: utf-8 
  2  import base64 
  3  import datetime 
  4  import functools 
  5  from logging import getLogger 
  6   
  7  from flask import url_for 
  8  import flask 
  9   
 10  from ..logic.users_logic import UsersLogic 
 11  from ..logic.builds_logic import BuildsLogic 
 12  from ..logic.coprs_logic import CoprsLogic 
 13  from ..rest_api.schemas import BuildTaskSchema 
 14  from ..rest_api.util import mm_serialize_one, get_one_safe 
 15   
 16  from .exceptions import AuthFailed 
 17  from .schemas import CoprChrootSchema, BuildSchema, ProjectSchema 
 18  from .util import mm_serialize_one 
 19  from coprs import app 
 20   
 21  log = getLogger(__name__) 
22 23 24 -def render_copr_chroot(chroot):
25 return { 26 "chroot": mm_serialize_one(CoprChrootSchema, chroot), 27 "_links": { 28 "project": {"href": url_for(".projectr", project_id=chroot.copr.id)}, 29 "self": {"href": url_for(".projectchrootr", 30 project_id=chroot.copr.id, 31 name=chroot.name)}, 32 } 33 }
34
35 36 -def render_build(build, self_params=None):
37 if self_params is None: 38 self_params = {} 39 return { 40 "build": mm_serialize_one(BuildSchema, build), 41 "_links": { 42 "self": {"href": url_for(".buildr", build_id=build.id, **self_params)}, 43 "project": {"href": url_for(".projectr", project_id=build.copr_id)}, 44 "build_tasks": {"href": url_for(".buildtasklistr", build_id=build.id)} 45 } 46 }
47
48 49 -def render_project(project, self_params=None):
50 """ 51 :param Copr project: 52 """ 53 if self_params is None: 54 self_params = {} 55 56 return { 57 "project": mm_serialize_one(ProjectSchema, project), 58 "_links": { 59 "self": {"href": url_for(".projectr", project_id=project.id, **self_params)}, 60 "builds": {"href": url_for(".buildlistr", project_id=project.id)}, 61 "chroots": {"href": url_for(".projectchrootlistr", project_id=project.id)}, 62 "build_tasks": {"href":url_for(".buildtasklistr", project_id=project.id) } 63 }, 64 }
65
66 67 -def render_build_task(chroot):
68 """ 69 :type chroot: BuildChroot 70 """ 71 return { 72 "build_task": mm_serialize_one(BuildTaskSchema, chroot), 73 "_links": { 74 "project": {"href": url_for(".projectr", project_id=chroot.build.copr_id)}, 75 "build": {"href": url_for(".buildr", build_id=chroot.build_id)}, 76 "self": {"href": url_for(".buildtaskr", 77 build_id=chroot.build.id, 78 name=chroot.name)}, 79 } 80 }
81
82 83 -def rest_api_auth_required(f):
84 # todo: move to common.py and test this 85 @functools.wraps(f) 86 def decorated_function(*args, **kwargs): 87 token = None 88 api_login = None 89 try: 90 if "Authorization" in flask.request.headers: 91 base64string = flask.request.headers["Authorization"] 92 base64string = base64string.split()[1].strip() 93 userstring = base64.b64decode(base64string) 94 (api_login, token) = userstring.decode("utf-8").split(":") 95 except Exception: 96 log.exception("Failed to get auth token from headers") 97 api_login = token = None 98 99 token_auth = False 100 if token and api_login: 101 user = UsersLogic.get_by_api_login(api_login).first() 102 if (user and user.api_token == token and 103 user.api_token_expiration >= datetime.date.today()): 104 105 token_auth = True 106 flask.g.user = user 107 if not token_auth: 108 message = ( 109 "Login invalid/expired. " 110 "Please visit {0}/api " 111 "get or renew your API token.") 112 113 raise AuthFailed(message.format(app.config["PUBLIC_COPR_HOSTNAME"])) 114 return f(*args, **kwargs)
115 return decorated_function 116
117 118 -def get_project_safe(project_id):
119 """ 120 :param int project_id: 121 :rtype: Copr 122 """ 123 return get_one_safe( 124 CoprsLogic.get_by_id(project_id), 125 msg="Project with id `{}` not found".format(project_id), 126 data={"project_id": project_id} 127 )
128
129 130 -def get_build_safe(build_id):
131 """ 132 :param int build_id: 133 :rtype: Build 134 """ 135 return get_one_safe( 136 BuildsLogic.get(build_id), 137 msg="Build with id `{}` not found".format(build_id), 138 data={"build_id": build_id} 139 )
140
141 142 -def get_user_safe(username):
143 """ 144 :param str username: 145 :rtype: User 146 """ 147 return get_one_safe( 148 UsersLogic.get(username), 149 msg="User `{}` doesn't have any project".format(username), 150 data={"username": username} 151 )
152