Skip to content

Commit

Permalink
Remove User.last_name; rename User.first_name
Browse files Browse the repository at this point in the history
  • Loading branch information
dcramer committed Dec 8, 2015
1 parent aa5a57c commit 14997a2
Show file tree
Hide file tree
Showing 16 changed files with 504 additions and 34 deletions.
2 changes: 2 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ Schema Changes
- Added ``GroupSnooze`` table.
- Added ``GroupResolution`` table.
- Added ``GroupBookmark.date_added`` column.
- Removed ``User.last_name`` column.
- (App-only) Renamed ``User.first_name`` to ``User.name``.

Version 7.7.1
-------------
Expand Down
6 changes: 3 additions & 3 deletions src/sentry/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ class UserAdmin(admin.ModelAdmin):
change_user_password_template = None
fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
(_('Personal info'), {'fields': ('name', 'email')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
Expand All @@ -180,9 +180,9 @@ class UserAdmin(admin.ModelAdmin):
form = UserChangeForm
add_form = UserCreationForm
change_password_form = AdminPasswordChangeForm
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'date_joined')
list_display = ('username', 'email', 'name', 'is_staff', 'date_joined')
list_filter = ('is_staff', 'is_superuser', 'is_active', 'is_managed')
search_fields = ('username', 'first_name', 'last_name', 'email')
search_fields = ('username', 'name', 'email')
ordering = ('username',)
inlines = (OrganizationMemberInline, AuthIdentityInline)

Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/user_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@


class UserSerializer(serializers.ModelSerializer):
name = serializers.CharField(source='first_name')
name = serializers.CharField()

class Meta:
model = User
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/auth/helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ def _handle_new_user(self, identity):
user = User.objects.create(
username=uuid4().hex,
email=identity['email'],
first_name=identity.get('name', '')[:200],
name=identity.get('name', '')[:200],
is_managed=True,
)

Expand Down
2 changes: 1 addition & 1 deletion src/sentry/conf/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -829,7 +829,7 @@ def create_partitioned_queues(name):

# Fields which managed users cannot change via Sentry UI. Username and password
# cannot be changed by managed users. Optionally include 'email' and
# 'first_name' in SENTRY_MANAGED_USER_FIELDS.
# 'name' in SENTRY_MANAGED_USER_FIELDS.
SENTRY_MANAGED_USER_FIELDS = ('email',)

SENTRY_SCOPES = set([
Expand Down

Large diffs are not rendered by default.

11 changes: 5 additions & 6 deletions src/sentry/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,10 @@ class UserManager(BaseManager, UserManager):
class User(BaseModel, AbstractBaseUser):
id = BoundedAutoField(primary_key=True)
username = models.CharField(_('username'), max_length=128, unique=True)
# this field is called first_name for legacy reasons, but it is the entire
# this column is called first_name for legacy reasons, but it is the entire
# display name
first_name = models.CharField(_('first name'), max_length=200, blank=True)
# last_name is not used
last_name = models.CharField(_('last name'), max_length=30, blank=True)
name = models.CharField(_('name'), max_length=200, blank=True,
db_column='first_name')
email = models.EmailField(_('email address'), blank=True)
is_staff = models.BooleanField(
_('staff status'), default=False,
Expand Down Expand Up @@ -80,10 +79,10 @@ def has_module_perms(self, app_label):
return self.is_superuser

def get_display_name(self):
return self.first_name or self.email or self.username
return self.name or self.email or self.username

def get_full_name(self):
return self.first_name
return self.name

def get_short_name(self):
return self.username
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/templates/sentry/account/settings.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

<legend style="margin-top: 0;">Your details</legend>

{% with form.first_name as field %}
{% with form.name as field %}
{{ field|as_crispy_field }}
{% endwith %}
{% if form.username %}
Expand Down
4 changes: 2 additions & 2 deletions src/sentry/templates/sentry/admin/users/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ <h3 class="no-border">{% trans "Users" %}</h3>
{% endif %}
<br/>
<small>
{% if user.first_name %}
{{ user.first_name }} ({{ user.email }})
{% if user.name %}
{{ user.name }} ({{ user.email }})
{% else %}
{{ user.email }}
{% endif %}
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/templatetags/sentry_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,7 @@ def basename(value):

@register.filter
def user_display_name(user):
return user.first_name or user.username
return user.name or user.username


@register.simple_tag(takes_context=True)
Expand Down
6 changes: 3 additions & 3 deletions src/sentry/web/forms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,15 @@ def clean_headers(self):

class BaseUserForm(forms.ModelForm):
email = forms.EmailField()
first_name = forms.CharField(required=True, label=_('Name'))
name = forms.CharField(required=True, label=_('Name'))


class NewUserForm(BaseUserForm):
send_welcome_mail = forms.BooleanField(required=False,
help_text=_("Send this user a welcome email which will contain their generated password."))

class Meta:
fields = ('first_name', 'username', 'email')
fields = ('name', 'username', 'email')
model = User


Expand All @@ -58,7 +58,7 @@ class ChangeUserForm(BaseUserForm):
'explicitly assigning them.'))

class Meta:
fields = ('first_name', 'username', 'email', 'is_active', 'is_staff',
fields = ('name', 'username', 'email', 'is_active', 'is_staff',
'is_superuser')
model = User

Expand Down
14 changes: 7 additions & 7 deletions src/sentry/web/forms/accounts.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ def save(self):
class AccountSettingsForm(forms.Form):
username = forms.CharField(label=_('Username'), max_length=128)
email = forms.EmailField(label=_('Email'))
first_name = forms.CharField(required=True, label=_('Name'), max_length=30)
name = forms.CharField(required=True, label=_('Name'), max_length=30)
new_password = forms.CharField(label=_('New password'), widget=forms.PasswordInput, required=False)

def __init__(self, user, *args, **kwargs):
Expand All @@ -263,8 +263,8 @@ def __init__(self, user, *args, **kwargs):

if self.user.is_managed:
# username and password always managed, email and
# first_name optionally managed
for field in ('email', 'first_name', 'username'):
# name optionally managed
for field in ('email', 'name', 'username'):
if field == 'username' or field in settings.SENTRY_MANAGED_USER_FIELDS:
self.fields[field] = ReadOnlyTextField(label=self.fields[field].label)
# don't show password field at all
Expand All @@ -276,7 +276,7 @@ def __init__(self, user, *args, **kwargs):

def is_readonly(self):
if self.user.is_managed:
return set(('email', 'first_name')) == set(settings.SENTRY_MANAGED_USER_FIELDS)
return set(('email', 'name')) == set(settings.SENTRY_MANAGED_USER_FIELDS)
return False

def _clean_managed_field(self, field):
Expand All @@ -288,8 +288,8 @@ def _clean_managed_field(self, field):
def clean_email(self):
return self._clean_managed_field('email')

def clean_first_name(self):
return self._clean_managed_field('first_name')
def clean_name(self):
return self._clean_managed_field('name')

def clean_username(self):
value = self._clean_managed_field('username')
Expand All @@ -300,7 +300,7 @@ def clean_username(self):
def save(self, commit=True):
if self.cleaned_data.get('new_password'):
self.user.set_password(self.cleaned_data['new_password'])
self.user.first_name = self.cleaned_data['first_name']
self.user.name = self.cleaned_data['name']

if self.cleaned_data['email'] != self.user.email:
new_username = self.user.email == self.user.username
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/web/frontend/accounts.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ def settings(request):
form = AccountSettingsForm(request.user, request.POST or None, initial={
'email': request.user.email,
'username': request.user.username,
'first_name': request.user.first_name,
'name': request.user.name,
})
if form.is_valid():
form.save()
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/web/frontend/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ def manage_users(request):
elif sort == 'login':
order_by = '-last_login'
elif sort == 'name':
order_by = 'first_name'
order_by = 'name'

user_list = user_list.order_by(order_by)

Expand Down
2 changes: 1 addition & 1 deletion tests/sentry/api/endpoints/test_user_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,5 @@ def test_simple(self):
assert resp.data['id'] == str(user.id)

user = User.objects.get(id=user.id)
assert user.first_name == 'hello world'
assert user.name == 'hello world'
assert user.email == 'b@example.com'
10 changes: 5 additions & 5 deletions tests/sentry/web/frontend/accounts/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def params(self, without=()):
params = {
'username': 'foobar',
'email': 'foo@example.com',
'first_name': 'Foo bar',
'name': 'Foo bar',
}
return dict((k, v) for k, v in params.iteritems() if k not in without)

Expand All @@ -78,14 +78,14 @@ def test_requires_email(self):
assert 'form' in resp.context
assert 'email' in resp.context['form'].errors

def test_requires_first_name(self):
def test_requires_name(self):
self.login_as(self.user)

resp = self.client.post(self.path, self.params(without=['first_name']))
resp = self.client.post(self.path, self.params(without=['name']))
assert resp.status_code == 200
self.assertTemplateUsed('sentry/account/settings.html')
assert 'form' in resp.context
assert 'first_name' in resp.context['form'].errors
assert 'name' in resp.context['form'].errors

def test_minimum_valid_params(self):
self.login_as(self.user)
Expand All @@ -95,7 +95,7 @@ def test_minimum_valid_params(self):
resp = self.client.post(self.path, params)
assert resp.status_code == 302
user = User.objects.get(id=self.user.id)
assert user.first_name == params['first_name']
assert user.name == params['name']
assert user.email == params['email']

def test_can_change_password(self):
Expand Down

0 comments on commit 14997a2

Please sign in to comment.