update user references if username gets changed

This commit is contained in:
j 2017-11-16 18:05:50 +01:00
parent 8c25aceb67
commit 3b73fe78bd
2 changed files with 48 additions and 3 deletions

View file

@ -27,3 +27,45 @@ def get_location(ip):
except: except:
country = city = None country = city = None
return city, country return city, country
def rename_user(user, new):
import itemlist.models
import item.models
import user.models
old = user.username
old_prefix = old + ':'
new_prefix = new + ':'
# update list queries matching user
for l in itemlist.models.List.objects.filter(query__contains=old_prefix):
changed = False
for q in l.query['conditions']:
if old_prefix in q['value']:
q['value'] = q['value'].replace(old_prefix, new_prefix)
changed = True
if changed:
l.save()
# update profile settings matching user
for p in user.models.UserProfile.objects.all():
changed = False
lists = list(p.ui.get('lists', {}))
for name in lists:
if name.startswith(old_prefix):
nname = name.replace(old_prefix, new_prefix)
p.ui['lists'][nname] = p.ui['lists'].pop(name)
changed = True
collections = list(p.ui.get('collections', {}))
for name in collections:
if name.startswith(old_prefix):
nname = name.replace(old_prefix, new_prefix)
p.ui['collections'][nname] = p.ui['collections'].pop(name)
changed = True
if changed:
p.save()
# update user item find
item.models.ItemFind.objects.filter(key='user', value=old).update(value=new)
user.username = new

View file

@ -29,6 +29,7 @@ from changelog.models import add_changelog
from . import models from . import models
from .decorators import capability_required_json from .decorators import capability_required_json
from .utils import rename_user
def get_user_or_404(data): def get_user_or_404(data):
@ -357,7 +358,7 @@ def editUser(request, data):
if 'email' in data: if 'email' in data:
if 'email' in data: if 'email' in data:
data['email'] = ox.escape_html(data['email']) data['email'] = ox.escape_html(data['email'])
if User.objects.filter(email__iexact=data['email']).exclude(id=user.id).count()>0: if User.objects.filter(email__iexact=data['email']).exclude(id=user.id).count() > 0:
response = json_response(status=403, text='email already in use') response = json_response(status=403, text='email already in use')
return render_to_json_response(response) return render_to_json_response(response)
user.email = data['email'] user.email = data['email']
@ -380,10 +381,12 @@ def editUser(request, data):
user.groups.add(group) user.groups.add(group)
if 'username' in data: if 'username' in data:
if User.objects.filter( if User.objects.filter(
username__iexact=data['username']).exclude(id=user.id).count()>0: username__iexact=data['username']).exclude(id=user.id).count() > 0:
response = json_response(status=403, text='username already in use') response = json_response(status=403, text='username already in use')
return render_to_json_response(response) return render_to_json_response(response)
user.username = data['username'] else:
rename_user(user, data['username'])
profile = models.UserProfile.objects.get(pk=user.pk)
user.save() user.save()
profile.save() profile.save()
add_changelog(request, data, user.username) add_changelog(request, data, user.username)