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
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
# 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 """