Example #1
0
def create_askbot_user(zd_user):
    """Create askbot user from Zendesk User record

    Zendesk User fields that are copied over or otherwise translated:
        name
        username
        email
        Organization name matching organization_id
        is_verified
        is_active
        last_login
        created_at

    :param zd_user: (obj) zendesk_models.User object to create Askbot user
    from.

    :returns: (mixed) askbot user object or None if there is an error
    """
    if zd_user.email is None:
        username = zd_user.name.replace(" ", "_").lower()
        email = ''
    else:
        username = zd_user.email
        email = zd_user.email
    username = ensure_unique_username(username[:30])

    # last_seen cannot be null
    last_seen = zd_user.last_login
    if not last_seen:
        last_seen = zd_user.created_at

    # lookup organization name (todo: cache this)
    about = ''
    if zd_user.organization_id:
        try:
            org = zendesk_models.Organization.objects.get(
                organization_id=zd_user.organization_id)
            about = org.name
        except zendesk_models.Organization.DoesNotExist:
            pass

    ab_user = askbot_models.User(
        username=username,
        first_name=zd_user.name.rpartition(' ')[0].strip()[:30],
        last_name=zd_user.name.rpartition(' ')[2].strip()[:30],
        real_name=zd_user.name[:100],
        email=email,
        email_isvalid=zd_user.is_verified,
        date_joined=zd_user.created_at,
        last_seen=last_seen,
        is_active=zd_user.is_active,
    )
    ab_user.save()
    ab_user.update_localized_profile(about=about)
    return ab_user
 def parse_post(self, post):
     title = post.find('Subject').text
     added_at = parse_date(post.find('CreationDate').text)
     username = post.find('Username').text
     body = post.find('Body').text
     try:
         user = models.User.objects.get(username=username)
     except models.User.DoesNotExist:
         email = '*****@*****.**' % self.bad_email_count
         self.bad_email_count += 1
         user = models.User(username=username, email=email)
         user.save()
     return title, body, added_at, user
    def import_users(self, user_soup):
        """import users from jive to askbot"""

        message = 'Importing users:'
        for user in ProgressBar(iter(user_soup), len(user_soup), message):
            username = user.find('Username').text
            real_name = user.find('Name').text
            try:
                email = EmailField().clean(user.find('Email').text)
            except ValidationError:
                email = '*****@*****.**' % self.bad_email_count
                self.bad_email_count += 1

            joined_timestamp = parse_date(user.find('CreationDate').text)
            user = models.User(username=username,
                               email=email,
                               real_name=real_name,
                               date_joined=joined_timestamp)
            user.save()
            transaction.commit()
    def parse_post(self, post):
        title = post.find('Subject').text
        added_at = parse_date(post.find('CreationDate').text)
        username = post.find('Username').text
        body = post.find('Body').text
        attachments_soup = post.find_all('Attachment')
        attachments = list()
        for att in attachments_soup:
            att_id = att['id']
            name = att.find('Name').text
            content_type = att['contentType']
            attachments.append((att_id, name, content_type))

        try:
            user = models.User.objects.get(username=username)
        except models.User.DoesNotExist:
            email = '*****@*****.**' % self.bad_email_count
            self.bad_email_count += 1
            user = models.User(username=username, email=email)
            user.save()
        return int(post['id']), title, body, attachments, added_at, user
Example #5
0
    def transfer_users(self):
        for se_u in se.User.objects.all().iterator():
            #if se_u.id == -1:#skip the Community user
            #    continue
            u = askbot.User()
            u_type = se_u.user_type.name
            if u_type == 'Administrator':
                u.set_admin_status()
            elif u_type == 'Moderator':
                u.set_status('m')
            elif u_type not in ('Unregistered', 'Registered'):
                raise Exception('unknown user type %s' % u_type)

            if se_u.password_id is not None:
                pw = se.Password.objects.get(id=se_u.password_id)
                u.password = '******' % (pw.salt, pw.password)
            else:
                u.set_unusable_password()

            #if user is not registered, no association record created
            #we do not allow posting by users who are not authenticated
            #probably they'll just have to "recover" their account by email
            if u_type != 'Unregistered':
                try:
                    assert (se_u.open_id)  #everybody must have open_id
                    u_openid = askbot_openid.UserAssociation()
                    u_openid.openid_url = se_u.open_id
                    u.save()
                    u_openid.user = u
                    u_openid.last_used_timestamp = se_u.last_login_date
                    u_openid.save()
                except AssertionError:
                    print u'User %s (id=%d) does not have openid' % \
                            (unidecode(se_u.display_name), se_u.id)
                    sys.stdout.flush()
                except IntegrityError:
                    print "Warning: have duplicate openid: %s" % se_u.open_id
                    sys.stdout.flush()

            if se_u.open_id is None and se_u.email is None:
                print 'Warning: SE user %d is not recoverable (no email or openid)'
                sys.stdout.flush()

            u.reputation = 1  #se_u.reputation, it's actually re-computed
            u.last_seen = se_u.last_access_date
            u.email = X.get_email(se_u.email)
            u.location = X.blankable(se_u.location)
            u.date_of_birth = se_u.birthday  #dattime -> date
            u.website = X.blankable(se_u.website_url)
            u.about = X.blankable(se_u.about_me)
            if se_u.last_login_date is None:
                u.last_login = se_u.creation_date
            else:
                u.last_login = se_u.last_login_date
            u.date_joined = se_u.creation_date
            u.is_active = True  #todo: this may not be the case

            u.username = X.get_screen_name(se_u)
            u.real_name = X.blankable(se_u.real_name)

            (gold, silver, bronze) = X.parse_badge_summary(se_u.badge_summary)
            u.gold = gold
            u.silver = silver
            u.bronze = bronze

            #todo: we don't have these fields
            #views - number of profile views?
            #has_replies
            #has_message
            #opt_in_recruit
            #last_login_ip
            #open_id_alt - ??
            #preferences_raw - not clear how to use
            #display_name_cleaned - lowercased, srtipped name
            #timed_penalty_date
            #phone

            #don't know how to handle these - there was no usage example
            #password_id
            #guid

            #ignored
            #last_email_date - this translates directly to EmailFeedSetting.reported_at

            #save the data
            try:
                other = askbot.User.objects.get(username=u.username)
                print 'alert - have a second user with name %s' % u.username
                sys.sdtout.flush()
            except askbot.User.DoesNotExist:
                pass
            u.save()
            form = EditUserEmailFeedsForm()
            form.reset()
            if se_u.opt_in_email == True:  #set up daily subscription on "own" items
                form.initial['individually_selected'] = 'd'
                form.initial['asked_by_me'] = 'd'
                form.initial['answered_by_me'] = 'd'
            #
            form.save(user=u, save_unbound=True)
            USER[se_u.id] = u
# load admin user where a user is needed (eg. user who closed thread)
ADMIN_USER = askbot_models.User.objects.filter(is_superuser=True)[:1]
# option choices for what data to import from Zendesk
DATA_IMPORT_ALL = 0
DATA_IMPORT_FORUMS = 1
DATA_IMPORT_TICKETS = 2

# used for seeding Vote count when importing Zendesk Forum content
try:
    PHANTOM_VOTER_USER = askbot_models.User.objects.get(username='******')
except askbot_models.User.DoesNotExist:
    PHANTOM_VOTER_USER = askbot_models.User(
            username = '******',
            first_name = 'Phantom',
            last_name = 'Voter',
            real_name = 'Phantom Voter',
            date_joined = datetime.now(),
            is_active = False,
            about = 'Fake account for seeding vote counts during Zendesk import',
        ).save()

def ensure_unique_username(name_seed):
    """Returns unique user name, by modifying the name if the same name exists 
    in the database until the modified name is unique.

    :param name_seed: (str) proposed user name

    :returns: (str) validated unique user name
    """
    original_name = name_seed
    attempt_no = 1
Example #7
0
# load admin user where a user is needed (eg. user who closed thread)
ADMIN_USER = askbot_models.User.objects.filter(is_superuser=True)[:1]
# option choices for what data to import from Zendesk
DATA_IMPORT_ALL = 0
DATA_IMPORT_FORUMS = 1
DATA_IMPORT_TICKETS = 2

# used for seeding Vote count when importing Zendesk Forum content
try:
    PHANTOM_VOTER_USER = askbot_models.User.objects.get(
        username='******')
except askbot_models.User.DoesNotExist:
    PHANTOM_VOTER_USER = askbot_models.User(
        username='******',
        first_name='Phantom',
        last_name='Voter',
        real_name='Phantom Voter',
        date_joined=timezone.now(),
        is_active=False,
    ).save()
    about = 'Fake account for seeding vote counts during Zendesk import'
    PHANTOM_VOTE_USER.update_localized_profile(about=about)


def ensure_unique_username(name_seed):
    """Returns unique user name, by modifying the name if the same name exists
    in the database until the modified name is unique.

    :param name_seed: (str) proposed user name

    :returns: (str) validated unique user name
    """