예제 #1
0
 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)
예제 #2
0
    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
예제 #3
0
 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)
예제 #4
0
    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)