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',
'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', ),
}

View File

@ -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)

View File

@ -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

View File

@ -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 ''
)

View File

@ -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.")

View File

@ -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'),
]

View File

@ -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)
@ -85,3 +97,40 @@ def ExtentForSubPerf(request):
# iata = serializers.serialize("json",ext)
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