diff --git a/config/settings.py b/config/settings.py index 6778982..3091d3f 100644 --- a/config/settings.py +++ b/config/settings.py @@ -149,6 +149,9 @@ MEDIA_ROOT = BASE_DIR / "media/" +AUTH_USER_MODEL = 'rog.CustomUser' + + # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field diff --git a/rog/admin.py b/rog/admin.py index fded166..50697ad 100644 --- a/rog/admin.py +++ b/rog/admin.py @@ -2,8 +2,8 @@ from django.contrib import admin from leaflet.admin import LeafletGeoAdmin from leaflet.admin import LeafletGeoAdminMixin from leaflet_admin_list.admin import LeafletAdminListMixin -from .models import RogUser, Location, SystemSettings, JoinedEvent, Favorite, TravelList, TravelPoint, ShapeLayers, Event, Location_line, Location_polygon, JpnAdminMainPerf, JpnAdminPerf, JpnSubPerf - +from .models import RogUser, Location, SystemSettings, JoinedEvent, Favorite, TravelList, TravelPoint, ShapeLayers, Event, Location_line, Location_polygon, JpnAdminMainPerf, JpnAdminPerf, JpnSubPerf, Useractions, CustomUser +from django.contrib.auth.admin import UserAdmin class RogAdmin(LeafletAdminListMixin, LeafletGeoAdminMixin, admin.ModelAdmin): list_display=['title', 'venue', 'at_date',] @@ -17,6 +17,23 @@ class EventRouteAdmin(LeafletAdminListMixin, LeafletGeoAdminMixin, admin.ModelAd class ShopRouteAdmin(LeafletAdminListMixin, LeafletGeoAdminMixin, admin.ModelAdmin): list_display=['name',] +class UserAdminConfig(UserAdmin): + search_fields = ('email',) + list_filter = ('email',) + ordering = ('email',) + list_display = ('email', 'is_active', 'is_staff',) + + fieldsets = ( + (None, {'fields':('email',)}), + ('Permissions', {'fields':('is_staff', 'is_active',)}), + ) + + add_fieldsets = ( + (None, {'classes':('wide',), 'fields':('email','password1', 'password2')}), + ) + +admin.site.register(Useractions) + admin.site.register(RogUser, admin.ModelAdmin) admin.site.register(Location, LeafletGeoAdmin) admin.site.register(SystemSettings, admin.ModelAdmin) @@ -30,4 +47,6 @@ admin.site.register(Location_polygon, LeafletGeoAdmin) admin.site.register(JpnAdminMainPerf, LeafletGeoAdmin) #admin.site.register(JpnAdminPerf, LeafletGeoAdmin) admin.site.register(JpnSubPerf, LeafletGeoAdmin) -admin.site.register(ShapeLayers, admin.ModelAdmin) \ No newline at end of file +admin.site.register(ShapeLayers, admin.ModelAdmin) + +admin.site.register(CustomUser, UserAdminConfig) \ No newline at end of file diff --git a/rog/migrations/0001_initial.py b/rog/migrations/0001_initial.py index 202124d..d1ce57f 100644 --- a/rog/migrations/0001_initial.py +++ b/rog/migrations/0001_initial.py @@ -1,9 +1,10 @@ -# Generated by Django 3.2.9 on 2022-03-16 11:00 +# Generated by Django 3.2.9 on 2022-05-04 15:05 from django.conf import settings import django.contrib.gis.db.models.fields from django.db import migrations, models import django.db.models.deletion +import rog.models class Migration(migrations.Migration): @@ -11,7 +12,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('auth', '0012_alter_user_first_name_max_length'), ] operations = [ @@ -53,18 +54,57 @@ class Migration(migrations.Migration): 'managed': False, }, ), + migrations.CreateModel( + name='JpnSubPerf', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('geom', django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)), + ('adm0_en', models.CharField(blank=True, max_length=254, null=True)), + ('adm0_ja', models.CharField(blank=True, max_length=254, null=True)), + ('adm0_pcode', models.CharField(blank=True, max_length=254, null=True)), + ('adm1_en', models.CharField(blank=True, max_length=254, null=True)), + ('adm1_ja', models.CharField(blank=True, max_length=254, null=True)), + ('adm1_pcode', models.CharField(blank=True, max_length=254, null=True)), + ('adm2_ja', models.CharField(blank=True, max_length=254, null=True)), + ('adm2_en', models.CharField(blank=True, max_length=254, null=True)), + ('adm2_pcode', models.CharField(blank=True, max_length=254, null=True)), + ], + options={ + 'db_table': 'jpn_sub_perf', + 'managed': False, + }, + ), + migrations.CreateModel( + name='CustomUser', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('email', models.EmailField(max_length=254, unique=True, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False)), + ('is_active', models.BooleanField(default=False)), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), + ], + options={ + 'abstract': False, + }, + ), migrations.CreateModel( name='Location', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('location_id', models.IntegerField(blank=True, null=True, verbose_name='Location id')), - ('location_name', models.CharField(max_length=255, verbose_name='Location Name')), + ('location_name', models.CharField(default='--- 場所をお願いします --', max_length=255, verbose_name='Location Name')), ('category', models.CharField(blank=True, max_length=255, null=True, verbose_name='Category')), ('zip', models.CharField(blank=True, max_length=12, null=True, verbose_name='Zip code')), ('address', models.CharField(blank=True, max_length=512, null=True, verbose_name='Address')), ('prefecture', models.CharField(blank=True, max_length=255, null=True, verbose_name='Prefecture')), ('area', models.CharField(blank=True, max_length=255, null=True, verbose_name='Area')), ('city', models.CharField(blank=True, max_length=255, null=True, verbose_name='City')), + ('latitude', models.FloatField(blank=True, null=True, verbose_name='Latitude')), + ('longitude', models.FloatField(blank=True, null=True, verbose_name='Latitude')), ('photos', models.CharField(blank=True, max_length=255, null=True, verbose_name='Phptos')), ('videos', models.CharField(blank=True, max_length=255, null=True, verbose_name='Videos')), ('webcontents', models.CharField(blank=True, max_length=255, null=True, verbose_name='Web Content')), @@ -89,12 +129,24 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, verbose_name='Shape Layer')), - ('file', models.FileField(blank=True, upload_to='%y%m%d')), + ('file', models.FileField(blank=True, upload_to=rog.models.get_file_path)), ('uploaded_date', models.DateField(auto_now_add=True)), - ('layerof', models.IntegerField(choices=[(1, 'locations'), (2, 'Location_line'), (3, 'Location_polygon')], default=1)), + ('layerof', models.IntegerField(choices=[(1, 'location'), (2, 'Location_line'), (3, 'Location_polygon')], default=1)), ('table_name', models.CharField(blank=True, max_length=255, verbose_name='Table name')), ], ), + migrations.CreateModel( + name='TestModel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('testbane', models.CharField(max_length=355, verbose_name='test field')), + ('wanttogo', models.BooleanField(default=False)), + ('like', models.BooleanField(default=False)), + ('checkin', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('last_updated_at', models.DateTimeField(auto_now=True)), + ], + ), migrations.CreateModel( name='TravelList', fields=[ @@ -115,6 +167,19 @@ class Migration(migrations.Migration): ('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL)), ], ), + migrations.CreateModel( + name='Useractions', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('wanttogo', models.BooleanField(default=False)), + ('like', models.BooleanField(default=False)), + ('checkin', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('last_updated_at', models.DateTimeField(auto_now=True)), + ('location', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='action_location', to='rog.location')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='action_user', to=settings.AUTH_USER_MODEL)), + ], + ), migrations.CreateModel( name='TravelPoint', fields=[ diff --git a/rog/migrations/0002_alter_shapelayers_file.py b/rog/migrations/0002_alter_shapelayers_file.py deleted file mode 100644 index de32d10..0000000 --- a/rog/migrations/0002_alter_shapelayers_file.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.9 on 2022-03-23 06:42 - -from django.db import migrations, models -import rog.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('rog', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='shapelayers', - name='file', - field=models.FileField(blank=True, upload_to=rog.models.get_file_path), - ), - ] diff --git a/rog/migrations/0002_auto_20220511_2017.py b/rog/migrations/0002_auto_20220511_2017.py new file mode 100644 index 0000000..73d7f4a --- /dev/null +++ b/rog/migrations/0002_auto_20220511_2017.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.9 on 2022-05-11 11:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rog', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='useractions', + name='order', + field=models.IntegerField(default=-1), + ), + migrations.AlterField( + model_name='customuser', + name='is_active', + field=models.BooleanField(default=True), + ), + ] diff --git a/rog/migrations/0003_alter_useractions_order.py b/rog/migrations/0003_alter_useractions_order.py new file mode 100644 index 0000000..9b6cb51 --- /dev/null +++ b/rog/migrations/0003_alter_useractions_order.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2022-05-11 17:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rog', '0002_auto_20220511_2017'), + ] + + operations = [ + migrations.AlterField( + model_name='useractions', + name='order', + field=models.IntegerField(default=0), + ), + ] diff --git a/rog/migrations/0003_auto_20220407_1420.py b/rog/migrations/0003_auto_20220407_1420.py deleted file mode 100644 index 7842bdb..0000000 --- a/rog/migrations/0003_auto_20220407_1420.py +++ /dev/null @@ -1,129 +0,0 @@ -# Generated by Django 3.2.9 on 2022-04-07 05:20 - -import django.contrib.gis.db.models.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('rog', '0002_alter_shapelayers_file'), - ] - - operations = [ - migrations.CreateModel( - name='JpnSubPerf', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('geom', django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)), - ('adm0_en', models.CharField(blank=True, max_length=254, null=True)), - ('adm0_ja', models.CharField(blank=True, max_length=254, null=True)), - ('adm0_pcode', models.CharField(blank=True, max_length=254, null=True)), - ('adm1_en', models.CharField(blank=True, max_length=254, null=True)), - ('adm1_ja', models.CharField(blank=True, max_length=254, null=True)), - ('adm1_pcode', models.CharField(blank=True, max_length=254, null=True)), - ('adm2_ja', models.CharField(blank=True, max_length=254, null=True)), - ('adm2_en', models.CharField(blank=True, max_length=254, null=True)), - ('adm2_pcode', models.CharField(blank=True, max_length=254, null=True)), - ], - options={ - 'db_table': 'jpn_sub_perf', - 'managed': False, - }, - ), - migrations.AlterField( - model_name='location', - name='address', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Address'), - ), - migrations.AlterField( - model_name='location', - name='area', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Area'), - ), - migrations.AlterField( - model_name='location', - name='category', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Category'), - ), - migrations.AlterField( - model_name='location', - name='city', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='City'), - ), - migrations.AlterField( - model_name='location', - name='email', - field=models.EmailField(blank=True, max_length=1024, null=True, verbose_name='Email'), - ), - migrations.AlterField( - model_name='location', - name='facility', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Facility'), - ), - migrations.AlterField( - model_name='location', - name='fax', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Fax'), - ), - migrations.AlterField( - model_name='location', - name='group', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Group'), - ), - migrations.AlterField( - model_name='location', - name='location_name', - field=models.CharField(max_length=1024, verbose_name='Location Name'), - ), - migrations.AlterField( - model_name='location', - name='parammeters', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Parameters'), - ), - migrations.AlterField( - model_name='location', - name='phone', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Phone'), - ), - migrations.AlterField( - model_name='location', - name='photos', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Phptos'), - ), - migrations.AlterField( - model_name='location', - name='portal', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Portal'), - ), - migrations.AlterField( - model_name='location', - name='prefecture', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Prefecture'), - ), - migrations.AlterField( - model_name='location', - name='remark', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Remarks'), - ), - migrations.AlterField( - model_name='location', - name='status', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Status'), - ), - migrations.AlterField( - model_name='location', - name='tags', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Tags'), - ), - migrations.AlterField( - model_name='location', - name='videos', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Videos'), - ), - migrations.AlterField( - model_name='location', - name='webcontents', - field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='Web Content'), - ), - ] diff --git a/rog/migrations/0004_alter_location_webcontents.py b/rog/migrations/0004_alter_location_webcontents.py deleted file mode 100644 index af5de6e..0000000 --- a/rog/migrations/0004_alter_location_webcontents.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.9 on 2022-04-07 05:25 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('rog', '0003_auto_20220407_1420'), - ] - - operations = [ - migrations.AlterField( - model_name='location', - name='webcontents', - field=models.TextField(blank=True, null=True, verbose_name='Web Content'), - ), - ] diff --git a/rog/migrations/0005_auto_20220407_1427.py b/rog/migrations/0005_auto_20220407_1427.py deleted file mode 100644 index adde763..0000000 --- a/rog/migrations/0005_auto_20220407_1427.py +++ /dev/null @@ -1,108 +0,0 @@ -# Generated by Django 3.2.9 on 2022-04-07 05:27 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('rog', '0004_alter_location_webcontents'), - ] - - operations = [ - migrations.AlterField( - model_name='location', - name='address', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='Address'), - ), - migrations.AlterField( - model_name='location', - name='area', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Area'), - ), - migrations.AlterField( - model_name='location', - name='category', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Category'), - ), - migrations.AlterField( - model_name='location', - name='city', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='City'), - ), - migrations.AlterField( - model_name='location', - name='email', - field=models.EmailField(blank=True, max_length=255, null=True, verbose_name='Email'), - ), - migrations.AlterField( - model_name='location', - name='facility', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Facility'), - ), - migrations.AlterField( - model_name='location', - name='fax', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Fax'), - ), - migrations.AlterField( - model_name='location', - name='group', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Group'), - ), - migrations.AlterField( - model_name='location', - name='location_name', - field=models.CharField(max_length=255, verbose_name='Location Name'), - ), - migrations.AlterField( - model_name='location', - name='parammeters', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='Parameters'), - ), - migrations.AlterField( - model_name='location', - name='phone', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Phone'), - ), - migrations.AlterField( - model_name='location', - name='photos', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Phptos'), - ), - migrations.AlterField( - model_name='location', - name='portal', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Portal'), - ), - migrations.AlterField( - model_name='location', - name='prefecture', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Prefecture'), - ), - migrations.AlterField( - model_name='location', - name='remark', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Remarks'), - ), - migrations.AlterField( - model_name='location', - name='status', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Status'), - ), - migrations.AlterField( - model_name='location', - name='tags', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='Tags'), - ), - migrations.AlterField( - model_name='location', - name='videos', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Videos'), - ), - migrations.AlterField( - model_name='location', - name='webcontents', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Web Content'), - ), - ] diff --git a/rog/migrations/0006_auto_20220408_1654.py b/rog/migrations/0006_auto_20220408_1654.py deleted file mode 100644 index 4019de1..0000000 --- a/rog/migrations/0006_auto_20220408_1654.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.9 on 2022-04-08 07:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('rog', '0005_auto_20220407_1427'), - ] - - operations = [ - migrations.AlterField( - model_name='location', - name='location_name', - field=models.CharField(default='--- 場所をお願いします --', max_length=255, verbose_name='Location Name'), - ), - migrations.AlterField( - model_name='shapelayers', - name='layerof', - field=models.IntegerField(choices=[(1, 'location'), (2, 'Location_line'), (3, 'Location_polygon')], default=1), - ), - ] diff --git a/rog/migrations/0007_auto_20220418_1503.py b/rog/migrations/0007_auto_20220418_1503.py deleted file mode 100644 index 2a263be..0000000 --- a/rog/migrations/0007_auto_20220418_1503.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.9 on 2022-04-18 06:03 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('rog', '0006_auto_20220408_1654'), - ] - - operations = [ - migrations.AddField( - model_name='location', - name='latitude', - field=models.FloatField(blank=True, null=True, verbose_name='Latitude'), - ), - migrations.AddField( - model_name='location', - name='longitude', - field=models.FloatField(blank=True, null=True, verbose_name='Latitude'), - ), - ] diff --git a/rog/models.py b/rog/models.py index 9b76c86..e752a6a 100644 --- a/rog/models.py +++ b/rog/models.py @@ -19,6 +19,7 @@ from .choices import LAYER_CHOICES from django.contrib.gis.utils import LayerMapping from django.apps import apps from django.db import transaction +from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager import csv import codecs @@ -32,6 +33,33 @@ environ.Env.read_env(env_file=".env") db = Db(dbname=env("POSTGRES_DBNAME"), user=env("POSTGRES_USER"), password=env("POSTGRES_PASS"), host="postgres-db", port=env("PG_PORT")) +class CustomUserManager(BaseUserManager): + + def create_user(self, email, password, **other_fields): + + if not email: + raise ValueError(_("You must provide an email address")) + + email = self.normalize_email(email) + user=self.model(email=email, **other_fields) + user.set_password(password) + user.save() + + return user + + + def create_superuser(self, email, password, **other_fields): + other_fields.setdefault('is_staff', True) + other_fields.setdefault('is_superuser', True) + other_fields.setdefault('is_active', True) + + if other_fields.get('is_staff') is not True: + raise ValueError(_('Supperuser must assigned to staff')) + if other_fields.get('is_superuser') is not True: + raise ValueError(_('Supperuser must assigned to superuser=True')) + + return self.create_user(email, password, **other_fields) + class JpnAdminMainPerf(models.Model): @@ -82,9 +110,20 @@ class JpnSubPerf(models.Model): managed = False db_table = 'jpn_sub_perf' +class CustomUser(AbstractBaseUser, PermissionsMixin): + email = models.EmailField(_("email address"), unique=True) + is_staff = models.BooleanField(default=False) + is_active = models.BooleanField(default=True) + USERNAME_FIELD = 'email' + + objects = CustomUserManager() + + def __str__(self): + return self.email + class RogUser(models.Model): - user=models.OneToOneField(User, on_delete=models.CASCADE) + user=models.OneToOneField(CustomUser, on_delete=models.CASCADE) email=models.EmailField(_('Email')) phone=models.CharField(_('Phone Number'), max_length=55) first_name=models.CharField(_('First Name'), max_length=255) @@ -97,14 +136,15 @@ class RogUser(models.Model): sex=models.CharField(_('Sex'), max_length=255, default='unknown', blank=True, null=True) birthyear=models.IntegerField(_('Birth year'), blank=True, null=True) family_structure =models.IntegerField(_('Family Structure'), blank=True, null=True) - introducer = models.ForeignKey(User, related_name='introduced_uesr', on_delete=models.DO_NOTHING) + introducer = models.ForeignKey(CustomUser, related_name='introduced_uesr', on_delete=models.DO_NOTHING) level= models.IntegerField(_('Level'), blank=True, null=True, default=0) parammeters=models.CharField(_('Parameters'), max_length=512) created_at=models.DateTimeField(auto_now_add=True) - last_updated_user=models.ForeignKey(User, related_name="roguser_updated_user", on_delete=models.DO_NOTHING) + last_updated_user=models.ForeignKey(CustomUser, related_name="roguser_updated_user", on_delete=models.DO_NOTHING) last_updated_at=models.DateTimeField(auto_now=True) + class SystemSettings(models.Model): setting_name=models.CharField(_('Settings Name'), max_length=255) version=models.CharField(_('Version'), max_length=10, blank=True, null=True) @@ -112,7 +152,7 @@ class SystemSettings(models.Model): end_date=models.DateTimeField() parammeters=models.CharField(_('Parameters'), max_length=512) created_at=models.DateTimeField(auto_now_add=True) - last_updated_user=models.ForeignKey(User, related_name="system_setting_updated_user", on_delete=models.DO_NOTHING) + last_updated_user=models.ForeignKey(CustomUser, related_name="system_setting_updated_user", on_delete=models.DO_NOTHING) last_updated_at=models.DateTimeField(auto_now=True) class Location(models.Model): @@ -140,7 +180,7 @@ class Location(models.Model): tags=models.CharField(_('Tags'), max_length=512, blank=True, null=True) parammeters=models.CharField(_('Parameters'), max_length=512, blank=True, null=True) created_at=models.DateTimeField(auto_now_add=True) - last_updated_user=models.ForeignKey(User, related_name="location_updated_user", on_delete=models.DO_NOTHING,blank=True, null=True) + last_updated_user=models.ForeignKey(CustomUser, related_name="location_updated_user", on_delete=models.DO_NOTHING,blank=True, null=True) last_updated_at=models.DateTimeField(auto_now=True) geom=models.MultiPointField(srid=4326) @@ -171,7 +211,7 @@ class Location_line(models.Model): tags=models.CharField(_('Tags'), max_length=512, blank=True, null=True) parammeters=models.CharField(_('Parameters'), max_length=512, blank=True, null=True) created_at=models.DateTimeField(auto_now_add=True) - last_updated_user=models.ForeignKey(User, related_name="location_line_updated_user", on_delete=models.DO_NOTHING,blank=True, null=True) + last_updated_user=models.ForeignKey(CustomUser, related_name="location_line_updated_user", on_delete=models.DO_NOTHING,blank=True, null=True) last_updated_at=models.DateTimeField(auto_now=True) geom=models.MultiLineStringField(srid=4326, blank=True, null=True) @@ -203,7 +243,7 @@ class Location_polygon(models.Model): tags=models.CharField(_('Tags'), max_length=512, blank=True, null=True) parammeters=models.CharField(_('Parameters'), max_length=512, blank=True, null=True) created_at=models.DateTimeField(auto_now_add=True) - last_updated_user=models.ForeignKey(User, related_name="location_polygon_updated_user", on_delete=models.DO_NOTHING,blank=True, null=True) + last_updated_user=models.ForeignKey(CustomUser, related_name="location_polygon_updated_user", on_delete=models.DO_NOTHING,blank=True, null=True) last_updated_at=models.DateTimeField(auto_now=True) geom=models.MultiPolygonField(srid=4326, blank=True, null=True) @@ -231,7 +271,7 @@ class Event(models.Model): remark=models.CharField(max_length=256, blank=True, null=True) parammeters=models.CharField(_('Parameters'), max_length=512, blank=True, null=True) created_at=models.DateTimeField(auto_now_add=True) - last_updated_user=models.ForeignKey(User, related_name="event_updated_user", on_delete=models.DO_NOTHING,blank=True, null=True) + last_updated_user=models.ForeignKey(CustomUser, related_name="event_updated_user", on_delete=models.DO_NOTHING,blank=True, null=True) last_updated_at=models.DateTimeField(auto_now=True) @@ -244,7 +284,7 @@ ROG_STATUS = ( ) class JoinedEvent(models.Model): - user=models.ForeignKey(User, on_delete=models.DO_NOTHING) + user=models.ForeignKey(CustomUser, on_delete=models.DO_NOTHING) tagname=models.CharField(_('Tag Name'), max_length=255, blank=True, null=True) status=models.CharField(max_length=256, choices=ROG_STATUS) registrationid=models.CharField(_('Registration Id'), max_length=56) @@ -253,13 +293,13 @@ class JoinedEvent(models.Model): remark=models.CharField(_('Remark'), max_length=255, blank=True, null=True) parammeters=models.CharField(_('Parameters'), max_length=512) created_at=models.DateTimeField(auto_now_add=True) - last_updated_user=models.ForeignKey(User, related_name="joined_event_updated_user", on_delete=models.DO_NOTHING) + last_updated_user=models.ForeignKey(CustomUser, related_name="joined_event_updated_user", on_delete=models.DO_NOTHING) last_updated_at=models.DateTimeField(auto_now=True) class Favorite(models.Model): - user=models.ForeignKey(User, on_delete=models.DO_NOTHING) + user=models.ForeignKey(CustomUser, on_delete=models.DO_NOTHING) location=models.ForeignKey(Location, on_delete=models.CASCADE) good=models.IntegerField(_('Good'), default=0) favorite=models.IntegerField(_('Favorite'), default=0) @@ -268,7 +308,7 @@ class Favorite(models.Model): last_visited=models.DateTimeField(_('Last Visited'), blank=True, null=True) parammeters=models.CharField(_('Parameters'), max_length=512, blank=True, null=True) created_at=models.DateTimeField(auto_now_add=True) - last_updated_user=models.ForeignKey(User, related_name="favorite_updated_user", on_delete=models.DO_NOTHING) + last_updated_user=models.ForeignKey(CustomUser, related_name="favorite_updated_user", on_delete=models.DO_NOTHING) last_updated_at=models.DateTimeField(auto_now=True) @@ -284,7 +324,7 @@ TRAVEL_CATEGORY = ( class TravelList(models.Model): travel_id= models.IntegerField(_('Travel Id')) - user=models.ForeignKey(User, on_delete=models.DO_NOTHING) + user=models.ForeignKey(CustomUser, on_delete=models.DO_NOTHING) start_date=models.DateTimeField(_('Start date') ,blank=True, null=True) finish_date=models.DateTimeField(_('End date') ,blank=True, null=True) category=models.CharField(max_length=256, choices=TRAVEL_CATEGORY) @@ -295,7 +335,7 @@ class TravelList(models.Model): eta=models.DateTimeField(blank=True, null=True) parammeters=models.CharField(_('Parameters'), max_length=512 ,blank=True, null=True) created_at=models.DateTimeField(auto_now_add=True) - last_updated_user=models.ForeignKey(User, related_name="travel_list_updated_user", on_delete=models.DO_NOTHING) + last_updated_user=models.ForeignKey(CustomUser, related_name="travel_list_updated_user", on_delete=models.DO_NOTHING) last_updated_at=models.DateTimeField(auto_now=True) @@ -308,12 +348,29 @@ class TravelPoint(models.Model): order_number=models.IntegerField(blank=True, null=True) parammeters=models.CharField(_('Parameters'), max_length=512 ,blank=True, null=True) created_at=models.DateTimeField(auto_now_add=True) - last_updated_user=models.ForeignKey(User, related_name="travelpoint_updated_user", on_delete=models.DO_NOTHING) + last_updated_user=models.ForeignKey(CustomUser, related_name="travelpoint_updated_user", on_delete=models.DO_NOTHING) last_updated_at=models.DateTimeField(auto_now=True) +class Useractions(models.Model): + user=models.ForeignKey(CustomUser, related_name="action_user", on_delete=models.CASCADE) + location=models.ForeignKey(Location, related_name="action_location", on_delete=models.CASCADE) + wanttogo=models.BooleanField(default=False) + like=models.BooleanField(default=False) + checkin=models.BooleanField(default=False) + order =models.IntegerField(default=0) + created_at=models.DateTimeField(auto_now_add=True) + last_updated_at=models.DateTimeField(auto_now=True) +class TestModel(models.Model): + testbane=models.CharField(_("test field"), max_length=355) + wanttogo=models.BooleanField(default=False) + like=models.BooleanField(default=False) + checkin=models.BooleanField(default=False) + created_at=models.DateTimeField(auto_now_add=True) + last_updated_at=models.DateTimeField(auto_now=True) + def getTableForModel(tbl): if tbl == 1: diff --git a/rog/serializers.py b/rog/serializers.py index 8029e0f..c30d6c5 100644 --- a/rog/serializers.py +++ b/rog/serializers.py @@ -1,12 +1,15 @@ from rest_framework import serializers from rest_framework_gis.serializers import GeoFeatureModelSerializer from sqlalchemy.sql.functions import mode -from .models import Location, Location_line, Location_polygon, JpnAdminMainPerf, JpnAdminPerf, JpnSubPerf +from .models import Location, Location_line, Location_polygon, JpnAdminMainPerf, JpnAdminPerf, JpnSubPerf, Useractions from drf_extra_fields.fields import Base64ImageField -from django.contrib.auth.models import User +#from django.contrib.auth.models import User +from .models import CustomUser from django.contrib.auth import authenticate +from .models import TestModel + class LocationCatSerializer(serializers.ModelSerializer): class Meta: @@ -54,28 +57,56 @@ class JPN_perfSerializer(serializers.ModelSerializer): class CreateUserSerializer(serializers.ModelSerializer): class Meta: - model = User - fields = ('id', 'username', 'password') + model = CustomUser + fields = ('email', 'password') extra_kwargs = {'password': {'write_only': True}} def create(self, validated_data): - user = User.objects.create_user(validated_data['username'], - None, - validated_data['password']) + user = CustomUser.objects.create_user(validated_data['email'],validated_data['password']) return user class UserSerializer(serializers.ModelSerializer): class Meta: - model = User - fields = ('id', 'username') + model = CustomUser + fields = ('id','email',) class LoginUserSerializer(serializers.Serializer): - username = serializers.CharField() + email = serializers.CharField() password = serializers.CharField() def validate(self, data): user = authenticate(**data) if user and user.is_active: return user - raise serializers.ValidationError("Invalid Details.") \ No newline at end of file + raise serializers.ValidationError("Invalid Details.") + + +class UseractionsSerializer(serializers.ModelSerializer): + + #user = UserSerializer(read_only=True) + #location = LocationSerializer(read_only=True) + #location = serializers.RelatedField(source='Location', read_only=True) + #location = serializers.PrimaryKeyRelatedField(many=True, read_only=True) + + class Meta: + model = Useractions + fields = ('id', 'user', 'location', 'wanttogo', 'like', 'checkin', 'order',) + +class UserDestinationSerializer(serializers.ModelSerializer): + + #user = UserSerializer(read_only=True) + location = LocationSerializer(read_only=True) + #location = serializers.RelatedField(source='Location', read_only=True) + #location = serializers.PrimaryKeyRelatedField(many=True, read_only=True) + + class Meta: + model = Useractions + fields = ('id', 'user', 'location', 'wanttogo', 'like', 'checkin') + + +class TestSerialiser(serializers.ModelSerializer): + + class Meta: + model = TestModel + fields = ('id', 'testbane', 'wanttogo', 'like', 'checkin') \ No newline at end of file diff --git a/rog/urls.py b/rog/urls.py index f1f7553..b04f129 100644 --- a/rog/urls.py +++ b/rog/urls.py @@ -1,9 +1,11 @@ from rest_framework import urlpatterns from rest_framework.routers import DefaultRouter -from .views import LocationViewSet, Location_lineViewSet, Location_polygonViewSet, Jpn_Main_PerfViewSet, Jpn_PerfViewSet, LocationsInPerf, SubInPerf, ExtentForSubPerf, SubPerfInMainPerf, ExtentForMainPerf, LocationsInSubPerf, CatView, RegistrationAPI, LoginAPI, UserAPI +from .views import LocationViewSet, Location_lineViewSet, Location_polygonViewSet, Jpn_Main_PerfViewSet, Jpn_PerfViewSet, LocationsInPerf, SubInPerf, ExtentForSubPerf, SubPerfInMainPerf, ExtentForMainPerf, LocationsInSubPerf, CatView, RegistrationAPI, LoginAPI, UserAPI, UserActionViewset, UserMakeActionViewset, UserDestinations, UpdateOrder from django.urls import path, include from knox import views as knox_views +from .views import TestActionViewSet + router = DefaultRouter() @@ -27,4 +29,8 @@ urlpatterns += [ path('login/', LoginAPI.as_view()), path('user/', UserAPI.as_view()), path('logout/', knox_views.LogoutView.as_view(), name='knox_logout'), + path('useraction/', UserActionViewset, name='user_action'), + path('makeaction/', UserMakeActionViewset, name='user_action'), + path('destinations/', UserDestinations, name='user_destinations'), + path('updateorder/', UpdateOrder, name='updateorder') ] \ No newline at end of file diff --git a/rog/views.py b/rog/views.py index 4c81ea4..f167ae2 100644 --- a/rog/views.py +++ b/rog/views.py @@ -1,7 +1,7 @@ from django.core.serializers import serialize -from .models import Location, Location_line, Location_polygon, JpnAdminMainPerf, JpnAdminPerf, JpnSubPerf +from .models import Location, Location_line, Location_polygon, JpnAdminMainPerf, JpnAdminPerf, JpnSubPerf, Useractions, CustomUser from rest_framework import viewsets -from .serializers import LocationSerializer, Location_lineSerializer, Location_polygonSerializer, JPN_main_perfSerializer, JPN_perfSerializer, JPN_sub_perSerializer, LocationCatSerializer, CreateUserSerializer, UserSerializer, LoginUserSerializer +from .serializers import LocationSerializer, Location_lineSerializer, Location_polygonSerializer, JPN_main_perfSerializer, JPN_perfSerializer, JPN_sub_perSerializer, LocationCatSerializer, CreateUserSerializer, UserSerializer, LoginUserSerializer, UseractionsSerializer, UserDestinationSerializer from knox.models import AuthToken from rest_framework import viewsets, permissions, generics @@ -11,6 +11,11 @@ from rest_framework.parsers import JSONParser, MultiPartParser from .serializers import LocationSerializer from django.http import JsonResponse +from .serializers import TestSerialiser +from .models import TestModel +from django.shortcuts import get_object_or_404 +from django.db.models import F + class LocationViewSet(viewsets.ModelViewSet): @@ -133,4 +138,95 @@ class UserAPI(generics.RetrieveAPIView): serializer_class = UserSerializer def get_object(self): - return self.request.user \ No newline at end of file + return self.request.user + + +def UserActionViewset(request): + user_id = request.GET.get('user_id') + location_id = request.GET.get('location_id') + location = Location.objects.get(location_id=location_id) + user = CustomUser.objects.get(id=user_id) + action = Useractions.objects.filter(location=location, user=user) + serializer = UseractionsSerializer(action, many=True) + return JsonResponse(serializer.data, safe=False) + + +def UserMakeActionViewset(request): + user_id = request.GET.get('user_id') + location_id = request.GET.get('location_id') + wanttogo = True if request.GET.get('wanttogo') == "true" else False + like = True if request.GET.get('like') == "true" else False + checkin = True if request.GET.get('checkin') == "true" else False + location = Location.objects.get(location_id=location_id) + user = CustomUser.objects.get(id=user_id) + #action = Useractions.objects.filter(location__id=location_id, user__id=user_id) + rec = Useractions.objects.filter(user=user, location=location) + if(rec): + obj = rec.update(wanttogo=wanttogo, like=like, checkin=checkin) + else: + obj, created = Useractions.objects.update_or_create(user=user, location=location, wanttogo=wanttogo, like=like, checkin=checkin) + serializer = UseractionsSerializer(obj, many=False) + return JsonResponse(serializer.data, safe=False) + + +def UserDestinations(request): + user_id = request.GET.get('user_id') + user = CustomUser.objects.get(id=user_id) + #action = Useractions.objects.filter(location__id=location_id, user__id=user_id) + rec = Useractions.objects.filter(user=user, checkin=True).order_by('order') + serializer = UserDestinationSerializer(rec, many=True) + return JsonResponse(serializer.data, safe=False) + + +def UpdateOrder(request): + dir = request.GET.get('dir') + user_action_id = int(request.GET.get('user_action_id')) + order = int(request.GET.get('order')) + aorder = int(request.GET.get('order')) + oorder = int(request.GET.get('order')) + if(user_action_id): + #updated = Useractions.objects.filter(order__gte=order).update(order = F('order')+1) + #res = Useractions.objects.filter(id=user_action_id).update(order=order) + index = 0 + if dir == "up": + for id in Useractions.objects.all().order_by('order').values_list('id', flat=True): + print(id) + print("----",user_action_id) + if index == order : + index += 1 + print("index increated .....") + if user_action_id == id: + Useractions.objects.filter(id=id).update(order=order) + print("updated .....") + continue + + Useractions.objects.filter(id=id).update(order=index) + index += 1 + else : + for id in Useractions.objects.all().order_by('order').values_list('id', flat=True): + print(id) + print("----",user_action_id) + if index == order : + index -= 1 + print("index increated .....") + if user_action_id == id: + Useractions.objects.filter(id=id).update(order=order) + print("updated .....") + continue + + Useractions.objects.filter(id=id).update(order=index) + index += 1 + # for id in Useractions.objects.values_list('order', flat=True): + # aorder -= 1 + # Useractions.objects.filter(order__lt=id).update(order=aorder) + # res = Useractions.objects.filter(id=user_action_id).update(order=oorder) + + return JsonResponse(1, safe=False) + else: + return JsonResponse({}, safe=False) + + + +class TestActionViewSet(viewsets.ModelViewSet): + serializer_class = TestSerialiser + queryset = TestModel.objects.all() \ No newline at end of file