def get(self, request, response, _appname, _modelname): """Return a HAL formatted version of the instance list. """ root = get_slumber_root() hal = Builder(self()) hal.add_link('model', root + self.model.path) query = self.model.model.objects hal_instance_list(self, request.GET, hal, query) response["instances"] = hal.as_object() response.root = 'instances'
def get(self, id): """Returns a specific of Organization.""" org = Organization.get_or_404(id) response = Builder(url_for("v1.OrganizationsView:get", id=id))\ .add_curie('r', url_for('v1.LinkRelationsView:index')+"/{rel}")\ .add_link('r:organizations', url_for("v1.OrganizationsView:index", page=1)) for key, value in org.to_dict().iteritems(): response.set_property(key, value) return response.as_object()
def test_links_to_endpoints(self): """ Verify that root links to the available endpoints """ b = Builder('http://localhost/').add_curie(name='ep', href='/rel/{rel}')\ .add_link('ep:user', target='/users')\ .add_link('ep:dataset', target='/datasets')\ .add_link('ep:organization', target='/organizations')\ .add_link('ep:schema', target='/schema') expected = b.as_object() response = self.client.get("/") Document.from_object(json.loads(response.data)) self.assertEquals(response.json, expected)
def post_invitation(self, id): """Create a new invitation""" #TODO replace boilerplate with decorator user = User.get(id) if not user: raise NotFound() if current_user.id != user.id: raise Unauthorized('user id does not match requesting user id') #END boilerplate if len(user.invitations) >= current_app.config.get('MAX_INVITES'): raise Conflict("Maximum invitations reached") args = user_invitation_post_parser.parse_args() email = args.get('email') token = generate_invitation_token(user) try: invite = Invite.create(invitor_id=id, invitee_email=email, token=token) except IntegrityError as e: raise Conflict('%s has already been invited.' % email) invite_link = urljoin(current_app.config['CLIENT_DOMAIN'], '/#/register?token='+token) #TODO this mail send should be performed asynchronously using celery, see issue #88850472 send_message( subject="You've been given early access to FogMine", sender="*****@*****.**", recipients = [user.email], html_body=render_template('email/invite.html', user=user, confirmation_link=invite_link), text_body=render_template('email/invite.txt', user=user, confirmation_link=invite_link) ) schema = InviteSchema() jsonSerializableInvite = schema.dump(invite)[0] b = Builder(href=url_for('v1.UsersView:get_invitation', userid=id, inviteid=invite.id))\ .add_curie('r', url_for('v1.LinkRelationsView:index')+"/{rel}") #TODO is there a simpler way to just add the whole dict here? for key, value in jsonSerializableInvite.iteritems(): b.set_property(key, value) return b.o, 201
def hal_instance_list(operation, control, builder, query_set, page_size=10): """Return a page of JSON-HAL based results across the query set. """ from slumber import data_link starter = control.get('lpk', None) if starter: query_set = query_set.filter(pk__lt=starter) lpk = None for instance in query_set.order_by('-pk').iterator(): if page_size == 0: builder.add_link('next', operation(lpk=lpk)) return else: page_size -= 1 lpk = instance.pk item = Builder(data_link(instance)) item.set_property('display', unicode(instance)) builder.embed('page', item)
def index(self): """Returns a Collection of Organizations.""" args = org_parser.parse_args() pagination = Organization.query.paginate(page=args.page, per_page=args.per_page) response = Builder(url_for("v1.OrganizationsView:index", page=pagination.page))\ .add_curie('r', url_for('v1.LinkRelationsView:index')+"/{rel}")\ .set_property('total', pagination.total) if pagination.has_prev: response = response.add_link('prev', url_for("v1.OrganizationsView:index", page=pagination.prev_num)) if pagination.has_next: response = response.add_link('next', url_for("v1.OrganizationsView:index", page=pagination.next_num)) if pagination.total > 1 and pagination.has_prev: response = response.add_link('first', url_for("v1.OrganizationsView:index", page=1)) if pagination.total > 1 and pagination.has_next: response = response.add_link('last', url_for("v1.OrganizationsView:index", page=pagination.pages)) for business in pagination.items: response = response.add_link('r:organization', url_for("v1.OrganizationsView:get", id=business.id)) return response.as_object()