From 11037587df9406c171a65d64c60f320f6fd7ac1b Mon Sep 17 00:00:00 2001 From: Mohamed Nouffer Date: Wed, 27 Apr 2022 15:47:37 +0530 Subject: [PATCH] update --- config/settings.py | 4 +- config/urls.py | 1 + requirements.txt | 1 + rog/models.py | 165 ++++++++++++++++++++++++++------------------- rog/serializers.py | 39 +++++++++++ rog/urls.py | 8 ++- rog/views.py | 61 +++++++++++++++-- 7 files changed, 202 insertions(+), 77 deletions(-) diff --git a/config/settings.py b/config/settings.py index 2628306..6778982 100644 --- a/config/settings.py +++ b/config/settings.py @@ -48,6 +48,7 @@ INSTALLED_APPS = [ 'django.contrib.gis', 'rest_framework', 'rest_framework_gis', + 'knox', 'leaflet', 'leaflet_admin_list', 'rog.apps.RogConfig', @@ -168,5 +169,6 @@ LEAFLET_CONFIG = { } REST_FRAMEWORK = { - 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'] + 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'], + 'DEFAULT_AUTHENTICATION_CLASSES': ('knox.auth.TokenAuthentication', ), } \ No newline at end of file diff --git a/config/urls.py b/config/urls.py index 6d58b26..b693be9 100644 --- a/config/urls.py +++ b/config/urls.py @@ -20,6 +20,7 @@ from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), + path('auth/', include('knox.urls')), path('api/', include("rog.urls")), ]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/requirements.txt b/requirements.txt index e797509..148477b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -63,3 +63,4 @@ typing_extensions==4.0.0 urllib3==1.26.7 django-extra-fields==3.0.2 django-phonenumber-field==6.1.0 +django-rest-knox==4.2.0 diff --git a/rog/models.py b/rog/models.py index 4ea2aaa..9b76c86 100644 --- a/rog/models.py +++ b/rog/models.py @@ -18,6 +18,7 @@ from .mapping import location_mapping, location_line_mapping, location_polygon_m from .choices import LAYER_CHOICES from django.contrib.gis.utils import LayerMapping from django.apps import apps +from django.db import transaction import csv import codecs @@ -369,13 +370,35 @@ def remove_bom_inplace(path): +@receiver(pre_save, sender=Location) +def location_presave(sender, instance, *args, **kwargs): + #print("------############------------", instance.location_id) + Location.objects.filter(location_id = instance.location_id).delete() + + +@receiver(pre_save, sender=Location_line) +def location_presave(sender, instance, *args, **kwargs): + Location_line.objects.filter(location_id = instance.location_id).delete() + +@receiver(pre_save, sender=Location_polygon) +def location_presave(sender, instance, *args, **kwargs): + Location_polygon.objects.filter(location_id = instance.location_id).delete() + + @receiver(pre_save, sender=ShapeLayers) def my_callback(sender, instance, *args, **kwargs): + instance.table_name = getTableForModel(instance.layerof) + + +def deletePrevious(mdl, fields): + with transaction.atomic(): + mdl.objects.filter(location_id = int(fields[0])).delete(); + @receiver(post_save, sender=ShapeLayers) -def publish_date(sender, instance, created, **kwargs): +def publish_data(sender, instance, created, **kwargs): file = instance.file.path file_format = os.path.basename(file).split('.')[-1] file_name = os.path.basename(file).split('.')[0] @@ -436,80 +459,84 @@ def updateLocation(mdl, fields): print(f"Updating {fields[0]} - {fields[1]}") print(mdl.objects.filter(location_id = int(fields[0]))) print("-------") - mdl.objects.filter(location_id = int(fields[0])).update( - location_name = fields[1] if len(fields) > 1 else '', - category = fields[2] if len(fields) > 1 else '', - zip = fields[3] if len(fields) > 1 else '', - address = fields[4] if len(fields) > 1 else '', - prefecture = fields[5] if len(fields) > 1 else '', - area = fields[6] if len(fields) > 1 else '', - city = fields[7] if len(fields) > 1 else '', - latitude = fields[8] if len(fields) > 1 else '', - longitude = fields[9] if len(fields) > 1 else '', - photos = fields[10] if len(fields) > 1 else '', - videos = fields[11] if len(fields) > 1 else '', - webcontents = fields[12] if len(fields) > 1 else '', - status = fields[13] if len(fields) > 1 else '', - portal = fields[14] if len(fields) > 1 else '', - group = fields[15] if len(fields) > 1 else '', - phone = fields[16] if len(fields) > 1 else '', - fax = fields[17] if len(fields) > 1 else '', - email = fields[18] if len(fields) > 1 else '', - facility = fields[19] if len(fields) > 1 else '', - remark = fields[20] if len(fields) > 1 else '', - parammeters = fields[21] if len(fields) > 1 else '', - tags = fields[22] if len(fields) > 1 else '' - ) + + with transaction.atomic(): + mdl.objects.filter(location_id = int(fields[0])).update( + location_name = fields[1] if len(fields) > 1 else '', + category = fields[2] if len(fields) > 1 else '', + zip = fields[3] if len(fields) > 1 else '', + address = fields[4] if len(fields) > 1 else '', + prefecture = fields[5] if len(fields) > 1 else '', + area = fields[6] if len(fields) > 1 else '', + city = fields[7] if len(fields) > 1 else '', + latitude = fields[8] if len(fields) > 1 else '', + longitude = fields[9] if len(fields) > 1 else '', + photos = fields[10] if len(fields) > 1 else '', + videos = fields[11] if len(fields) > 1 else '', + webcontents = fields[12] if len(fields) > 1 else '', + status = fields[13] if len(fields) > 1 else '', + portal = fields[14] if len(fields) > 1 else '', + group = fields[15] if len(fields) > 1 else '', + phone = fields[16] if len(fields) > 1 else '', + fax = fields[17] if len(fields) > 1 else '', + email = fields[18] if len(fields) > 1 else '', + facility = fields[19] if len(fields) > 1 else '', + remark = fields[20] if len(fields) > 1 else '', + parammeters = fields[21] if len(fields) > 1 else '', + tags = fields[22] if len(fields) > 1 else '' + ) def updateLineTable(mdl, fields): print(f"Updating {fields[0]} - {fields[1]}") print(mdl.objects.filter(location_id = int(fields[0]))) print("-------") - mdl.objects.filter(location_id = int(fields[0])).update( - location_name= fields[1] if len(fields) > 1 else '', - category=fields[2] if len(fields) > 2 else '', - zip=fields[3] if len(fields) > 3 else '', - address=fields[4] if len(fields) > 4 else '', - prefecture=fields[5] if len(fields) > 5 else '', - area=fields[6] if len(fields) > 6 else '', - city=fields[7] if len(fields) > 7 else '', - photos=fields[8] if len(fields) > 8 else '', - videos=fields[9] if len(fields) > 9 else '', - webcontents=fields[10] if len(fields) > 10 else '', - status=fields[11] if len(fields) > 11 else '', - portal=fields[12] if len(fields) > 12 else '', - group=fields[13] if len(fields) > 13 else '', - phone=fields[14] if len(fields) > 14 else '', - fax=fields[15] if len(fields) > 15 else '', - email=fields[16] if len(fields) > 16 else '', - facility=fields[17] if len(fields) > 17 else '', - remark=fields[18] if len(fields) > 18 else '', - tags=fields[19] if len(fields) > 19 else '', - parammeters=fields[20] if len(fields) > 20 else '' - ) + with transaction.atomic(): + mdl.objects.filter(location_id = int(fields[0])).update( + location_name= fields[1] if len(fields) > 1 else '', + category=fields[2] if len(fields) > 2 else '', + zip=fields[3] if len(fields) > 3 else '', + address=fields[4] if len(fields) > 4 else '', + prefecture=fields[5] if len(fields) > 5 else '', + area=fields[6] if len(fields) > 6 else '', + city=fields[7] if len(fields) > 7 else '', + photos=fields[8] if len(fields) > 8 else '', + videos=fields[9] if len(fields) > 9 else '', + webcontents=fields[10] if len(fields) > 10 else '', + status=fields[11] if len(fields) > 11 else '', + portal=fields[12] if len(fields) > 12 else '', + group=fields[13] if len(fields) > 13 else '', + phone=fields[14] if len(fields) > 14 else '', + fax=fields[15] if len(fields) > 15 else '', + email=fields[16] if len(fields) > 16 else '', + facility=fields[17] if len(fields) > 17 else '', + remark=fields[18] if len(fields) > 18 else '', + tags=fields[19] if len(fields) > 19 else '', + parammeters=fields[20] if len(fields) > 20 else '' + ) def updatePolygonTable(mdl, fields): #print(f"Updated {fields[0]} - {fields[1]}") - mdl.objects.filter(location_id = fields[0]).update( - location_name= fields[1] if len(fields) > 1 else '', - category=fields[2] if len(fields) > 2 else '', - zip=fields[3] if len(fields) > 3 else '', - address=fields[4] if len(fields) > 4 else '', - prefecture=fields[5] if len(fields) > 5 else '', - area=fields[6] if len(fields) > 6 else '', - city=fields[7] if len(fields) > 7 else '', - photos=fields[8] if len(fields) > 8 else '', - videos=fields[9] if len(fields) > 9 else '', - webcontents=fields[10] if len(fields) > 10 else '', - status=fields[11] if len(fields) > 11 else '', - portal=fields[12] if len(fields) > 12 else '', - group=fields[13] if len(fields) > 13 else '', - phone=fields[14] if len(fields) > 14 else '', - fax=fields[15] if len(fields) > 15 else '', - email=fields[16] if len(fields) > 16 else '', - facility=fields[17] if len(fields) > 17 else '', - remark=fields[18] if len(fields) > 18 else '', - tags=fields[19] if len(fields) > 19 else '', - parammeters=fields[20] if len(fields) > 20 else '' - ) + with transaction.atomic(): + mdl.objects.filter(location_id = fields[0]).update( + location_name= fields[1] if len(fields) > 1 else '', + category=fields[2] if len(fields) > 2 else '', + zip=fields[3] if len(fields) > 3 else '', + address=fields[4] if len(fields) > 4 else '', + prefecture=fields[5] if len(fields) > 5 else '', + area=fields[6] if len(fields) > 6 else '', + city=fields[7] if len(fields) > 7 else '', + photos=fields[8] if len(fields) > 8 else '', + videos=fields[9] if len(fields) > 9 else '', + webcontents=fields[10] if len(fields) > 10 else '', + status=fields[11] if len(fields) > 11 else '', + portal=fields[12] if len(fields) > 12 else '', + group=fields[13] if len(fields) > 13 else '', + phone=fields[14] if len(fields) > 14 else '', + fax=fields[15] if len(fields) > 15 else '', + email=fields[16] if len(fields) > 16 else '', + facility=fields[17] if len(fields) > 17 else '', + remark=fields[18] if len(fields) > 18 else '', + tags=fields[19] if len(fields) > 19 else '', + parammeters=fields[20] if len(fields) > 20 else '' + ) diff --git a/rog/serializers.py b/rog/serializers.py index d52b50b..8029e0f 100644 --- a/rog/serializers.py +++ b/rog/serializers.py @@ -4,6 +4,15 @@ from sqlalchemy.sql.functions import mode from .models import Location, Location_line, Location_polygon, JpnAdminMainPerf, JpnAdminPerf, JpnSubPerf from drf_extra_fields.fields import Base64ImageField +from django.contrib.auth.models import User +from django.contrib.auth import authenticate + + +class LocationCatSerializer(serializers.ModelSerializer): + class Meta: + model=Location + fields=['category',] + class LocationSerializer(GeoFeatureModelSerializer): class Meta: @@ -40,3 +49,33 @@ class JPN_perfSerializer(serializers.ModelSerializer): class Meta: model=JpnAdminPerf fields=['id','et_id', 'et_right', 'et_left', 'adm2_l', 'adm1_l', 'adm0_l', 'adm0_r', 'adm1_r', 'adm2_r', 'admlevel'] + + + +class CreateUserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ('id', 'username', 'password') + extra_kwargs = {'password': {'write_only': True}} + + def create(self, validated_data): + user = User.objects.create_user(validated_data['username'], + None, + validated_data['password']) + return user + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ('id', 'username') + + +class LoginUserSerializer(serializers.Serializer): + username = 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 diff --git a/rog/urls.py b/rog/urls.py index 6f7322b..f1f7553 100644 --- a/rog/urls.py +++ b/rog/urls.py @@ -1,7 +1,8 @@ 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 +from .views import LocationViewSet, Location_lineViewSet, Location_polygonViewSet, Jpn_Main_PerfViewSet, Jpn_PerfViewSet, LocationsInPerf, SubInPerf, ExtentForSubPerf, SubPerfInMainPerf, ExtentForMainPerf, LocationsInSubPerf, CatView, RegistrationAPI, LoginAPI, UserAPI from django.urls import path, include +from knox import views as knox_views router = DefaultRouter() @@ -21,4 +22,9 @@ urlpatterns += [ path('subperfinmain/', SubPerfInMainPerf, name="sub_perf"), path('perfext/', ExtentForSubPerf, name="sub_perf_ext"), path('mainperfext/', ExtentForMainPerf, name="main_perf_ext"), + path('cats/', CatView, name='cats'), + path('register/', RegistrationAPI.as_view()), + path('login/', LoginAPI.as_view()), + path('user/', UserAPI.as_view()), + path('logout/', knox_views.LogoutView.as_view(), name='knox_logout'), ] \ No newline at end of file diff --git a/rog/views.py b/rog/views.py index dc9f4ac..4c81ea4 100644 --- a/rog/views.py +++ b/rog/views.py @@ -1,8 +1,10 @@ from django.core.serializers import serialize from .models import Location, Location_line, Location_polygon, JpnAdminMainPerf, JpnAdminPerf, JpnSubPerf from rest_framework import viewsets -from .serializers import LocationSerializer, Location_lineSerializer, Location_polygonSerializer, JPN_main_perfSerializer, JPN_perfSerializer, JPN_sub_perSerializer +from .serializers import LocationSerializer, Location_lineSerializer, Location_polygonSerializer, JPN_main_perfSerializer, JPN_perfSerializer, JPN_sub_perSerializer, LocationCatSerializer, CreateUserSerializer, UserSerializer, LoginUserSerializer +from knox.models import AuthToken +from rest_framework import viewsets, permissions, generics from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.parsers import JSONParser, MultiPartParser @@ -39,16 +41,26 @@ class Jpn_PerfViewSet(viewsets.ModelViewSet): def LocationsInPerf(request): perfecture = request.GET.get('perf') + cat = request.GET.get('cat') perf_geom = JpnAdminMainPerf.objects.get(id=perfecture) - locs = Location.objects.filter(geom__within=perf_geom.geom) + + if(cat): + locs = Location.objects.filter(geom__within=perf_geom.geom, category=cat) + else: + locs = Location.objects.filter(geom__within=perf_geom.geom) + serializer = LocationSerializer(locs, many=True) return JsonResponse(serializer.data, safe=False) - #return JsonResponse({}) def LocationsInSubPerf(request): subperfecture = request.GET.get('subperf') + cat = request.GET.get('cat') perf_geom = JpnSubPerf.objects.get(id=subperfecture) - locs = Location.objects.filter(geom__within=perf_geom.geom) + + if(cat): + locs = Location.objects.filter(geom__within=perf_geom.geom, category=cat) + else: + locs = Location.objects.filter(geom__within=perf_geom.geom) serializer = LocationSerializer(locs, many=True) return JsonResponse(serializer.data, safe=False) @@ -65,7 +77,7 @@ def SubPerfInMainPerf(request): prefecture = request.GET.get('perf') perf_geom = JpnAdminMainPerf.objects.get(id=prefecture) sub = JpnSubPerf.objects.filter(geom__within=perf_geom.geom) - serializer = JPN_sub_perSerializer + #serializer = JPN_sub_perSerializer #sub = JpnAdminPerf.objects.filter(geom__within=perf_geom.geom) serializer = JPN_sub_perSerializer(sub, many=True) return JsonResponse(serializer.data, safe=False) @@ -84,4 +96,41 @@ def ExtentForSubPerf(request): ext = sub_perf.geom.extent # iata = serializers.serialize("json",ext) return JsonResponse(ext, safe=False) - \ No newline at end of file + + +def CatView(request): + c = Location.objects.values('category').distinct() + serializer = LocationCatSerializer(c, many=True) + return JsonResponse(serializer.data, safe=False) + + +class RegistrationAPI(generics.GenericAPIView): + serializer_class = CreateUserSerializer + + def post(self, request, *args, **kwargs): + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + user = serializer.save() + return Response({ + "user": UserSerializer(user, context=self.get_serializer_context()).data, + "token": AuthToken.objects.create(user)[1] + }) + +class LoginAPI(generics.GenericAPIView): + serializer_class = LoginUserSerializer + + def post(self, request, *args, **kwargs): + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + user = serializer.validated_data + return Response({ + "user": UserSerializer(user, context=self.get_serializer_context()).data, + "token": AuthToken.objects.create(user)[1] + }) + +class UserAPI(generics.RetrieveAPIView): + permission_classes = [permissions.IsAuthenticated, ] + serializer_class = UserSerializer + + def get_object(self): + return self.request.user \ No newline at end of file