Hi Eric,
A couple comments:
1) allowed_methods is a tuple, so it needs to be
allowed_methods = ('POST',)
Without that comma, it becomes ('P', 'O', 'S', 'T'), preventing HTTP POST
from working.
2) resources.reviews.get_object(request, *args, **kwargs) will only work if
the URL for your resource has all the same regex capture groups that the
review resource has. That basically means it must be a child object.
Since it's not (assuming you're not doing anything really hacky and
custom), you'll need to provide all those as keyword arguments to
get_object(). I believe you'll need:
review = resources.reviews.get_object(request, review_request_id=<ID>,
review_id=<ID>)
Alternatively, you could query from the database directly with
Review.objects.get(review_id=<ID>). The former will perform a query that
will filter out replies, and will also perform some local caching (which
will prevent extra database queries if performing the same get_object()
within the same request).
3) Your function will need to return proper webapi error objects for the
error cases, and a tuple in the final return case. For a HTTP POST, you
want:
return 201, {
self.item_result_key: yourdata,
}
Hope that helps!
- Christian
--
Christian Hammond
President/CEO of Beanbag <https://www.beanbaginc.com/>
Makers of Review Board <https://www.reviewboard.org/>
On Tue, May 10, 2016 at 10:28 PM, Eric Holmberg <[email protected]>
wrote:
> Hi Christian,
>
> Here is the core of the extension. The `model` and `uri_object_key`
> issues are due to the resources.review.get_object() request. Maybe I
> should be going directly to the database model instead of going through the
> webapi?
>
> class SampleExtensionResource(WebAPIResource):
> """Resource for review voting"""
> name = 'ballot_box'
> uri_name = 'ballot_box'
> allowed_methods = ('POST')
>
>
> def has_access_permissions(self, request, *args, **kwargs):
> return review_request.is_accessible_by(request.user)
>
> def create(self, request, *args, **kwargs):
>
> try:
> # v--- problem is there
> review = resources.review.get_object(request, *args, **kwargs)
> except ObjectDoesNotExist:
> # TODO - need to return a proper failure message here
> return HttpResponse("Unable to lookup review")
>
>
> if not resources.review.has_modify_permissions(request, review):
> return self.get_no_access_error(request.user)
>
>
> comment_kwargs = {
> 'body_top_text_type': 'plain',
> 'body_bottom': '', 'body_bottom_text_type': 'plain',
> 'public': 1,
> 'ship_it': True,
> 'body_top': "TODO - Add real comment here"
> }
> new_comment = self.create_comment(fields=(), review=review, **
> comment_kwargs)
> review.general_comments.add(new_comment)
>
>
> # TODO - probably need a json response
> response = "OK"
> return HttpResponse(response)
>
> Regards,
> Eric
>
> On Friday, May 6, 2016 at 10:07:31 PM UTC+12, Christian Hammond wrote:
>>
>> Hi Eric,
>>
>> The `model` and `uri_object_key` are configurations for a resource's
>> implementation, and aren't related to the data provided by the caller.
>>
>> The `model` attribute is optionally used to associate a WebAPIResource
>> subclass with a particular database model. If set, many of the operations
>> (GET requests to lists or to objects, DELETEs, etc.) are implemented for
>> you, but otherwise, you have to implement those yourself (by overriding
>> get(), get_list(), delete(), etc.).
>>
>> `uri_object_key` defines the name of the capture group in the URL's regex
>> that captures the iD used to look up the appropriate object (defined by
>> `model`) in the database.
>>
>> You don't need to do anything with Backbone to make use of the API. a
>> $.post() should be fine. However, it sounds like maybe the WebAPIResource
>> isn't implemented fully.
>>
>> Can you show me the code you've written, how you're calling into the API,
>> and what the results are when you do so? We can help you write the
>> WebAPIResource to do what you need.
>>
>> Christian
>>
>> --
>> Christian Hammond
>> President/CEO of Beanbag <https://www.beanbaginc.com/>
>> Makers of Review Board <https://www.reviewboard.org/>
>>
>> On Wed, May 4, 2016 at 9:04 PM, Eric Holmberg <[email protected]>
>> wrote:
>>
>>> I have created a WebAPIResource extension based upon the instructions in
>>> https://www.reviewboard.org/docs/manual/2.0/extending/extensions/webapi/
>>> which is called based upon the user clicking on a menu item which was
>>> created by ReviewRequestDropdownActionHook.
>>>
>>> How do I actually do the POST call?
>>>
>>> I tried just the usual jQuery $.post(...), but djblets/webapi/
>>> resources.base.py tries to get the "model" and "uri_object_keys" and
>>> fails since they are not part of the post data. It looks like I need to
>>> create a view and model by deriving from Backbone.View.extend
>>> Backbone.Model.extend,
>>> but I haven't found any concise examples that I can understand well enough
>>> to use as a template.
>>>
>>> My use case:
>>>
>>> 1. Based upon a UI event, post to the WebAPIResource
>>> 2. In the WebAPIResource.create method:
>>> 1. Lookup current review, post a comment based upon the approval
>>> request (similar to a ship-it comment)
>>> 2. Log vote into a new database model
>>> 3. Query the existing votes and if everything looks good, trigger
>>> a merge of the change or rejection email
>>>
>>>
>>> Note that I'm not a Javascript or web programmer since my background is
>>> C++ and Python, so I'm sorry if my question is elementary.
>>>
>>> Regards,
>>> Eric
>>>
>>>
>>>
>>>
>>> --
>>> Supercharge your Review Board with Power Pack:
>>> https://www.reviewboard.org/powerpack/
>>> Want us to host Review Board for you? Check out RBCommons:
>>> https://rbcommons.com/
>>> Happy user? Let us know! https://www.reviewboard.org/users/
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "reviewboard" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>> --
> Supercharge your Review Board with Power Pack:
> https://www.reviewboard.org/powerpack/
> Want us to host Review Board for you? Check out RBCommons:
> https://rbcommons.com/
> Happy user? Let us know! https://www.reviewboard.org/users/
> ---
> You received this message because you are subscribed to the Google Groups
> "reviewboard" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>
--
Supercharge your Review Board with Power Pack:
https://www.reviewboard.org/powerpack/
Want us to host Review Board for you? Check out RBCommons:
https://rbcommons.com/
Happy user? Let us know! https://www.reviewboard.org/users/
---
You received this message because you are subscribed to the Google Groups
"reviewboard" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.