コード例 #1
0
def report(request, model_name, id):
    """
    This view serves both the proper form page and the POST requests for
    the report form page.

    It's essentially a clone of new but with a few fixes since the model is
    mucked up with metamadness.
    """
    if model_name not in MODEL_MAP:
        if request.method != "POST":
            return HttpResponse("Unknown model name specified.")
        return json_error({"error": "Requested page type \"{}\" does not "
                                    "have a known model."
                                    .format(model_name)
                           })
    if model_name not in MODEL_FORM_MAP:
        if request.method != "POST":
            return HttpResponse("Unknown model name specified.")
        return json_error({"error": "Requested page type \"{}\" does not "
                                    "have a known form.".format(model_name)
                           })

    if request.method == "POST":
        res = {}
        data = json.loads(request.body.decode())

        target_model = MODEL_MAP[model_name]
        form = MODEL_FORM_MAP["report"]

        inst = target_model.objects.get(id=id)
        if not inst:
            json_error({"error": "Unknown model instance id for provided model"
                                 " ({} for '{}').".format(id, model_name)})

        err = check_fields_in_data(data, Report, form)
        if err:
            return err

        print(data)

        new = Report.create(target_model, id, request.user, data["summary"],
                            data["text"])
        new.save()
        res["id"] = new.id

        messages.success(request, "Added report!")
        return HttpResponse(json.dumps(res),
                            content_type="application/json")
    else:
        inst = MODEL_MAP[model_name].objects.get(id=id)
        template = loader.get_template("new/report.html")
        context = {"instance": inst, "model": model_name, "id": id}

        return HttpResponse(template.render(context))
コード例 #2
0
def new(request, type="new", page=None, id=None):
    if not request.user.is_authenticated():
        if request.method == "POST":
            return json_error({"error": "Please login to add a {}."
                                        .format(page)})
        else:
            redir = request.META.get("HTTP_REFERER")
            if not redir:
                redir = reverse("home")
            messages.error(request,
                           "You must be logged in to add a {}.".format(page))
            return HttpResponseRedirect(redir)

    model = None
    response = {"error": {"error": ""}}

    if request.method != "POST":
        return get_template_for_model(request, MODEL_FORM_MAP, page)

    data = json.loads(request.body.decode())

    if page not in MODEL_MAP:
        return json_error({"error": "Requested page type \"{}\" does not have"
                                    " a known model.".format(page)})
    if page not in MODEL_FORM_MAP.keys():
        return json_error({"error": "Requested page type \"{}\" does not have"
                                    " a known form.".format(page)})

    model = MODEL_MAP[page]
    form = MODEL_FORM_MAP[page]

    # If model has an owner or created by field, add us
    if form.needs_owner:
        data["owner"] = request.user
    elif form.needs_created_by:
        data["created_by"] = request.user

    # FIXME: Is this necessary? It seems like it should autoresolve this
    if page == "reviewcomment":
        data["target"] = Review.objects.get(id=int(data["target"]))

    res = check_fields_in_data(data, model, form)
    if res:
        return res

    # Look for any errors
    for k, v in response["error"].items():
        if len(v) > 0:
            return HttpResponse(json.dumps(response))
    try:
        emptyKeys = []
        for key, value in data.items():
            if value == '':
                emptyKeys.append(key)
        for key in emptyKeys:
            data.pop(key)

        print(data)
        if type == "new":
            # Try to create it
            new = model(**data)
        elif type == "edit":
            # We can assume it exists
            new = model.objects.get(id=id)
            for k, v in data.items():
                setattr(new, k, data[k])
            if hasattr(new, "updated_ts"):
                new.updated_ts = datetime.datetime.now()

        new.full_clean()
    except ValidationError as e:
        print("ERROR: " + str(e))
        errorDict = {}
        for key, value in e.message_dict.items():
            if isinstance(value, list):
                errorDict[key] = " ".join(value).strip("[]/'")

        return HttpResponse(json_error(errorDict))

    for field in MODEL_FORM_MAP[page].Meta.fields:
        response["error"][field] = ""  # clear errors

    new.save()
    response["id"] = new.id  # return new id at top level.
    # Save and return all info

    return HttpResponse(json.dumps(response))