def key_list(request): ''' For: GET /keys POST /keys ''' api = API(request) api.authenticated_or_raise() if api.get: keys = Key.list_user( user=request.user ) return api.respond( data=keys, paginate=True ) elif api.post: key = Key.create_one( user=request.user, address=api.required('address'), type=api.required('type'), action=api.required('action'), users=api.required('users') ) return api.respond( data=key ) else: return api.raise_method_not_allowed()
def builds(request, id=None): api = API(request) if id is None: if api.get: builds = Build.list() return api.respond( builds, template='builds/builds.html' ) elif api.post: build = Build.create( user=request.user, package=api.required('package'), flavour=api.required('flavour'), version=api.required('version'), commit=api.required('commit'), platform=api.optional('platform'), url=api.optional('url') ) return api.respond(build) else: if api.get: build = Build.objects.get( id=id ) return api.respond(build) raise API.MethodNotAllowedError( method=request.method )
def components(request, id=None, type=None): ''' Standard API endpoint for components ''' api = API(request) if api.get: filters = {} if type: type = type[:-1] # Remove the trailing 's' that is in the URL filters['type'] = type components = Component.list( user=request.user, address=api.optional('address'), published=api.optional('published', True, lambda value: bool(int(value))), filters=filters, sort=api.optional('sort', 'id') ) return api.respond( data=components, paginate=25 ) elif api.post: api.authenticated_or_raise() component = Component.create_one( user=request.user, address=api.required('address'), type=api.required('type'), ) return api.respond( data=component ) else: api.raise_method_not_allowed()
def address_list(request): ''' For: GET /addresses POST /addresses ''' api = API(request) api.authenticated_or_raise() if api.get: addresses = Address.list( user=request.user ) return api.respond( data=addresses, paginate=100 ) elif api.post: address = Address.create_one( user=request.user, address=api.required('address'), type=api.required('type'), action=api.required('action'), users=api.required('users') ) return api.respond( data=address ) else: return api.raise_method_not_allowed()
def content(request, address): ''' Get or set the content of a stencil ''' api = API(request) if api.get: component = Component.get( id=None, user=request.user, action=READ, address=address ) result = component.content_get( format=api.optional('format', 'html'), ) elif api.put: component = Component.get( id=None, user=request.user, action=UPDATE, address=address ) result = component.content_set( user=request.user, format=api.required('format'), content=api.required('content'), revision=api.required('revision') ) return api.respond(result)
def sessions(request, id=None): api = API(request) if id is None: if api.get: # Get a list of sessions sessions = Session.list(user=request.user, filter={"active": True}) return api.respond( sessions, template="sessions/list.html", context={ "sessions": sessions, "types": SessionType.objects.order_by("rank").all(), "images": SessionImage.objects.all(), }, ) elif api.post: # Launch a session for the user session = Session.launch(user=request.user, type_id=api.required("type"), image_name=api.require("image")) return api.respond(session) else: if api.get: # Get a session, updating it first session = Session.get(id=id, user=request.user) if session.active: session.update() return api.respond(session) return api.respond(status=405)
def events(request): api = API(request) if api.post: UserEvent.create( user=request.user, name=api.required('name'), data=api.required('data') ) return api.respond() else: return api.respond(status=405)
def new(request): """ List session types, create a new session, launch it and redirect the user to it's page """ api = API(request) if api.get: return api.respond( template="sessions/new.html", context={ "sessions": Session.list(user=request.user, filter={"active": True}).count(), "types": SessionType.objects.order_by("rank").all(), "images": SessionImage.objects.all(), }, ) elif api.post: session = Session.launch(user=request.user, type_id=api.required("type"), image_name=api.required("image")) return api.respond_created(url=session.url()) return api.respond_bad()
def received(request, address): ''' Endpoint for the `curator` to ping when a component has received an update e.g. from `git push`. A token is used to protect access. But this endpoint only accepts the address of the component and then fetches an update from the `curator`, so a malicious user can not read or write data anyway. ''' api = API(request) # Check access token token = api.required('token') if token != settings.COMMS_TOKEN: return JsonResponse( {'error': 'invalid token'}, status=403 ) # Update the component component = Component.objects.get( address=address ) component.update() return api.respond()
def component_fork(request, id): ''' Fork a component For: POST /components/{id}/fork ''' api = API(request) api.authenticated_or_raise() component = Component.get( id=id, user=request.user, action=READ, ) if api.post: fork = component.fork( user=request.user, to=api.required('to') ) return api.respond(fork) else: api.raise_method_not_allowed()