last country

This commit is contained in:
alex 2020-01-10 15:57:36 +03:00
parent e8538d4fc2
commit 989e9f9465
6 changed files with 70 additions and 7 deletions

View File

@ -24,7 +24,7 @@ class UserAdmin(BaseUserAdmin):
list_filter = ('is_active', 'is_staff', 'is_superuser', 'email_confirmed',
'groups',)
search_fields = ('email', 'first_name', 'last_name')
readonly_fields = ('last_login', 'date_joined', 'image_preview', 'cropped_image_preview', 'last_ip')
readonly_fields = ('last_login', 'date_joined', 'image_preview', 'cropped_image_preview', 'last_ip', 'last_country')
fieldsets = (
(None, {'fields': ('email', 'password',)}),
(_('Personal info'), {
@ -36,7 +36,7 @@ class UserAdmin(BaseUserAdmin):
'newsletter',
)
}),
(_('Important dates'), {'fields': ('last_login', 'date_joined', 'last_ip')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined', 'last_ip', 'last_country')}),
(_('Permissions'), {
'fields': (
'is_active', 'is_staff', 'is_superuser', 'email_confirmed',

View File

@ -0,0 +1,20 @@
# Generated by Django 2.2.7 on 2020-01-10 12:10
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('main', '0045_carousel_is_international'),
('account', '0030_user_last_ip'),
]
operations = [
migrations.AddField(
model_name='user',
name='last_country',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='main.SiteSettings', verbose_name='last site settings'),
),
]

View File

@ -137,6 +137,14 @@ class User(AbstractUser):
city = models.TextField(default=None, blank=True, null=True,
verbose_name=_('User last visited from city'))
last_ip = models.GenericIPAddressField(_('last IP address'), blank=True, null=True, default=None)
last_country = models.ForeignKey(
SiteSettings,
verbose_name=_('last site settings'),
blank=True,
null=True,
default=None,
on_delete=models.SET_NULL,
)
EMAIL_FIELD = 'email'
USERNAME_FIELD = 'username'

View File

@ -2,6 +2,7 @@
from rest_framework import serializers
from account import models
from account.models import User
from main.models import SiteSettings
class RoleSerializer(serializers.ModelSerializer):
@ -13,7 +14,19 @@ class RoleSerializer(serializers.ModelSerializer):
]
class _SiteSettingsSerializer(serializers.ModelSerializer):
class Meta:
model = SiteSettings
fields = (
'id',
'subdomain',
'country_code',
)
class BackUserSerializer(serializers.ModelSerializer):
last_country = _SiteSettingsSerializer(read_only=True)
class Meta:
model = User
fields = (
@ -37,11 +50,12 @@ class BackUserSerializer(serializers.ModelSerializer):
'city',
'locale',
'last_ip',
'last_country',
)
extra_kwargs = {
'password': {'write_only': True},
}
read_only_fields = ('old_password', 'last_login', 'date_joined', 'city', 'locale', 'last_ip')
read_only_fields = ('old_password', 'last_login', 'date_joined', 'city', 'locale', 'last_ip', 'last_country')
def create(self, validated_data):
user = super().create(validated_data)

View File

@ -103,6 +103,10 @@ class SiteSettings(ProjectBaseMixin):
subdomain=self.subdomain,
domain=settings.SITE_DOMAIN_URI)
@property
def country_code(self):
return self.country.code
class Feature(ProjectBaseMixin, PlatformMixin):
"""Feature model."""

View File

@ -4,6 +4,7 @@ from django.utils import translation, timezone
from account.models import User
from configuration.models import TranslationSettings
from main.methods import determine_user_city
from main.models import SiteSettings
from translation.models import Language
@ -64,14 +65,30 @@ def get_client_ip(request):
def user_last_ip(get_response):
"""Update user last ip address"""
"""Update user last ip address and last country"""
def middleware(request):
response = get_response(request)
current_ip = get_client_ip(request)
country_code = request.COOKIES.get('country_code')
current_site = SiteSettings.objects.by_country_code(country_code).first()
if not current_site:
current_site = SiteSettings.objects.filter(subdomain='www').first()
if request.user.is_authenticated:
User.objects.filter(pk=request.user.pk).update(**{
'last_ip': get_client_ip(request),
})
payload = {}
if request.user.last_ip != current_ip:
payload.update({
'last_ip': current_ip,
})
if request.user.last_country != current_site:
payload.update({
'last_country': current_site,
})
if payload:
User.objects.filter(pk=request.user.pk).update(**payload)
return response
return middleware