示例#1
0
def roadmap_id(request, roadmap_id):
    if request.method == "GET":
        if not request.user.is_authenticated:
            return HttpResponse(status=401)
        try:
            roadmap = Roadmap.objects.get(id=roadmap_id)
        except ObjectDoesNotExist:
            return HttpResponseNotFound()

        roadmap_dict = roadmap.to_dict()
        return JsonResponse(roadmap_dict)

    elif request.method == "PUT":
        if not request.user.is_authenticated:
            return HttpResponse(status=401)
        try:
            roadmap = Roadmap.objects.get(id=roadmap_id)
        except ObjectDoesNotExist:
            return HttpResponseNotFound()
        if not roadmap.author_id == request.user.id:
            return HttpResponseForbidden()
        try:
            req_data = json.loads(request.body.decode())
            new_private = req_data["private"]
            new_image_id = req_data["imageId"]
            new_title = req_data["title"]
            new_level = req_data["level"]
            new_description = req_data["description"]
            section_list = req_data["sections"]
            added_tag_list = req_data["addedTagList"]
            deleted_tag_list = req_data["deletedTagList"]

        except (KeyError, JSONDecodeError):
            return HttpResponseBadRequest()

        # Edit
        roadmap.delete_sections()
        roadmap.private = new_private
        roadmap.image_id = new_image_id
        roadmap.title = new_title
        roadmap.level = new_level
        roadmap.description = new_description
        for section in section_list:
            new_section = Section(title=section["section_title"],
                                  roadmap=roadmap)
            new_section.save()

            task_list = section["tasks"]
            for task in task_list:
                Task(
                    title=task["task_title"],
                    url=task["task_url"],
                    type=task["task_type"],
                    description=task["task_description"],
                    roadmap=roadmap,
                    section=new_section,
                ).save()

        # Set default value or non-changing
        roadmap.date = datetime.now()
        roadmap.progress = 1

        roadmap.save()

        # Delete tags in roadmap
        for tag in deleted_tag_list:
            tag_query = roadmap.tags.filter(tag_name__iexact=tag)
            if tag_query.exists():
                target_tag = tag_query.first()
                target_tag.decrement_count_roadmap()
                target_tag.save()
                roadmap.tags.remove(target_tag)

        # Add new tags m2m field in roadmap
        for tag in added_tag_list:
            tag_query = Tag.objects.filter(tag_name__iexact=tag)
            if tag_query.exists():
                target_tag = tag_query.first()
                roadmap.tags.add(target_tag)
                target_tag.increment_count_roadmap()
                target_tag.save()
            else:
                new_tag = Tag(tag_name=tag)
                new_tag.increment_count_roadmap()
                new_tag.save()
                roadmap.tags.add(new_tag)

        roadmap.save()
        roadmap_dict_simple = roadmap.to_dict_simple()
        return JsonResponse(roadmap_dict_simple, status=200)

    elif request.method == "DELETE":
        if not request.user.is_authenticated:
            return HttpResponse(status=401)
        try:
            roadmap = Roadmap.objects.get(id=roadmap_id)
        except ObjectDoesNotExist:
            return HttpResponseNotFound()
        if not roadmap.author_id == request.user.id:
            return HttpResponseForbidden()

        for tag in roadmap.tags.all():
            tag.decrement_count_roadmap()
            tag.save()

        roadmap.delete()
        return HttpResponse(status=204)

    elif request.method == "POST":
        if not request.user.is_authenticated:
            return HttpResponse(status=401)
        try:
            roadmap = Roadmap.objects.get(id=roadmap_id)
        except ObjectDoesNotExist:
            return HttpResponseNotFound()

        new_roadmap = Roadmap(
            private=roadmap.private,
            image_id=roadmap.image_id,
            title=roadmap.title,
            level=roadmap.level,
            description=roadmap.description,
            original_author=roadmap.author,
            author=request.user,
        )
        new_roadmap.save()

        # Add copied tags m2m fields
        for tag in roadmap.tags.all():
            new_roadmap.tags.add(tag)
            tag.increment_count_roadmap()
            tag.save()
        new_roadmap.save()

        # Add copied sections and tasks
        for section in roadmap.section_roadmap.all():
            new_section = Section(title=section.title, roadmap=new_roadmap)
            new_section.save()

            for task in section.task_section.all():
                Task(
                    title=task.title,
                    url=task.url,
                    type=task.type,
                    description=task.description,
                    roadmap=new_roadmap,
                    section=new_section,
                ).save()

        # Post response
        roadmap_dict_simple = new_roadmap.to_dict_simple()
        return JsonResponse(roadmap_dict_simple, status=201)
示例#2
0
def roadmap(request):
    if request.method == "POST":
        if not request.user.is_authenticated:
            return HttpResponse(status=401)
        try:
            req_data = json.loads(request.body.decode())
            new_private = req_data["private"]
            new_image_id = req_data["imageId"]
            new_title = req_data["title"]
            new_level = req_data["level"]
            new_description = req_data["description"]
            section_list = req_data["sections"]
            tag_list = req_data["tags"]
        except (KeyError, JSONDecodeError):
            return HttpResponseBadRequest()

        new_roadmap = Roadmap(
            private=new_private,
            image_id=new_image_id,
            title=new_title,
            level=new_level,
            description=new_description,
            original_author=request.user,
            author=request.user,
        )
        new_roadmap.save()

        # Add tags m2m field in new_roadmap
        for tag in tag_list:
            tag_query = Tag.objects.filter(tag_name__iexact=tag)
            if tag_query.exists():
                target_tag = tag_query.first()
                new_roadmap.tags.add(target_tag)
                target_tag.increment_count_roadmap()
                target_tag.save()

            else:
                new_tag = Tag(tag_name=tag)
                new_tag.increment_count_roadmap()
                new_tag.save()
                new_roadmap.tags.add(new_tag)

        new_roadmap.save()

        # Add sections and tasks of this roadmap
        for section in section_list:
            new_section = Section(title=section["section_title"],
                                  roadmap=new_roadmap)
            new_section.save()

            task_list = section["tasks"]
            for task in task_list:
                Task(
                    title=task["task_title"],
                    url=task["task_url"],
                    type=task["task_type"],
                    description=task["task_description"],
                    roadmap=new_roadmap,
                    section=new_section,
                ).save()

        # Post response
        roadmap_dict_simple = new_roadmap.to_dict_simple()
        return JsonResponse(roadmap_dict_simple, status=201)

    return HttpResponseNotAllowed(["POST"])