import MySQLdb from MySQLdb.cursors import DictCursor import xlrd from django.core.management.base import NoArgsCommand from django.conf import settings from emencia.django.newsletter.models import Contact, ContactSettings from accounts.models import User BAD_EMAILS_PATH = settings.SITE_ROOT + '/emencia/django/newsletter/management/commands/bad_emails.xlsx' def validateEmail(email): from django.core.validators import validate_email from django.core.exceptions import ValidationError try: validate_email(email) return True except ValidationError: return False def get_validated_emails(emails): # remove not emails result = [email for email in emails if validateEmail(email)] # bad emails result = [email for email in result if email[:5] != 'info@'] result = [email for email in result if email[:6] != 'admin@'] result = [email for email in result if email[:6] != 'sales@'] result = [email for email in result if email[:5] != 'sale@'] # bad emails from file f = open(BAD_EMAILS_PATH) book = xlrd.open_workbook(file_contents=f.read()) sheet = book.sheet_by_index(0) bad_emails = [sheet.row_values(row_number)[0] for row_number in range(sheet.nrows)] result = list(set(result) - set(bad_emails)) return result def handle_email(email, cursor): from theme.models import Theme # get theme ids sql = "select categories_id from cat_to_subsc WHERE email='{0}';" try: cursor.execute(sql.format(email)) except UnicodeEncodeError: return theme_ids = [item['categories_id'] for item in cursor.fetchall() if item.get('categories_id')] # create contact try: user = User.objects.get(username=email) except User.DoesNotExist: user = None try: contact = Contact.objects.create(email=email, activated=True, user=user) except: pass else: setting = ContactSettings.objects.create(contact=contact) setting.theme = Theme.objects.filter(id__in=theme_ids) print(email) class Command(NoArgsCommand): def handle(self, *args, **options): db = MySQLdb.connect(host="localhost", user=settings.DATABASES['default']['USER'], passwd=settings.DATABASES['default']['PASSWORD'], db="old_db", charset='utf8', cursorclass=DictCursor) cursor = db.cursor() sql = "select email from cat_to_subsc GROUP BY `email`" cursor.execute(sql) result = cursor.fetchall() # validate emails unique_emails = [item['email'].strip() for item in result] correct_emails = get_validated_emails(unique_emails) for email in correct_emails: handle_email(email, cursor)