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)
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"])