Esempio n. 1
0
def sync_users(dry_run, sync_from_datetime, loglevel):
    logger.setLevel(loglevel)
    error_count = 0
    success_count = 0

    users = Member.objects.all()
    if sync_from_datetime:
        users = users.filter(updated__gte=sync_from_datetime)

    logger.info("Syncing {0} User objects.".format(users.count()))

    for user in users:
        logger.debug("Syncing User: {0}".format(user.id))

        # Find the corresponding SF user.
        try:
            contact = SalesforceContact.objects.get(external_id=user.id)
        except SalesforceContact.DoesNotExist:
            contact = SalesforceContact()
        except Exception as e:
            logger.error("Error while loading sfcontact id {0} - stopping: ".format(user.id) + str(e))
            return success_count, error_count+1

        # Populate the data from the source
        contact.external_id = user.id
        contact.user_name = user.username

        if re_email.match(user.email.upper()):
            contact.email = user.email
        else:
            logger.error("User has invalid e-mail address '{0}', member id {1}. "
                         "Ignoring e-mail address field.".format(user.email, user.id))

        contact.is_active = user.is_active
        contact.member_since = user.date_joined
        contact.date_joined = user.date_joined
        contact.deleted = user.deleted

        contact.category1 = Member.UserType.values[user.user_type].title()

        contact.first_name = user.first_name
        if user.last_name.strip():
            contact.last_name = user.last_name
        else:
            contact.last_name = "1%MEMBER"

        contact.location = user.location
        contact.website = user.website

        contact.picture_location = ""
        if user.picture:
            contact.picture_location = str(user.picture)

        contact.about_me_us = user.about
        contact.why_one_percent_member = user.why

        contact.availability = user.available_time

        contact.facebook = user.facebook
        contact.twitter = user.twitter
        contact.skype = user.skypename

        contact.primary_language = user.primary_language
        contact.receive_newsletter = user.newsletter
        contact.phone = user.phone_number
        contact.birth_date = user.birthdate

        if user.gender == "male":
            contact.gender = Member.Gender.values['male'].title()
        elif user.gender == "female":
            contact.gender = Member.Gender.values['female'].title()
        else:
            contact.gender = ""

        contact.tags = ""
        for tag in user.tags.all():
            contact.tags = str(tag) + ", " + contact.tags

        if user.address:
            contact.mailing_city = user.address.city
            contact.mailing_street = user.address.line1 + ' ' + user.address.line2
            if user.address.country:
                contact.mailing_country = user.address.country.name
            else:
                contact.mailing_country = ''
            contact.mailing_postal_code = user.address.postal_code
            contact.mailing_state = user.address.state
        else:
            contact.mailing_city = ''
            contact.mailing_street = ''
            contact.mailing_country = ''
            contact.mailing_postal_code = ''
            contact.mailing_state = ''

        # Determine if the user has activated himself, by default assume not
        # if this is a legacy record, by default assume it has activated
        contact.has_activated = False
        try:
            rp = RegistrationProfile.objects.get(user_id=user.id)
            contact.tags = rp.activation_key
            if rp.activation_key == RegistrationProfile.ACTIVATED:
                contact.has_activated = True
        except RegistrationProfile.DoesNotExist:
            if not user.is_active and user.date_joined == user.last_login:
                contact.has_activated = False
            else:
                contact.has_activated = True

        contact.last_login = user.last_login

        # Bank details of recurring payments
        try:
            monthly_donor = MonthlyDonor.objects.get(user=user)
            contact.bank_account_city = monthly_donor.city
            contact.bank_account_holder = monthly_donor.name
            contact.bank_account_number = ''
            contact.bank_account_iban = monthly_donor.iban
            contact.bank_account_active_recurring_debit = monthly_donor.active
        except MonthlyDonor.DoesNotExist:
            contact.bank_account_city = ''
            contact.bank_account_holder = ''
            contact.bank_account_number = ''
            contact.bank_account_iban = ''
            contact.bank_account_active_recurring_debit = False

        # Save the object to Salesforce
        if not dry_run:
            try:
                contact.save()
                success_count += 1
            except Exception as e:
                error_count += 1
                logger.error("Error while saving contact id {0}: ".format(user.id) + str(e))

    return success_count, error_count