From a9dbc0d051b8166da69953e482df4bd1dee8e8da Mon Sep 17 00:00:00 2001 From: vu-luong Date: Tue, 27 Oct 2020 19:35:29 +1000 Subject: [PATCH 01/18] Add NewTinh Model --- project/app/migrations/0071_newtinh.py | 29 ++++++++++++++++++++++++++ project/app/models.py | 17 +++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 project/app/migrations/0071_newtinh.py diff --git a/project/app/migrations/0071_newtinh.py b/project/app/migrations/0071_newtinh.py new file mode 100644 index 0000000..4e18a40 --- /dev/null +++ b/project/app/migrations/0071_newtinh.py @@ -0,0 +1,29 @@ +# Generated by Django 3.1.2 on 2020-10-27 09:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0070_merge_20201027_0115'), + ] + + operations = [ + migrations.CreateModel( + name='NewTinh', + fields=[ + ('name', models.TextField(blank=True, default='', verbose_name='Tỉnh')), + ('prefix', models.TextField(blank=True, default='', null=True)), + ('suffix', models.TextField(blank=True, default='', null=True)), + ('long', models.TextField(blank=True, default='', null=True)), + ('lat', models.TextField(blank=True, default='', null=True)), + ('level', models.IntegerField(blank=True, null=True)), + ('id', models.AutoField(primary_key=True, serialize=False)), + ], + options={ + 'verbose_name': '3. Thống kê Tỉnh (new)', + 'verbose_name_plural': '3. Thống kê Tỉnh (new)', + }, + ), + ] diff --git a/project/app/models.py b/project/app/models.py index ebffece..90676d8 100644 --- a/project/app/models.py +++ b/project/app/models.py @@ -59,6 +59,23 @@ class Meta: abstract = 'rest_framework.authtoken' not in settings.INSTALLED_APPS +class NewTinh(models.Model): + name = models.TextField(blank=True, default='', verbose_name="Tỉnh") + prefix = models.TextField(blank=True, default='', null=True) + suffix = models.TextField(blank=True, default='', null=True) + long = models.TextField(blank=True, default='', null=True) + lat = models.TextField(blank=True, default='', null=True) + level = models.IntegerField(blank=True, null=True) + id = models.AutoField(primary_key=True) + + def __str__(self): + return self.name + + class Meta: + verbose_name = "3. Thống kê Tỉnh (new)" + verbose_name_plural = "3. Thống kê Tỉnh (new)" + + class Tinh(models.Model): name = models.TextField(blank=True, default='', verbose_name="Tỉnh") From a11bf71eb609b665ff53491e5d64e4bafe83f8cc Mon Sep 17 00:00:00 2001 From: dungpt3003 Date: Tue, 27 Oct 2020 11:50:14 +0000 Subject: [PATCH 02/18] Add new models for Huyen and Xa, change longitude/latitude name and type --- .../app/migrations/0072_auto_20201027_1848.py | 70 +++++++++++++++++++ project/app/models.py | 36 +++++++++- 2 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 project/app/migrations/0072_auto_20201027_1848.py diff --git a/project/app/migrations/0072_auto_20201027_1848.py b/project/app/migrations/0072_auto_20201027_1848.py new file mode 100644 index 0000000..146034e --- /dev/null +++ b/project/app/migrations/0072_auto_20201027_1848.py @@ -0,0 +1,70 @@ +# Generated by Django 3.1.2 on 2020-10-27 11:48 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0071_newtinh'), + ] + + operations = [ + migrations.CreateModel( + name='NewHuyen', + fields=[ + ('name', models.TextField(blank=True, default='', verbose_name='Huyện')), + ('prefix', models.TextField(blank=True, default='', null=True)), + ('suffix', models.TextField(blank=True, default='', null=True)), + ('longitude', models.FloatField(blank=True, null=True)), + ('latitude', models.FloatField(blank=True, null=True)), + ('level', models.IntegerField(blank=True, null=True)), + ('id', models.AutoField(primary_key=True, serialize=False)), + ], + options={ + 'verbose_name': '4. Thống kê Huyện', + 'verbose_name_plural': '4. Thống kê Huyện', + }, + ), + migrations.RemoveField( + model_name='newtinh', + name='lat', + ), + migrations.RemoveField( + model_name='newtinh', + name='long', + ), + migrations.AddField( + model_name='newtinh', + name='latitude', + field=models.FloatField(blank=True, null=True), + ), + migrations.AddField( + model_name='newtinh', + name='longitude', + field=models.FloatField(blank=True, null=True), + ), + migrations.CreateModel( + name='NewXa', + fields=[ + ('name', models.TextField(blank=True, default='', verbose_name='Xã')), + ('prefix', models.TextField(blank=True, default='', null=True)), + ('suffix', models.TextField(blank=True, default='', null=True)), + ('longitude', models.FloatField(blank=True, null=True)), + ('latitude', models.FloatField(blank=True, null=True)), + ('level', models.IntegerField(blank=True, null=True)), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('huyen', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='app.newhuyen')), + ], + options={ + 'verbose_name': '5. Thống kê Xã', + 'verbose_name_plural': '5. Thống kê Xã', + }, + ), + migrations.AddField( + model_name='newhuyen', + name='tinh', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='app.newtinh'), + ), + ] diff --git a/project/app/models.py b/project/app/models.py index 90676d8..374e586 100644 --- a/project/app/models.py +++ b/project/app/models.py @@ -63,8 +63,8 @@ class NewTinh(models.Model): name = models.TextField(blank=True, default='', verbose_name="Tỉnh") prefix = models.TextField(blank=True, default='', null=True) suffix = models.TextField(blank=True, default='', null=True) - long = models.TextField(blank=True, default='', null=True) - lat = models.TextField(blank=True, default='', null=True) + longitude = models.FloatField(blank=True, null=True) + latitude = models.FloatField(blank=True, null=True) level = models.IntegerField(blank=True, null=True) id = models.AutoField(primary_key=True) @@ -86,6 +86,22 @@ class Meta: verbose_name = "3. Thống kê Tỉnh" verbose_name_plural = "3. Thống kê Tỉnh" +class NewHuyen(models.Model): + name = models.TextField(blank=True, default='', verbose_name="Huyện") + prefix = models.TextField(blank=True, default='', null=True) + suffix = models.TextField(blank=True, default='', null=True) + longitude = models.FloatField(blank=True, null=True) + latitude = models.FloatField(blank=True, null=True) + level = models.IntegerField(blank=True, null=True) + id = models.AutoField(primary_key=True) + tinh = models.ForeignKey(NewTinh, blank=True, null=True, on_delete=models.CASCADE) + + def __str__(self): + return self.name + + class Meta: + verbose_name = "4. Thống kê Huyện" + verbose_name_plural = "4. Thống kê Huyện" class Huyen(models.Model): name = models.TextField(blank=True, default='', verbose_name="Huyện") @@ -99,6 +115,22 @@ class Meta: verbose_name = "4. Thống kê Huyện" verbose_name_plural = "4. Thống kê Huyện" +class NewXa(models.Model): + name = models.TextField(blank=True, default='', verbose_name="Xã") + prefix = models.TextField(blank=True, default='', null=True) + suffix = models.TextField(blank=True, default='', null=True) + longitude = models.FloatField(blank=True, null=True) + latitude = models.FloatField(blank=True, null=True) + level = models.IntegerField(blank=True, null=True) + id = models.AutoField(primary_key=True) + huyen = models.ForeignKey(NewHuyen, blank=True, null=True, on_delete=models.CASCADE) + + def __str__(self): + return self.name + + class Meta: + verbose_name = "5. Thống kê Xã" + verbose_name_plural = "5. Thống kê Xã" class Xa(models.Model): name = models.TextField(blank=True, default='', verbose_name="Xã") From 6b67c7a1998274d8df0baa34419746512d977192 Mon Sep 17 00:00:00 2001 From: dungpt3003 Date: Tue, 27 Oct 2020 12:19:35 +0000 Subject: [PATCH 03/18] Add scripts to import tinh, huyen, xa data from files --- .../migrations/0073_import_location_data.py | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 project/app/migrations/0073_import_location_data.py diff --git a/project/app/migrations/0073_import_location_data.py b/project/app/migrations/0073_import_location_data.py new file mode 100644 index 0000000..75e0464 --- /dev/null +++ b/project/app/migrations/0073_import_location_data.py @@ -0,0 +1,65 @@ +# Generated by Django 3.1.2 on 2020-10-24 16:37 + +from django.db import migrations +import csv +from app.models import NewTinh, NewHuyen, NewXa + +def import_tinh_data(apps, schema_editor): + with open('project/app/data/tinh.csv') as f: + reader = csv.reader(f) + next(reader, None) + for row in reader: + _, _ = NewTinh.objects.get_or_create( + name = row[0], + prefix = row[1], + suffix = row[2], + longitude = row[3], + latitude = row[4], + level = row[5], + id = row[6], + ) + +def import_huyen_data(apps, schema_editor): + with open('project/app/data/huyen.csv') as f: + reader = csv.reader(f) + next(reader, None) + for row in reader: + _, _ = NewHuyen.objects.get_or_create( + name = row[0], + prefix = row[1], + suffix = row[2], + longitude = row[3], + latitude = row[4], + level = row[5], + id = row[6], + tinh_id = row[7], + ) + +def import_xa_data(apps, schema_editor): + with open('project/app/data/xa.csv') as f: + reader = csv.reader(f) + next(reader, None) + for row in reader: + _, _ = NewXa.objects.get_or_create( + name = row[0], + prefix = row[1], + suffix = row[2], + longitude = row[3], + latitude = row[4], + level = row[5], + id = row[6], + huyen_id = row[7], + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0072_auto_20201027_1848'), + ] + + operations = [ + migrations.RunPython(import_tinh_data), + migrations.RunPython(import_huyen_data), + migrations.RunPython(import_xa_data), + ] From db2a905e3f30ff5abaa3dff531a4dfe56b9ac0c8 Mon Sep 17 00:00:00 2001 From: dungpt3003 Date: Tue, 27 Oct 2020 12:29:19 +0000 Subject: [PATCH 04/18] Return new location data in API --- project/app/views.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/project/app/views.py b/project/app/views.py index d44ce66..88468cb 100644 --- a/project/app/views.py +++ b/project/app/views.py @@ -4,18 +4,18 @@ from rest_framework.permissions import IsAuthenticated from django_restful_admin import RestFulModelAdmin from rest_framework.response import Response -from app.models import HoDan, CuuHo, TinhNguyenVien, Tinh, Huyen, Xa, TrangThaiHoDan +from app.models import HoDan, CuuHo, TinhNguyenVien, NewTinh, NewHuyen, NewXa, TrangThaiHoDan class TinhHuyenXaBase(serializers.ModelSerializer): class Meta: abstract = True - tinh = serializers.PrimaryKeyRelatedField(queryset=Tinh.objects.all()) + tinh = serializers.PrimaryKeyRelatedField(queryset=NewTinh.objects.all()) tinh_display = serializers.SerializerMethodField(read_only=True) - huyen = serializers.PrimaryKeyRelatedField(queryset=Huyen.objects.all()) + huyen = serializers.PrimaryKeyRelatedField(queryset=NewHuyen.objects.all()) huyen_display = serializers.SerializerMethodField(read_only=True) - xa = serializers.PrimaryKeyRelatedField(queryset=Xa.objects.all()) + xa = serializers.PrimaryKeyRelatedField(queryset=NewXa.objects.all()) xa_display = serializers.SerializerMethodField(read_only=True) def get_tinh_display(self, obj): @@ -88,26 +88,26 @@ class TinhNguyenVienViewSet(viewsets.ModelViewSet): class TinhSerializer(serializers.ModelSerializer): class Meta: - model = Tinh + model = NewTinh fields = '__all__' class TinhViewSet(viewsets.ModelViewSet): permission_classes = (IsAuthenticated,) serializer_class = TinhSerializer - queryset = Tinh.objects.all() + queryset = NewTinh.objects.all() class HuyenSerializer(serializers.ModelSerializer): class Meta: - model = Huyen + model = NewHuyen fields = '__all__' class HuyenViewSet(viewsets.ModelViewSet): permission_classes = (IsAuthenticated,) serializer_class = HuyenSerializer - queryset = Huyen.objects.all() + queryset = NewHuyen.objects.all() class TrangThaiHoDanSerializer(serializers.ModelSerializer): @@ -124,14 +124,14 @@ class TrangThaiHoDanSet(viewsets.ModelViewSet): class XaSerializer(serializers.ModelSerializer): class Meta: - model = Xa + model = NewXa fields = '__all__' class XaViewSet(viewsets.ModelViewSet): permission_classes = (IsAuthenticated,) serializer_class = XaSerializer - queryset = Xa.objects.all() + queryset = NewXa.objects.all() class BaseRestfulAdmin(RestFulModelAdmin): From 926a82b598041f0bac1f9a103f8373d720277675 Mon Sep 17 00:00:00 2001 From: dungpt3003 Date: Tue, 27 Oct 2020 12:46:32 +0000 Subject: [PATCH 05/18] Change old location models to new ones --- project/app/admin.py | 12 +-- project/app/index.py | 6 +- .../app/migrations/0074_auto_20201027_1934.py | 90 +++++++++++++++++++ project/app/models.py | 24 ++--- 4 files changed, 111 insertions(+), 21 deletions(-) create mode 100644 project/app/migrations/0074_auto_20201027_1934.py diff --git a/project/app/admin.py b/project/app/admin.py index bec85eb..ce72ec2 100644 --- a/project/app/admin.py +++ b/project/app/admin.py @@ -5,7 +5,7 @@ from rest_framework import routers from app.settings import TIME_ZONE -from app.models import TinTuc, TinhNguyenVien, CuuHo, HoDan, Tinh, Huyen, Xa,\ +from app.models import TinTuc, TinhNguyenVien, CuuHo, HoDan, NewTinh, NewHuyen, NewXa,\ TrangThaiHoDan, CUUHO_STATUS, TINHNGUYEN_STATUS from app.views import CuuHoViewSet, HoDanViewSet,\ TinhNguyenVienViewSet, TinhViewSet, HuyenViewSet, XaViewSet, TrangThaiHoDanSet @@ -92,7 +92,7 @@ class Meta: def __init__(self, *args, **kwargs): super(CuuHoLocationForm, self).__init__(*args, **kwargs) - self.fields["tinh"].queryset = Tinh.objects.order_by("name") + self.fields["tinh"].queryset = NewTinh.objects.order_by("name") self.fields['volunteer'] = ModelChoiceField(queryset=TinhNguyenVien.objects.all(), widget=Select2(), required=False) @@ -168,7 +168,7 @@ class Meta: def __init__(self, *args, **kwargs): super(HoDanForm, self).__init__(*args, **kwargs) - self.fields["tinh"].queryset = Tinh.objects.order_by("name") + self.fields["tinh"].queryset = NewTinh.objects.order_by("name") self.fields['volunteer'] = ModelChoiceField(queryset=TinhNguyenVien.objects.all(), widget=Select2(), required=False) self.fields['cuuho'] = ModelChoiceField(queryset=CuuHo.objects.all(), widget=Select2(), required=False) @@ -394,9 +394,9 @@ def __init__(self, model, admin_site): admin.site.register(CuuHo, CuuHoAdmin) admin.site.register(TinhNguyenVien, TinhNguyenVienAdmin) -admin.site.register(Tinh, TinhAdmin) -admin.site.register(Huyen, HuyenAdmin) -admin.site.register(Xa, XaAdmin) +admin.site.register(NewTinh, TinhAdmin) +admin.site.register(NewHuyen, HuyenAdmin) +admin.site.register(NewXa, XaAdmin) admin.site.register(TrangThaiHoDan, TrangThaiHoDanAdmin) # admin.site.register(Thon, ThonAdmin) diff --git a/project/app/index.py b/project/app/index.py index cdef3e1..6e6d8b7 100644 --- a/project/app/index.py +++ b/project/app/index.py @@ -1,5 +1,5 @@ from app.admin import TinhAdmin -from app.models import Tinh, HoDan, CuuHo +from app.models import NewTinh, HoDan, CuuHo from django.db.models import Count from django.shortcuts import render from django.urls import reverse @@ -10,11 +10,11 @@ def index(request): tong_hodan_da_duoc_cuu = HoDan.objects.filter(status_id=7).count() tong_doi_cuu_ho = CuuHo.objects.count() - totalHoDanByTinh = Tinh.objects.prefetch_related('hodan_reversed')\ + totalHoDanByTinh = NewTinh.objects.prefetch_related('hodan_reversed')\ .filter(hodan_reversed__status_id=3)\ .annotate(total_hodan=Count("hodan_reversed"))\ .order_by('-total_hodan')[0:5] - cuuHoByTinh = Tinh.objects.prefetch_related('cuuho_reversed')\ + cuuHoByTinh = NewTinh.objects.prefetch_related('cuuho_reversed')\ .annotate(total_cuuho=Count("cuuho_reversed"))\ .filter(id__in=[tinh.id for tinh in totalHoDanByTinh]) cuuHoDict = dict((o.id,o) for o in cuuHoByTinh) diff --git a/project/app/migrations/0074_auto_20201027_1934.py b/project/app/migrations/0074_auto_20201027_1934.py new file mode 100644 index 0000000..a35165d --- /dev/null +++ b/project/app/migrations/0074_auto_20201027_1934.py @@ -0,0 +1,90 @@ +# Generated by Django 3.1.2 on 2020-10-27 12:34 + +from django.db import migrations, models +import django.db.models.deletion +import smart_selects.db_fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0073_import_location_data'), + ] + + operations = [ + migrations.AlterField( + model_name='cuuho', + name='huyen', + field=smart_selects.db_fields.ChainedForeignKey(auto_choose=True, blank=True, chained_field='tinh', chained_model_field='tinh', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cuuho_reversed', to='app.newhuyen'), + ), + migrations.AlterField( + model_name='cuuho', + name='tinh', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cuuho_reversed', to='app.newtinh'), + ), + migrations.AlterField( + model_name='cuuho', + name='xa', + field=smart_selects.db_fields.ChainedForeignKey(auto_choose=True, blank=True, chained_field='huyen', chained_model_field='huyen', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cuuho_reversed', to='app.newxa'), + ), + migrations.AlterField( + model_name='historicalhodan', + name='huyen', + field=smart_selects.db_fields.ChainedForeignKey(auto_choose=True, blank=True, chained_field='tinh', chained_model_field='tinh', db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='app.newhuyen'), + ), + migrations.AlterField( + model_name='historicalhodan', + name='tinh', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='app.newtinh'), + ), + migrations.AlterField( + model_name='historicalhodan', + name='xa', + field=smart_selects.db_fields.ChainedForeignKey(auto_choose=True, blank=True, chained_field='huyen', chained_model_field='huyen', db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='app.newxa'), + ), + migrations.AlterField( + model_name='hodan', + name='huyen', + field=smart_selects.db_fields.ChainedForeignKey(auto_choose=True, blank=True, chained_field='tinh', chained_model_field='tinh', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hodan_reversed', to='app.newhuyen'), + ), + migrations.AlterField( + model_name='hodan', + name='tinh', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hodan_reversed', to='app.newtinh'), + ), + migrations.AlterField( + model_name='hodan', + name='xa', + field=smart_selects.db_fields.ChainedForeignKey(auto_choose=True, blank=True, chained_field='huyen', chained_model_field='huyen', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hodan_reversed', to='app.newxa'), + ), + migrations.AlterField( + model_name='nguonluc', + name='huyen', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='app.newhuyen'), + ), + migrations.AlterField( + model_name='nguonluc', + name='tinh', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='app.newtinh'), + ), + migrations.AlterField( + model_name='nguonluc', + name='xa', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='app.newxa'), + ), + migrations.AlterField( + model_name='tinhnguyenvien', + name='huyen', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='app.newhuyen'), + ), + migrations.AlterField( + model_name='tinhnguyenvien', + name='tinh', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='app.newtinh'), + ), + migrations.AlterField( + model_name='tinhnguyenvien', + name='xa', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='app.newxa'), + ), + ] diff --git a/project/app/models.py b/project/app/models.py index 374e586..48aed9d 100644 --- a/project/app/models.py +++ b/project/app/models.py @@ -180,10 +180,10 @@ class TinhNguyenVien(models.Model): note = models.TextField(blank=True, default='', verbose_name='Ghi chú') tinh = models.ForeignKey( - Tinh, blank=True, null=True, on_delete=models.CASCADE) + NewTinh, blank=True, null=True, on_delete=models.CASCADE) huyen = models.ForeignKey( - Huyen, blank=True, null=True, on_delete=models.CASCADE) - xa = models.ForeignKey(Xa, blank=True, null=True, on_delete=models.CASCADE) + NewHuyen, blank=True, null=True, on_delete=models.CASCADE) + xa = models.ForeignKey(NewXa, blank=True, null=True, on_delete=models.CASCADE) thon = models.ForeignKey( Thon, blank=True, null=True, on_delete=models.CASCADE) @@ -201,12 +201,12 @@ class CuuHo(models.Model): status = models.IntegerField( choices=CUUHO_STATUS, default=0, verbose_name="Tình trạng") tinh = models.ForeignKey( - Tinh, blank=True, null=True, on_delete=models.CASCADE, + NewTinh, blank=True, null=True, on_delete=models.CASCADE, related_name="cuuho_reversed" ) huyen = ChainedForeignKey( - Huyen, + NewHuyen, chained_field = "tinh", chained_model_field = "tinh", show_all = False, @@ -218,7 +218,7 @@ class CuuHo(models.Model): on_delete=models.CASCADE) xa = ChainedForeignKey( - Xa, + NewXa, chained_field = "huyen", chained_model_field = "huyen", show_all = False, @@ -289,11 +289,11 @@ class HoDan(models.Model): ) people_number = models.PositiveIntegerField(blank=True, null=True, default=1, verbose_name="Số người") tinh = models.ForeignKey( - Tinh, blank=True, null=True, on_delete=models.CASCADE, + NewTinh, blank=True, null=True, on_delete=models.CASCADE, related_name="hodan_reversed" ) huyen = ChainedForeignKey( - Huyen, + NewHuyen, chained_field = "tinh", chained_model_field = "tinh", show_all = False, @@ -305,7 +305,7 @@ class HoDan(models.Model): on_delete=models.CASCADE) xa = ChainedForeignKey( - Xa, + NewXa, chained_field = "huyen", chained_model_field = "huyen", show_all = False, @@ -372,10 +372,10 @@ class NguonLuc(models.Model): choices=RESOURCE_STATUS, default=0, verbose_name="Tình trạng") tinh = models.ForeignKey( - Tinh, blank=True, null=True, on_delete=models.CASCADE) + NewTinh, blank=True, null=True, on_delete=models.CASCADE) huyen = models.ForeignKey( - Huyen, blank=True, null=True, on_delete=models.CASCADE) - xa = models.ForeignKey(Xa, blank=True, null=True, on_delete=models.CASCADE) + NewHuyen, blank=True, null=True, on_delete=models.CASCADE) + xa = models.ForeignKey(NewXa, blank=True, null=True, on_delete=models.CASCADE) thon = models.ForeignKey( Thon, blank=True, null=True, on_delete=models.CASCADE) From e20ac701f8b9f333761a6646185ae94f41f679bb Mon Sep 17 00:00:00 2001 From: dungpt3003 Date: Sat, 31 Oct 2020 04:13:55 +0000 Subject: [PATCH 06/18] Add migration to migrate old tinh data (csv file needed) --- .../migrations/0074_migrate_old_tinh_data.py | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 project/app/migrations/0074_migrate_old_tinh_data.py diff --git a/project/app/migrations/0074_migrate_old_tinh_data.py b/project/app/migrations/0074_migrate_old_tinh_data.py new file mode 100644 index 0000000..c8c6509 --- /dev/null +++ b/project/app/migrations/0074_migrate_old_tinh_data.py @@ -0,0 +1,47 @@ +# Generated by Django 3.1.2 on 2020-10-24 16:37 + +from django.db import migrations +import csv +from app.models import NewTinh, NewHuyen, NewXa, HoDan, CuuHo +from django.db import models + +def migrate_tinh_id(apps, schema_editor): + province_dict = {} + with open('project/app/data/map_province.csv') as f: + reader = csv.reader(f) + next(reader, None) + for row in reader: + if row[1] != "null": + province_dict[int(row[0])] = int(row[1]) + else: + province_dict[int(row[0])] = None + for hodan in HoDan.objects.all(): + if hodan.tinh_id is not None: + hodan.tinh_id = province_dict[hodan.tinh_id] + hodan.save() + for cuuho in CuuHo.objects.all(): + if cuuho.tinh_id is not None: + cuuho.tinh_id = province_dict[cuuho.tinh_id] + cuuho.save() + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0073_import_location_data'), + ] + + operations = [ + # Remove foreign key before update + migrations.AlterField( + model_name='hodan', + name='tinh_id', + field=models.IntegerField(db_index=True, null=True) + ), + migrations.AlterField( + model_name='cuuho', + name='tinh_id', + field=models.IntegerField(db_index=True, null=True), + ), + migrations.RunPython(migrate_tinh_id), + + ] From 35e18b7236b0129743cb6bf4ae9b23380ac0da9d Mon Sep 17 00:00:00 2001 From: dungpt3003 Date: Sat, 31 Oct 2020 04:50:11 +0000 Subject: [PATCH 07/18] Add migration to migrate old huyen data --- .../migrations/0075_migrate_old_huyen_data.py | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 project/app/migrations/0075_migrate_old_huyen_data.py diff --git a/project/app/migrations/0075_migrate_old_huyen_data.py b/project/app/migrations/0075_migrate_old_huyen_data.py new file mode 100644 index 0000000..770bb94 --- /dev/null +++ b/project/app/migrations/0075_migrate_old_huyen_data.py @@ -0,0 +1,47 @@ +# Generated by Django 3.1.2 on 2020-10-24 16:37 + +from django.db import migrations +import csv +from app.models import NewTinh, NewHuyen, NewXa, HoDan, CuuHo +from django.db import models + +def migrate_huyen_id(apps, schema_editor): + district_dict = {} + with open('project/app/data/map_district.csv') as f: + reader = csv.reader(f) + next(reader, None) + for row in reader: + if row[1] != "null": + district_dict[int(row[0])] = int(row[1]) + else: + district_dict[int(row[0])] = None + for hodan in HoDan.objects.all(): + if hodan.huyen_id is not None: + hodan.huyen_id = district_dict.get(hodan.huyen_id, None) + hodan.save() + for cuuho in CuuHo.objects.all(): + if cuuho.huyen_id is not None: + cuuho.huyen_id = district_dict.get(cuuho.huyen_id, None) + cuuho.save() + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0074_migrate_old_tinh_data'), + ] + + operations = [ + # Remove foreign key before update + migrations.AlterField( + model_name='hodan', + name='huyen_id', + field=models.IntegerField(db_index=True, null=True) + ), + migrations.AlterField( + model_name='cuuho', + name='huyen_id', + field=models.IntegerField(db_index=True, null=True), + ), + migrations.RunPython(migrate_huyen_id), + + ] From fc1f55f22005f3a86e17eeaedcabcfec12559705 Mon Sep 17 00:00:00 2001 From: dungpt3003 Date: Sat, 31 Oct 2020 04:50:54 +0000 Subject: [PATCH 08/18] Change verbose name of model NewTinh --- project/app/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/app/models.py b/project/app/models.py index 48aed9d..e48a565 100644 --- a/project/app/models.py +++ b/project/app/models.py @@ -72,8 +72,8 @@ def __str__(self): return self.name class Meta: - verbose_name = "3. Thống kê Tỉnh (new)" - verbose_name_plural = "3. Thống kê Tỉnh (new)" + verbose_name = "3. Thống kê Tỉnh" + verbose_name_plural = "3. Thống kê Tỉnh" class Tinh(models.Model): From 2a45c42a3eff8f21f9a0c7ac2191cd5352ab29a3 Mon Sep 17 00:00:00 2001 From: dungpt3003 Date: Sat, 31 Oct 2020 06:02:33 +0000 Subject: [PATCH 09/18] Add migration to migrate xa data --- .../migrations/0076_migrate_old_xa_data.py | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 project/app/migrations/0076_migrate_old_xa_data.py diff --git a/project/app/migrations/0076_migrate_old_xa_data.py b/project/app/migrations/0076_migrate_old_xa_data.py new file mode 100644 index 0000000..fb18aa6 --- /dev/null +++ b/project/app/migrations/0076_migrate_old_xa_data.py @@ -0,0 +1,56 @@ +# Generated by Django 3.1.2 on 2020-10-24 16:37 + +from django.db import migrations +import csv +from app.models import NewTinh, NewHuyen, NewXa, HoDan, CuuHo, Xa +from django.db import models + +def migrate_xa_id(apps, schema_editor): + for hodan in HoDan.objects.all(): + if hodan.xa_id is not None: + flag = True + current_xa = Xa.objects.get(pk=hodan.xa_id) + matched_name_list = NewXa.objects.all().filter(name=current_xa.name) + for new_xa in matched_name_list: + if new_xa.huyen_id == hodan.huyen_id: + hodan.xa_id = new_xa.id + flag = False + break + if flag == False: + hodan.xa_id = None + hodan.save() + + for cuuho in CuuHo.objects.all(): + if cuuho.xa_id is not None: + flag = True + current_xa = Xa.objects.get(pk=cuuho.xa_id) + matched_name_list = NewXa.objects.all().filter(name=current_xa.name) + for new_xa in matched_name_list: + if new_xa.huyen_id == cuuho.huyen_id: + cuuho.xa_id = new_xa.id + flag = False + break + if flag == False: + cuuho.xa_id = None + cuuho.save() + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0075_migrate_old_huyen_data'), + ] + + operations = [ + # Remove foreign key before update + migrations.AlterField( + model_name='hodan', + name='xa_id', + field=models.IntegerField(db_index=True, null=True) + ), + migrations.AlterField( + model_name='cuuho', + name='xa_id', + field=models.IntegerField(db_index=True, null=True), + ), + migrations.RunPython(migrate_xa_id), + ] From 80343a217e52194613e4677b538da280461ddf4b Mon Sep 17 00:00:00 2001 From: dungpt3003 Date: Sat, 31 Oct 2020 06:03:02 +0000 Subject: [PATCH 10/18] Rename template name to match new model name --- project/templates/home_index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/templates/home_index.html b/project/templates/home_index.html index 12ee3a2..3e9d763 100644 --- a/project/templates/home_index.html +++ b/project/templates/home_index.html @@ -95,7 +95,7 @@
Đội cứu hộ
Tình hình các tỉnh
- Xem tất cả + Xem tất cả
@@ -124,7 +124,7 @@
Tình hình các tỉnh