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
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'}
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"}
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'}
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)}
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) }
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)}
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}
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}
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()}
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()}
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"}