From 989e9f9465e2f234c4709aa6fa726943c7916594 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 10 Jan 2020 15:57:36 +0300 Subject: [PATCH] last country --- apps/account/admin.py | 4 +-- .../migrations/0031_user_last_country.py | 20 +++++++++++++++ apps/account/models.py | 8 ++++++ apps/account/serializers/back.py | 16 +++++++++++- apps/main/models.py | 4 +++ apps/utils/middleware.py | 25 ++++++++++++++++--- 6 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 apps/account/migrations/0031_user_last_country.py diff --git a/apps/account/admin.py b/apps/account/admin.py index 19eaab5d..0a6de6a0 100644 --- a/apps/account/admin.py +++ b/apps/account/admin.py @@ -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', diff --git a/apps/account/migrations/0031_user_last_country.py b/apps/account/migrations/0031_user_last_country.py new file mode 100644 index 00000000..06a92db5 --- /dev/null +++ b/apps/account/migrations/0031_user_last_country.py @@ -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'), + ), + ] diff --git a/apps/account/models.py b/apps/account/models.py index 0302ba50..5e280919 100644 --- a/apps/account/models.py +++ b/apps/account/models.py @@ -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' diff --git a/apps/account/serializers/back.py b/apps/account/serializers/back.py index b6ef5bc5..4c810ee7 100644 --- a/apps/account/serializers/back.py +++ b/apps/account/serializers/back.py @@ -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) diff --git a/apps/main/models.py b/apps/main/models.py index 296e847c..63a65062 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -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.""" diff --git a/apps/utils/middleware.py b/apps/utils/middleware.py index a1f0f382..c772e645 100644 --- a/apps/utils/middleware.py +++ b/apps/utils/middleware.py @@ -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