def ajax_logs(request, obj_type, obj_ref, obj_revi): """ Ajax Logs page of a SubversionRepository. """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) ctx["error"] = False try: revision = parse_revision(obj.svn_revision) uri = obj.repository_uri if uri.startswith("file://") or uri.startswith("/"): raise ValueError() client = pysvn.Client() if not client.is_url(uri): raise ValueError() logs = client.log(uri, limit=20, revision_start=revision) for log in logs: log["date"] = datetime.datetime.fromtimestamp(log["date"]) log["day"] = get_day(log) ctx["logs"] = logs except (ValueError, pysvn.ClientError): ctx["error"] = True ctx['current_page'] = 'logs' return pviews.r2r('ajax_logs.htm', ctx, request)
def add_children(request, obj_type, obj_ref, obj_revi): """ Manage html page for chidren creation of the selected object. It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) if request.POST: add_child_form = AddChildForm(obj.object, request.POST) if add_child_form.is_valid(): child_obj = get_obj_from_form(add_child_form, request.user) obj.add_child(child_obj, add_child_form.cleaned_data["quantity"], add_child_form.cleaned_data["order"], add_child_form.cleaned_data["unit"], **add_child_form.extensions) return HttpResponseRedirect(obj.plmobject_url + "BOM-child/") else: add_child_form = AddChildForm(obj.object) ctx['current_page'] = 'BOM-child' ctx.update({'link_creation': True, 'add_child_form': add_child_form, 'attach' : (obj, "add_child")}) return r2r('DisplayObjectChildAdd.htm', ctx, request)
def display_files(request, obj_type, obj_ref, obj_revi): """ Files page of a SubversionRepository. """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) ctx['current_page'] = 'files' return pviews.r2r('subversion_files.htm', ctx, request)
def edit_children(request, obj_type, obj_ref, obj_revi): """ Manage html page which edits the chidren of the selected object. Possibility to modify the `.ParentChildLink.order`, the `.ParentChildLink.quantity` and to desactivate the `.ParentChildLink` It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) if not hasattr(obj, "get_children"): # TODO raise TypeError() if request.method == "POST": formset = get_children_formset(obj, request.POST) if formset.is_valid(): obj.update_children(formset) return HttpResponseRedirect("..") else: formset = get_children_formset(obj) extra_columns = [] extra_fields = [] for PCLE in models.get_PCLEs(obj.object): fields = PCLE.get_visible_fields() if fields: extra_columns.extend((f, PCLE._meta.get_field(f).verbose_name) for f in fields) prefix = PCLE._meta.module_name extra_fields.extend('%s_%s' % (prefix, f) for f in fields) ctx.update({'current_page':'BOM-child', 'extra_columns' : extra_columns, 'extra_fields' : extra_fields, 'children_formset': formset, }) return r2r('DisplayObjectChildEdit.htm', ctx, request)
def display_management(request, obj_type, obj_ref, obj_revi): """ Manage html page which displays the Users who manage the selected object (:class:`PLMObjectUserLink`). It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) object_management_list = models.PLMObjectUserLink.objects.filter(plmobject=obj) object_management_list = object_management_list.order_by("role") if not ctx["is_owner"]: link = object_management_list.filter(role="notified", user=request.user) ctx["is_notified"] = bool(link) if link: ctx["remove_notify_link"] = link[0] else: initial = { "type" : "User", "username" : request.user.username } form = SelectUserForm(initial=initial) for field in ("type", "username"): form.fields[field].widget = HiddenInput() ctx["notify_self_form"] = form ctx.update({'current_page':'management', 'object_management': object_management_list}) return r2r('DisplayObjectManagement.htm', ctx, request)
def display_object_parents(request, obj_type, obj_ref, obj_revi): """ Manage html page which displays the parent of the selected object. It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) if not hasattr(obj, "get_parents"): # TODO raise TypeError() date = None level = "first" if request.GET: display_form = DisplayChildrenForm(request.GET) if display_form.is_valid(): date = display_form.cleaned_data["date"] level = display_form.cleaned_data["level"] else: display_form = DisplayChildrenForm(initial={"date" : datetime.datetime.now(), "level" : "first"}) max_level = 1 if level == "first" else -1 parents = obj.get_parents(max_level, date=date) if level == "last" and parents: maximum = max(parents, key=attrgetter("level")).level parents = (c for c in parents if c.level == maximum) ctx.update({'current_page':'parents', 'parents' : parents, 'display_form' : display_form, }) return r2r('DisplayObjectParents.htm', ctx, request)
def replace_management(request, obj_type, obj_ref, obj_revi, link_id): """ Manage html page for the modification of the Users who manage the selected object (:class:`PLMObjectUserLink`). It computes a context dictionnary based on .. include:: views_params.txt :param link_id: :attr:`.PLMObjectUserLink.id` :type link_id: str """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) link = models.PLMObjectUserLink.objects.get(id=int(link_id)) if obj.object.id != link.plmobject.id: raise ValueError("Bad link id") if request.method == "POST": replace_management_form = SelectUserForm(request.POST) if replace_management_form.is_valid(): if replace_management_form.cleaned_data["type"] == "User": user_obj = get_obj_from_form(replace_management_form, request.user) obj.set_role(user_obj.object, link.role) if link.role == 'notified': obj.remove_notified(link.user) return HttpResponseRedirect("../..") else: replace_management_form = SelectUserForm() ctx.update({'current_page':'management', 'replace_management_form': replace_management_form, 'link_creation': True, 'attach' : (obj, "delegate")}) return r2r('DisplayObjectManagementReplace.htm', ctx, request)
def display_object_lifecycle(request, obj_type, obj_ref, obj_revi): """ Manage html page which displays lifecycle of the selected object. It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) if request.method == 'POST': if request.POST["action"] == "DEMOTE": obj.demote() elif request.POST["action"] == "PROMOTE": obj.promote() state = obj.state.name object_lifecycle = [] roles = dict(obj.plmobjectuserlink_plmobject.values_list("role", "user__username")) for i, st in enumerate(obj.lifecycle): signer = roles.get(level_to_sign_str(i)) object_lifecycle.append((st, st == state, signer)) is_signer = obj.check_permission(obj.get_current_sign_level(), False) is_signer_dm = obj.check_permission(obj.get_previous_sign_level(), False) ctx.update({'current_page':'lifecycle', 'object_lifecycle': object_lifecycle, 'is_signer' : is_signer, 'is_signer_dm' : is_signer_dm}) return r2r('DisplayObjectLifecycle.htm', ctx, request)
def change_user_password(request, obj_ref): """ Manage html page for the modification of the selected :class:`~django.contrib.auth.models.User` password. It computes a context dictionnary based on :param request: :class:`django.http.QueryDict` :param obj_ref: :attr:`~django.contrib.auth.models.User.username` :return: a :class:`django.http.HttpResponse` """ if request.user.username=='test': return HttpResponseRedirect("/user/%s/attributes/" % request.user) obj, ctx = get_generic_data(request, "User", obj_ref) if obj.object != request.user: raise PermissionError("You are not the user") if request.method == 'POST' and request.POST: modification_form = PasswordChangeForm(obj, request.POST) if modification_form.is_valid(): obj.set_password(modification_form.cleaned_data['new_password2']) obj.save() return HttpResponseRedirect("/user/%s/" % obj.username) else: modification_form = PasswordChangeForm(obj) ctx.update({'class4div': "ActiveBox4User", 'modification_form': modification_form}) return r2r('DisplayObject4PasswordModification.htm', ctx, request)
def add_management(request, obj_type, obj_ref, obj_revi): """ Manage html page for the addition of a "notification" link (:class:`PLMObjectUserLink`) between some Users and the selected object. It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) if request.method == "POST": add_management_form = SelectUserForm(request.POST) if add_management_form.is_valid(): if add_management_form.cleaned_data["type"] == "User": user_obj = get_obj_from_form(add_management_form, request.user) obj.set_role(user_obj.object, "notified") return HttpResponseRedirect("..") else: add_management_form = SelectUserForm() ctx.update({'current_page':'management', 'replace_management_form': add_management_form, 'link_creation': True, "attach" : (obj, "delegate")}) return r2r('DisplayObjectManagementReplace.htm', ctx, request)
def display_files(request, client, obj_type, obj_ref, obj_revi): """ Files page of a GoogleDocument. """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) if not hasattr(obj, "files"): raise TypeError() try: entry = client.get_resource_by_id(obj.resource_id) edit_uri = "" for link in entry.link: if link.rel == 'alternate': edit_uri = link.href break uri = client._get_download_uri(entry.content.src) ctx.update({ 'resource' : obj.resource_id.split(":", 1)[-1], 'download_uri' : uri, 'edit_uri' : edit_uri, 'error' : False, }) except gdata.client.RequestError: ctx['error'] = True ctx['current_page'] = 'files' return pviews.r2r('gdoc_files.htm', ctx, request)
def logs(request, obj_type, obj_ref, obj_revi): """ Logs page of a SubversionRepository. """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) ctx['current_page'] = 'logs' return pviews.r2r('logs.htm', ctx, request)
def display_object_doc_cad(request, obj_type, obj_ref, obj_revi): """ Manage html page which displays the related documents and CAD of the selected object. It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) if not hasattr(obj, "get_attached_documents"): # TODO raise TypeError() if request.method == "POST": formset = get_doc_cad_formset(obj, request.POST) if formset.is_valid(): obj.update_doc_cad(formset) return HttpResponseRedirect(".") else: formset = get_doc_cad_formset(obj) archive_form = forms.ArchiveForm() ctx.update({'current_page':'doc-cad', 'object_doc_cad': obj.get_attached_documents(), 'archive_form' : archive_form, 'doc_cad_formset': formset}) return r2r('DisplayObjectDocCad.htm', ctx, request)
def display_plmobjects(request, obj_ref): """ View of the *objects* page of a group. """ obj, ctx = get_generic_data(request, "Group", obj_ref) ctx["objects"] = obj.plmobject_group.all().order_by("type", "reference", "revision") ctx['current_page'] = 'groups' return r2r("groups/objects.htm", ctx, request)
def display_groups(request, obj_ref): """ View of the *groups* page of an user. """ obj, ctx = get_generic_data(request, "User", obj_ref) ctx['current_page'] = 'groups' return r2r("users/groups.htm", ctx, request)
def attributes(request, obj_ref, obj_revi): """Custom attributes page """ obj_type = "Bicycle" obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) object_attributes = [] for attr in obj.attributes: item = obj.get_verbose_name(attr) + ":" # <- this is our small modification object_attributes.append((item, getattr(obj, attr))) ctx.update({"current_page": "attributes", "object_attributes": object_attributes}) return r2r("attributes.html", ctx, request)
def attributes(request, obj_ref, obj_revi): """Custom attributes page """ obj_type = "Bicycle" obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) object_attributes = [] for attr in obj.attributes: item = obj.get_verbose_name(attr) + ":" # <- this is our small modification object_attributes.append((item, getattr(obj, attr))) ctx.update({'current_page':'attributes', 'object_attributes': object_attributes}) return r2r('attributes.html', ctx, request)
def group_ask_to_join(request, obj_ref): obj, ctx = get_generic_data(request, "Group", obj_ref) if request.method == "POST": obj.ask_to_join() return HttpResponseRedirect("..") else: form = forms.SelectUserForm() ctx["ask_form"] = "" ctx['current_page'] = 'users' ctx['in_group'] = bool(request.user.groups.filter(id=obj.id)) return r2r("groups/ask_to_join.htm", ctx, request)
def display_object_history(request, obj_type, obj_ref, obj_revi): """ Manage html page which displays the history of the selected object. It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) history = obj.HISTORY.objects.filter(plmobject=obj.object).order_by('-date') ctx.update({'current_page' : 'history', 'object_history' : list(history)}) return r2r('DisplayObjectHistory.htm', ctx, request)
def sponsor(request, obj_ref): obj, ctx = get_generic_data(request, "User", obj_ref) if request.method == "POST": form = forms.SponsorForm(request.POST) if form.is_valid(): new_user = form.save() obj.sponsor(new_user) return HttpResponseRedirect("..") else: form = SponsorForm(initial={"sponsor":obj.id}, sponsor=obj.id) ctx["sponsor_form"] = form ctx['current_page'] = 'delegation' return r2r("users/sponsor.htm", ctx, request)
def display_object_child(request, obj_type, obj_ref, obj_revi): """ Manage html page which displays the chidren of the selected object. It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) if not hasattr(obj, "get_children"): # TODO raise TypeError() date = None level = "first" if request.GET: display_form = DisplayChildrenForm(request.GET) if display_form.is_valid(): date = display_form.cleaned_data["date"] level = display_form.cleaned_data["level"] else: display_form = DisplayChildrenForm(initial={"date" : datetime.datetime.now(), "level" : "first"}) max_level = 1 if level == "first" else -1 children = obj.get_children(max_level, date=date) if level == "last" and children: maximum = max(children, key=attrgetter("level")).level children = (c for c in children if c.level == maximum) children = list(children) extra_columns = [] extension_data = defaultdict(dict) for PCLE in models.get_PCLEs(obj.object): fields = PCLE.get_visible_fields() if fields: extra_columns.extend((f, PCLE._meta.get_field(f).verbose_name) for f in fields) for child in children: link = child.link for field in fields: try: e = PCLE.objects.get(link=link) extension_data[link][field] = getattr(e, field) except PCLE.DoesNotExist: extension_data[link][field] = "" ctx.update({'current_page':'BOM-child', 'children': children, 'extra_columns' : extra_columns, 'extension_data': extension_data, "display_form" : display_form}) return r2r('DisplayObjectChild.htm', ctx, request)
def display_users(request, obj_ref): obj, ctx = get_generic_data(request, "Group", obj_ref) if request.method == "POST": formset = forms.get_user_formset(obj, request.POST) if formset.is_valid(): obj.update_users(formset) return HttpResponseRedirect(".") else: formset = forms.get_user_formset(obj) ctx["user_formset"] = formset ctx["pending_invitations"] = obj.invitation_set.filter( state=models.Invitation.PENDING) ctx['current_page'] = 'users' ctx['in_group'] = bool(request.user.groups.filter(id=obj.id)) return r2r("groups/users.htm", ctx, request)
def refuse_invitation(request, obj_ref, token): token = long(token) obj, ctx = get_generic_data(request, "Group", obj_ref) inv = models.Invitation.objects.get(token=token) if request.method == "POST": form = forms.InvitationForm(request.POST) if form.is_valid() and inv == form.cleaned_data["invitation"]: obj.refuse_invitation(inv) return HttpResponseRedirect("../../../users/") else: form = forms.InvitationForm(initial={"invitation" : inv}) ctx["invitation_form"] = form ctx["invitation"] = inv ctx['current_page'] = 'users' return r2r("groups/refuse_invitation.htm", ctx, request)
def delegate(request, obj_ref, role, sign_level): """ Manage html page for delegations modification of the selected :class:`~django.contrib.auth.models.User`. It computes a context dictionnary based on :param request: :class:`django.http.QueryDict` :param obj_type: :class:`~django.contrib.auth.models.User` :type obj_ref: str :param role: :attr:`.DelegationLink.role` if role is not "sign" :type role: str :param sign_level: used for :attr:`.DelegationLink.role` if role is "sign" :type sign_level: str :return: a :class:`django.http.HttpResponse` """ obj, ctx = get_generic_data(request, "User", obj_ref) if request.method == "POST": delegation_form = SelectUserForm(request.POST) if delegation_form.is_valid(): if delegation_form.cleaned_data["type"] == "User": user_obj = get_obj_from_form(delegation_form, request.user) if role == "notified" or role == "owner": obj.delegate(user_obj.object, role) return HttpResponseRedirect("../..") elif role == "sign": if sign_level == "all": obj.delegate(user_obj.object, "sign*") return HttpResponseRedirect("../../..") elif sign_level.isdigit(): obj.delegate(user_obj.object, level_to_sign_str(int(sign_level)-1)) return HttpResponseRedirect("../../..") else: delegation_form = SelectUserForm() if role == 'sign': if sign_level.isdigit(): role = _("signer level") + " " + str(sign_level) else: role = _("signer all levels") elif role == "notified": role = _("notified") ctx.update({'current_page':'delegation', 'replace_management_form': delegation_form, 'link_creation': True, 'attach' : (obj, "delegate"), 'role': role}) return r2r('DisplayObjectManagementReplace.htm', ctx, request)
def display_object_attributes(request, obj_type, obj_ref, obj_revi): """ Manage html page which displays attributes of the selected object. It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) object_attributes_list = [] for attr in obj.attributes: item = obj.get_verbose_name(attr) object_attributes_list.append((item, getattr(obj, attr))) ctx.update({'current_page' : 'attributes', 'object_attributes': object_attributes_list}) return r2r('DisplayObject.htm', ctx, request)
def display_related_plmobject(request, obj_type, obj_ref, obj_revi): """ Manage html page which displays the related parts and related documents of (:class:`PLMObjectUserLink` with) the selected :class:`~django.contrib.auth.models.User`. It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) if not hasattr(obj, "get_object_user_links"): # TODO raise TypeError() ctx.update({'current_page':'parts-doc-cad', 'object_user_link': obj.get_object_user_links()}) return r2r('DisplayObjectRelPLMObject.htm', ctx, request)
def group_add_user(request, obj_ref): """ View of the *Add user* page of a group. """ obj, ctx = get_generic_data(request, "Group", obj_ref) if request.method == "POST": form = SelectUserForm(request.POST) if form.is_valid(): obj.add_user(User.objects.get(username=form.cleaned_data["username"])) return HttpResponseRedirect("..") else: form = forms.SelectUserForm() ctx["add_user_form"] = form ctx['current_page'] = 'users' return r2r("groups/add_user.htm", ctx, request)
def import_csv_apply(request, target, filename, encoding): obj, ctx = get_generic_data(request) ctx["encoding_error"] = False ctx["io_error"] = False Importer = csvimport.IMPORTERS[target] Formset = forms.get_headers_formset(Importer) try: path = os.path.join(tempfile.gettempdir(), "openplmcsv" + request.user.username + filename) with open(path, "rb") as csv_file: importer = Importer(csv_file, request.user, encoding) preview = importer.get_preview() if request.method == "POST": headers_formset = Formset(request.POST) if headers_formset.is_valid(): headers = headers_formset.headers try: with open(path, "rb") as csv_file: importer = Importer(csv_file, request.user, encoding) importer.import_csv(headers) except csvimport.CSVImportError as exc: ctx["errors"] = exc.errors.iteritems() else: os.remove(path) return HttpResponseRedirect("/import/done/") else: initial = [{"header": header} for header in preview.guessed_headers] headers_formset = Formset(initial=initial) ctx.update({ "preview" : preview, "preview_data" : itertools.izip((f["header"] for f in headers_formset.forms), preview.headers, *preview.rows), "headers_formset" : headers_formset, }) except UnicodeError: ctx["encoding_error"] = True except (IOError, csv.Error): ctx["io_error"] = True ctx["has_critical_error"] = ctx["io_error"] or ctx["encoding_error"] \ or "errors" in ctx ctx["csv_form"] = CSVForm(initial={"encoding" : encoding}) ctx["step"] = 2 ctx["target"] = target return r2r("import/csv.htm", ctx, request)
def modify_object(request, obj_type, obj_ref, obj_revi): """ Manage html page for the modification of the selected object. It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) cls = models.get_all_plmobjects()[obj_type] if request.method == 'POST' and request.POST: modification_form = get_modification_form(cls, request.POST) if modification_form.is_valid(): obj.update_from_form(modification_form) return HttpResponseRedirect(obj.plmobject_url + "attributes/") else: modification_form = get_modification_form(cls, instance=obj.object) ctx['modification_form'] = modification_form return r2r('DisplayObject4modification.htm', ctx, request)
def add_file(request, obj_type, obj_ref, obj_revi): """ Manage html page for the files (:class:`DocumentFile`) addition in the selected object. It computes a context dictionnary based on .. include:: views_params.txt """ obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) if request.method == "POST": add_file_form = AddFileForm(request.POST, request.FILES) if add_file_form.is_valid(): obj.add_file(request.FILES["filename"]) ctx.update({'add_file_form': add_file_form, }) return HttpResponseRedirect(obj.plmobject_url + "files/") else: add_file_form = AddFileForm() ctx.update({ 'add_file_form': add_file_form, }) return r2r('DisplayFileAdd.htm', ctx, request)
def create_gdoc(request, client): """ Creation view of a :class:`.GoogleDocument`. """ obj, ctx = get_generic_data(request) if request.method == 'GET': creation_form = get_gdoc_creation_form(request.user, client) elif request.method == 'POST': creation_form = get_gdoc_creation_form(request.user, client, request.POST) if creation_form.is_valid(): user = request.user ctrl = GoogleDocumentController.create_from_form(creation_form, user) return HttpResponseRedirect(ctrl.plmobject_url) ctx.update({ 'creation_form': creation_form, 'object_type': "GoogleDocument", }) return pviews.r2r('DisplayObject4creation.htm', ctx, request)