def reject_document(request, name, path=None): document = get_document(name=name, path=path) if document.current_edit_meta is None: raise PermissionDenied() notifications_factory.notification_document( request.user, document, strings.NOTIFICATION_DOCUMENT_REJECTED ) edit_meta = document.current_edit_meta edit_meta.end_datetime = timezone.now() edit_meta.status = DocumentEditMeta.Status.REJECTED edit_meta.closed_by = request.user edit_meta.save() document.accepted_edit_meta = document.current_edit_meta document.current_edit_meta = None document.data = edit_meta.previous_document_data document.status = Document.Status.OPEN document.save() activity_factory.for_document( request.user, document, strings.i18n_format( strings.ACTIVITY_REVERT_DOCUMENT, datetime=edit_meta.previous_document_data.datetime ), document_data=edit_meta.previous_document_data ) return Response({}, status=status.HTTP_200_OK)
def toggle_follow(request, name, path=None): document = get_document(name=name, path=path) if request.user in document.followers.all(): document.followers.remove(request.user) else: document.followers.add(request.user) return Response({}, status=status.HTTP_200_OK)
def write_remark(request, name, path=None): document = get_document(name=name, path=path) reject_remark_id = request.GET.get("reject_remark_id") remark_to_reject = None if reject_remark_id is not None: reject_remark_id = get_request_int_or_404(request, "GET", "reject_remark_id") remark_to_reject = get_object_or_404(Remark, id=reject_remark_id) if remark_to_reject.is_rejected: raise PermissionDenied() if document.current_edit_meta is None: raise PermissionDenied() form = RemarkForm(request.POST) context = browser_base_context(request) context.update({ "form_title": _("Write remark"), "form": form, "submit_title": _("Submit"), "validator_url": reverse("documents:validator-write-remark"), }) if request.method == "POST" and form.is_valid(): remark = form.save(commit=False) remark.edit_meta = document.current_edit_meta remark.user = request.user remark.save() # Reject remark if remark_to_reject is not None: remark_to_reject.status = Remark.Status.REJECTED remark_to_reject.save() notifications_factory.notification_remark( request.user, document, remark_to_reject, strings.NOTIFICATION_REMARK_REJECTED ) notifications_factory.notification_remark( request.user, document, remark, strings.NOTIFICATION_REMARK_WROTE ) messages.success(request, _("Successfully submitted remark")) return redirect(document.permalink) return TemplateResponse(template="forms/form.html", request=request, context=context)
def upload_new_version(request, name, path=None): document = get_document(name=name, path=path) if document.current_edit_meta is None: raise PermissionDenied() if request.method == "POST": # No instance because need new version of document and save old version form = UploadNewVersionForm(request.POST, request.FILES) else: form = UploadNewVersionForm( instance=document.data, initial={"name": name, "parent": document.parent} ) context = browser_base_context(request) context.update({ "form_title": _("Upload new version"), "form": form, "submit_title": _("Upload"), "validator_url": reverse("documents:validator-upload-new-version"), }) if request.method == "POST" and form.is_valid(): data = form.save(commit=False) data.document = document data.save() document.data = data activity_factory.for_document( request.user, document, form.cleaned_data["message"], document_data=data ) # if document.name != form.cleaned_data["name"]: # document.name = form.cleaned_data["name"] # activity_factory.for_document( # request.user, # document, # strings.i18n_format( # strings.ACTIVITY_RENAME_DOCUMENT, # old_name=document.name, # new_name=form.cleaned_data["name"] # ) # ) document.save() messages.success(request, _("Successfully uploaded")) return redirect(document.permalink) return TemplateResponse(template="forms/form.html", request=request, context=context)
def take_for_revision(request, name, path=None): document = get_document(name=name, path=path) if document.is_under_edition: raise ValidationError(_("Already under edition")) # Attach editor to document edit_meta = DocumentEditMeta.objects.create( editor=request.user, document=document, previous_document_data=document.data ) document.current_edit_meta = edit_meta document.status = Document.Status.IN_PROGRESS document.save() messages.success(request._request, _("Successfully took")) return Response({}, status=status.HTTP_200_OK)
def rename_document(request, name, path=None): document = get_document(name=name, path=path) old_name = document.name if request.method == "POST": form = RenameDocumentForm(request.POST, instance=document) else: form = RenameDocumentForm(instance=document) context = browser_base_context(request) context.update({ "form_title": _("Rename document"), "form": form, "submit_title": _("Rename"), "validator_url": reverse("documents:validator-rename-document"), }) if request.method == "POST" and form.is_valid(): redirect_next = request.GET.get("next", "single") if old_name != document.name: activity_factory.for_document( request.user, document, strings.i18n_format( strings.ACTIVITY_RENAME_DOCUMENT, old_name=old_name, new_name=document.name ) ) form.save() messages.success(request, _("Successfully renamed")) if redirect_next == "list": return redirect(document.parent.permalink) else: return redirect(document.permalink) return TemplateResponse(template="forms/form.html", request=request, context=context)
def mark_as_finished_remark(request, name, path=None): document = get_document(name=name, path=path) if document.current_edit_meta is None: raise PermissionDenied() remark_id = get_request_int_or_404(request, "data", "remark_id") remark = get_object_or_404(Remark, id=remark_id) remark.status = Remark.Status.FINISHED remark.save() # Send notification notifications_factory.notification_remark( request.user, document, remark, strings.NOTIFICATION_REMARK_FINISHED, to_followers=True ) return Response({}, status=status.HTTP_200_OK)
def revert_document(request, name, path=None): document = get_document(name=name, path=path) activity_id = get_request_int_or_404(request, "data", "activity_id") activity = get_object_or_404(Activity, id=activity_id) if activity.document_data is None: raise ValidationError(_("Activity does not provide data")) if document.data.id == activity.document_data.id: raise ValidationError(_("Already this version")) document.data = activity.document_data document.save() activity_factory.for_document( request.user, document, strings.i18n_format(strings.ACTIVITY_REVERT_DOCUMENT, datetime=activity.datetime), document_data=activity.document_data ) return Response({}, status=status.HTTP_200_OK)
def update_document_status(request, name, path=None): document = get_document(name=name, path=path) if request.method == "POST": form = UpdateStatusForm(request.POST, instance=document) else: form = UpdateStatusForm(instance=document) context = browser_base_context(request) context.update({ "form_title": _("Update document status"), "form": form, "submit_title": _("Update"), "validator_url": reverse("documents:validator-update-document-status"), }) if request.method == "POST" and form.is_valid(): form.save() messages.success(request, _("Successfully updated")) return redirect(document.permalink) return TemplateResponse(template="forms/form.html", request=request, context=context)
def accept_remark(request, name, path=None): document = get_document(name=name, path=path) if document.current_edit_meta is None: raise PermissionDenied() remark_id = get_request_int_or_404(request, "data", "remark_id") remark = get_object_or_404(Remark, id=remark_id) if remark.is_accepted: raise ValidationError({"details": _("Already accepted")}) remark.status = Remark.Status.ACCEPTED remark.save() # Send notification notifications_factory.notification_remark( request.user, document, remark, strings.NOTIFICATION_REMARK_ACCEPTED ) return Response({}, status=status.HTTP_200_OK)
def accept_document(request, name, path=None): document = get_document(name=name, path=path) if document.current_edit_meta is None: raise PermissionDenied() notifications_factory.notification_document( request.user, document, strings.NOTIFICATION_DOCUMENT_ACCEPTED ) edit_meta = document.current_edit_meta edit_meta.end_datetime = timezone.now() edit_meta.status = DocumentEditMeta.Status.ACCEPTED edit_meta.closed_by = request.user edit_meta.save() document.accepted_edit_meta = document.current_edit_meta document.current_edit_meta = None document.status = Document.Status.FINAL document.save() return Response({}, status=status.HTTP_200_OK)
def get_for_instance(self, **kwargs): return get_document(**kwargs)