def _set_main_fields(self, data, page): self.set_type_of_data(page, data) self.set_area_covered(page, data) try: self.set_lowest_level_of_geography(page, data) except NoResultFound as e: message = "There was an error setting lowest level of geography" self.logger.exception(message) raise PageUnEditable(message) try: self.set_page_frequency(page, data) except NoResultFound as e: message = "There was an error setting frequency of publication" self.logger.exception(message) raise PageUnEditable(message) try: self.set_department_source(page, data) except NoResultFound as e: message = "There was an error setting the department source (publisher) of the data" self.logger.exception(message) raise PageUnEditable(message) self.set_other_fields(data, page)
def create_upload(self, page, upload, title, description): extension = upload.filename.split(".")[-1] if title and extension: file_name = "%s.%s" % (slugify(title), extension) else: file_name = upload.filename if page.not_editable(): message = 'Error updating page "{}" - only pages in DRAFT or REJECT can be edited'.format(page.guid) self.logger.error(message) raise PageUnEditable(message) guid = create_guid(file_name) if not self.check_upload_title_unique(page, title): raise UploadAlreadyExists("An upload with that title already exists for this measure") else: self.logger.info("Upload with guid %s does not exist ok to proceed", guid) upload.seek(0, os.SEEK_END) size = upload.tell() upload.seek(0) self.upload_data(page, upload, filename=file_name) db_upload = Upload( guid=guid, title=title, file_name=file_name, description=description, page=page, size=size ) page.uploads.append(db_upload) db.session.add(page) db.session.commit() return db_upload
def update_page(self, page, data, last_updated_by): if page.not_editable(): message = "Error updating '{}' pages not in DRAFT, REJECT, UNPUBLISHED can't be edited".format( page.guid) self.logger.error(message) raise PageUnEditable(message) elif page_service.is_stale_update(data, page): raise StaleUpdateException("") else: # Possibly temporary to work out issue with data deletions message = "EDIT MEASURE: Current state of page: %s" % page.to_dict( ) self.logger.info(message) message = "EDIT MEASURE: Data posted to update page: %s" % data self.logger.info(message) subtopic = data.pop("subtopic", None) if subtopic is not None and page.parent.guid != subtopic: new_subtopic = page_service.get_page(subtopic) conflicting_url = [ measure for measure in new_subtopic.children if measure.uri == page.uri ] if conflicting_url: message = "A page with url %s already exists in %s" % ( page.uri, new_subtopic.title) raise PageExistsException(message) else: page.parent = new_subtopic page.position = len(new_subtopic.children) data.pop("guid", None) title = data.pop("title").strip() if page.version == "1.0": uri = slugify(title) if uri != page.uri and self.new_uri_invalid(page, uri): message = "The title '%s' and uri '%s' already exists under '%s'" % ( title, uri, page.parent_guid) raise PageExistsException(message) page.uri = uri page.title = title self._set_main_fields(data, page) if page.publish_status() in ["REJECTED", "UNPUBLISHED"]: new_status = publish_status.inv[1] page.status = new_status page.updated_at = datetime.utcnow() page.last_updated_by = last_updated_by db.session.add(page) db.session.commit() # Possibly temporary to work out issue with data deletions message = "EDIT MEASURE: Page updated to: %s" % page.to_dict() self.logger.info(message) return page
def delete_dimension(self, page, guid): if page.not_editable(): message = 'Error updating page "{}" - only pages in DRAFT or REJECT can be edited'.format(page.guid) self.logger.error(message) raise PageUnEditable(message) dimension = page.get_dimension(guid) db.session.delete(dimension) db.session.commit()
def delete_dimension(self, measure_version, guid): if measure_version.not_editable(): message = f'Error updating page "{measure_version.title}" - only pages in DRAFT or REJECT can be edited' self.logger.error(message) raise PageUnEditable(message) dimension = measure_version.get_dimension(guid) db.session.delete(dimension) db.session.commit()
def delete_upload_obj(self, page, upload): if page.not_editable(): message = 'Error updating page "{}" - only pages in DRAFT or REJECT can be edited'.format(page.guid) self.logger.error(message) raise PageUnEditable(message) try: self.delete_upload_files(page=page, file_name=upload.file_name) except FileNotFoundError: pass db.session.delete(upload) db.session.commit()
def edit_upload(self, measure, upload, data, file=None): if measure.not_editable(): message = 'Error updating page "{}" - only pages in DRAFT or REJECT can be edited'.format(measure.guid) self.logger.error(message) raise PageUnEditable(message) page_file_system = self.app.file_service.page_system(measure) new_title = data.get("title", upload.title) existing_title = upload.title if file: if new_title: extension = file.filename.split(".")[-1] file_name = "%s.%s" % (slugify(data["title"]), extension) file.seek(0, os.SEEK_END) size = file.tell() file.seek(0) file.size = size upload_service.upload_data(measure, file, filename=file_name) if upload.file_name != file_name: upload_service.delete_upload_files(page=measure, file_name=upload.file_name) upload.file_name = file_name else: file.seek(0, os.SEEK_END) size = file.tell() file.seek(0) file.size = size upload_service.upload_data(measure, file, filename=file.filename) if upload.file_name != file.filename: upload_service.delete_upload_files(page=measure, file_name=upload.file_name) upload.file_name = file.filename else: if new_title != existing_title: # current file needs renaming extension = upload.file_name.split(".")[-1] file_name = "%s.%s" % (slugify(data["title"]), extension) if self.app.config.get("FILE_SERVICE", "local").lower() == "local": path = self.get_url_for_file(measure, upload.file_name) dir_path = os.path.dirname(path) page_file_system.rename_file(upload.file_name, file_name, dir_path) else: if data["title"] != upload.title: path = "%s/%s/source" % (measure.guid, measure.version) page_file_system.rename_file(upload.file_name, file_name, path) upload_service.delete_upload_files(page=measure, file_name=upload.file_name) upload.file_name = file_name upload.description = data["description"] if "description" in data else upload.title upload.title = new_title db.session.add(upload) db.session.commit()
def update_measure_version( # noqa: C901 (complexity) self, measure_version, measure_version_form, last_updated_by_email, **kwargs ): if measure_version.not_editable(): message = "Error updating '{}': Versions not in DRAFT, REJECT can't be edited".format(measure_version.title) self.logger.error(message) raise PageUnEditable(message) elif page_service._is_stale_update(measure_version_form.data, measure_version): raise StaleUpdateException("") # Possibly temporary to work out issue with data deletions message = "EDIT MEASURE: Current state of measure_version: %s" % measure_version.to_dict() self.logger.info(message) message = "EDIT MEASURE: Request data: %s" % request.form self.logger.info(message) message = "EDIT MEASURE: WTForm data to update measure version: %s" % measure_version_form.data self.logger.info(message) subtopic_id_from_form = kwargs.get("subtopic_id") if subtopic_id_from_form is not None and measure_version.measure.subtopic.id != int(subtopic_id_from_form): if measure_version.version != "1.0": raise CannotChangeSubtopicOncePublished new_subtopic = Subtopic.query.get(subtopic_id_from_form) conflicting_url = [msure for msure in new_subtopic.measures if msure.slug == measure_version.measure.slug] if conflicting_url: message = f"A measure with url '{measure_version.measure.slug}' already exists in {new_subtopic.title}" raise PageExistsException(message) else: measure_version.measure.subtopics = [new_subtopic] measure_version.measure.position = len(new_subtopic.measures) status = kwargs.get("status") if status is not None: measure_version.status = status if measure_version.version == "1.0": slug = slugify(measure_version_form.title.data) if slug != measure_version.measure.slug and self._new_slug_invalid(measure_version, slug): message = f"A page with slug '{slug}' already exists under {measure_version.measure.subtopic.title}" raise PageExistsException(message) measure_version.measure.slug = slug # Update main fields of MeasureVersion measure_version_form.populate_obj(measure_version) # Update fields in the parent Measure if "internal_reference" in measure_version_form.data: reference = measure_version_form.data["internal_reference"] measure_version.measure.reference = reference if reference else None if measure_version.publish_status() == "REJECTED": measure_version.status = "DRAFT" measure_version.updated_at = datetime.utcnow() measure_version.last_updated_by = last_updated_by_email db.session.commit() return measure_version