def as_dto(self, logged_in_username: str) -> UserDTO: """ Create DTO object from user in scope """ user_dto = UserDTO() user_dto.id = self.id user_dto.username = self.username user_dto.role = UserRole(self.role).name user_dto.mapping_level = MappingLevel(self.mapping_level).name user_dto.projects_mapped = (len(self.projects_mapped) if self.projects_mapped else None) user_dto.is_expert = self.is_expert or False user_dto.date_registered = self.date_registered user_dto.twitter_id = self.twitter_id user_dto.linkedin_id = self.linkedin_id user_dto.facebook_id = self.facebook_id user_dto.skype_id = self.skype_id user_dto.slack_id = self.slack_id user_dto.irc_id = self.irc_id user_dto.city = self.city user_dto.country = self.country user_dto.name = self.name user_dto.picture_url = self.picture_url user_dto.osm_profile = self.osm_profile_url user_dto.missing_maps_profile = self.missing_maps_profile_url user_dto.default_editor = self.default_editor user_dto.mentions_notifications = self.mentions_notifications user_dto.projects_notifications = self.projects_notifications user_dto.comments_notifications = self.comments_notifications user_dto.tasks_notifications = self.tasks_notifications user_dto.teams_notifications = self.teams_notifications if self.username == logged_in_username: # Only return email address and gender information when logged in user is looking at their own profile user_dto.email_address = self.email_address user_dto.is_email_verified = self.is_email_verified gender = None if self.gender is not None: gender = UserGender(self.gender).name user_dto.gender = gender user_dto.self_description_gender = self.self_description_gender return user_dto
def patch(self): """ Updates user info --- tags: - users produces: - application/json parameters: - in: header name: Authorization description: Base64 encoded session token required: true type: string default: Token sessionTokenHere== - in: body name: body required: true description: JSON object to update a user schema: properties: name: type: string example: Your Name city: type: string example: Your City country: type: string example: Your Country emailAddress: type: string example: [email protected] twitterId: type: string example: twitter handle without @ facebookId: type: string example: facebook username linkedinId: type: string example: linkedin username gender: type: string description: gender selfDescriptionGender: type: string description: gender self-description responses: 200: description: Details saved 400: description: Client Error - Invalid Request 401: description: Unauthorized - Invalid credentials 500: description: Internal Server Error """ try: user_dto = UserDTO(request.get_json()) if user_dto.email_address == "": user_dto.email_address = ( None # Replace empty string with None so validation doesn't break ) user_dto.validate() except ValueError as e: return {"Error": str(e)}, 400 except DataError as e: current_app.logger.error(f"error validating request: {str(e)}") return {"Error": "Unable to update user details"}, 400 try: verification_sent = UserService.update_user_details( tm.authenticated_user_id, user_dto) return verification_sent, 200 except NotFound: return {"Error": "User not found"}, 404 except Exception as e: error_msg = f"User GET - unhandled error: {str(e)}" current_app.logger.critical(error_msg) return {"Error": "Unable to update user details"}, 500