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)
예제 #2
0
    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
예제 #4
0
    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()
예제 #6
0
    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()
예제 #7
0
    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