コード例 #1
0
 def _get_component(self, doc, part):
     Document3DController(doc, self.user).check_readable()
     component = {}
     component["document"] = doc.id
     draft = doc.is_draft
     if doc.id not in self._documents:
         d = self._documents[doc.id] = object_to_dict(doc)
         files = d["files"] = []
         for df in doc.files:
             checkout = draft and (not df.locked) and df.checkout_valid
             files.append({
                 "id": df.id,
                 "filename": df.filename,
                 "size": df.size,
                 "locked": df.locked,
                 "locker": getattr(df.locker, "username", None),
                 "checkout": checkout,
                 "ctime": df.ctime,
             })
     if part is not None:
         component["part"] = part.id
         if part.id not in self._parts:
             self._parts[part.id] = object_to_dict(part)
     else:
         component["part"] = None
     component["children"] = []
     return component
コード例 #2
0
ファイル: api.py プロジェクト: amarh/openPLM
def revise(request, doc_id):
    """
    Makes a new revision of the :class:`.Document` identified by *doc_id*.

    :implements: :func:`http_api.revise`

    :param request: the request
    :param doc_id: id of a :class:`.Document`
    :returned fields:
        * doc, the new document (see :ref:`http-api-object`)
        * files, a list of files (see :ref:`http-api-file`)
    """

    doc = get_obj_by_id(doc_id, request.user)
    form = forms.AddRevisionForm(doc, request.user, request.POST)
    if form.is_valid():
        rev = doc.revise(form.cleaned_data["revision"], group=form.cleaned_data["group"])
        ret = {"doc" : object_to_dict(rev)}
        files = []
        for df in rev.files:
            files.append(dict(id=df.id, filename=df.filename, size=df.size))
        ret["files"] = files
        return ret
    else:
        return {"result" : 'error'}
コード例 #3
0
ファイル: api.py プロジェクト: amarh/openPLM
def search(request, editable_only="true", with_file_only="true"):
    """
    Returns all objects matching a query.

    :param editable_only: if ``"true"`` (the default), returns only editable objects
    :param with_file_only: if ``"true"`` (the default), returns only documents with
                           at least one file

    :implements: :func:`http_api.search`
    """
    if request.GET and "type" in request.GET:
        form = forms.SimpleSearchForm(request.GET)
        if form.is_valid():
            # object may have been deleted but not yet unindexed
            results = [r.object for r in form.search().load_all()[:30] if r is not None]
            objects = []
            ids = set()
            for res in results:
                if isinstance(res, models.DocumentFile):
                    res = res.document.get_leaf_object()
                if res.id in ids: # avoiding duplicated results
                    continue
                if editable_only == "false" or res.is_editable:
                    if with_file_only == "true" and hasattr(res, "files") \
                       and not bool(res.files):
                        continue
                    if editable_only == "true":
                        obj = DocumentController(res, request.user)
                        if not obj.check_in_group(request.user, False):
                            continue
                    ids.add(res.id)
                    objects.append(object_to_dict(res))
            return {"objects" : objects}
    return {"result": "error"}
コード例 #4
0
ファイル: api.py プロジェクト: pcon-world/pcon_db
def revise(request, doc_id):
    """
    Makes a new revision of the :class:`.Document` identified by *doc_id*.

    :implements: :func:`http_api.revise`

    :param request: the request
    :param doc_id: id of a :class:`.Document`
    :returned fields:
        * doc, the new document (see :ref:`http-api-object`)
        * files, a list of files (see :ref:`http-api-file`)
    """

    doc = get_obj_by_id(doc_id, request.user)
    form = forms.AddRevisionForm(doc, request.user, request.POST)
    if form.is_valid():
        rev = doc.revise(form.cleaned_data["revision"],
                         group=form.cleaned_data["group"])
        ret = {"doc": object_to_dict(rev)}
        files = []
        for df in rev.files:
            files.append(dict(id=df.id, filename=df.filename, size=df.size))
        ret["files"] = files
        return ret
    else:
        return {"result": 'error'}
コード例 #5
0
ファイル: api.py プロジェクト: amarh/openPLM
def get_object(request, obj_id):
    """
    .. versionadded:: 2.0

    Returns basic fields of the :class:`.PLMObject` identified by *obj_id*.

    :implements: :func:`http_api.get`

    :param request: the request
    :param obj_id: id of a :class:`.PLMObject`
    :returned fields: object, a dictionary of object fields
    """
    obj = get_obj_by_id(obj_id, request.user)
    obj.check_readable()
    return {"object": object_to_dict(obj)}
コード例 #6
0
ファイル: api.py プロジェクト: pcon-world/pcon_db
def prepare_multi_check_out(request, doc_id):

    root_document = models3D.Document3D.objects.get(id=doc_id)
    controller = models3D.Document3DController(root_document, request.user)
    controller.check_readable()
    controller.check_edit_files()
    dict_args = dict(json.loads(request.POST["args"]))
    type_check_out = dict_args["type_check_out"]
    documents = dict_args["documents"]

    if type_check_out == "stp":
        lock_docfiles(documents, request.user, type_check_out)
        #to avoid weird concurrency events verify all documents were locked by the user
        STP_file = root_document.files.get(models3D.is_stp)
        return {
            "id": STP_file.id,
            "filename": STP_file.filename,
            "object": object_to_dict(controller)
        }

    elif type_check_out == "catia":
        objects = lock_docfiles(documents, request.user, type_check_out)
        roots = possibles_root_catia(root_document)
        return {
            "objects": objects,
            "roots": roots,
            "object": object_to_dict(controller)
        }
    else:
        objects = lock_docfiles(documents, request.user, type_check_out)
        roots = objects
        return {
            "objects": objects,
            "roots": roots,
            "object": object_to_dict(controller)
        }
コード例 #7
0
ファイル: api.py プロジェクト: pcon-world/pcon_db
def get_object(request, obj_id):
    """
    .. versionadded:: 2.0

    Returns basic fields of the :class:`.PLMObject` identified by *obj_id*.

    :implements: :func:`http_api.get`

    :param request: the request
    :param obj_id: id of a :class:`.PLMObject`
    :returned fields: object, a dictionary of object fields
    """
    obj = get_obj_by_id(obj_id, request.user)
    obj.check_readable()
    return {"object": object_to_dict(obj)}
コード例 #8
0
ファイル: api.py プロジェクト: amarh/openPLM
def prepare_multi_check_out(request,doc_id):

    root_document = models3D.Document3D.objects.get(id=doc_id)
    controller=models3D.Document3DController(root_document,request.user)
    controller.check_readable()
    controller.check_edit_files()
    dict_args= dict(json.loads(request.POST["args"]))
    type_check_out =dict_args["type_check_out"]
    documents=dict_args["documents"]

    if type_check_out == "stp":
        lock_docfiles(documents,request.user,type_check_out)
        #to avoid weird concurrency events verify all documents were locked by the user
        STP_file=root_document.files.get(models3D.is_stp)
        return {"id" : STP_file.id , "filename" : STP_file.filename , "object" : object_to_dict(controller)}

    elif type_check_out == "catia":
        objects=lock_docfiles(documents,request.user,type_check_out)
        roots=possibles_root_catia(root_document)
        return {"objects" : objects, "roots" : roots ,  "object" : object_to_dict(controller)}
    else:
        objects=lock_docfiles(documents, request.user,type_check_out)
        roots = objects
        return {"objects" : objects, "roots" : roots ,  "object" : object_to_dict(controller)}
コード例 #9
0
ファイル: api.py プロジェクト: amarh/openPLM
def get_attached_documents(request, part_id):
    """
    .. versionadded:: 2.0

    Returns documents attached to the :class:`.Part` identified by *part_id*.

    :implements: :func:`http_api.attached_documents`

    :param request: the request
    :param part_id: id of a :class:`.Part`
    :returned fields: documents, a list of dictionaries describing attached documents
    """
    part = get_obj_by_id(part_id, request.user)
    part.check_readable()
    docs = []
    for link in part.get_attached_documents():
        docs.append(object_to_dict(link.document))
    return {"documents": docs}
コード例 #10
0
ファイル: api.py プロジェクト: pcon-world/pcon_db
def get_attached_documents(request, part_id):
    """
    .. versionadded:: 2.0

    Returns documents attached to the :class:`.Part` identified by *part_id*.

    :implements: :func:`http_api.attached_documents`

    :param request: the request
    :param part_id: id of a :class:`.Part`
    :returned fields: documents, a list of dictionaries describing attached documents
    """
    part = get_obj_by_id(part_id, request.user)
    part.check_readable()
    docs = []
    for link in part.get_attached_documents():
        docs.append(object_to_dict(link.document))
    return {"documents": docs}
コード例 #11
0
ファイル: api.py プロジェクト: amarh/openPLM
def get_attached_parts(request, doc_id):
    """
    .. versionadded:: 2.0

    Returns parts attached to the :class:`.Document` identified by *doc_id*.

    :implements: :func:`http_api.attached_parts`

    :param request: the request
    :param doc_id: id of a :class:`.Document`
    :returned fields: parts, a list of dictionaries describing attached parts
    """

    doc = get_obj_by_id(doc_id, request.user)
    doc.check_readable()
    parts = []
    for link in doc.get_attached_parts():
        parts.append(object_to_dict(link.part))
    return {"parts": parts}
コード例 #12
0
ファイル: api.py プロジェクト: amarh/openPLM
def create(request):
    """
    Creates a :class:`.PLMObject` and returns it

    :implements: :func:`http_api.create`
    """
    try:
        type_name = request.POST["type"]
        cls = models.get_all_plmobjects()[type_name]
    except KeyError:
        return {"result" : "error", 'error' : 'bad type'}
    form = forms.get_creation_form(request.user, cls, request.POST)
    if form.is_valid():
        controller_cls = get_controller(type_name)
        controller = controller_cls.create_from_form(form, request.user)
        ret = {"object" : object_to_dict(controller)}
        return ret
    else:
        return {"result" : "error", "error" : form.errors.as_text()}
コード例 #13
0
ファイル: api.py プロジェクト: pcon-world/pcon_db
def get_attached_parts(request, doc_id):
    """
    .. versionadded:: 2.0

    Returns parts attached to the :class:`.Document` identified by *doc_id*.

    :implements: :func:`http_api.attached_parts`

    :param request: the request
    :param doc_id: id of a :class:`.Document`
    :returned fields: parts, a list of dictionaries describing attached parts
    """

    doc = get_obj_by_id(doc_id, request.user)
    doc.check_readable()
    parts = []
    for link in doc.get_attached_parts():
        parts.append(object_to_dict(link.part))
    return {"parts": parts}
コード例 #14
0
ファイル: api.py プロジェクト: pcon-world/pcon_db
def create(request):
    """
    Creates a :class:`.PLMObject` and returns it

    :implements: :func:`http_api.create`
    """
    try:
        type_name = request.POST["type"]
        cls = models.get_all_plmobjects()[type_name]
    except KeyError:
        return {"result": "error", 'error': 'bad type'}
    form = forms.get_creation_form(request.user, cls, request.POST)
    if form.is_valid():
        controller_cls = get_controller(type_name)
        controller = controller_cls.create_from_form(form, request.user)
        ret = {"object": object_to_dict(controller)}
        return ret
    else:
        return {"result": "error", "error": form.errors.as_text()}
コード例 #15
0
ファイル: api.py プロジェクト: pcon-world/pcon_db
def search(request, editable_only="true", with_file_only="true"):
    """
    Returns all objects matching a query.

    :param editable_only: if ``"true"`` (the default), returns only editable objects
    :param with_file_only: if ``"true"`` (the default), returns only documents with
                           at least one file

    :implements: :func:`http_api.search`
    """
    if request.GET and "type" in request.GET:
        form = forms.SimpleSearchForm(request.GET)
        if form.is_valid():
            # object may have been deleted but not yet unindexed
            results = [
                r.object for r in form.search().load_all()[:30]
                if r is not None
            ]
            objects = []
            ids = set()
            for res in results:
                if isinstance(res, models.DocumentFile):
                    res = res.document.get_leaf_object()
                if res.id in ids:  # avoiding duplicated results
                    continue
                if editable_only == "false" or res.is_editable:
                    if with_file_only == "true" and hasattr(res, "files") \
                       and not bool(res.files):
                        continue
                    if editable_only == "true":
                        obj = DocumentController(res, request.user)
                        if not obj.check_in_group(request.user, False):
                            continue
                    ids.add(res.id)
                    objects.append(object_to_dict(res))
            return {"objects": objects}
    return {"result": "error"}