async def initial_dep_fetch(dep: DEP): """Perform the initial DEP fetch, if required.""" for page in dep.devices(): for device in page: pass
def dep_fetch_devices(app: Flask, dep: DEP, dep_account_id: int): """Perform fetch or sync of devices. TODO: If default DEP Profile is nominated, it is queued for assignment here. But may want to check `profile_status` to see whether only devices with the `removed` status are considered unassigned. See: https://docs.sqlalchemy.org/en/latest/orm/contextual.html """ thread_session = db.create_scoped_session() dep_account: DEPAccount = thread_session.query(DEPAccount).one() if dep_account.cursor is not None: app.logger.info('Syncing using previous cursor: %s', dep_account.cursor) else: app.logger.info('No DEP cursor found, performing a full fetch') # TODO: if fetched_until is quite recent, there's no reason to fetch again for device_page in dep.devices(dep_account.cursor): print(device_page) for device in device_page['devices']: if 'op_type' in device: # its a sync, not a fetch optype = DEPOperationType(device['op_type']) if optype == DEPOperationType.Added: app.logger.debug('DEP Added: %s', device['serial_number']) elif optype == DEPOperationType.Modified: app.logger.debug('DEP Modified: %s', device['serial_number']) elif optype == DEPOperationType.Deleted: app.logger.debug('DEP Deleted: %s', device['serial_number']) else: app.logger.error('DEP op_type not recognised (%s), skipping', device['op_type']) continue else: pass try: d: Device = thread_session.query(Device).filter(Device.serial_number == device['serial_number']).one() d.description = device['description'] d.model = device['model'] d.os = device['os'] d.device_family = device['device_family'] d.color = device['color'] d.profile_status = device['profile_status'] if device['profile_status'] != 'empty': d.profile_uuid = device.get('profile_uuid', None) # Only exists in DEP Sync not Fetch? d.profile_assign_time = dateutil.parser.parse(device['profile_assign_time']) d.device_assigned_by = device['device_assigned_by'] d.device_assigned_date = dateutil.parser.parse(device['device_assigned_date']) d.is_dep = True except sqlalchemy.orm.exc.NoResultFound: app.logger.debug('No existing device record for serial: %s', device['serial_number']) if device['profile_status'] != 'empty': device['profile_assign_time'] = dateutil.parser.parse(device['profile_assign_time']) device['device_assigned_date'] = dateutil.parser.parse(device['device_assigned_date']) if 'op_type' in device: del device['op_type'] del device['op_date'] del device['profile_assign_time'] del device['device_assigned_date'] d = Device(**device) d.is_dep = True thread_session.add(d) except sqlalchemy.exc.StatementError as e: app.logger.error('Got a statement error trying to insert a DEP device: {}'.format(e)) app.logger.debug('Last DEP Cursor was: %s', device_page['cursor']) dep_account.cursor = device_page.get('cursor', None) dep_account.more_to_follow = device_page.get('more_to_follow', None) dep_account.fetched_until = dateutil.parser.parse(device_page['fetched_until']) thread_session.commit()
def test_fetch_cursor(self, dep: DEP): dep.fetch_token() for page in dep.devices(): print(len(page)) for d in page: print(d)