From 641f07c55935931111c8823b1794e8949adb0e74 Mon Sep 17 00:00:00 2001 From: Eeshu Yadav <153345870+Eeshu-Yadav@users.noreply.github.com> Date: Sun, 6 Oct 2024 07:56:25 +0530 Subject: [PATCH 1/7] Add files via upload --- SR_backend/__init__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 240 bytes SR_backend/__pycache__/celery.cpython-312.pyc | Bin 0 -> 673 bytes .../__pycache__/settings.cpython-312.pyc | Bin 0 -> 2547 bytes SR_backend/__pycache__/urls.cpython-312.pyc | Bin 0 -> 457 bytes SR_backend/__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 660 bytes SR_backend/asgi.py | 16 ++ SR_backend/celery.py | 9 + SR_backend/settings.py | 138 ++++++++++ SR_backend/urls.py | 7 + SR_backend/wsgi.py | 16 ++ api_location/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 168 bytes .../__pycache__/admin.cpython-312.pyc | Bin 0 -> 734 bytes api_location/__pycache__/apps.cpython-312.pyc | Bin 0 -> 485 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 961 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 0 -> 742 bytes .../__pycache__/tasks.cpython-312.pyc | Bin 0 -> 1248 bytes api_location/__pycache__/urls.cpython-312.pyc | Bin 0 -> 644 bytes .../__pycache__/views.cpython-312.pyc | Bin 0 -> 10245 bytes api_location/admin.py | 15 ++ api_location/apps.py | 6 + api_location/migrations/0001_initial.py | 29 ++ ...ation_latitude_alter_location_longitude.py | 22 ++ api_location/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 1062 bytes ...e_alter_location_longitude.cpython-312.pyc | Bin 0 -> 918 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 179 bytes api_location/models.py | 35 +++ api_location/serializers.py | 7 + api_location/tasks.py | 23 ++ api_location/tests.py | 3 + api_location/urls.py | 14 + api_location/views.py | 251 ++++++++++++++++++ db.sqlite3 | Bin 0 -> 139264 bytes manage.py | 22 ++ 36 files changed, 616 insertions(+) create mode 100644 SR_backend/__init__.py create mode 100644 SR_backend/__pycache__/__init__.cpython-312.pyc create mode 100644 SR_backend/__pycache__/celery.cpython-312.pyc create mode 100644 SR_backend/__pycache__/settings.cpython-312.pyc create mode 100644 SR_backend/__pycache__/urls.cpython-312.pyc create mode 100644 SR_backend/__pycache__/wsgi.cpython-312.pyc create mode 100644 SR_backend/asgi.py create mode 100644 SR_backend/celery.py create mode 100644 SR_backend/settings.py create mode 100644 SR_backend/urls.py create mode 100644 SR_backend/wsgi.py create mode 100644 api_location/__init__.py create mode 100644 api_location/__pycache__/__init__.cpython-312.pyc create mode 100644 api_location/__pycache__/admin.cpython-312.pyc create mode 100644 api_location/__pycache__/apps.cpython-312.pyc create mode 100644 api_location/__pycache__/models.cpython-312.pyc create mode 100644 api_location/__pycache__/serializers.cpython-312.pyc create mode 100644 api_location/__pycache__/tasks.cpython-312.pyc create mode 100644 api_location/__pycache__/urls.cpython-312.pyc create mode 100644 api_location/__pycache__/views.cpython-312.pyc create mode 100644 api_location/admin.py create mode 100644 api_location/apps.py create mode 100644 api_location/migrations/0001_initial.py create mode 100644 api_location/migrations/0002_alter_location_latitude_alter_location_longitude.py create mode 100644 api_location/migrations/__init__.py create mode 100644 api_location/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 api_location/migrations/__pycache__/0002_alter_location_latitude_alter_location_longitude.cpython-312.pyc create mode 100644 api_location/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 api_location/models.py create mode 100644 api_location/serializers.py create mode 100644 api_location/tasks.py create mode 100644 api_location/tests.py create mode 100644 api_location/urls.py create mode 100644 api_location/views.py create mode 100644 db.sqlite3 create mode 100644 manage.py diff --git a/SR_backend/__init__.py b/SR_backend/__init__.py new file mode 100644 index 00000000..b7b5dfeb --- /dev/null +++ b/SR_backend/__init__.py @@ -0,0 +1,3 @@ +from .celery import app as celery_app + +__all__ = ('celery_app',) \ No newline at end of file diff --git a/SR_backend/__pycache__/__init__.cpython-312.pyc b/SR_backend/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42bceda28ae5c7e758a205e1adb19411ee3c16be GIT binary patch literal 240 zcmX@j%ge<81f6>r)183yV-N=hn4pZ$B0$D;h7^Vr#vF!R#waF6h7_hK=1OKwmY0k` zDNV*(%!vgBK#D6lH7B*GG9JkD(`32D2H_Sl0~Hmq0Et`d@$rc{Iq~r;89oEK48L5R ztztrpQ;UjYQd5gFN@HA7i?d7e3u5vTixcCM5|gu2^HO4hgRn8<<1_OzOXB183Mzkb n*yQG?l;)(`6@h#Ma#JxckodsN$jEq?LG=NbWFvbK2T%k68~i{S literal 0 HcmV?d00001 diff --git a/SR_backend/__pycache__/celery.cpython-312.pyc b/SR_backend/__pycache__/celery.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2ecd3bd30830245bde789d1634bdff7a23a5325 GIT binary patch literal 673 zcmZuv&ubGw6n?XtY?C#mQcbMjKM=v-QHltfgs9XMn)YB=940%HxXJF$GBaC9PkPe- zz`sG_xp?*LCB;f*L{vO^6ME~(9n&;9_zrKr_s#q9@n$}*uDX!fheI^Di2#0?U~ai{ zaC(@5H$Z`+5F*q?k=3=3iLKD?+SzG`xhUVwBVhKhG%sJA!?gvTBbuZ6i8YH5Siths znPdu#bqlO8yfVYfp03csyW*lM%PKG5&+z1&LNKFNKlPb*C zwZ)}&{C`?R-ViG+-VX$iwVO4htWVNVX`3X8UN>Wc0qzSPVcs*s^g2lur-AhOJ`-3G zIg)STH0uLr_4=l_Cz+5QWAb_GHJBVJo_H~l1owzPVlnkPJO6_-J+)+fR=68+nuhG2 zF#9*JCfk|&V7GFO2+Gq+ZF;+P3=e-grPt3sIX7O|U%)N~b literal 0 HcmV?d00001 diff --git a/SR_backend/__pycache__/settings.cpython-312.pyc b/SR_backend/__pycache__/settings.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7288f5af07ea97b3cf3db856e39a48284953f26 GIT binary patch literal 2547 zcma)8OK;mo5MJv2wk%7wVkd3fAZg^l^fR#&Bxz}hc7*6vQHmSFC_!u2GHr^KNy?6R z(!H0Wm-diTZbg1dFE)CJu|NR>J@rsPNp3lHDao>`7^o>|A2ajK&VHO3>GxpJ2gvjD zKUB3D0^l!ebN;w`i;sW;;1>V^q-0Q|c!~lxfGA{pOXSwG=kCsfFPWWW_CXi#heQMI(9(I|P!a`wuN_s24?sU3gaH^tP8c%% z0Kk#gHi_axFbqeDRTxG(<5*{mN>tUskH8oohU5GwIWI!KV{n3x!Z;s;*WhH;#*f1( zeu8}C@H&4D-ry&jUnIW#+X_BGVMjqUcFi@oCn{BSR#J3SX=rHn_U+|mc(}Znn0+{{ zsrPH@s`B7geMenhJUqC24~nx-8vD&x3wPv3?O^rE{gof2Qo>_KyKd-;su-HIO^dK5 zDdyO)v_Vds8WLI%q!>oCj&yTkNU0-TmsI6*MU5!LDnU#RBMi}yDm#*lbR5!&)fhqk6&719+}0 z8$cyKKcu48YN|pfJJbJ|>e>#SB*O~{9SxYS48pNi{yOWB32*3jc`R_o7f-)(hW`4&AFZ<1J&xXXdt?$ z)#;uh)yc|42XNzoeX~?)wr%%@lNl$8{z)~IEWQZ;rj z@ZVe&-z}CxFUAW8-(J;0u2DmpRQcS46DhL|9ox&Lr0Lc>?PJco(Q`|ftf>&mI=v=U zNl~fm5|W`A+ck{(qq#Y&naI1UZai9@pP%oG7Zz9OdGcB4isKrBlKvm_2TLmt=jP3u zI;o7RCc%D{a6Q3Vw`y>#sWvpBZ)SC{ebme)rm(wC8n`TNYj*NVu}2WBrY8v4O}d^c zA0q6kla8hs*t5oPtd(Tg$Fa#GTN0kLFR?Slu9Y`%kjZ57n`}yWmghozEVK?V_7gNFuCX*)0JjwlFhRJP|nGIG*=2I+jn9i~SpC_s6DU*QH3#&Qo zvQ{OYL|!7Elh)}tl494Ha;78@&v{`z&1Ou6BSv`a&cabK{m^zGyQFtBPF^~Oj|6ZExLXKAFbcbPi*qhmQ@t`7DD=NV=IO9 zeM7BpDWWc(zr(GI0v=rI$S_E+)aiQjljkwXs)mf7YO}XI_`&Cm*jk|v zXrdrI-3qilAj(pw;mBz;eipd-0XT1k+IDx;_udfDmw%Z8K)7caTH{T6zirq~tc-?jk;_W+N zG~NoH1x8!mGyh1-b4G%8wF4kDK?3!G@%zUhLaySxe(IQNJMD1-ijrVrbH`xxG`@HY UVnjQ-)C!)C&76R+c8~D&FSkEQF8}}l literal 0 HcmV?d00001 diff --git a/SR_backend/__pycache__/urls.cpython-312.pyc b/SR_backend/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa9910051e719c2594c1790632440450f14a1f38 GIT binary patch literal 457 zcmZvYy-Ncz7{-&kT(4SN>Eg#G6o&)7PC68^h|Ug*2**K5FQL8mE_Wn%V7s|>v{U~E z>7U{v)WrjFaB{13>txc8LGT@(_j!Lwo{+p0i<>}Jy51c3&qPIL-8i?nsXvUj%r&T1NKOSU+Nq#|OB;gYS_TAE|_a+dk6 zumv*%lh9|DmZ2CY?acI<7o>#ta|>SWBOLqHepzZGh&-J55wlYsh-)jKl}HD(R%Ck- zOSs?Ux{S;UE2uVcBndYZM#4{Mh7`>TQsr$4S5$P9 zD0UeZxY5L3monns-u!1(rXBa@`Li%0X+Y0;NhYdyi&H669YXj44nD!*PYxIxgT1Gd lQEgZo)ra*7s=TB8U}w1dx_>k&A5V}yHS}%mvB1^;{sN9Ja|i$c literal 0 HcmV?d00001 diff --git a/SR_backend/__pycache__/wsgi.cpython-312.pyc b/SR_backend/__pycache__/wsgi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e06762ad7b255593d2bb9adaea8df2917b53d0b GIT binary patch literal 660 zcmYjP&ubGw6rS0QP1)EWYI`2UOF(zqgO?&gF=>cs3MNGefz4#+WwYt*%(62{O>aH< zCwTG?kp3xNDhk4${DB8=N^U(l+jL3ZVdi`D_}=%u$9&q_a*&CiT^xSE2>r^FB1$)4 zF*M*kVyK50W){aiY;K!dvE8#V0zBC)D64x?S>Xb)61#O_Ei;TP1op*Eskbq=Y8z*n z^QO~mkwA)36q1olN$0gcq`?UYMv_!cAkePkv^0UYiBzD79s^l&DCcy@flx&#i6xtI zc+6o2oXlt%U6%xnfsw(0CJB!Msv{`|1Jm!&2*ol55(%RjUl)iJrg@~uDB|#lC;(@y zb)xn?kI6u}Y(hmS3r~TJJrLd#ch4KkQ!PCP377L2g!WEV7sNX%+=gvezo~@x$$Rd)pRr;38`Ik{IxO0|Ew}DE$$-h{6>4+YAD&mz+lKTXn(D&m literal 0 HcmV?d00001 diff --git a/SR_backend/asgi.py b/SR_backend/asgi.py new file mode 100644 index 00000000..c8c391c5 --- /dev/null +++ b/SR_backend/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for SR_backend project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "SR_backend.settings") + +application = get_asgi_application() diff --git a/SR_backend/celery.py b/SR_backend/celery.py new file mode 100644 index 00000000..4622e930 --- /dev/null +++ b/SR_backend/celery.py @@ -0,0 +1,9 @@ +from __future__ import absolute_import, unicode_literals +import os +from celery import Celery + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') + +app = Celery('your_project') +app.config_from_object('django.conf:settings', namespace='CELERY') +app.autodiscover_tasks() diff --git a/SR_backend/settings.py b/SR_backend/settings.py new file mode 100644 index 00000000..135a3a0f --- /dev/null +++ b/SR_backend/settings.py @@ -0,0 +1,138 @@ +from pathlib import Path +# import ee +# import os +# from dotenv import load_dotenv + +# Load environment variables from the .env file +# load_dotenv() + +# # Get service account email and private key path from environment variables +# SERVICE_ACCOUNT = os.getenv("GEE_SERVICE_ACCOUNT") +# PRIVATE_KEY_PATH = os.getenv("GEE_PRIVATE_KEY_PATH") + +# # Initialize Earth Engine with the Service Account credentials using the key file path +# credentials = ee.ServiceAccountCredentials(SERVICE_ACCOUNT, PRIVATE_KEY_PATH) +# ee.Initialize(credentials) + +# Django settings +BASE_DIR = Path(__file__).resolve().parent.parent + + +SECRET_KEY = "django-insecure-%%44dv42)-9!ro5mo8n6#pfo42vq(+da-=ukyx1&lumq8=57^i" + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + 'rest_framework', + 'api_location', +] + +MIDDLEWARE = [ + "django.middleware.security.SecurityMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", +] + +ROOT_URLCONF = "SR_backend.urls" + +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + ], + }, + }, +] + +WSGI_APPLICATION = "SR_backend.wsgi.application" + + +# Database +# https://docs.djangoproject.com/en/5.1/ref/settings/#databases + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": BASE_DIR / "db.sqlite3", + } +} + + +# Password validation +# https://docs.djangoproject.com/en/5.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/5.1/topics/i18n/ + +LANGUAGE_CODE = "en-us" + +TIME_ZONE = "UTC" + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/5.1/howto/static-files/ + +STATIC_URL = "static/" + +# Default primary key field type +# https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" + +CORS_ALLOWED_ORIGINS = [ + "http://localhost:8000", + "http://127.0.0.1:8000", +] + + +# your_project/settings.py +CELERY_BROKER_URL = 'redis://localhost:6379/0' +CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' + +# Email configurations for SendGrid +EMAIL_BACKEND = "sendgrid_backend.SendgridBackend" +SENDGRID_API_KEY = "your_sendgrid_api_key" + diff --git a/SR_backend/urls.py b/SR_backend/urls.py new file mode 100644 index 00000000..1a953c30 --- /dev/null +++ b/SR_backend/urls.py @@ -0,0 +1,7 @@ +from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path('admin/', admin.site.urls), + path('api/', include('api_location.urls')), # Include your app URLs here +] diff --git a/SR_backend/wsgi.py b/SR_backend/wsgi.py new file mode 100644 index 00000000..d4cd207c --- /dev/null +++ b/SR_backend/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for SR_backend project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "SR_backend.settings") + +application = get_wsgi_application() diff --git a/api_location/__init__.py b/api_location/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/api_location/__pycache__/__init__.cpython-312.pyc b/api_location/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9866d9660b6ebd8069f2b16aa3b4af7470c6efc9 GIT binary patch literal 168 zcmX@j%ge<81RSA^=^*+sh(HIQS%4zb87dhx8U0o=6fpsLpFwJVxjS3Mgche3700Be z7H5>kxTF?mm*f}3Q9-Pz*!G}!Sr&%v&LrJ-vKwbMhul&q zc=mduYk z1Jj-XXTX3V0bLX#1Pn7GaF>Jx0S1l^y?N2K=VXK`hT%0Z=LA^IWS0G|vn(2sijQXD z&>grz{nD}k=~~RXX?AI~4D)vKBreiCOJ>QXn+d>l!_YI}5F!R4W+)^KhYllQjXA8w zP>R~PjZ6b4aCLL8^}==ti1vFTPB_itF4vwgZHhkQx*_tcQ^EjAJ7|Dq!#HV2+0$-2 z<$|f8u02|oQmTDQyE*F%ZtxNE9;;~E)XeFT+%Af626kO^? z7378b3RBYwuC`xpMIRNHD&kxn^rLOAj*7e&WwDCsew-Zfj71;b|A%oerDC?OsNCXa zZy@XT>ee{sQ;&@~fs5s>;m)}AaJW0Z{b=}Z;(@<3UTl58^K3%!O@9Kou`nUdE%*4X zY|ZQU%*adZFwQ#pW|C)xO!uXI2<@8LxlpoZi6?o-jBEz-cWt=bb#;klt5nLZ7&-{sR_6xcvYC literal 0 HcmV?d00001 diff --git a/api_location/__pycache__/apps.cpython-312.pyc b/api_location/__pycache__/apps.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c584186bfa5b0ed10304f1d8297395765bdee5a GIT binary patch literal 485 zcmYjNze~eF6n>Ya()5R@h)}`7MaYs_M1_6gfK89Am0m zMz-1J{zWt-i64cA;>ulm)^*^}TkQL}xw=Xx1Ry$3ZFSS(U7caY!Z% z{8`mXTRga5{PT~zom7_wr`Kcp>-eCW0O+&j6<~PWct9}4qgnrck literal 0 HcmV?d00001 diff --git a/api_location/__pycache__/models.cpython-312.pyc b/api_location/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf6732e0f173f7da38dc7c8d826315876e839709 GIT binary patch literal 961 zcma)4O=uHA6n?Wm=_WQLDN?~|NkG8`X+bKMB3`Pst+fZM9ztZ;WX81VWH;_?N?Qu% z&_e~mddi^)J+@RZM?LA?ODctiy?W|Rh`sdW%x)U0^x(jJeDmHn^S*gA-{bKZh_Uwq z6>n<*Kjq?d=pE7?6Qm9V2x3r1S%g4=hd`8dASy*AvG3opr-qTNx}ur-kzAO_kCYuk z884hwcZ<9g(K=AbA_7@O0jidav%-)QL=>WYRJ#TAK-qhaQtGrlCCp@d{!?cVeI2sV zm5ABn8#7M9@)jKXh=^03nyMcwTg#YHyXejPnq6hg*YnJ>7fr>LX5FZO0t!n8DElC1 z`?-KRtU)OV{|(EC4aq99MrF_1cyHEL|=TvgG#Vwq-3X9Yxxw$7@ zYE>36>vSX+KIKql#qYtGdoISS$udRA#gPFqPR)Wp?Ho z-nWs1)MRbCl}K+a9VXKIiS#yUTsuhIsZF+$na#*yGP9q|Y9eNhM@h-Di_Q?qhi3K1^8bg$FG&YoLnp@F@Rs-7%OWA)hhGu!OGOAB-vV^?w-!M& QXk+Q!+MBgwkUZG^2Q9qTo&W#< literal 0 HcmV?d00001 diff --git a/api_location/__pycache__/serializers.cpython-312.pyc b/api_location/__pycache__/serializers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f52d5fdcc2b984257b0316d33a8ef96af6cd7029 GIT binary patch literal 742 zcmZWnyKWRQ6!l|fGFkHCo$!#TkfuqM3ZX;@1QH@Ch|-Kkvdr39ChMJ9>{+3uP61yK zYC4opp`rp=N<|gXAQptQ71!gLgcUB1&$aJ8_hElpTo?fanAP`; z*$!iaQjC-YzQEY45mzpfG3};oL%5X6M*F!`!hA#%*U|Lp!+Y5t%*kX@nwO*Oku?3P z9A*VKoW0=PzAQwx`}~aZVa`-D!t9^ckaY>o0>B~qy0ZEr0f1mGQ=j~m01mZoC+8XA6G>b`a# z!bWw=#`nLx?fO4|FfTuwavI+@uYlsM_cy<+ZG2wa K_>I7*3;7GZQM0K4 literal 0 HcmV?d00001 diff --git a/api_location/__pycache__/tasks.cpython-312.pyc b/api_location/__pycache__/tasks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bbb5204bb4fe5fe81555bdd957cdba7d82758e8 GIT binary patch literal 1248 zcmZWo&1)M+6rb5|TVC0X)3_u}*cO_iKoxu{EhT9pJJ_`&6kcB2SAXK>n2yj}x#@}41&37tPf&xPS=^Ax?U>B2zsheOk%jjBIu9{;F+gE6y1uY*%t0pM_ZUUVEnZ`5yY%ZUep0 zw>h>V34xWuF=m^mGY!tUbuUEat?wGwU*O__{mzl zNEmZv2&k_A5;71ukW3|{_?Z^@tM8x znb+>@=ADi)_*>;sW#72CXI$(IPwiaZ8Q#73%dUI>@BD@R{I$LOwN7sAz((e!_sB3U zCViF*gTRGQ!rDx7$wtDJAZeyB&Wsf0&@$QkEGOW7L}`%`E>xwm+=*ebq{^lSjY+c4 zk@BsQI&yx9({PQF8|+I^$!E;Jh2=oU7{5VR-k_^$_5Q&_?=%}*hdR>S1BnjK0eYud K-7|%h#cTQ(LK>Igx|d7EbDBEMl1#d6ZZLoXK=O^1&b7YDBM3;R2gj zS2ZR7;V|$7``}INhKI^j_?Ru+xP7hGpb5G#(I^jT6l}M;?K9KtTG}ajwV}NvAEdQ_ zF4dhmSm$+GEfsYI^31FwEqqxFc$F0SN&;KUQ0Z`C6J*JiY8tI{%23)brZbfD*SLb5 zXQ0V^_l6F{i08wiSIbmMV?sKZ^o#^m_17ixwhB4!$-kE?>6)RtiFYdL8Mbd4>}sri z3ByF;E45?vbbuM{U?W#YigB>&i!NO!MSaR)@~s0pz0s#lc;V0 literal 0 HcmV?d00001 diff --git a/api_location/__pycache__/views.cpython-312.pyc b/api_location/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ddfe6f461fa523562103361790f855034bcc48f GIT binary patch literal 10245 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 literal 0 HcmV?d00001 diff --git a/api_location/migrations/__pycache__/__init__.cpython-312.pyc b/api_location/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d1d9dafe2e3ecd75ddb7382b4cb6faa28700090 GIT binary patch literal 179 zcmX@j%ge<81RSA^=^*+sh(HIQS%4zb87dhx8U0o=6fpsLpFwJV1vy*Agche3700Be z7H5>kxTF?mm*f}3<}=|x~xaZG%C pW?p7Ve7s&k 0: + geo_data = response.json()[0] + data['latitude'] = geo_data['lat'] + data['longitude'] = geo_data['lon'] + else: + return Response({"error": "Invalid place name"}, status=400) + + # Handle latitude and longitude directly + elif (data.get('latitude') is not None and data.get('longitude') is not None): + # If latitude and longitude are present, no further action is needed + pass + + # Check for valid input + elif 'place_name' not in data and (data.get('latitude') is None or data.get('longitude') is None): + return Response({"error": "Please provide either place_name or both latitude and longitude"}, status=400) + + serializer = self.get_serializer(data=data) + serializer.is_valid(raise_exception=True) + self.perform_create(serializer) + return Response(serializer.data) + +class LocationAdmin(admin.ModelAdmin): + list_display = ('place_name', 'latitude', 'longitude') + search_fields = ('place_name',) + list_filter = ('latitude', 'longitude') + ordering = ('place_name',) + readonly_fields = ('latitude', 'longitude') + +class LandsatDataViewSet(viewsets.ViewSet): + + def list(self, request): + location_id = request.query_params.get('location') + location = Location.objects.get(id=location_id) + + # Get the latitude and longitude of the user-defined location + lat = location.latitude + lon = location.longitude + + # Define the area of interest (3x3 pixel grid around the central point) + pixel_radius = 0.0003 # Approximate size for 3x3 grid at Landsat resolution + region = ee.Geometry.Rectangle( + [lon - pixel_radius, lat - pixel_radius, lon + pixel_radius, lat + pixel_radius] + ) + + # Fetch Landsat 8 Surface Reflectance data for the location + landsat_collection = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR") \ + .filterBounds(region) \ + .filterDate('2023-01-01', '2023-12-31') \ + .sort('CLOUD_COVER') \ + .first() + + # Select the relevant bands (e.g., B4: Red, B5: Near Infrared) + bands = landsat_collection.select(['B4', 'B5']) + + # Sample the data at the defined grid + pixel_data = bands.sample(region, scale=30).getInfo() + + # Extract the data from the GEE response + landsat_grid = [] + for feature in pixel_data['features']: + lat_lon = feature['geometry']['coordinates'] + sr_value = feature['properties']['B4'] # Surface Reflectance value for band 4 (example) + landsat_grid.append({ + "lat": lat_lon[1], + "lon": lat_lon[0], + "sr_value": sr_value + }) + + return Response({"grid": landsat_grid}) + + + +from skyfield.api import load, Topos +from datetime import datetime, timedelta, timezone +import requests +from rest_framework import status +from rest_framework.response import Response +from rest_framework import viewsets +from .models import Location + +# class OverpassViewSet(viewsets.ViewSet): +# def list(self, request): +# location_id = request.query_params.get('location') +# try: +# location = Location.objects.get(id=location_id) +# except Location.DoesNotExist: +# return Response({"error": "Location not found"}, status=status.HTTP_404_NOT_FOUND) + +# lat = location.latitude +# lon = location.longitude + +# # Step 1: Fetch TLE data from CelesTrak +# tle_url = f"https://celestrak.com/NORAD/elements/gp.php?CATNR=39084" +# response = requests.get(tle_url) + +# if response.status_code != 200: +# return Response({"error": "Unable to retrieve TLE data"}, status_code=status.HTTP_400_BAD_REQUEST) + +# tle_lines = response.text.splitlines() +# if len(tle_lines) < 2: +# return Response({"error": "Invalid TLE data received"}, status_code=status.HTTP_400_BAD_REQUEST) + +# # Step 2: Use Skyfield to calculate the next overpass time +# tle_data = "\n".join(tle_lines) # Joining TLE lines into a single string + +# # Use load.tle instead of load.tle_file +# satellite = load.tle(tle_data) # Loading TLE data correctly +# ts = load.timescale() +# observer_location = Topos(latitude_degrees=lat, longitude_degrees=lon) + +# # Step 3: Calculate the next overpass within a 24-hour window +# start_time = datetime.now(timezone.utc) +# end_time = start_time + timedelta(days=1) +# t0 = ts.utc(start_time.year, start_time.month, start_time.day, start_time.hour, start_time.minute) +# t1 = ts.utc(end_time.year, end_time.month, end_time.day, end_time.hour, end_time.minute) + +# # Step 4: Determine satellite passes +# time, events = satellite.find_events(observer_location, t0, t1, altitude_degrees=30.0) + +# # Get the next overpass time +# for ti, event in zip(time, events): +# if event == 0: # 0 indicates rise event (when satellite becomes visible) +# overpass_time = ti.utc_iso() +# return Response({"overpass_time": overpass_time}) + +# return Response({"error": "No overpass found in the next 24 hours"}, status=status.HTTP_404_NOT_FOUND) + + +from rest_framework import status, viewsets +from rest_framework.response import Response +from .models import Location +from skyfield.api import load, Topos +import requests +from datetime import datetime, timedelta, timezone + +class OverpassViewSet(viewsets.ViewSet): + def list(self, request): + location_id = request.query_params.get('location') + try: + location = Location.objects.get(id=location_id) + except Location.DoesNotExist: + return Response({"error": "Location not found"}, status=status.HTTP_404_NOT_FOUND) + + lat = location.latitude + lon = location.longitude + + # Step 1: Fetch TLE data from CelesTrak + tle_url = "https://celestrak.com/NORAD/elements/gp.php?CATNR=39084" # Landsat 8 NORAD ID + response = requests.get(tle_url) + + if response.status_code != 200: + return Response({"error": "Unable to retrieve TLE data"}, status=status.HTTP_400_BAD_REQUEST) + + tle_lines = response.text.strip().splitlines() + if len(tle_lines) < 3: # Ensure at least 3 lines for a valid TLE + return Response({"error": "Invalid TLE data received"}, status=status.HTTP_400_BAD_REQUEST) + + # Clean up TLE lines and remove leading/trailing whitespace + tle_lines = [line.strip() for line in tle_lines] + + # Debugging output to check TLE lines + print("TLE Lines:") + for line in tle_lines: + print(f"'{line}'") # Print each line with quotes to identify whitespace + + # Step 2: Use Skyfield to calculate the next overpass time + try: + # Use load.tle_file with properly formatted TLE lines + satellites = load.tle_file('\n'.join(tle_lines)) + satellite = satellites[0] # Get the first satellite from the loaded TLE lines + except Exception as e: + return Response({"error": f"Error loading satellite: {str(e)}"}, status=status.HTTP_400_BAD_REQUEST) + + ts = load.timescale() + observer_location = Topos(latitude_degrees=lat, longitude_degrees=lon) + + # Step 3: Calculate the next overpass within a 24-hour window + start_time = datetime.now(timezone.utc) + end_time = start_time + timedelta(days=1) + t0 = ts.utc(start_time.year, start_time.month, start_time.day, start_time.hour, start_time.minute) + t1 = ts.utc(end_time.year, end_time.month, end_time.day, end_time.hour, end_time.minute) + + # Step 4: Determine satellite passes + time, events = satellite.find_events(observer_location, t0, t1, altitude_degrees=30.0) + + # Get the next overpass time + for ti, event in zip(time, events): + if event == 0: # 0 indicates rise event (when satellite becomes visible) + overpass_time = ti.utc_iso() + return Response({"overpass_time": overpass_time}) + + return Response({"error": "No overpass found in the next 24 hours"}, status=status.HTTP_404_NOT_FOUND) + + + +class NotificationViewSet(viewsets.ViewSet): + def create(self, request): + location_id = request.data.get('location') + email = request.data.get('email') + phone_number = request.data.get('phone_number') + lead_time = int(request.data.get('lead_time', 60)) # lead time in minutes + + location = get_object_or_404(Location, id=location_id) + + # Mock overpass time (in a real scenario, calculate or fetch overpass time) + overpass_time_str = "2024-10-12T14:55:00Z" + overpass_time = datetime.strptime(overpass_time_str, "%Y-%m-%dT%H:%M:%SZ") + + # Schedule time = Overpass time - Lead time + notification_time = overpass_time - timedelta(minutes=lead_time) + countdown = (notification_time - datetime.now(timezone.utc)).total_seconds() + + if countdown > 0: + if email: + send_email_notification.apply_async((email, overpass_time_str), countdown=countdown) + if phone_number: + send_sms_notification.apply_async((phone_number, overpass_time_str), countdown=countdown) + return Response({"message": "Notification scheduled."}) + else: + return Response({"error": "Lead time is too short; overpass has already occurred or is too soon."}, status=400) diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..4154ceea17ddf3dbb572c01e07d92dd78d63c46a GIT binary patch literal 139264 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 CUyv^V literal 0 HcmV?d00001 diff --git a/manage.py b/manage.py new file mode 100644 index 00000000..1a932731 --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "SR_backend.settings") + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == "__main__": + main() From 2e3f9722f079666266c6ddfcb4e7e12246e16171 Mon Sep 17 00:00:00 2001 From: Eeshu Yadav <153345870+Eeshu-Yadav@users.noreply.github.com> Date: Sun, 6 Oct 2024 07:58:01 +0530 Subject: [PATCH 2/7] Update README.md --- README.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index abc30b8b..a571a573 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,8 @@ # NASA Space Apps Challenge 2024 [Noida] -#### Team Name - -#### Problem Statement - -#### Team Leader Email - +#### Team Name - Tech Conqueror +#### Problem Statement - Landsat Reflectance Data: On the Fly and at Your +Fingertips +#### Team Leader Email - eeshuyadav123@gmail.com -## A Brief of the Prototype: - What is your solution? and how it works. -## Code Execution Instruction: - *[If your solution is **not** application based, you can ignore this para] - - *The Repository must contain your **Execution Plan PDF**. From 3f3ee2473dc083c1533ef370d66d18622d2f5519 Mon Sep 17 00:00:00 2001 From: Eeshu Yadav <153345870+Eeshu-Yadav@users.noreply.github.com> Date: Sun, 6 Oct 2024 08:11:51 +0530 Subject: [PATCH 3/7] Update README.md --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index a571a573..019ebf5d 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,24 @@ Fingertips #### Team Leader Email - eeshuyadav123@gmail.com +#### Solution Overview +Our solution is a satellite overpass notification and data retrieval platform focused on Landsat imagery. Designed for users needing timely and precise satellite-based surface reflectance data, this prototype aims to simplify satellite imagery access and enhance environmental monitoring, research, and planning applications. The solution allows users to specify a target location, check upcoming Landsat satellite overpass times, and view a 3x3 grid of Landsat pixels centered on that location. Additionally, users can set notifications to alert them before an overpass, and the platform provides options to receive alerts via email or SMS. This system brings the power of satellite observation directly to users in real-time, aiding anyone from environmental scientists to policymakers in making data-driven decisions based on timely satellite imagery. + +The platform consists of three core components: + +Target Location and Overpass Notification Setup +Real-time Landsat Pixel Data Retrieval +Automated Notifications +##########How it Works +#### 1. Target Location and Overpass Notification Setup +Users begin by selecting or inputting a target location. This input can be a latitude/longitude coordinate or a direct selection on an interactive map. Once the location is set, our platform determines when the next Landsat satellite will pass over the area by querying services such as the CelesTrak API. CelesTrak provides orbital parameters that can be used to predict satellite positions, enabling us to determine overpass times based on user-defined coordinates. With the overpass time calculated, users can set lead times (e.g., 1 day, 1 hour) before the satellite's expected arrival and choose their preferred notification method, either email or SMS. + +#### 2. Real-time Landsat Pixel Data Retrieval +The platform uses Google Earth Engine (GEE) or the USGS Earth Explorer API to fetch satellite imagery data from Landsat satellites. A 3x3 grid centered around the user-defined location is displayed, where each grid cell represents a Landsat pixel. This feature allows users to inspect nearby pixels and understand the local variations in surface reflectance. The grid data includes spectral reflectance values across multiple bands, and if available, surface temperature information derived from thermal infrared bands. This high-resolution, real-time grid visualization assists users in gaining insight into the spatial distribution of reflectance data in their area of interest. + +The retrieval of Landsat data considers user-set parameters, such as cloud cover threshold and acquisition time range, ensuring that the data is relevant and high-quality. Users can opt for recent acquisitions or specify a time range for historical data, allowing for a flexible analysis suited to their needs. + +#### 3. Automated Notifications +Upon setting a notification, Celery, a background task manager, schedules the notifications based on the user-defined lead time. Celery works in conjunction with Redis, a message broker, to ensure task reliability and timely notifications. Users are notified by their chosen method, either via email (using SendGrid) or SMS (using Twilio). Email notifications include the exact overpass time, while SMS notifications are sent in advance of the overpass as per the lead time preference. This ensures users are prepared to capture or analyze data as the satellite passes. + +By providing an intuitive interface for tracking satellite imagery overpasses and automating data notifications, this solution bridges the gap between remote sensing data accessibility and real-time field application. This capability is particularly valuable for environmental researchers, agriculturalists, and climate scientists who rely on up-to-date, reliable, and precise data to make informed decisions. Our platform enables easier satellite data access while supporting accurate and timely analysis, making it a robust tool for a range of geospatial and environmental monitoring applications. From 45c0299f97aa6b6d52ebc6f8f814e9ee805791a4 Mon Sep 17 00:00:00 2001 From: Eeshu Yadav <153345870+Eeshu-Yadav@users.noreply.github.com> Date: Sun, 6 Oct 2024 08:12:33 +0530 Subject: [PATCH 4/7] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 019ebf5d..3140ca1c 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The platform consists of three core components: Target Location and Overpass Notification Setup Real-time Landsat Pixel Data Retrieval Automated Notifications -##########How it Works +### How it Works #### 1. Target Location and Overpass Notification Setup Users begin by selecting or inputting a target location. This input can be a latitude/longitude coordinate or a direct selection on an interactive map. Once the location is set, our platform determines when the next Landsat satellite will pass over the area by querying services such as the CelesTrak API. CelesTrak provides orbital parameters that can be used to predict satellite positions, enabling us to determine overpass times based on user-defined coordinates. With the overpass time calculated, users can set lead times (e.g., 1 day, 1 hour) before the satellite's expected arrival and choose their preferred notification method, either email or SMS. From 58c2e2bd4d5d368dc4542c6c687f7a6debb2f213 Mon Sep 17 00:00:00 2001 From: Eeshu Yadav <153345870+Eeshu-Yadav@users.noreply.github.com> Date: Sun, 6 Oct 2024 08:17:47 +0530 Subject: [PATCH 5/7] Add files via upload --- ...Notification and Data Retrieval Platform.pdf | Bin 0 -> 75110 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Execution Plan for Satellite Overpass Notification and Data Retrieval Platform.pdf diff --git a/Execution Plan for Satellite Overpass Notification and Data Retrieval Platform.pdf b/Execution Plan for Satellite Overpass Notification and Data Retrieval Platform.pdf new file mode 100644 index 0000000000000000000000000000000000000000..242b045a80b4955b5cda1377e012a83996b65a9b GIT binary patch literal 75110 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 w* Date: Sun, 6 Oct 2024 08:20:15 +0530 Subject: [PATCH 6/7] Update README.md --- README.md | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/README.md b/README.md index 3140ca1c..5e33c2fe 100644 --- a/README.md +++ b/README.md @@ -27,3 +27,133 @@ The retrieval of Landsat data considers user-set parameters, such as cloud cover Upon setting a notification, Celery, a background task manager, schedules the notifications based on the user-defined lead time. Celery works in conjunction with Redis, a message broker, to ensure task reliability and timely notifications. Users are notified by their chosen method, either via email (using SendGrid) or SMS (using Twilio). Email notifications include the exact overpass time, while SMS notifications are sent in advance of the overpass as per the lead time preference. This ensures users are prepared to capture or analyze data as the satellite passes. By providing an intuitive interface for tracking satellite imagery overpasses and automating data notifications, this solution bridges the gap between remote sensing data accessibility and real-time field application. This capability is particularly valuable for environmental researchers, agriculturalists, and climate scientists who rely on up-to-date, reliable, and precise data to make informed decisions. Our platform enables easier satellite data access while supporting accurate and timely analysis, making it a robust tool for a range of geospatial and environmental monitoring applications. + + + + + +Execution Plan for Satellite Overpass Notification and Data Retrieval Platform +1. Repository Setup +Clone the Repository + +bash +Copy code +git clone +cd +Check Directory Structure +Ensure the repository has the following structure for smooth setup: + +arduino +Copy code +├── project_folder/ +│ ├── settings.py +│ ├── urls.py +│ ├── views.py +│ ├── tasks.py +│ ├── models.py +├── templates/ +├── static/ +├── Execution_Plan.pdf +├── requirements.txt +├── README.md +├── ... +2. Python Environment Setup +Set up a Python Virtual Environment + +bash +Copy code +python3 -m venv myenv +source myenv/bin/activate # For Windows: myenv\Scripts\activate +Install Requirements +Install all dependencies: + +bash +Copy code +pip install -r requirements.txt +3. Configure Celery and Redis for Background Tasks +Install Redis (if not already installed) +Follow instructions on Redis’s official website to install Redis on your system. + +Start Redis Server + +bash +Copy code +redis-server +Configure Celery in Django +Ensure that celery.py is configured correctly with Redis as the broker: + +python +Copy code +# In celery.py +app.conf.broker_url = 'redis://localhost:6379/0' +app.conf.result_backend = 'redis://localhost:6379/0' +Run Celery Worker +Open a new terminal and start the Celery worker: + +bash +Copy code +celery -A project_folder worker -l info +4. Configure Email and SMS Services +Email Setup (SendGrid or SMTP) +Configure email settings in settings.py: + +python +Copy code +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +EMAIL_HOST = 'smtp.sendgrid.net' # or your SMTP provider +EMAIL_PORT = 587 +EMAIL_USE_TLS = True +EMAIL_HOST_USER = '' +EMAIL_HOST_PASSWORD = '' +SMS Setup (Twilio) +Add your Twilio account credentials to settings.py: + +python +Copy code +TWILIO_ACCOUNT_SID = '' +TWILIO_AUTH_TOKEN = '' +TWILIO_PHONE_NUMBER = '' +5. Database Setup +Set up PostgreSQL Database +Create a PostgreSQL database and user, then add the database configurations in settings.py: + +python +Copy code +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'your_db_name', + 'USER': 'your_db_user', + 'PASSWORD': 'your_db_password', + 'HOST': 'localhost', + 'PORT': '5432', + } +} +Run Migrations + +bash +Copy code +python manage.py makemigrations +python manage.py migrate +6. Run Django Server +Start Development Server + +bash +Copy code +python manage.py runserver +Access the Application +Open your browser and go to http://localhost:8000 to view the application. + +7. Testing the Application +Set Up Test Data +Add initial data, including sample locations, by using the Django admin interface or through fixtures. + +Test Notification Scheduling + +Access the overpass time scheduling view. +Verify that notifications are scheduled and sent correctly according to lead times. +Verify Landsat Data Retrieval +Test the data retrieval views and ensure the 3x3 Landsat grid is fetched and displayed correctly. + + + From 158da0bd2896a02edd85049398f9fc4dca18d672 Mon Sep 17 00:00:00 2001 From: Rishikeshari7 Date: Sun, 6 Oct 2024 09:45:39 +0530 Subject: [PATCH 7/7] frontend folder --- frontend/index.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 frontend/index.html diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 00000000..7fe338b7 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1 @@ +Rishi \ No newline at end of file