def post(self, request: Request, project_id) -> Response: """Create a deep-link. The request user must not be anonymous and must have annotate permissions. --- serializer: DeepLinkSerializer """ if request.user == get_anonymous_user( ) or not request.user.is_authenticated: raise PermissionError('Unauthenticated or anonymous users ' \ 'can not create persistent deep links.') project_id = int(project_id) alias = request.POST.get('alias') if alias: if not re.match(r'^[a-zA-Z0-9-_\.]+$', alias): raise ValueError( "Only alphanumeric characters, '-', '_' and '.' allowed") else: n_links = DeepLink.objects.filter(project_id=project_id).count() alias = make_unique_id() params = { 'project_id': project_id, 'user': request.user, 'alias': alias, } if 'is_public' in request.POST: params['is_public'] = get_request_bool(request.POST, 'is_public') if 'location_x' in request.POST: params['location_x'] = float(request.POST['location_x']) if 'location_y' in request.POST: params['location_y'] = float(request.POST['location_y']) if 'location_z' in request.POST: params['location_z'] = float(request.POST['location_z']) if 'active_treenode_id' in request.POST: params['active_treenode_id'] = int( request.POST['active_treenode_id']) if 'active_connector_id' in request.POST: params['active_connector_id'] = int( request.POST['active_connector_id']) if 'active_skeleton_id' in request.POST: params['active_skeleton_id'] = int( request.POST['active_skeleton_id']) if 'closest_node_to_location' in request.POST: params['closest_node_to_location'] = get_request_bool( request.POST, 'closest_node_to_location') if 'follow_id_history' in request.POST: params['follow_id_history'] = get_request_bool( request.POST, 'follow_id_history') if 'layered_stacks' in request.POST: params['layered_stacks'] = get_request_bool( request.POST, 'layered_stacks') if 'layout' in request.POST: params['layout'] = request.POST['layout'] if 'tool' in request.POST: params['tool'] = request.POST['tool'] if 'show_help' in request.POST: params['show_help'] = get_request_bool(request.POST, 'show_help') if 'password' in request.POST: params['password'] = make_password(request.POST('password')) if 'message' in request.POST: params['message'] = request.POST['message'] # TBA: data_view deeplink = DeepLink(**params) deeplink.save() serializer = DeepLinkSerializer(deeplink) # Stacks stacks = get_request_list(request.POST, 'stacks', map_fn=float) if stacks: # Nested lists of 2-tuples: [[stack_id, scale_level]] for s in stacks: stack_link = DeepLinkStack( **{ 'project_id': project_id, 'user_id': request.user.id, 'deep_link': deeplink, 'stack_id': int(s[0]), 'zoom_level': s[1], }) stack_link.save() # Stack groups if 'stack_group' in request.POST: sg_id = int(request.POST['stack_group']) sg_zoom_levels = get_request_list(request.POST, 'stack_group_scale_levels', map_fn=float) sg_link = DeepLinkStackGroup( **{ 'project_id': project_id, 'user_id': request.user.id, 'deeplink': deeplink, 'stack_group_id': sg_id, 'zoom_levels': sg_zoom_levels, }) sg_link.save() return Response(serializer.data)