Example #1
0
    def handle(self, *args, **options):
        global database
        if options['database']:
            database = options['database']

        if int(options['empty_db']) == 1:
            shutil.copy2(DATABASES['empty']['NAME'], DATABASES[database]['NAME'])

        if not options['import_type'] or not options['path']:
            raise CommandError('--type and --path are required')
        path = options['path']
        upload_path = os.path.join(path, 'uploads')
        import_type = options['import_type']

        if not os.path.exists(path):
            raise CommandError('%s does not exist' % path)

        required_files = ['users', 'ads', 'ads_categories', 'product_categories', 'products', 'product_subcategories', 'products_subcategories', 'product_fields', 'products_fields', 'ads_values', 'ads_uploads', 'ads_uploads', 'deals']
        for f in required_files:
            try:
                open(path + f + '.' + ext, 'rb')
            except IOError as e:
                raise CommandError('%s.%s was not found. (%s)' % (f, ext, e))

        start = time.time()

        """ Users """
        if import_type == 'users':
            import_simple_data()
            filename = path + 'users.' + ext
            mapping = [
                ('id', 'id', User),
                ('un', 'username', User),
                ('pw', 'old_password', OldPassword),
                ('nonce', 'old_nonce', OldPassword),
                ('last_activity', False, False),
                ('first_name', 'first_name', User),
                ('last_name', 'last_name', User),
                ('email', 'email', User),
                ('phone', 'phone', UserProfile),
                ('cellphone', 'mobile', UserProfile),
                ('company_name', 'business_name', BusinessProfile),
                ('company_description', 'business_description', BusinessProfile),
                ('city', 'address_city', BusinessProfile),
                ('zipcode', 'address_zipcode', BusinessProfile),
                ('street', 'address', BusinessProfile),
                ('forgot_hash', False, False),
                ('forgot_time', False, False),
                #('level_id', 'member_level', BusinessProfile),
                #('level_promoted_timestamp', 'member_level_promoted', BusinessProfile),
                ('moderator', False, False),
                ('created', 'date_joined', User),
                ('avatar_160', False, False),  # image
                ('avatar_240', 'avatar', UserProfile),
                ('logo_160', False, False),
                ('logo_240', 'logo', BusinessProfile),
                ('imported', False, False),
                ('pw_pain', False, False),
                ('gps_lat', False, False),
                ('gps_lon', False, False),
                ('admin_id', False, False),
            ]
            f = open(filename, 'rb',)
            OldPassword.objects.using(database).delete()
            reader = csv.reader(f, delimiter=sep)
            header = []
            failed = []
            num = -1
            try:
                for row in reader:
                    num += 1
                    if num == 0:
                        for field in row:
                            header.append(field)
                        print header
                        continue

                    user = User()

                    user.password = "******"
                    user_profile = UserProfile()
                    old_password = OldPassword()

                    business_profile = False

                    for i in range(len(header)):
                        for old_field, new_field, model in mapping:
                            if new_field and model and old_field == header[i]:
                                row[i] = row[i].decode('utf-8')
                                #print "%s\t->\t%s\t(%s): %s - %s" % (old_field, new_field, model, i, row[i])

                                if model == User:
                                    if new_field == 'date_joined':
                                        row[i] = ts_to_datetime(row[i])
                                    elif new_field == 'email':
                                        setattr(user, 'username', row[i])
                                    setattr(user, new_field, row[i])
                                elif model == UserProfile:
                                    if new_field == 'phone' and row[i] != 'NULL':
                                        setattr(user_profile, 'cellphone', row[9])
                                    if new_field == 'avatar' and row[i] != 'NULL':
                                        row[i] = save_image(os.path.join(upload_path, 'avatars/' + row[0], row[i]), 'Avatar for %s %s' % (row[5], row[6]))
                                    elif new_field == 'avatar':
                                        row[i] = None
                                    if row[i] != 'NULL' and row[i]:
                                        setattr(user_profile, new_field, row[i])
                                elif model == BusinessProfile:
                                    if new_field == 'business_name':
                                        business_profile = BusinessProfile.objects.using(database).get_or_create(business_name=row[i])[0]
                                        business_profile.business_name = row[i]
                                        user_profile.active_profile = business_profile
                                    elif business_profile:
                                        if new_field == 'logo' and row[i] != 'NULL':
                                            row[i] = save_image(os.path.join(upload_path, 'logos/' + row[0], row[i]), 'Logo for ' + business_profile.business_name)
                                        elif new_field == 'logo':
                                            row[i] = None
                                        #elif new_field == 'member_level':
                                        #    row[i] = MemberLevel.objects.using(database).get(id=row[i])
                                        #elif new_field == 'member_level_promoted':
                                        #    row[i] = ts_to_datetime(row[i])
                                        setattr(business_profile, new_field, row[i])
                                elif model == OldPassword:
                                    setattr(old_password, new_field, row[i])
                                break
                    try:
                        user.save(using=database)
                    except IntegrityError:
                        print "error2 " + str(row[0])
                        failed.append(row)
                        continue
                    # Snatch the signal created profile and convert it!
                    try:
                        created_user_profile = user.get_userprofile()
                    except:
                        created_user_profile = user_profile
                    user_profile.user = user
                    user_profile.id = created_user_profile.id

                    created_user_profile = user_profile
                    created_user_profile.save(using=database)
                    if created_user_profile.avatar:
                        created_user_profile.avatar.creator = user
                        created_user_profile.avatar.save(using=database)

                    old_password.user = user
                    old_password.save(using=database)
                    if business_profile:
                        user_profile.business_profiles.add(business_profile)
                        if not business_profile.creator:
                            business_profile.creator = user_profile
                        if business_profile.logo:
                            if not business_profile.logo.creator:
                                business_profile.logo.creator = user
                                business_profile.logo.save()
                        business_profile.save(using=database)
                    print user

                    if num % 100 == 0:
                        timediff = time.time() - start
                        print "Rows: %s, %s" % (num, num / timediff)
            except csv.Error, e:
                exit('file %s, line %d: %s' % (filename, reader.line_num, e))

            print "%s Users" % (num, )

            print "%s failed" % len(failed)
            if failed:
                for row in failed:
                    u = User.objects.using(database).get(email=row[7])
                    print " - %s: %s %s %s (DUPLICATE: %s, %s)" % (row[0], row[5], row[6], row[7], u.id, u.email)