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