Ejemplo n.º 1
0
 def __init__(self, server):
     super(WorkbookManager, self).__init__(server)
     self.sample_project_id = None
     sample_project_entry = Project.get_by_name(
                                             self.server.environment.envid,
                                             'Tableau Samples')
     if sample_project_entry:
         self.sample_project_id = sample_project_entry.id
Ejemplo n.º 2
0
    def load(self, agent):
        # pylint: disable=too-many-locals
        # pylint: disable=too-many-statements

        envid = self.server.environment.envid
        if not self.sample_project_id:
            sample_project_entry = Project.get_by_name(envid,
                                                       'Tableau Samples')
            if sample_project_entry:
                self.sample_project_id = sample_project_entry.id

        stmt = \
            'SELECT id, name, repository_url, description,' +\
            ' created_at, updated_at, owner_id, project_id,' +\
            ' view_count, size, embedded, thumb_user,' +\
            ' refreshable_extracts, extracts_refreshed_at, lock_version,' +\
            ' state, version, checksum, display_tabs, data_engine_extracts,' +\
            ' incrementable_extracts, site_id, revision,' +\
            ' repository_data_id, repository_extract_data_id,' +\
            ' first_published_at, primary_content_url, share_description,' +\
            ' show_toolbar, extracts_incremented_at, default_view_index,' +\
            ' luid, asset_key_id, document_version ' +\
            'FROM workbooks'

        session = meta.Session()

        last_updated_at = WorkbookEntry.get_last_updated_at(envid)
        if last_updated_at:
            stmt += " WHERE updated_at > '" + last_updated_at + "'"

        data = agent.odbc.execute(stmt)

        updates = []

        if 'error' in data or '' not in data:
            logger.debug("workbooks load: bad data: %s", str(data))
            return data

        logger.debug(data)

        # Get users only if needed
        users = None

        for odbcdata in ODBC.load(data):
            name = odbcdata.data['name']
            revision = odbcdata.data['revision']
            site_id = odbcdata.data['site_id']
            project_id = odbcdata.data['project_id']
            luid = odbcdata.data['luid']

            if project_id == self.sample_project_id:
                logger.debug(
                        "workbooks load: Ignoring Tableau Sample wb: %s, %s",
                        name, revision)
                continue

            wbe = WorkbookEntry.get(envid, site_id, project_id, luid,
                                                            default=None)
            if wbe is None:
                wbe = WorkbookEntry(envid=envid, site_id=site_id,
                                    project_id=project_id, luid=luid)
                session.add(wbe)

            # NOTE: id is updated with each revision.
            odbcdata.copyto(wbe, excludes=['revision'])

            if not users:
                users = self.load_users(agent)

            system_user_id = users.get(wbe.site_id, wbe.owner_id)
            wbe.system_user_id = system_user_id

            # must commit here so that update foreign keys work.
            session.commit()

            wbu = WorkbookUpdateEntry.get(wbe.workbookid,
                                          revision,
                                          default=None)
            if not wbu:
                # The updated_at time is the publish time.
                wbu = WorkbookUpdateEntry(workbookid=wbe.workbookid,
                                          revision=revision,
                                          system_user_id=system_user_id,
                                          timestamp=wbe.updated_at,
                                          url='')
                session.add(wbu)
                updates.append(wbu)

            logger.debug("workbook update '%s', revision %s", name, revision)

        session.commit()

        prune_count = self._prune_missed_revisions()

        if not self.system[SystemKeys.WORKBOOK_RETAIN_COUNT]:
            result = {u'disabled':
                      'Workbook Archives are not enabled. Will not archive.'}
        elif not self.cred_check():
            result = {u'error': 'Can not load workbooks: missing credentials.'}
        else:
            # Second pass - build the archive files.
            result = self._archive_updates(agent, updates)

        result[u'schema'] = self.schema(data)
        result[u'updates-new'] = len(updates)
        result[u'updates-missed'] = prune_count

        return result