def setUp(self): self.dodgy_lc = data_setup.create_labcontroller(fqdn=u"dodgylc.example.invalid") self.distro_tree = data_setup.create_distro_tree() for lca in list(self.distro_tree.lab_controller_assocs): if lca.lab_controller == self.dodgy_lc: self.distro_tree.lab_controller_assocs.remove(lca) session.expunge(lca)
def _from_csv(cls,system,data,csv_type,log): """ Import data from CSV file into System Objects """ if 'key' in data and data['key']: try: key = Key.by_name(data['key']) except InvalidRequestError: log.append('%s: Invalid Key %s ' % (system.fqdn, data['key'])) return False else: log.append('%s: Key must not be blank!' % system.fqdn) return False if 'key_value' in data and data['key_value']: if key.numeric: system_key_values = system.key_values_int try: key_value = Key_Value_Int.by_key_value(system, key, data['key_value']) except InvalidRequestError: key_value = Key_Value_Int(key=key, key_value=data['key_value']) else: system_key_values = system.key_values_string try: key_value = Key_Value_String.by_key_value(system, key, data['key_value']) except InvalidRequestError: key_value = Key_Value_String(key=key, key_value=data['key_value']) else: log.append('%s: Key Value must not be blank!' % system.fqdn) return False deleted = False if 'deleted' in data: deleted = smart_bool(data['deleted']) if deleted: if key_value in system_key_values: system.record_activity(user=identity.current.user, service=u'CSV', action=u'Removed', field=u'Key/Value', old=u'%s/%s' % (data['key'],data['key_value']), new=u'') system_key_values.remove(key_value) if not key_value.id: session.expunge(key_value) else: if key_value not in system_key_values: system.record_activity(user=identity.current.user, service=u'CSV', action=u'Added', field=u'Key/Value', old=u'', new=u'%s/%s' % (data['key'],data['key_value'])) system_key_values.append(key_value) session.add(key_value) return True
def action_import(self, csv_file, *args, **kw): """ TurboGears method to import data from csv """ log = [] try: # ... process CSV file contents here ... missing = object() reader = csv.DictReader(csv_file.file, restkey=missing, restval=missing) for data in reader: if missing in data: log.append('Too many fields on line %s (expecting %s)' % (reader.line_num, len(reader.fieldnames))) continue if any(value is missing for value in data.itervalues()): missing_fields = [field for field, value in data.iteritems() if value is missing] log.append('Missing fields on line %s: %s' % (reader.line_num, ', '.join(missing_fields))) continue if 'csv_type' in data: if data['csv_type'] in system_types and \ 'fqdn' in data: try: system = System.query.filter(System.fqdn == data['fqdn']).one() except InvalidRequestError: # Create new system with some defaults # Assume the system is broken until proven otherwise. # Also assumes its a machine. we have to pick something system = System(fqdn=data['fqdn'], owner=identity.current.user, type=SystemType.machine, status=SystemStatus.broken) if system.can_admin(identity.current.user): # Remove fqdn, can't change that via csv. data.pop('fqdn') if not self.from_csv(system, data, log): if system.id: # System already existed but some or all of the # import data was invalid. session.expire(system) else: # System didn't exist before import but some # or all of the import data was invalid. session.expunge(system) del(system) else: # Save out our system. If we created it above we # want to make sure its found on subsequent lookups session.add(system) session.flush([system]) else: log.append("You are not the owner of %s" % system.fqdn) elif data['csv_type'] == 'user_group' and \ 'user' in data: user = User.by_user_name(data['user']) if user: CSV_GroupUser.from_csv(user, data, log) else: log.append('%s is not a valid user' % data['user']) else: log.append("Invalid csv_type %s or missing required fields" % data['csv_type']) else: log.append("Missing csv_type from record") except csv.Error, e: session.rollback() log.append('Error parsing CSV file: %s' % e)
def action_import(self, csv_file, *args, **kw): """ TurboGears method to import data from csv """ log = [] try: # ... process CSV file contents here ... missing = object() reader = csv.DictReader(csv_file.file, restkey=missing, restval=missing) for data in reader: if missing in data: log.append('Too many fields on line %s (expecting %s)' % (reader.line_num, len(reader.fieldnames))) continue if any(value is missing for value in data.itervalues()): missing_fields = [field for field, value in data.iteritems() if value is missing] log.append('Missing fields on line %s: %s' % (reader.line_num, ', '.join(missing_fields))) continue if 'csv_type' in data: if data['csv_type'] in system_types and ('fqdn' in data or 'id' in data): if data.get('id', None): try: system = System.query.filter(System.id == data['id']).one() except InvalidRequestError as e: log.append('Error importing system on line %s: Non-existent system id' % reader.line_num) continue else: try: system = System.query.filter(System.fqdn == data['fqdn']).one() except InvalidRequestError: # Create new system with some defaults # Assume the system is broken until proven otherwise. # Also assumes its a machine. we have to pick something try: system = System(fqdn=data['fqdn'], owner=identity.current.user, type=SystemType.machine, status=SystemStatus.broken) session.add(system) except ValueError as e: log.append('Error importing system on line %s: %s' % (reader.line_num, str(e))) continue # new systems are visible to everybody by default system.custom_access_policy = SystemAccessPolicy() system.custom_access_policy.add_rule( SystemPermission.view, everybody=True) if system.can_edit(identity.current.user): # we change the FQDN only when a valid system id is supplied if not data.get('id', None): data.pop('fqdn') try: self.from_csv(system, data, log) except ValueError as e: log.append('Error importing system on line %s: %s' % (reader.line_num, str(e))) if system.id: # System already existed but some or all of the # import data was invalid. session.expire(system) else: # System didn't exist before import but some # or all of the import data was invalid. session.expunge(system) del(system) else: session.add(system) session.flush() else: log.append("You are not the owner of %s" % system.fqdn) elif data['csv_type'] == 'user_group' and \ 'user' in data: user = User.by_user_name(data['user']) if user: CSV_GroupUser.from_csv(user, data, log) else: log.append('%s is not a valid user' % data['user']) else: log.append("Invalid csv_type %s or missing required fields" % data['csv_type']) else: log.append("Missing csv_type from record") except csv.Error, e: session.rollback() log.append('Error parsing CSV file: %s' % e)