コード例 #1
0
ファイル: file.py プロジェクト: k1000/django-stratus
def new(request, repo_name, branch=REPO_BRANCH, path=None):
    file_source = ""
    msgs = []

    file_path = path  #!!! FIX security
    # TODO check if file exist allready
    file_meta = dict(type="python")

    if request.method == "POST":
        form = TextFileEditForm(request.POST, request.FILES)
        if form.is_valid():
            repo = get_repo(repo_name)

            file_source = form.cleaned_data["file_source"]
            file_writen = write_file(file_path, file_source)

            if file_writen:
                msg = form.cleaned_data["message"]
                signals.file_created.send(sender=repo, file_path=file_path, url="")
                result_msg = mk_commit(repo, msg, file_path)
                msgs.append(result_msg)
            else:
                msgs.append("Error. file has been created")

        else:
            msgs.append(form.errors)

    else:
        form = TextFileEditForm(initial={"message": "%s added" % path})

    context = dict(
        STRATUS_MEDIA_URL=STRATUS_MEDIA_URL,
        form=form,
        breadcrumbs=make_crumbs(path),
        msg=msgs,
        file_meta=file_meta,
        repo_name=repo_name,
        branch_name=branch,
        repo=repo,
        path=path,
    )
    return mix_response(request, "stratus/new_file.html", context)
コード例 #2
0
ファイル: file.py プロジェクト: k1000/django-stratus
def edit(request, repo_name, branch=REPO_BRANCH, path=None):

    file_source = ""
    msgs = []
    json_convert = None

    if path in FILE_BLACK_LIST:
        msg = MSG_NOT_ALLOWED
        return error_view(request, result_msg)

    if path[-1:] == "/":
        path = path[:-1]
    file_path = path  #!!! FIX security

    repo = get_repo(repo_name)
    tree = repo.tree()

    # edit only if exist in tree
    try:
        tree = tree[path]
    except KeyError:
        msg.append(MSG_NO_FILE_IN_TREE)
        return error_view(request, msg)

    # edit only if it is file
    if not tree.type is "blob":
        msgs.append(MSG_CANT_VIEW)
        return error_view(request, msg)

    mime = tree.mime_type.split("/")
    file_meta = dict(
        STRATUS_MEDIA_URL=STRATUS_MEDIA_URL,
        abspath=tree.abspath,
        repo=repo,
        mime=tree.mime_type,
        size=tree.size,
        tree=tree,
        mime_type=mime[0],
        type=file_type_from_mime(tree.mime_type),
    )

    if file_meta["mime_type"] in EDITABLE_MIME_TYPES:
        form_class = TextFileEditForm
    else:
        form_class = FileEditForm

    signals.file_edit_start.send(sender=repo, file_path=file_path, url="")

    if request.method == "POST":
        form = form_class(request.POST, request.FILES)
        if form.is_valid():
            file_abs_path = os.path.join(repo.working_dir, file_path)
            if file_meta["mime_type"] == "text" or mime[1] in ["xml"]:
                file_source = form.cleaned_data["file_source"]
                file_writen = write_file(file_abs_path, file_source)
            else:
                file_writen = handle_uploaded_file(file_abs_path, request.FILES["file_source"])

            if file_writen:
                msgs.append("File has been saved")
                message = form.cleaned_data["message"]
                ammend = form.cleaned_data.get("ammend", None)
                msg = mk_commit(repo, message, file_path, ammend)
                msgs.append(msg)
            else:
                msgs.append(MSG_CANT_SAVE_FILE)
        else:
            msgs.append(form.errors)

        if request.is_ajax():
            json_convert = message_convert
    else:
        if file_meta["mime_type"] in EDITABLE_MIME_TYPES:
            file_source = tree.data_stream[3].read
        else:
            file_source = file_meta["abspath"]

        form = form_class(initial={"file_source": file_source, "message": "modified %s" % path})

    context = dict(
        STRATUS_MEDIA_URL=STRATUS_MEDIA_URL,
        form=form,
        file_source=file_source,
        breadcrumbs=make_crumbs(path),
        file_meta=file_meta,
        msg=msgs,
        repo_name=repo_name,
        branch_name=branch,
        repo=repo,
        delete_form=FileDeleteForm(initial={"message": MSG_DELETE_SUCCESS % path}),
        path=path,
        name=path.split("/")[-1:][0],
    )

    if mime[0] == "image":
        import base64

        context["img_base"] = base64.b64encode(file_source)
        from getimageinfo import getImageInfo

        context["img_meta"] = getImageInfo(file_source)

    return mix_response(request, "stratus/edit.html", context, json_convert)