Allow users to customize their Discourse username
This commit is contained in:
parent
b0b480c95b
commit
bef5ac437a
|
@ -32,8 +32,8 @@ class Command(BaseCommand):
|
||||||
'protospace_instructors': [],
|
'protospace_instructors': [],
|
||||||
}
|
}
|
||||||
|
|
||||||
for user in User.objects.all():
|
for user in User.objects.filter(member__discourse_username__isnull=False):
|
||||||
username = user.username
|
username = user.member.discourse_username
|
||||||
|
|
||||||
# handle non-member vs. member
|
# handle non-member vs. member
|
||||||
if user.member.paused_date:
|
if user.member.paused_date:
|
||||||
|
|
|
@ -58,6 +58,7 @@ class Member(models.Model):
|
||||||
paused_date = models.DateField(blank=True, null=True)
|
paused_date = models.DateField(blank=True, null=True)
|
||||||
monthly_fees = models.IntegerField(default=55, blank=True, null=True)
|
monthly_fees = models.IntegerField(default=55, blank=True, null=True)
|
||||||
is_allowed_entry = models.BooleanField(default=True)
|
is_allowed_entry = models.BooleanField(default=True)
|
||||||
|
discourse_username = models.CharField(default=None, max_length=40, blank=True, null=True)
|
||||||
|
|
||||||
history = HistoricalRecords(excluded_fields=['member_forms'])
|
history = HistoricalRecords(excluded_fields=['member_forms'])
|
||||||
|
|
||||||
|
|
|
@ -210,6 +210,18 @@ class MemberSerializer(serializers.ModelSerializer):
|
||||||
instance.photo_medium = medium
|
instance.photo_medium = medium
|
||||||
instance.photo_large = large
|
instance.photo_large = large
|
||||||
|
|
||||||
|
if 'discourse_username' in validated_data:
|
||||||
|
changed = validated_data['discourse_username'] != instance.discourse_username
|
||||||
|
if changed and utils_auth.discourse_is_configured():
|
||||||
|
username = instance.discourse_username
|
||||||
|
new_username = validated_data['discourse_username']
|
||||||
|
logger.info('Changing discourse_username from %s to %s', username, new_username)
|
||||||
|
if utils_auth.change_discourse_username(username, new_username) != 200:
|
||||||
|
msg = 'Problem connecting to Discourse Auth server: change username.'
|
||||||
|
utils.alert_tanner(msg)
|
||||||
|
logger.info(msg)
|
||||||
|
raise ValidationError(dict(discourse_username='Invalid Discourse username.'))
|
||||||
|
|
||||||
return super().update(instance, validated_data)
|
return super().update(instance, validated_data)
|
||||||
|
|
||||||
# admin viewing member details
|
# admin viewing member details
|
||||||
|
@ -599,6 +611,8 @@ class MyPasswordChangeSerializer(PasswordChangeSerializer):
|
||||||
logger.info(msg)
|
logger.info(msg)
|
||||||
raise ValidationError(dict(non_field_errors=msg))
|
raise ValidationError(dict(non_field_errors=msg))
|
||||||
|
|
||||||
|
data['username'] = self.user.member.discourse_username or self.user.username
|
||||||
|
|
||||||
if utils_auth.discourse_is_configured():
|
if utils_auth.discourse_is_configured():
|
||||||
if request_id: utils_stats.set_progress(request_id, 'Changing Discourse password...')
|
if request_id: utils_stats.set_progress(request_id, 'Changing Discourse password...')
|
||||||
if utils_auth.set_discourse_password(data) != 200:
|
if utils_auth.set_discourse_password(data) != 200:
|
||||||
|
@ -606,6 +620,9 @@ class MyPasswordChangeSerializer(PasswordChangeSerializer):
|
||||||
utils.alert_tanner(msg)
|
utils.alert_tanner(msg)
|
||||||
logger.info(msg)
|
logger.info(msg)
|
||||||
raise ValidationError(dict(non_field_errors=msg))
|
raise ValidationError(dict(non_field_errors=msg))
|
||||||
|
if not self.user.member.discourse_username:
|
||||||
|
self.user.member.discourse_username = self.user.username
|
||||||
|
self.user.member.save()
|
||||||
|
|
||||||
if request_id: utils_stats.set_progress(request_id, 'Changing Spaceport password...')
|
if request_id: utils_stats.set_progress(request_id, 'Changing Spaceport password...')
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
@ -657,6 +674,8 @@ class MyPasswordResetConfirmSerializer(PasswordResetConfirmSerializer):
|
||||||
logger.info(msg)
|
logger.info(msg)
|
||||||
raise ValidationError(dict(non_field_errors=msg))
|
raise ValidationError(dict(non_field_errors=msg))
|
||||||
|
|
||||||
|
data['username'] = self.user.member.discourse_username or self.user.username
|
||||||
|
|
||||||
if utils_auth.discourse_is_configured():
|
if utils_auth.discourse_is_configured():
|
||||||
if request_id: utils_stats.set_progress(request_id, 'Changing Discourse password...')
|
if request_id: utils_stats.set_progress(request_id, 'Changing Discourse password...')
|
||||||
if utils_auth.set_discourse_password(data) != 200:
|
if utils_auth.set_discourse_password(data) != 200:
|
||||||
|
@ -664,6 +683,9 @@ class MyPasswordResetConfirmSerializer(PasswordResetConfirmSerializer):
|
||||||
utils.alert_tanner(msg)
|
utils.alert_tanner(msg)
|
||||||
logger.info(msg)
|
logger.info(msg)
|
||||||
raise ValidationError(dict(non_field_errors=msg))
|
raise ValidationError(dict(non_field_errors=msg))
|
||||||
|
if not self.user.member.discourse_username:
|
||||||
|
self.user.member.discourse_username = self.user.username
|
||||||
|
self.user.member.save()
|
||||||
|
|
||||||
member = self.user.member
|
member = self.user.member
|
||||||
logging.info('Password reset completed for: {} {} ({})'.format(member.first_name, member.last_name, member.id))
|
logging.info('Password reset completed for: {} {} ({})'.format(member.first_name, member.last_name, member.id))
|
||||||
|
@ -718,6 +740,12 @@ class SpaceportAuthSerializer(LoginSerializer):
|
||||||
data['first_name'] = user.member.first_name
|
data['first_name'] = user.member.first_name
|
||||||
|
|
||||||
utils_auth.set_wiki_password(data)
|
utils_auth.set_wiki_password(data)
|
||||||
|
|
||||||
|
data['username'] = user.member.discourse_username or user.username
|
||||||
utils_auth.set_discourse_password(data)
|
utils_auth.set_discourse_password(data)
|
||||||
|
|
||||||
|
if not user.member.discourse_username:
|
||||||
|
user.member.discourse_username = user.username
|
||||||
|
user.member.save()
|
||||||
|
|
||||||
return user
|
return user
|
||||||
|
|
|
@ -414,6 +414,9 @@ def register_user(data, user):
|
||||||
msg = 'Problem connecting to Discourse Auth server: set.'
|
msg = 'Problem connecting to Discourse Auth server: set.'
|
||||||
utils.alert_tanner(msg)
|
utils.alert_tanner(msg)
|
||||||
logger.info(msg)
|
logger.info(msg)
|
||||||
|
if not user.member.discourse_username:
|
||||||
|
user.member.discourse_username = user.username
|
||||||
|
user.member.save()
|
||||||
|
|
||||||
if utils_auth.discourse_is_configured():
|
if utils_auth.discourse_is_configured():
|
||||||
if data['request_id']: utils_stats.set_progress(data['request_id'], 'Adding to Discourse group...')
|
if data['request_id']: utils_stats.set_progress(data['request_id'], 'Adding to Discourse group...')
|
||||||
|
|
|
@ -51,3 +51,10 @@ def remove_discourse_group_members(group_name, usernames):
|
||||||
usernames=usernames,
|
usernames=usernames,
|
||||||
)
|
)
|
||||||
return auth_api(secrets.DISCOURSE_AUTH_API_URL + 'remove-discourse-group-members', json=json)
|
return auth_api(secrets.DISCOURSE_AUTH_API_URL + 'remove-discourse-group-members', json=json)
|
||||||
|
|
||||||
|
def change_discourse_username(username, new_username):
|
||||||
|
data = dict(
|
||||||
|
username=username,
|
||||||
|
new_username=new_username,
|
||||||
|
)
|
||||||
|
return auth_api(secrets.DISCOURSE_AUTH_API_URL + 'change-discourse-username', data=data)
|
||||||
|
|
|
@ -259,6 +259,11 @@ export function AccountForm(props) {
|
||||||
{...makeProps('emergency_contact_phone')}
|
{...makeProps('emergency_contact_phone')}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{member.discourse_username && <Form.Input
|
||||||
|
label='Discourse Username'
|
||||||
|
{...makeProps('discourse_username')}
|
||||||
|
/>}
|
||||||
|
|
||||||
<Form.Input
|
<Form.Input
|
||||||
label='Member Photo'
|
label='Member Photo'
|
||||||
name='photo'
|
name='photo'
|
||||||
|
|
|
@ -534,6 +534,11 @@ export function AdminMemberInfo(props) {
|
||||||
<Table.Cell>{member.user ? 'Yes' : 'No'}</Table.Cell>
|
<Table.Cell>{member.user ? 'Yes' : 'No'}</Table.Cell>
|
||||||
</Table.Row>
|
</Table.Row>
|
||||||
|
|
||||||
|
<Table.Row>
|
||||||
|
<Table.Cell>Discourse Username:</Table.Cell>
|
||||||
|
<Table.Cell>{member.discourse_username || '?'}</Table.Cell>
|
||||||
|
</Table.Row>
|
||||||
|
|
||||||
<Table.Row>
|
<Table.Row>
|
||||||
<Table.Cell>Public Bio:</Table.Cell>
|
<Table.Cell>Public Bio:</Table.Cell>
|
||||||
</Table.Row>
|
</Table.Row>
|
||||||
|
|
|
@ -137,7 +137,7 @@ export function AuthDiscourse(props) {
|
||||||
<Header size='small'>Success!</Header>
|
<Header size='small'>Success!</Header>
|
||||||
<p>You can now log into the Discourse:</p>
|
<p>You can now log into the Discourse:</p>
|
||||||
<p>
|
<p>
|
||||||
Username: {user.username}<br/>
|
Username: {user.member.discourse_username || user.username}<br/>
|
||||||
Password: [this Spaceport password]
|
Password: [this Spaceport password]
|
||||||
</p>
|
</p>
|
||||||
<p><a href='https://forum.protospace.ca' rel='noopener noreferrer'>Protospace Discourse</a></p>
|
<p><a href='https://forum.protospace.ca' rel='noopener noreferrer'>Protospace Discourse</a></p>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user