Пример #1
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
Пример #2
0
    def copy(self):
        # get a list of classification_links from this dimension before we make any changes
        # TODO: In reality there will only ever be one of these. We should refactor the model to reflect this.
        links = []
        for link in self.classification_links:
            db.session.expunge(link)
            make_transient(link)
            links.append(link)

        # get the existing chart and table before we lift from session
        chart_object = self.dimension_chart
        table_object = self.dimension_table

        # lift dimension from session
        db.session.expunge(self)
        make_transient(self)

        # update disassociated dimension
        self.guid = create_guid(self.title)

        if chart_object:
            self.dimension_chart = chart_object.copy()

        if table_object:
            self.dimension_table = table_object.copy()

        for dc in links:
            self.classification_links.append(dc)

        return self
    def create_copy(self, page_guid, page_version, version_type, created_by):
        page = self.get_page_with_version(page_guid, page_version)
        next_version = page.next_version_number_by_type(version_type)

        if version_type != "copy" and self.already_updating(
                page.guid, next_version):
            raise UpdateAlreadyExists()

        dimensions = [dimension for dimension in page.dimensions]
        uploads = [upload for upload in page.uploads]

        db.session.expunge(page)
        make_transient(page)
        original_guid = page.guid

        if version_type == "copy":
            page.guid = str(uuid.uuid4())
            page.title = f"COPY OF {page.title}"
            # Duplicate (URI + version) in the same subtopic would mean we can't resolve preview URLs to a single page
            while self.new_uri_invalid(page, page.uri):
                page.uri = f"{page.uri}-copy"
        page.version = next_version
        page.status = "DRAFT"
        page.created_by = created_by
        page.created_at = datetime.utcnow()
        page.publication_date = None
        page.published = False
        page.internal_edit_summary = None
        page.external_edit_summary = None
        page.latest = True

        for dimension in dimensions:
            page.dimensions.append(dimension.copy())

        for upload in uploads:
            file_name = upload.file_name
            db.session.expunge(upload)
            make_transient(upload)
            upload.guid = create_guid(file_name)
            page.uploads.append(upload)

        db.session.add(page)
        db.session.commit()

        previous_page = page.get_previous_version()
        if previous_page is not None:
            previous_page.latest = False
            db.session.add(previous_page)
            db.session.commit()

        upload_service.copy_uploads(page, page_version, original_guid)

        return page
Пример #4
0
    def create_dimension(self, page, title, time_period, summary):

        guid = create_guid(title)

        if not self.check_dimension_title_unique(page, title):
            raise DimensionAlreadyExists()
        else:
            self.logger.info("Dimension with guid %s does not exist ok to proceed", guid)

            db_dimension = Dimension(
                guid=guid,
                title=title,
                time_period=time_period,
                summary=summary,
                page=page,
                position=page.dimensions.count(),
            )

            page.dimensions.append(db_dimension)
            db.session.add(page)
            db.session.commit()

            return page.get_dimension(db_dimension.guid)
    def create_measure_version(self, measure_version, update_type, user):
        next_version_number = measure_version.next_version_number_by_type(update_type)

        if update_type != NewVersionType.NEW_MEASURE and self.get_measure_version_by_measure_id_and_version(
            measure_version.measure_id, next_version_number
        ):
            raise UpdateAlreadyExists()

        new_version = measure_version.copy(exclude_fields=["update_corrects_data_mistake"])

        if update_type == NewVersionType.NEW_MEASURE:
            new_version.title = f"COPY OF {measure_version.title}"

            new_slug = f"{measure_version.measure.slug}-copy"
            # In case there are multiple -copy measures, try this...
            try:
                while self.get_measure(
                    measure_version.measure.subtopic.topic.slug, measure_version.measure.subtopic.slug, new_slug
                ):
                    new_slug = f"{new_slug}-copy"
            except PageNotFoundException:
                pass

            new_version.measure = Measure(slug=new_slug, position=len(measure_version.measure.subtopic.measures))
            new_version.measure.subtopics = measure_version.measure.subtopics
        else:
            # We insert to the front of the `measure.versions` relationship so that we maintain ordering of
            # desc(measure_version.version) as defined by the relationship on the model, as otherwise the list is not
            # updated by sqlalchemy until a commit.
            measure_version.measure.versions.insert(0, new_version)

        new_version.version = next_version_number
        new_version.status = "DRAFT"
        new_version.created_by = user.email
        new_version.created_at = datetime.utcnow()
        new_version.published_at = None
        new_version.internal_edit_summary = None
        new_version.external_edit_summary = None
        new_version.uploads = []
        new_version.dimensions = [dimension.copy() for dimension in measure_version.dimensions]
        new_version.latest = True

        # We don't copy uploads or data sources for major updates, as major updates should always have new data
        if update_type != NewVersionType.MAJOR_UPDATE:
            for upload in measure_version.uploads:
                new_upload = upload.copy()
                new_upload.guid = create_guid(upload.file_name)
                new_version.uploads.append(new_upload)

            new_version.data_sources = measure_version.data_sources

        db.session.add(new_version)
        db.session.flush()

        upload_service.copy_uploads_between_measure_versions(
            from_measure_version=measure_version, to_measure_version=new_version
        )

        previous_version = new_version.get_previous_version()
        if previous_version:
            previous_version.latest = False
            db.session.add(previous_version)

        db.session.commit()

        return new_version