pandora/pandora/user/utils.py

92 lines
2.8 KiB
Python

from django.contrib.gis.geoip2 import GeoIP2, GeoIP2Exception
import ox
def get_ip(request):
if 'HTTP_X_FORWARDED_FOR' in request.META:
ip = request.META['HTTP_X_FORWARDED_FOR'].split(',')[0]
else:
ip = request.META['REMOTE_ADDR']
if ip.startswith('::ffff:'):
ip = ip[len('::ffff:'):]
return ip
def get_location(ip):
country = city = None
try:
g = GeoIP2()
except:
country = city = None
else:
try:
location = g.city(ip)
except:
try:
location = g.country(ip)
except:
location = None
if location:
country = ox.get_country_name(location['country_code'])
if location.get('city'):
city = location['city']
if isinstance(city, bytes):
city = city.decode('latin-1')
return city, country
def rename_user(u, new):
import itemlist.models
import item.models
import user.models
old = u.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)
u.username = new
u.save()
def update_groups(model, groups):
from .models import Group
if isinstance(groups, list):
groups = list(filter(lambda g: g.strip(), groups))
groups = [ox.escape_html(g) for g in groups]
for g in model.groups.exclude(name__in=groups):
model.groups.remove(g)
current_groups = [g.name for g in model.groups.all()]
for g in list(filter(lambda g: g not in current_groups, groups)):
group, created = Group.objects.get_or_create(name=g)
model.groups.add(group)