Esempio n. 1
0
def edit_installer(request, slug):
    """Display an edit form for install scripts

    Args:
        request: Django request object
        slug (str): installer slug

    Returns:
        Django response
    """

    installer = get_object_or_404(Installer, slug=slug)

    # Handle installer deletion in a separate view
    if 'delete' in request.POST:
        return redirect(
            reverse('delete_installer', kwargs={'slug': installer.slug}))

    # Extract optional revision ID from parameters
    revision_id = request.GET.get('revision')
    try:
        revision_id = int(revision_id)
    except (ValueError, TypeError):
        revision_id = None

    draft_data = None
    versions = Version.objects.get_for_object(installer)
    for version in versions:
        if revision_id:
            # Display the revision given in the GET parameters
            if version.id == revision_id:
                draft_data = version.field_dict
                break
        else:
            # Display the latest revision created by the current logged in user
            if (version.revision.user == request.user
                    and version.revision.date_created > installer.updated_at):
                draft_data = version.field_dict
                revision_id = version.id
                break

    if draft_data:
        messages.info(
            request, "You are viewing a draft of the installer which does not "
            "reflect the currently available installer. Changes will be "
            "published once it goes through moderation.")
        if 'runner_id' in draft_data:
            draft_data['runner'] = draft_data['runner_id']

    form = InstallerEditForm(request.POST or None,
                             instance=installer,
                             initial=draft_data)
    if request.method == 'POST' and form.is_valid():
        # Force the creation of a revision instead of creating a new installer
        with reversion.create_revision():
            installer = form.save(commit=False)
            reversion.set_user(request.user)
            reversion.set_comment("[{}] {} by {} on {}".format(
                'draft' if installer.draft else 'submission', slug,
                request.user.username, timezone.now()))
            reversion.add_to_revision(installer)
        return redirect("installer_complete", slug=installer.game.slug)
    return render(
        request, 'installers/form.html', {
            'form': form,
            'game': installer.game,
            'new': False,
            'installer': installer,
            'versions': versions,
            'revision_id': revision_id
        })
Esempio n. 2
0
def edit_installer(request, slug):
    """Display an edit form for install scripts

    Args:
        request: Django request object
        slug (str): installer slug

    Returns:
        Django response
    """

    installer = get_object_or_404(Installer, slug=slug)

    # Handle installer deletion in a separate view
    if "delete" in request.POST:
        return redirect(
            reverse("delete_installer", kwargs={"slug": installer.slug}))
    # Extract optional revision ID from parameters
    revision_id = request.GET.get("revision")
    try:
        revision_id = int(revision_id)
    except (ValueError, TypeError):
        revision_id = None

    draft_data = None
    versions = Version.objects.get_for_object(installer)

    # Reset reason when the installer is edited.
    installer.reason = ""

    for version in versions:
        if revision_id:
            # Display the revision given in the GET parameters
            if version.revision.id == revision_id:
                draft_data = version.field_dict
                break
        else:
            # Display the latest revision created by the current logged in user
            if (version.revision.user == request.user or request.user.is_staff
                ) and version.revision.date_created > installer.updated_at:
                draft_data = version.field_dict
                revision_id = version.revision.id
                break
    if draft_data:
        draft_data["reason"] = ""
        if "runner_id" in draft_data:
            draft_data["runner"] = draft_data["runner_id"]

    form = InstallerEditForm(request.POST or None,
                             instance=installer,
                             initial=draft_data)
    if request.method == "POST" and form.is_valid():
        # Force the creation of a revision instead of creating a new installer
        with reversion.create_revision():
            installer = form.save(commit=False)
            reversion.set_user(request.user)
            reversion.set_comment("[{}] {} by {} on {}".format(
                "draft" if installer.draft else "submission",
                slug,
                request.user.username,
                timezone.now(),
            ))
            reversion.add_to_revision(installer)

        if "save" in request.POST:
            messages.info(request, "Draft saved")
            return redirect("edit_installer", slug=installer.slug)
        messages.info(request, "Submission sent to moderation")
        return redirect("installer_complete", slug=installer.game.slug)

    if draft_data:
        messages.info(
            request,
            "You are viewing a draft of the installer which does not "
            "reflect the currently available installer. Changes will be "
            "published once it goes through moderation.",
        )
    return render(
        request, "installers/form.html", {
            "form": form,
            "game": installer.game,
            "new": False,
            "installer": installer,
            "versions": versions,
            "revision_id": revision_id,
        })
Esempio n. 3
0
def edit_installer(request, slug):
    """Display an edit form for install scripts

    Args:
        request: Django request object
        slug (str): installer slug

    Returns:
        Django response
    """

    installer = get_object_or_404(Installer, slug=slug)

    # Handle installer deletion in a separate view
    if "delete" in request.POST:
        return redirect(reverse("delete_installer", kwargs={"slug": installer.slug}))
    # Extract optional revision ID from parameters
    revision_id = request.GET.get("revision")
    try:
        revision_id = int(revision_id)
    except (ValueError, TypeError):
        revision_id = None

    draft_data = None
    versions = Version.objects.get_for_object(installer)

    # Reset reason when the installer is edited.
    installer.reason = ""

    for version in versions:
        if revision_id:
            # Display the revision given in the GET parameters
            if version.revision.id == revision_id:
                draft_data = version.field_dict
                break
        else:
            # Display the latest revision created by the current logged in user
            if (
                    version.revision.user == request.user or request.user.is_staff
            ) and version.revision.date_created > installer.updated_at:
                draft_data = version.field_dict
                revision_id = version.revision.id
                break
    if draft_data:
        draft_data["reason"] = ""
        if "runner_id" in draft_data:
            draft_data["runner"] = draft_data["runner_id"]

    form = InstallerEditForm(
        request.POST or None, instance=installer, initial=draft_data
    )
    if request.method == "POST" and form.is_valid():
        # Force the creation of a revision instead of creating a new installer
        with reversion.create_revision():
            installer = form.save(commit=False)
            reversion.set_user(request.user)
            reversion.set_comment(
                "[{}] {} by {} on {}".format(
                    "draft" if installer.draft else "submission",
                    slug,
                    request.user.username,
                    timezone.now(),
                )
            )
            reversion.add_to_revision(installer)

        if "save" in request.POST:
            messages.info(request, "Draft saved")
            return redirect("edit_installer", slug=installer.slug)
        messages.info(request, "Submission sent to moderation")
        return redirect("installer_complete", slug=installer.game.slug)

    if draft_data:
        messages.info(
            request,
            "You are viewing a draft of the installer which does not "
            "reflect the currently available installer. Changes will be "
            "published once it goes through moderation.",
        )
    return render(
        request,
        "installers/form.html",
        {
            "form": form,
            "game": installer.game,
            "new": False,
            "installer": installer,
            "versions": versions,
            "revision_id": revision_id,
        }
    )