Changeset 2417 in main


Ignore:
Timestamp:
05/15/13 13:13:55 (6 years ago)
Author:
pcosquer
Message:

web api: add attached_documents, attached_parts and get methods

  • increase api version to 1.1

see #196

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/docs/en/devel/http-api.rst

    r1075 r2417  
    2929 
    3030    api_version 
    31         the api version (current : **1.0**) 
     31        the api version (current : **1.1**) 
    3232 
    3333    result 
     
    3939.. code-block:: javascript 
    4040     
    41     {"result": "ok", "api_version": "1.0"} 
     41    {"result": "ok", "api_version": "1.1"} 
    4242 
    4343If an error occurred, an extra field is add: 
     
    5050.. code-block:: javascript 
    5151 
    52     {"result": "error", "api_version": "1.0", "error": "Oups an error occured"} 
     52    {"result": "error", "api_version": "1.1", "error": "Oups an error occured"} 
    5353 
    5454 
     
    8888============ 
    8989 
    90 Some queries returns a description of an object field, this description contains 
     90Some queries return a description of an object field, this description contains 
    9191the following fields: 
    9292 
     
    321321           :ref:`http-api-fields`. 
    322322 
     323.. py:function:: get 
     324 
     325    .. versionadded:: 1.1 
     326 
     327    Returns description of an object (part or document) identified by its id. 
     328 
     329    :url: :samp:`{server}/get/{object_id}/` 
     330    :type: GET 
     331    :login required: yes 
     332    :implemented by: :func:`plmapp.views.api.get_object` 
     333    :returned fields: 
     334        object 
     335           dictionary describing the object, see :ref:`http-api-object`. 
     336 
     337 
     338Part queries 
     339++++++++++++++++ 
     340 
     341In the following queries, *part_id* is a the id (an integer) of a 
     342:class:`.Part`  
     343 
     344.. py:function:: attached_documents 
     345 
     346    .. versionadded:: 1.1 
     347 
     348    Returns the list of attached parts.  
     349 
     350    :url: :samp:`{server}/api/object/{part_id}/attached_documents/`  
     351    :type: GET 
     352    :login required: yes 
     353    :implemented by: :func:`plmapp.views.api.get_attached_documents` 
     354    :returned fields: parts, a list of dictionaries describing attached documents 
     355 
    323356 
    324357Document queries 
     
    410443            the file that has been had, see :ref:`http-api-file`. 
    411444 
     445.. py:function:: attached_parts 
     446 
     447    .. versionadded:: 1.1 
     448 
     449    Returns the list of attached parts.  
     450 
     451    :url: :samp:`{server}/api/object/{doc_id}/attached_parts/`  
     452    :type: GET 
     453    :login required: yes 
     454    :implemented by: :func:`plmapp.views.api.get_attached_parts` 
     455    :returned fields: parts, a list of dictionaries describing attached parts 
    412456 
    413457Document file queries 
     
    476520    :post param: filename 
    477521    :returned fields: None 
     522     
     523 
  • trunk/openPLM/plmapp/tests/api.py

    r2087 r2417  
    33 
    44from openPLM.plmapp.tests.views import CommonViewTest 
    5 from openPLM.plmapp.controllers.document import DocumentController 
    6  
     5from openPLM.plmapp.controllers import DocumentController, PartController 
    76 
    87class ApiTestCase(CommonViewTest): 
     
    3736        self.assertTrue("Document" in data["types"]) 
    3837        self.assertTrue("OfficeDocument" in data["types"]) 
    39      
     38 
    4039    def test_get_all_parts(self): 
    4140        data = self.get("/api/parts/") 
     
    4847        data = self.get("/api/testlogin/") 
    4948        self.assertEqual("ok", data["result"]) 
    50          
     49 
    5150    def test_search(self): 
    5251        for url in ("/api/search/", "/api/search/false/", 
     
    7069        data = self.get("/api/search/") 
    7170        self.assertEqual("error", data["result"]) 
    72      
     71 
    7372    def test_search_with_file_only(self): 
    7473        doc = DocumentController.create("Doc", "Document", "a", self.user, 
     
    8281        self.assertEqual("ok", data["result"]) 
    8382        self.assertEqual(1, len(data["objects"])) 
    84          
     83 
    8584        d = data["objects"][0] 
    8685        self.assertEqual(doc.name, d["name"]) 
     
    9493        reference_field = [f for f in fields if f["name"] == "q"][0] 
    9594        self.assertEqual("text", reference_field["type"]) 
    96     
     95 
    9796    def test_get_creation_fields_part(self): 
    9897        data = self.get("/api/creation_fields/Part/") 
     
    105104        group_field = [f for f in fields if f["name"] == "group"][0] 
    106105        self.assertTrue(group_field["choices"]) 
    107      
     106 
    108107    def test_get_creation_fields_harddisk(self): 
    109108        data = self.get("/api/creation_fields/HardDisk/") 
     
    114113        capacity_field = [f for f in fields if f["name"] == "capacity_in_go"][0] 
    115114        self.assertEqual("int", capacity_field["type"]) 
    116      
     115 
    117116    def test_get_creation_fields_unknown_type(self): 
    118117        data = self.get("/api/creation_fields/UnknownType/") 
     
    182181        self.assertEqual("ok", data["result"]) 
    183182        self.assertEqual([], data["files"]) 
    184      
     183 
    185184    def test_get_files(self): 
    186185        doc = DocumentController.create("Doc", "Document", "a", self.user, 
     
    203202        self.assertEqual("ok", data["result"]) 
    204203        self.assertEqual([df.id], [f["id"] for f in data["files"]]) 
    205     
     204 
    206205    def test_add_file(self): 
    207206        doc = DocumentController.create("Doc", "Document", "a", self.user, 
     
    214213        self.assertEqual(mock_file.name, data["doc_file"]["filename"]) 
    215214        self.assertEqual(doc.files[0].id, data["doc_file"]["id"]) 
    216          
     215 
    217216    def test_add_file_error_missing_file(self): 
    218217        doc = DocumentController.create("Doc", "Document", "a", self.user, 
     
    221220        self.assertEqual("error", data["result"]) 
    222221        self.assertFalse(doc.files) 
    223      
     222 
    224223    def test_attach_to_part(self): 
    225224        doc = DocumentController.create("Doc", "Document", "a", self.user, 
     
    265264        df = doc.add_file(self.get_file()) 
    266265        mock_file = self.get_file(data="robert") 
    267         data = self.post("/api/object/%d/checkin/%d/" % (doc.id, df.id),  
     266        data = self.post("/api/object/%d/checkin/%d/" % (doc.id, df.id), 
    268267                filename=mock_file) 
    269268        self.assertEqual("ok", data["result"]) 
     
    276275        thumbnail = ContentFile(file("datatests/thumbnail.png").read()) 
    277276        thumbnail.name = "Thumbnail.png" 
    278         data = self.post("/api/object/%d/add_thumbnail/%d/" % (doc.id, df.id),  
     277        data = self.post("/api/object/%d/add_thumbnail/%d/" % (doc.id, df.id), 
    279278                filename=thumbnail) 
    280279        self.assertEqual("ok", data["result"]) 
    281280        self.assertNotEqual(None, doc.files[0].thumbnail) 
    282281 
    283  
     282    def test_get(self): 
     283        doc = DocumentController.create("Doc", "Document", "a", self.user, 
     284                self.DATA) 
     285        data = self.get("/api/get/%d/" % doc.id) 
     286        wanted = { 
     287            "id": doc.id, 
     288            "reference": "Doc", 
     289            "type": "Document", 
     290            "revision": "a", 
     291            "name": doc.name, 
     292            } 
     293        self.assertEqual("ok", data["result"]) 
     294        self.assertEqual(data["object"], wanted) 
     295 
     296    def test_attached_parts_empty(self): 
     297        doc = DocumentController.create("Doc", "Document", "a", self.user, 
     298                self.DATA) 
     299        url = "/api/object/%d/attached_parts/" % doc.id 
     300        data = self.get(url) 
     301        self.assertEqual(data["parts"], []) 
     302 
     303    def test_attached_parts_one_part(self): 
     304        doc = DocumentController.create("Doc", "Document", "a", self.user, 
     305                self.DATA) 
     306        doc.attach_to_part(self.controller) 
     307        url = "/api/object/%d/attached_parts/" % doc.id 
     308        data = self.get(url) 
     309        wanted = [{ 
     310            "id": self.controller.id, 
     311            "reference": self.controller.reference, 
     312            "type": self.controller.type, 
     313            "revision": self.controller.revision, 
     314            "name": self.controller.name, 
     315            }] 
     316        self.assertEqual(data["parts"], wanted) 
     317 
     318    def test_attached_parts_two_parts(self): 
     319        doc = DocumentController.create("Doc", "Document", "a", self.user, 
     320                self.DATA) 
     321        doc.attach_to_part(self.controller) 
     322        part2 = PartController.create("Part2", "Part", "a", self.user, self.DATA) 
     323        doc.attach_to_part(part2) 
     324        wanted = [ 
     325            { 
     326                "id": self.controller.id, 
     327                "reference": self.controller.reference, 
     328                "type": self.controller.type, 
     329                "revision": self.controller.revision, 
     330                "name": self.controller.name, 
     331            }, 
     332            { 
     333                "id": part2.id, 
     334                "reference": part2.reference, 
     335                "type": part2.type, 
     336                "revision": part2.revision, 
     337                "name": part2.name, 
     338            }, 
     339        ] 
     340        key = lambda x: x["id"] 
     341        url = "/api/object/%d/attached_parts/" % doc.id 
     342        data = self.get(url) 
     343        self.assertEqual(sorted(data["parts"], key=key), sorted(wanted, key=key)) 
     344 
     345    def test_attached_documents_empty(self): 
     346        url = "/api/object/%d/attached_documents/" % self.controller.id 
     347        data = self.get(url) 
     348        self.assertEqual(data["documents"], []) 
     349 
     350    def test_attached_documents_one_part(self): 
     351        doc = DocumentController.create("Doc", "Document", "a", self.user, 
     352                self.DATA) 
     353        doc.attach_to_part(self.controller) 
     354        url = "/api/object/%d/attached_documents/" % self.controller.id 
     355        data = self.get(url) 
     356        wanted = [{ 
     357            "id": doc.id, 
     358            "reference": doc.reference, 
     359            "type": doc.type, 
     360            "revision": doc.revision, 
     361            "name": doc.name, 
     362            }] 
     363        self.assertEqual(data["documents"], wanted) 
     364 
     365    def test_attached_documents_two_parts(self): 
     366        doc = DocumentController.create("Doc", "Document", "a", self.user, 
     367                self.DATA) 
     368        doc.attach_to_part(self.controller) 
     369        doc2 = DocumentController.create("Doc2", "Document", "a", self.user, 
     370                self.DATA) 
     371        doc2.attach_to_part(self.controller) 
     372        wanted = [ 
     373            { 
     374                "id": doc.id, 
     375                "reference": doc.reference, 
     376                "type": doc.type, 
     377                "revision": doc.revision, 
     378                "name": doc.name, 
     379            }, 
     380            { 
     381                "id": doc2.id, 
     382                "reference": doc2.reference, 
     383                "type": doc2.type, 
     384                "revision": doc2.revision, 
     385                "name": doc2.name, 
     386            }, 
     387        ] 
     388        key = lambda x: x["id"] 
     389        url = "/api/object/%d/attached_documents/" % self.controller.id 
     390        data = self.get(url) 
     391        self.assertEqual(sorted(data["documents"], key=key), sorted(wanted, key=key)) 
     392 
     393 
  • trunk/openPLM/plmapp/views/api.py

    r2338 r2417  
    4444        secure_required 
    4545 
    46 #: Version of the API (value: ``'1.0'``) 
    47 API_VERSION = "1.0" 
     46#: Version of the API (value: ``'1.1'``) 
     47API_VERSION = "1.1" 
    4848#: Decorator whichs requires that the user is login 
    4949api_login_required = user_passes_test(lambda u: (u.is_authenticated() 
     
    463463def add_thumbnail(request, doc_id, df_id): 
    464464    """ 
    465     Add a thumbnail the :class:`.DocumentFile` identified by *df_id* from 
     465    Adds a thumbnail to the :class:`.DocumentFile` identified by *df_id* from 
    466466    the :class:`.Document` identified by *doc_id*. 
    467467 
     
    480480    return {} 
    481481 
     482 
     483@login_json 
     484def get_object(request, obj_id): 
     485    """ 
     486    .. versionadded:: 1.3 
     487 
     488    Returns basic fields of the :class:`.PLMObject` identified by *obj_id*. 
     489 
     490    :implements: :func:`http_api.get` 
     491 
     492    :param request: the request 
     493    :param obj_id: id of a :class:`.PLMObject` 
     494    :returned fields: object, a dictionary of object fields 
     495    """ 
     496    obj = get_obj_by_id(obj_id, request.user) 
     497    obj.check_readable() 
     498    return {"object": object_to_dict(obj)} 
     499 
     500 
     501@login_json 
     502def get_attached_parts(request, doc_id): 
     503    """ 
     504    .. versionadded:: 1.3 
     505 
     506    Returns parts attached to the :class:`.Document` identified by *doc_id*. 
     507 
     508    :implements: :func:`http_api.attached_parts` 
     509 
     510    :param request: the request 
     511    :param doc_id: id of a :class:`.Document` 
     512    :returned fields: parts, a list of dictionaries describing attached parts 
     513    """ 
     514 
     515    doc = get_obj_by_id(doc_id, request.user) 
     516    doc.check_readable() 
     517    parts = [] 
     518    for link in doc.get_attached_parts(): 
     519        parts.append(object_to_dict(link.part)) 
     520    return {"parts": parts} 
     521 
     522 
     523@login_json 
     524def get_attached_documents(request, part_id): 
     525    """ 
     526    .. versionadded:: 1.3 
     527 
     528    Returns documents attached to the :class:`.Part` identified by *part_id*. 
     529 
     530    :implements: :func:`http_api.attached_documents` 
     531 
     532    :param request: the request 
     533    :param part_id: id of a :class:`.Part` 
     534    :returned fields: documents, a list of dictionaries describing attached documents 
     535    """ 
     536    part = get_obj_by_id(part_id, request.user) 
     537    part.check_readable() 
     538    docs = [] 
     539    for link in part.get_attached_documents(): 
     540        docs.append(object_to_dict(link.document)) 
     541    return {"documents": docs} 
     542 
  • trunk/openPLM/urls.py

    r2383 r2417  
    210210    (r'search_fields/(?P<typename>[\w_]+)/$', api.get_search_fields), 
    211211    (r'creation_fields/(?P<typename>[\w_]+)/$', api.get_creation_fields), 
     212    (r'get/(?P<obj_id>\d+)/', api.get_object), 
     213    (r'object/(?P<part_id>\d+)/attached_documents/', api.get_attached_documents), 
    212214    ) 
    213215 
     
    227229    (r'checkin/(?P<df_id>\d+)/thumbnail/$', api.check_in, {"thumbnail" : True}), 
    228230    (r'add_thumbnail/(?P<df_id>\d+)/$', api.add_thumbnail), 
     231    (r'attached_parts/$', api.get_attached_parts), 
    229232) 
    230233 
Note: See TracChangeset for help on using the changeset viewer.