This commit is contained in:
Mohamed Nouffer
2022-04-27 15:47:37 +05:30
parent 4bc68e947e
commit 11037587df
7 changed files with 202 additions and 77 deletions

View File

@ -48,6 +48,7 @@ INSTALLED_APPS = [
'django.contrib.gis', 'django.contrib.gis',
'rest_framework', 'rest_framework',
'rest_framework_gis', 'rest_framework_gis',
'knox',
'leaflet', 'leaflet',
'leaflet_admin_list', 'leaflet_admin_list',
'rog.apps.RogConfig', 'rog.apps.RogConfig',
@ -168,5 +169,6 @@ LEAFLET_CONFIG = {
} }
REST_FRAMEWORK = { REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'] 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
'DEFAULT_AUTHENTICATION_CLASSES': ('knox.auth.TokenAuthentication', ),
} }

View File

@ -20,6 +20,7 @@ from django.conf.urls.static import static
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('auth/', include('knox.urls')),
path('api/', include("rog.urls")), path('api/', include("rog.urls")),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@ -63,3 +63,4 @@ typing_extensions==4.0.0
urllib3==1.26.7 urllib3==1.26.7
django-extra-fields==3.0.2 django-extra-fields==3.0.2
django-phonenumber-field==6.1.0 django-phonenumber-field==6.1.0
django-rest-knox==4.2.0

View File

@ -18,6 +18,7 @@ from .mapping import location_mapping, location_line_mapping, location_polygon_m
from .choices import LAYER_CHOICES from .choices import LAYER_CHOICES
from django.contrib.gis.utils import LayerMapping from django.contrib.gis.utils import LayerMapping
from django.apps import apps from django.apps import apps
from django.db import transaction
import csv import csv
import codecs 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) @receiver(pre_save, sender=ShapeLayers)
def my_callback(sender, instance, *args, **kwargs): def my_callback(sender, instance, *args, **kwargs):
instance.table_name = getTableForModel(instance.layerof) 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) @receiver(post_save, sender=ShapeLayers)
def publish_date(sender, instance, created, **kwargs): def publish_data(sender, instance, created, **kwargs):
file = instance.file.path file = instance.file.path
file_format = os.path.basename(file).split('.')[-1] file_format = os.path.basename(file).split('.')[-1]
file_name = os.path.basename(file).split('.')[0] file_name = os.path.basename(file).split('.')[0]
@ -436,6 +459,8 @@ def updateLocation(mdl, fields):
print(f"Updating {fields[0]} - {fields[1]}") 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])))
print("-------") print("-------")
with transaction.atomic():
mdl.objects.filter(location_id = int(fields[0])).update( mdl.objects.filter(location_id = int(fields[0])).update(
location_name = fields[1] if len(fields) > 1 else '', location_name = fields[1] if len(fields) > 1 else '',
category = fields[2] if len(fields) > 1 else '', category = fields[2] if len(fields) > 1 else '',
@ -465,6 +490,7 @@ def updateLineTable(mdl, fields):
print(f"Updating {fields[0]} - {fields[1]}") 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])))
print("-------") print("-------")
with transaction.atomic():
mdl.objects.filter(location_id = int(fields[0])).update( mdl.objects.filter(location_id = int(fields[0])).update(
location_name= fields[1] if len(fields) > 1 else '', location_name= fields[1] if len(fields) > 1 else '',
category=fields[2] if len(fields) > 2 else '', category=fields[2] if len(fields) > 2 else '',
@ -491,6 +517,7 @@ def updateLineTable(mdl, fields):
def updatePolygonTable(mdl, fields): def updatePolygonTable(mdl, fields):
#print(f"Updated {fields[0]} - {fields[1]}") #print(f"Updated {fields[0]} - {fields[1]}")
with transaction.atomic():
mdl.objects.filter(location_id = fields[0]).update( mdl.objects.filter(location_id = fields[0]).update(
location_name= fields[1] if len(fields) > 1 else '', location_name= fields[1] if len(fields) > 1 else '',
category=fields[2] if len(fields) > 2 else '', category=fields[2] if len(fields) > 2 else '',

View File

@ -4,6 +4,15 @@ 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
from drf_extra_fields.fields import Base64ImageField 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 LocationSerializer(GeoFeatureModelSerializer):
class Meta: class Meta:
@ -40,3 +49,33 @@ class JPN_perfSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model=JpnAdminPerf model=JpnAdminPerf
fields=['id','et_id', 'et_right', 'et_left', 'adm2_l', 'adm1_l', 'adm0_l', 'adm0_r', 'adm1_r', 'adm2_r', 'admlevel'] 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.")

View File

@ -1,7 +1,8 @@
from rest_framework import urlpatterns from rest_framework import urlpatterns
from rest_framework.routers import DefaultRouter 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 django.urls import path, include
from knox import views as knox_views
router = DefaultRouter() router = DefaultRouter()
@ -21,4 +22,9 @@ urlpatterns += [
path('subperfinmain/', SubPerfInMainPerf, name="sub_perf"), path('subperfinmain/', SubPerfInMainPerf, name="sub_perf"),
path('perfext/', ExtentForSubPerf, name="sub_perf_ext"), path('perfext/', ExtentForSubPerf, name="sub_perf_ext"),
path('mainperfext/', ExtentForMainPerf, name="main_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'),
] ]

View File

@ -1,8 +1,10 @@
from django.core.serializers import serialize 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
from rest_framework import viewsets 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.decorators import action
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.parsers import JSONParser, MultiPartParser from rest_framework.parsers import JSONParser, MultiPartParser
@ -39,15 +41,25 @@ class Jpn_PerfViewSet(viewsets.ModelViewSet):
def LocationsInPerf(request): def LocationsInPerf(request):
perfecture = request.GET.get('perf') perfecture = request.GET.get('perf')
cat = request.GET.get('cat')
perf_geom = JpnAdminMainPerf.objects.get(id=perfecture) perf_geom = JpnAdminMainPerf.objects.get(id=perfecture)
if(cat):
locs = Location.objects.filter(geom__within=perf_geom.geom, category=cat)
else:
locs = Location.objects.filter(geom__within=perf_geom.geom) locs = Location.objects.filter(geom__within=perf_geom.geom)
serializer = LocationSerializer(locs, many=True) serializer = LocationSerializer(locs, many=True)
return JsonResponse(serializer.data, safe=False) return JsonResponse(serializer.data, safe=False)
#return JsonResponse({})
def LocationsInSubPerf(request): def LocationsInSubPerf(request):
subperfecture = request.GET.get('subperf') subperfecture = request.GET.get('subperf')
cat = request.GET.get('cat')
perf_geom = JpnSubPerf.objects.get(id=subperfecture) perf_geom = JpnSubPerf.objects.get(id=subperfecture)
if(cat):
locs = Location.objects.filter(geom__within=perf_geom.geom, category=cat)
else:
locs = Location.objects.filter(geom__within=perf_geom.geom) locs = Location.objects.filter(geom__within=perf_geom.geom)
serializer = LocationSerializer(locs, many=True) serializer = LocationSerializer(locs, many=True)
return JsonResponse(serializer.data, safe=False) return JsonResponse(serializer.data, safe=False)
@ -65,7 +77,7 @@ def SubPerfInMainPerf(request):
prefecture = request.GET.get('perf') prefecture = request.GET.get('perf')
perf_geom = JpnAdminMainPerf.objects.get(id=prefecture) perf_geom = JpnAdminMainPerf.objects.get(id=prefecture)
sub = JpnSubPerf.objects.filter(geom__within=perf_geom.geom) 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) #sub = JpnAdminPerf.objects.filter(geom__within=perf_geom.geom)
serializer = JPN_sub_perSerializer(sub, many=True) serializer = JPN_sub_perSerializer(sub, many=True)
return JsonResponse(serializer.data, safe=False) return JsonResponse(serializer.data, safe=False)
@ -85,3 +97,40 @@ def ExtentForSubPerf(request):
# iata = serializers.serialize("json",ext) # iata = serializers.serialize("json",ext)
return JsonResponse(ext, safe=False) return JsonResponse(ext, safe=False)
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