Commit 1f3d2c24 by Andy Armstrong

Isolate Bok Choy tests to unique test users

parent 9907cb52
...@@ -17,7 +17,7 @@ class AccountSettingsPage(FieldsMixin, PageObject): ...@@ -17,7 +17,7 @@ class AccountSettingsPage(FieldsMixin, PageObject):
url = "{base}/{settings}".format(base=BASE_URL, settings='account/settings') url = "{base}/{settings}".format(base=BASE_URL, settings='account/settings')
def is_browser_on_page(self): def is_browser_on_page(self):
return 'Account Settings' in self.browser.title return self.q(css='.account-settings-container').present
def sections_structure(self): def sections_structure(self):
""" """
...@@ -31,8 +31,6 @@ class AccountSettingsPage(FieldsMixin, PageObject): ...@@ -31,8 +31,6 @@ class AccountSettingsPage(FieldsMixin, PageObject):
... ...
] ]
""" """
self.wait_for_ajax()
structure = [] structure = []
sections = self.q(css='.section') sections = self.q(css='.section')
......
...@@ -16,8 +16,6 @@ class FieldsMixin(object): ...@@ -16,8 +16,6 @@ class FieldsMixin(object):
""" """
Return field with field_id. Return field with field_id.
""" """
self.wait_for_ajax()
query = self.q(css='.u-field-{}'.format(field_id)) query = self.q(css='.u-field-{}'.format(field_id))
return query.text[0] if query.present else None return query.text[0] if query.present else None
......
...@@ -306,18 +306,20 @@ class EventsTestMixin(object): ...@@ -306,18 +306,20 @@ class EventsTestMixin(object):
self.event_collection.drop() self.event_collection.drop()
self.start_time = datetime.now() self.start_time = datetime.now()
def get_matching_events(self, event_type): def get_matching_events(self, username, event_type):
""" """
Returns a cursor for the matching browser events. Returns a cursor for the matching browser events.
""" """
return self.event_collection.find({ return self.event_collection.find({
"username": username,
"event_type": event_type, "event_type": event_type,
"time": {"$gt": self.start_time}, "time": {"$gt": self.start_time},
}) })
def verify_events_of_type(self, event_type, expected_events, expected_referers=None): def verify_events_of_type(self, username, event_type, expected_events, expected_referers=None):
"""Verify that the expected events of a given type were logged. """Verify that the expected events of a given type were logged.
Args: Args:
username (str): The name of the authenticated user.
event_type (str): The type of event to be verified. event_type (str): The type of event to be verified.
expected_events (list): A list of dicts representing the events that should expected_events (list): A list of dicts representing the events that should
have been fired. have been fired.
...@@ -328,12 +330,12 @@ class EventsTestMixin(object): ...@@ -328,12 +330,12 @@ class EventsTestMixin(object):
will verify that the referer for the single event ends with "/account/settings". will verify that the referer for the single event ends with "/account/settings".
""" """
EmptyPromise( EmptyPromise(
lambda: self.get_matching_events(event_type).count() >= len(expected_events), lambda: self.get_matching_events(username, event_type).count() >= len(expected_events),
"Waiting for the minimum number of events of type {type} to have been recorded".format(type=event_type) "Waiting for the minimum number of events of type {type} to have been recorded".format(type=event_type)
).fulfill() ).fulfill()
# Verify that the correct events were fired # Verify that the correct events were fired
cursor = self.get_matching_events(event_type) cursor = self.get_matching_events(username, event_type)
actual_events = [] actual_events = []
actual_referers = [] actual_referers = []
for __ in range(0, cursor.count()): for __ in range(0, cursor.count()):
......
...@@ -9,7 +9,6 @@ from bok_choy.web_app_test import WebAppTest ...@@ -9,7 +9,6 @@ from bok_choy.web_app_test import WebAppTest
from ...pages.lms.account_settings import AccountSettingsPage from ...pages.lms.account_settings import AccountSettingsPage
from ...pages.lms.auto_auth import AutoAuthPage from ...pages.lms.auto_auth import AutoAuthPage
from ...pages.lms.dashboard import DashboardPage from ...pages.lms.dashboard import DashboardPage
from ..helpers import EventsTestMixin
from ..helpers import EventsTestMixin from ..helpers import EventsTestMixin
...@@ -19,42 +18,41 @@ class AccountSettingsTestMixin(EventsTestMixin, WebAppTest): ...@@ -19,42 +18,41 @@ class AccountSettingsTestMixin(EventsTestMixin, WebAppTest):
Mixin with helper methods to test the account settings page. Mixin with helper methods to test the account settings page.
""" """
USERNAME = u"test"
PASSWORD = "testpass"
EMAIL = u"test@example.com"
CHANGE_INITIATED_EVENT_NAME = u"edx.user.settings.change_initiated" CHANGE_INITIATED_EVENT_NAME = u"edx.user.settings.change_initiated"
USER_SETTINGS_CHANGED_EVENT_NAME = 'edx.user.settings.changed' USER_SETTINGS_CHANGED_EVENT_NAME = 'edx.user.settings.changed'
ACCOUNT_SETTINGS_REFERER = u"/account/settings" ACCOUNT_SETTINGS_REFERER = u"/account/settings"
def setUp(self): def log_in_as_unique_user(self, email=None):
""" """
Initialize account and pages. Create a unique user and return the account's username and id.
""" """
super(AccountSettingsTestMixin, self).setUp() username = "test_{uuid}".format(uuid=self.unique_id[0:6])
auto_auth_page = AutoAuthPage(self.browser, username=username, email=email).visit()
user_id = auto_auth_page.get_user_id()
return username, user_id
self.user_id = AutoAuthPage( def assert_event_emitted_num_times(self, user_id, setting, num_times):
self.browser, username=self.USERNAME, password=self.PASSWORD, email=self.EMAIL
).visit().get_user_id()
def assert_event_emitted_num_times(self, setting, num_times):
""" """
Verify a particular user settings change event was emitted a certain Verify a particular user settings change event was emitted a certain
number of times. number of times.
""" """
# pylint disable=no-member # pylint disable=no-member
super(AccountSettingsTestMixin, self).assert_event_emitted_num_times( super(AccountSettingsTestMixin, self).assert_event_emitted_num_times(
self.USER_SETTINGS_CHANGED_EVENT_NAME, self.start_time, self.user_id, num_times, setting=setting self.USER_SETTINGS_CHANGED_EVENT_NAME, self.start_time, user_id, num_times, setting=setting
) )
def verify_settings_changed_events(self, events, table=None): def verify_settings_changed_events(self, username, user_id, events, table=None):
""" """
Verify a particular set of account settings change events were fired. Verify a particular set of account settings change events were fired.
""" """
expected_referers = [self.ACCOUNT_SETTINGS_REFERER] * len(events) expected_referers = [self.ACCOUNT_SETTINGS_REFERER] * len(events)
for event in events: for event in events:
event[u'user_id'] = long(self.user_id) event[u'user_id'] = long(user_id)
event[u'table'] = u"auth_userprofile" if table is None else table event[u'table'] = u"auth_userprofile" if table is None else table
self.verify_events_of_type(self.USER_SETTINGS_CHANGED_EVENT_NAME, events, expected_referers=expected_referers) self.verify_events_of_type(
username, self.USER_SETTINGS_CHANGED_EVENT_NAME, events,
expected_referers=expected_referers
)
class DashboardMenuTest(AccountSettingsTestMixin, WebAppTest): class DashboardMenuTest(AccountSettingsTestMixin, WebAppTest):
...@@ -71,6 +69,7 @@ class DashboardMenuTest(AccountSettingsTestMixin, WebAppTest): ...@@ -71,6 +69,7 @@ class DashboardMenuTest(AccountSettingsTestMixin, WebAppTest):
And I click on "Account Settings" in the top drop down And I click on "Account Settings" in the top drop down
Then I should see my account settings page Then I should see my account settings page
""" """
self.log_in_as_unique_user()
dashboard_page = DashboardPage(self.browser) dashboard_page = DashboardPage(self.browser)
dashboard_page.visit() dashboard_page.visit()
dashboard_page.click_username_dropdown() dashboard_page.click_username_dropdown()
...@@ -89,10 +88,16 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -89,10 +88,16 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
Initialize account and pages. Initialize account and pages.
""" """
super(AccountSettingsPageTest, self).setUp() super(AccountSettingsPageTest, self).setUp()
self.username, self.user_id = self.log_in_as_unique_user()
self.visit_account_settings_page()
# Visit the account settings page for the current user. def visit_account_settings_page(self):
"""
Visit the account settings page for the current user.
"""
self.account_settings_page = AccountSettingsPage(self.browser) self.account_settings_page = AccountSettingsPage(self.browser)
self.account_settings_page.visit() self.account_settings_page.visit()
self.account_settings_page.wait_for_ajax()
def test_page_view_event(self): def test_page_view_event(self):
""" """
...@@ -104,9 +109,10 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -104,9 +109,10 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
Then a page view analytics event should be recorded Then a page view analytics event should be recorded
""" """
self.verify_events_of_type( self.verify_events_of_type(
self.username,
u"edx.user.settings.viewed", u"edx.user.settings.viewed",
[{ [{
u"user_id": int(self.user_id), u"user_id": long(self.user_id),
u"page": u"account", u"page": u"account",
u"visibility": None, u"visibility": None,
}] }]
...@@ -195,6 +201,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -195,6 +201,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
self.account_settings_page.wait_for_loading_indicator() self.account_settings_page.wait_for_loading_indicator()
else: else:
self.browser.refresh() self.browser.refresh()
self.account_settings_page.wait_for_page()
self.assertEqual(self.account_settings_page.value_for_dropdown_field(field_id), new_value) self.assertEqual(self.account_settings_page.value_for_dropdown_field(field_id), new_value)
def _test_link_field(self, field_id, title, link_title, success_message): def _test_link_field(self, field_id, title, link_title, success_message):
...@@ -210,11 +217,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -210,11 +217,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
""" """
Test behaviour of "Username" field. Test behaviour of "Username" field.
""" """
self._test_readonly_field( self._test_readonly_field('username', 'Username', self.username)
'username',
'Username',
self.USERNAME,
)
def test_full_name_field(self): def test_full_name_field(self):
""" """
...@@ -223,21 +226,22 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -223,21 +226,22 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
self._test_text_field( self._test_text_field(
u'name', u'name',
u'Full Name', u'Full Name',
self.USERNAME, self.username,
u'@', u'@',
[u'another name', self.USERNAME], [u'another name', self.username],
) )
self.verify_settings_changed_events( self.verify_settings_changed_events(
self.username, self.user_id,
[{ [{
u"setting": u"name", u"setting": u"name",
u"old": self.USERNAME, u"old": self.username,
u"new": u"another name", u"new": u"another name",
}, },
{ {
u"setting": u"name", u"setting": u"name",
u"old": u'another name', u"old": u'another name',
u"new": self.USERNAME, u"new": self.username,
}] }]
) )
...@@ -245,10 +249,13 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -245,10 +249,13 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
""" """
Test behaviour of "Email" field. Test behaviour of "Email" field.
""" """
EMAIL = u"test@example.com"
username, user_id = self.log_in_as_unique_user(email=EMAIL)
self.visit_account_settings_page()
self._test_text_field( self._test_text_field(
u'email', u'email',
u'Email Address', u'Email Address',
self.EMAIL, EMAIL,
u'@', u'@',
[u'me@here.com', u'you@there.com'], [u'me@here.com', u'you@there.com'],
success_message='Click the link in the message to update your email address.', success_message='Click the link in the message to update your email address.',
...@@ -256,18 +263,19 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -256,18 +263,19 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
) )
self.verify_events_of_type( self.verify_events_of_type(
username,
self.CHANGE_INITIATED_EVENT_NAME, self.CHANGE_INITIATED_EVENT_NAME,
[ [
{ {
u"user_id": int(self.user_id), u"user_id": long(user_id),
u"setting": u"email", u"setting": u"email",
u"old": self.EMAIL, u"old": EMAIL,
u"new": u'me@here.com' u"new": u'me@here.com'
}, },
{ {
u"user_id": int(self.user_id), u"user_id": long(user_id),
u"setting": u"email", u"setting": u"email",
u"old": self.EMAIL, # NOTE the first email change was never confirmed, so old has not changed. u"old": EMAIL, # NOTE the first email change was never confirmed, so old has not changed.
u"new": u'you@there.com' u"new": u'you@there.com'
} }
], ],
...@@ -275,7 +283,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -275,7 +283,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
) )
# Email is not saved until user confirms, so no events should have been # Email is not saved until user confirms, so no events should have been
# emitted. # emitted.
self.assert_event_emitted_num_times('email', 0) self.assert_event_emitted_num_times(user_id, 'email', 0)
def test_password_field(self): def test_password_field(self):
""" """
...@@ -289,6 +297,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -289,6 +297,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
) )
self.verify_events_of_type( self.verify_events_of_type(
self.username,
self.CHANGE_INITIATED_EVENT_NAME, self.CHANGE_INITIATED_EVENT_NAME,
[{ [{
u"user_id": int(self.user_id), u"user_id": int(self.user_id),
...@@ -300,7 +309,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -300,7 +309,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
) )
# Like email, since the user has not confirmed their password change, # Like email, since the user has not confirmed their password change,
# the field has not yet changed, so no events will have been emitted. # the field has not yet changed, so no events will have been emitted.
self.assert_event_emitted_num_times('password', 0) self.assert_event_emitted_num_times(self.user_id, 'password', 0)
@skip( @skip(
'On bokchoy test servers, language changes take a few reloads to fully realize ' 'On bokchoy test servers, language changes take a few reloads to fully realize '
...@@ -329,6 +338,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -329,6 +338,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
[u'Bachelor\'s degree', u''], [u'Bachelor\'s degree', u''],
) )
self.verify_settings_changed_events( self.verify_settings_changed_events(
self.username, self.user_id,
[{ [{
u"setting": u"level_of_education", u"setting": u"level_of_education",
u"old": None, u"old": None,
...@@ -352,6 +362,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -352,6 +362,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
[u'Female', u''], [u'Female', u''],
) )
self.verify_settings_changed_events( self.verify_settings_changed_events(
self.username, self.user_id,
[{ [{
u"setting": u"gender", u"setting": u"gender",
u"old": None, u"old": None,
...@@ -378,6 +389,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -378,6 +389,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
[u'1980', u''], [u'1980', u''],
) )
self.verify_settings_changed_events( self.verify_settings_changed_events(
self.username, self.user_id,
[{ [{
u"setting": u"year_of_birth", u"setting": u"year_of_birth",
u"old": None, u"old": None,
...@@ -400,17 +412,21 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ...@@ -400,17 +412,21 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest):
u'', u'',
[u'Pakistan', u'Palau'], [u'Pakistan', u'Palau'],
) )
def test_country_field_events(self):
"""
Test that saving the country field records the correct events.
"""
self.reset_event_tracking()
self.assertEqual(self.account_settings_page.value_for_dropdown_field(u'country', u'Pakistan'), u'Pakistan')
self.account_settings_page.wait_for_messsage(u'country', self.SUCCESS_MESSAGE)
self.verify_settings_changed_events( self.verify_settings_changed_events(
self.username, self.user_id,
[{ [{
u"setting": u"country", u"setting": u"country",
u"old": None, u"old": None,
u"new": u'PK', u"new": u'PK',
}, }],
{
u"setting": u"country",
u"old": u'PK',
u"new": u'PW',
}]
) )
def test_preferred_language_field(self): def test_preferred_language_field(self):
......
...@@ -84,14 +84,15 @@ class LearnerProfileTestMixin(EventsTestMixin): ...@@ -84,14 +84,15 @@ class LearnerProfileTestMixin(EventsTestMixin):
str(birth_year) str(birth_year)
) )
def verify_profile_page_view_event(self, profile_user_id, visibility=None): def verify_profile_page_view_event(self, requesting_username, profile_user_id, visibility=None):
""" """
Verifies that the correct view event was captured for the profile page. Verifies that the correct view event was captured for the profile page.
""" """
self.verify_events_of_type( self.verify_events_of_type(
requesting_username,
u"edx.user.settings.viewed", u"edx.user.settings.viewed",
[{ [{
u"user_id": int(profile_user_id), u"user_id": long(profile_user_id),
u"page": u"profile", u"page": u"profile",
u"visibility": unicode(visibility), u"visibility": unicode(visibility),
}] }]
...@@ -180,7 +181,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): ...@@ -180,7 +181,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest):
self.assertTrue(profile_page.privacy_field_visible) self.assertTrue(profile_page.privacy_field_visible)
self.assertEqual(profile_page.visible_fields, self.PRIVATE_PROFILE_FIELDS) self.assertEqual(profile_page.visible_fields, self.PRIVATE_PROFILE_FIELDS)
self.verify_profile_page_view_event(user_id, visibility=self.PRIVACY_PRIVATE) self.verify_profile_page_view_event(username, user_id, visibility=self.PRIVACY_PRIVATE)
def test_fields_on_my_public_profile(self): def test_fields_on_my_public_profile(self):
""" """
...@@ -202,7 +203,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): ...@@ -202,7 +203,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest):
self.assertEqual(profile_page.editable_fields, self.PUBLIC_PROFILE_EDITABLE_FIELDS) self.assertEqual(profile_page.editable_fields, self.PUBLIC_PROFILE_EDITABLE_FIELDS)
self.verify_profile_page_view_event(user_id, visibility=self.PRIVACY_PUBLIC) self.verify_profile_page_view_event(username, user_id, visibility=self.PRIVACY_PUBLIC)
def _test_dropdown_field(self, profile_page, field_id, new_value, displayed_value, mode): def _test_dropdown_field(self, profile_page, field_id, new_value, displayed_value, mode):
""" """
...@@ -332,7 +333,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): ...@@ -332,7 +333,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest):
username, user_id = self.log_in_as_unique_user() username, user_id = self.log_in_as_unique_user()
message = "You must specify your birth year before you can share your full profile." message = "You must specify your birth year before you can share your full profile."
self.verify_profile_forced_private_message(username, birth_year=None, message=message) self.verify_profile_forced_private_message(username, birth_year=None, message=message)
self.verify_profile_page_view_event(user_id, visibility=self.PRIVACY_PRIVATE) self.verify_profile_page_view_event(username, user_id, visibility=self.PRIVACY_PRIVATE)
def test_user_is_under_age(self): def test_user_is_under_age(self):
""" """
...@@ -350,7 +351,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): ...@@ -350,7 +351,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest):
birth_year=under_age_birth_year, birth_year=under_age_birth_year,
message='You must be over 13 to share a full profile.' message='You must be over 13 to share a full profile.'
) )
self.verify_profile_page_view_event(user_id, visibility=self.PRIVACY_PRIVATE) self.verify_profile_page_view_event(username, user_id, visibility=self.PRIVACY_PRIVATE)
def test_user_can_only_see_default_image_for_private_profile(self): def test_user_can_only_see_default_image_for_private_profile(self):
""" """
...@@ -557,12 +558,12 @@ class DifferentUserLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): ...@@ -557,12 +558,12 @@ class DifferentUserLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest):
Then I see some of the profile fields are shown. Then I see some of the profile fields are shown.
""" """
different_username, different_user_id = self._initialize_different_user(privacy=self.PRIVACY_PRIVATE) different_username, different_user_id = self._initialize_different_user(privacy=self.PRIVACY_PRIVATE)
self.log_in_as_unique_user() username, __ = self.log_in_as_unique_user()
profile_page = self.visit_profile_page(different_username) profile_page = self.visit_profile_page(different_username)
self.assertFalse(profile_page.privacy_field_visible) self.assertFalse(profile_page.privacy_field_visible)
self.assertEqual(profile_page.visible_fields, self.PRIVATE_PROFILE_FIELDS) self.assertEqual(profile_page.visible_fields, self.PRIVATE_PROFILE_FIELDS)
self.verify_profile_page_view_event(different_user_id, visibility=self.PRIVACY_PRIVATE) self.verify_profile_page_view_event(username, different_user_id, visibility=self.PRIVACY_PRIVATE)
def test_different_user_under_age(self): def test_different_user_under_age(self):
""" """
...@@ -597,13 +598,13 @@ class DifferentUserLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): ...@@ -597,13 +598,13 @@ class DifferentUserLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest):
Also `location`, `language` and `about me` fields are not editable. Also `location`, `language` and `about me` fields are not editable.
""" """
different_username, different_user_id = self._initialize_different_user(privacy=self.PRIVACY_PUBLIC) different_username, different_user_id = self._initialize_different_user(privacy=self.PRIVACY_PUBLIC)
self.log_in_as_unique_user() username, __ = self.log_in_as_unique_user()
profile_page = self.visit_profile_page(different_username) profile_page = self.visit_profile_page(different_username)
profile_page.wait_for_public_fields() profile_page.wait_for_public_fields()
self.assertFalse(profile_page.privacy_field_visible) self.assertFalse(profile_page.privacy_field_visible)
self.assertEqual(profile_page.visible_fields, self.PUBLIC_PROFILE_FIELDS) self.assertEqual(profile_page.visible_fields, self.PUBLIC_PROFILE_FIELDS)
self.assertEqual(profile_page.editable_fields, []) self.assertEqual(profile_page.editable_fields, [])
self.verify_profile_page_view_event(different_user_id, visibility=self.PRIVACY_PUBLIC) self.verify_profile_page_view_event(username, different_user_id, visibility=self.PRIVACY_PUBLIC)
def _initialize_different_user(self, privacy=None, birth_year=None): def _initialize_different_user(self, privacy=None, birth_year=None):
""" """
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment