def manage_category(request, guid=None): """ Manage category :param request: HttpRequest GET: '/api/cmn/category/' - get all roots '/api/cmn/category/?subs=true' - get all roots '/api/cmn/category/{guid}/' - get category by guid '/api/cmn/category/{guid}/?subs=true' - get category with subs :return: ServerResponse """ field_name = "category" if request.is_GET: subs_field_name = "subs" parent_field_name = "parent" if guid: try: category = Category.objects.get(guid=guid, owner_id=request.user.pk) except ObjectDoesNotExist as e: return ServerResponse.not_found() result = {field_name: category.serialize()} if request.request.GET.get(subs_field_name, False): result[field_name][subs_field_name] = [s.serialize() for s in category.get_subs()] if request.request.GET.get(parent_field_name, False): parent_category = category.get_parent() result[field_name][parent_field_name] = parent_category.serialize() if parent_category else None return ServerResponse.ok(data=result) else: categories = Category.objects.get_roots(owner_id=request.user.pk) return ServerResponse.ok(data={field_name: {subs_field_name: [c.serialize() for c in categories]}}) if request.is_PUT: form = CategoryForm(request.data) if form.errors: return ServerResponse.bad_request(data=form.errors) category_guid = request.data.get("guid", None) if not category_guid: return ServerResponse.bad_request(message=Message.error("Guid is not defined")) try: category = Category.objects.get(guid=category_guid, owner_id=request.user.pk) category.update(request.data) category.save() except ObjectDoesNotExist as e: return ServerResponse.not_found() except Exception as e: return ServerResponse.internal_server_error( message=Message.error("The error was occured during saving process") ) return ServerResponse.ok(data={field_name: category.serialize()}) if request.is_DELETE: if not guid: return ServerResponse.bad_request(message=Message.error("Guid must be set")) try: category = Category.objects.get(guid=guid, owner_id=request.user.pk) except ObjectDoesNotExist as e: return ServerResponse.not_found() if category.has_dependencies(): return ServerResponse.internal_server_error( message=Message.warning("Category has dependencies. It cannot be deleted") ) category.delete() return ServerResponse.ok(data={field_name: guid}) if request.is_POST: form = CategoryForm(request.data) if form.errors: return ServerResponse.bad_request(data=form.errors) name = request.data.get("name") parent_guid = request.data.get("parent_guid", None) if parent_guid: # create subcategory try: parent_category = request.user.category_set.get(guid=parent_guid) except ObjectDoesNotExist as e: return ServerResponse.not_found(message=Message.error("Parent category does not exist")) try: category = Category.objects.create_sub(name, parent_category) except CreationError as e: return ServerResponse.internal_server_error(message=Message.error(e.message)) else: # create root level category category = Category.objects.create_root(name) category.owner = request.user category.save() return ServerResponse.created(data={field_name: category.serialize()})