def update(self, project_dto: ProjectDTO): """ Updates project from DTO """ self.status = ProjectStatus[project_dto.project_status].value self.priority = ProjectPriority[project_dto.project_priority].value self.default_locale = project_dto.default_locale self.enforce_mapper_level = project_dto.enforce_mapper_level self.enforce_validator_role = project_dto.enforce_validator_role self.private = project_dto.private self.mapper_level = MappingLevel[project_dto.mapper_level.upper()].value self.entities_to_map = project_dto.entities_to_map self.changeset_comment = project_dto.changeset_comment self.due_date = project_dto.due_date self.imagery = project_dto.imagery self.josm_preset = project_dto.josm_preset self.last_updated = timestamp() self.license_id = project_dto.license_id if project_dto.organisation_tag: org_tag = Tags.upsert_organistion_tag(project_dto.organisation_tag) self.organisation_tag = org_tag else: self.organisation_tag = None # Set to none, for cases where a tag could have been removed if project_dto.campaign_tag: camp_tag = Tags.upsert_campaign_tag(project_dto.campaign_tag) self.campaign_tag = camp_tag else: self.campaign_tag = None # Set to none, for cases where a tag could have been removed # Cast MappingType strings to int array type_array = [] for mapping_type in project_dto.mapping_types: type_array.append(MappingTypes[mapping_type].value) self.mapping_types = type_array # Add list of allowed users, meaning the project can only be mapped by users in this list if hasattr(project_dto, 'allowed_users'): self.allowed_users = [] # Clear existing relationships then re-insert for user in project_dto.allowed_users: self.allowed_users.append(user) # Set Project Info for all returned locales for dto in project_dto.project_info_locales: project_info = self.project_info.filter_by(locale=dto.locale).one_or_none() if project_info is None: new_info = ProjectInfo.create_from_dto(dto) # Can't find info so must be new locale self.project_info.append(new_info) else: project_info.update_from_dto(dto) self.priority_areas = [] # Always clear Priority Area prior to updating if project_dto.priority_areas: for priority_area in project_dto.priority_areas: pa = PriorityArea.from_dict(priority_area) self.priority_areas.append(pa) db.session.commit()
def update(self, project_dto: ProjectDTO): """ Updates project from DTO """ self.status = ProjectStatus[project_dto.project_status].value self.priority = ProjectPriority[project_dto.project_priority].value self.default_locale = project_dto.default_locale self.enforce_mapper_level = project_dto.enforce_mapper_level self.enforce_validator_role = project_dto.enforce_validator_role self.enforce_random_task_selection = project_dto.enforce_random_task_selection self.allow_non_beginners = project_dto.allow_non_beginners self.private = project_dto.private self.mapper_level = MappingLevel[ project_dto.mapper_level.upper()].value self.entities_to_map = project_dto.entities_to_map self.changeset_comment = project_dto.changeset_comment self.due_date = project_dto.due_date self.imagery = project_dto.imagery self.josm_preset = project_dto.josm_preset self.id_presets = project_dto.id_presets self.last_updated = timestamp() self.license_id = project_dto.license_id if project_dto.osmcha_filter_id: # Support simple extraction of OSMCha filter id from OSMCha URL match = re.search('aoi=([\w-]+)', project_dto.osmcha_filter_id) self.osmcha_filter_id = match.group( 1) if match else project_dto.osmcha_filter_id else: self.osmcha_filter_id = None if project_dto.organisation_tag: org_tag = Tags.upsert_organistion_tag(project_dto.organisation_tag) self.organisation_tag = org_tag else: self.organisation_tag = None # Set to none, for cases where a tag could have been removed if project_dto.campaign_tag: camp_tag = Tags.upsert_campaign_tag(project_dto.campaign_tag) self.campaign_tag = camp_tag else: self.campaign_tag = None # Set to none, for cases where a tag could have been removed # Cast MappingType strings to int array type_array = [] for mapping_type in project_dto.mapping_types: type_array.append(MappingTypes[mapping_type].value) self.mapping_types = type_array # Cast Editor strings to int array mapping_editors_array = [] for mapping_editor in project_dto.mapping_editors: mapping_editors_array.append(Editors[mapping_editor].value) self.mapping_editors = mapping_editors_array validation_editors_array = [] for validation_editor in project_dto.validation_editors: validation_editors_array.append(Editors[validation_editor].value) self.validation_editors = validation_editors_array # Add list of allowed users, meaning the project can only be mapped by users in this list if hasattr(project_dto, 'allowed_users'): self.allowed_users = [ ] # Clear existing relationships then re-insert for user in project_dto.allowed_users: self.allowed_users.append(user) # Set Project Info for all returned locales for dto in project_dto.project_info_locales: project_info = self.project_info.filter_by( locale=dto.locale).one_or_none() if project_info is None: new_info = ProjectInfo.create_from_dto( dto) # Can't find info so must be new locale self.project_info.append(new_info) else: project_info.update_from_dto(dto) self.priority_areas = [ ] # Always clear Priority Area prior to updating if project_dto.priority_areas: for priority_area in project_dto.priority_areas: pa = PriorityArea.from_dict(priority_area) self.priority_areas.append(pa) if project_dto.custom_editor: if not self.custom_editor: new_editor = CustomEditor.create_from_dto( self.id, project_dto.custom_editor) self.custom_editor = new_editor else: self.custom_editor.update_editor(project_dto.custom_editor) else: if self.custom_editor: self.custom_editor.delete() db.session.commit()