diff --git a/server/admins/__init__.py b/server/admins/__init__.py index 7c1b1f6..17e6b5f 100644 --- a/server/admins/__init__.py +++ b/server/admins/__init__.py @@ -1,10 +1,10 @@ from core.pagination import CustomPagination +from mainapp.models import MusicData from userprofile.models import UserData + from .issue_jwt import AdminTokenAuth -from mainapp.models import MusicData from .models import AdminAuth - Admin_Token_Auth = AdminTokenAuth() Paginate = CustomPagination() Music_Data = MusicData() diff --git a/server/admins/create_admin.py b/server/admins/create_admin.py index c6494f1..28c6abb 100644 --- a/server/admins/create_admin.py +++ b/server/admins/create_admin.py @@ -1,9 +1,11 @@ -from dotenv import load_dotenv -import hashlib, binascii -import pymongo +import binascii +import hashlib +import os import random import string -import os + +import pymongo +from dotenv import load_dotenv load_dotenv() diff --git a/server/admins/issue_jwt.py b/server/admins/issue_jwt.py index 4b06596..6265823 100644 --- a/server/admins/issue_jwt.py +++ b/server/admins/issue_jwt.py @@ -1,9 +1,10 @@ -from datetime import datetime, timedelta -from dotenv import load_dotenv -import jwt import os +from datetime import datetime, timedelta +import jwt from authentication.errors import InvalidTokenError +from dotenv import load_dotenv + from .errors import AdminTokenGenerationError load_dotenv() diff --git a/server/admins/models.py b/server/admins/models.py index cb1e074..3ec0e6c 100644 --- a/server/admins/models.py +++ b/server/admins/models.py @@ -1,16 +1,18 @@ -from dotenv import load_dotenv -import hashlib, binascii -import pymongo +import binascii +import hashlib +import os import random import string -import os +import pymongo from core.settings import DATABASE +from dotenv import load_dotenv + from .errors import ( - InvalidAdminCredentialsError, AdminDoesNotExistError, - InvalidAdminIDError, AdminExistsError, + InvalidAdminCredentialsError, + InvalidAdminIDError, ) load_dotenv() diff --git a/server/admins/tests/test_jwt_adm.py b/server/admins/tests/test_jwt_adm.py index 5c47fa9..6f7df37 100644 --- a/server/admins/tests/test_jwt_adm.py +++ b/server/admins/tests/test_jwt_adm.py @@ -1,7 +1,7 @@ import unittest -from authentication.errors import InvalidTokenError from admins.issue_jwt import AdminTokenAuth +from authentication.errors import InvalidTokenError class Test_Admin_JWT(unittest.TestCase): diff --git a/server/admins/tests/test_models_adm.py b/server/admins/tests/test_models_adm.py index e8e4a50..fd9ce57 100644 --- a/server/admins/tests/test_models_adm.py +++ b/server/admins/tests/test_models_adm.py @@ -1,12 +1,12 @@ -from dotenv import load_dotenv import unittest -from admins.models import AdminAuth from admins.errors import ( - InvalidAdminCredentialsError, AdminDoesNotExistError, + InvalidAdminCredentialsError, InvalidAdminIDError, ) +from admins.models import AdminAuth +from dotenv import load_dotenv class Test_Admin_Model(unittest.TestCase): diff --git a/server/admins/urls.py b/server/admins/urls.py index 4650711..94c93a5 100644 --- a/server/admins/urls.py +++ b/server/admins/urls.py @@ -1,6 +1,7 @@ -from .views import AdminView, AdminLogin, GenerateTokens from django.urls import path +from .views import AdminLogin, AdminView, GenerateTokens + urlpatterns = [ path("", AdminView.as_view()), path("login", AdminLogin.as_view()), diff --git a/server/admins/utils.py b/server/admins/utils.py index fc926f3..0218c8a 100644 --- a/server/admins/utils.py +++ b/server/admins/utils.py @@ -1,20 +1,19 @@ -from rest_framework import status -from django.http import response - -from userprofile.errors import FileDoesNotExistForCurrentUserError from authentication.errors import InvalidTokenError from core.errors import PageDoesNotExistError +from django.http import response +from mainapp.aws import AWSFunctionsS3 from mainapp.errors import DataFetchingError +from rest_framework import status +from userprofile.errors import FileDoesNotExistForCurrentUserError + +from . import Admin_Auth, Admin_Token_Auth, Music_Data, Paginate, User_Data from .errors import ( - InvalidAdminCredentialsError, - AdminTokenGenerationError, AdminDoesNotExistError, + AdminTokenGenerationError, + InvalidAdminCredentialsError, InvalidAdminIDError, ) -from . import Paginate, Music_Data, User_Data, Admin_Auth, Admin_Token_Auth -from mainapp.aws import AWSFunctionsS3 - def login_admin(request, **kwargs) -> response.JsonResponse: """Handles data when Admin Logs In through POST requests diff --git a/server/admins/validate_admins.py b/server/admins/validate_admins.py index 55a3c24..3e3107e 100644 --- a/server/admins/validate_admins.py +++ b/server/admins/validate_admins.py @@ -1,7 +1,7 @@ +from authentication.errors import InvalidTokenError from rest_framework.permissions import BasePermission -from authentication.errors import InvalidTokenError -from . import Admin_Token_Auth, Admin_Auth +from . import Admin_Auth, Admin_Token_Auth from .errors import InvalidAdminIDError diff --git a/server/admins/views.py b/server/admins/views.py index 68398f0..a287597 100644 --- a/server/admins/views.py +++ b/server/admins/views.py @@ -1,10 +1,10 @@ +from core.throttle import throttle +from django.http import response from rest_framework.permissions import AllowAny from rest_framework.views import APIView -from django.http import response -from .utils import delete_music_data, send_music_data, login_admin, get_tokens -from core.throttle import throttle from . import validate_admins +from .utils import delete_music_data, get_tokens, login_admin, send_music_data class AdminLogin(APIView): diff --git a/server/authentication/__init__.py b/server/authentication/__init__.py index bf6854d..3f29604 100644 --- a/server/authentication/__init__.py +++ b/server/authentication/__init__.py @@ -1,5 +1,5 @@ -from .models import UserAuth, ContactUsData from .jwt import TokenAuth +from .models import ContactUsData, UserAuth Contact_Us = ContactUsData() Token_Auth = TokenAuth() diff --git a/server/authentication/errors.py b/server/authentication/errors.py index c5c4d58..a5d6e51 100644 --- a/server/authentication/errors.py +++ b/server/authentication/errors.py @@ -9,6 +9,10 @@ class InvalidVerificationError(AuthenticationErrors): ... +class NoContactUsQueriesFoundError(ContactUsErrors): + ... + + class ContactUsDataInsertionError(ContactUsErrors): ... @@ -31,3 +35,7 @@ class UserExistsError(AuthenticationErrors): class InvalidUIDError(AuthenticationErrors): ... + + +class InvalidQIDError(ContactUsErrors): + ... diff --git a/server/authentication/jwt.py b/server/authentication/jwt.py index b183d3a..2b5008e 100644 --- a/server/authentication/jwt.py +++ b/server/authentication/jwt.py @@ -1,7 +1,9 @@ +import os from datetime import datetime, timedelta + from dotenv import load_dotenv + import jwt -import os from .errors import InvalidTokenError, TokenGenerationError diff --git a/server/authentication/mailer.py b/server/authentication/mailer.py index b8aa4aa..99ff742 100644 --- a/server/authentication/mailer.py +++ b/server/authentication/mailer.py @@ -1,6 +1,7 @@ -from dotenv import load_dotenv -import smtplib import os +import smtplib + +from dotenv import load_dotenv from . import UserAuth diff --git a/server/authentication/models.py b/server/authentication/models.py index a7cf116..c74802b 100644 --- a/server/authentication/models.py +++ b/server/authentication/models.py @@ -1,19 +1,23 @@ -from dotenv import load_dotenv -from datetime import datetime -import hashlib, binascii -import pymongo +import binascii +import hashlib +import os import random import string -import os +from datetime import datetime +import pymongo from core.settings import DATABASE +from dotenv import load_dotenv + from .errors import ( - InvalidUserCredentialsError, ContactUsDataInsertionError, + InvalidQIDError, + InvalidUIDError, + InvalidUserCredentialsError, InvalidVerificationError, + NoContactUsQueriesFoundError, UserDoesNotExistError, UserExistsError, - InvalidUIDError, ) load_dotenv() @@ -96,10 +100,33 @@ def insert_user(self, email: str, pwd: str) -> None: "user_id": self.generate_uid(), "Email": email, "Password": pwd, - "ContactUs": [], + "ContactUs": [], # Query ID + "Likes": [], # Like ID + "Comments": [], # Comment ID + "Notes": [], # Notes on When Password was Last Changed - FOR ADMIN } self.db.insert_one(rec) + def get_contact_us_query_ids(self, email: str) -> list: + """Fetches contact us query ids for particular user + + Args: + email: User Email ID + + Returns: + list + """ + if value := self.db.find_one({"Email": email}): + query_ids = value["ContactUs"] + if isinstance(query_ids, list) and len(query_ids) > 0: + return query_ids + else: + raise NoContactUsQueriesFoundError( + f"User {email} Has No Contact Us Queries Raised" + ) + + raise UserDoesNotExistError(f"User {email} Does Not Exist") + def add_verif_code(self, email: str, check_recursive_correctness: int) -> int: """Adds verification code & timestamp for reset password functionality @@ -217,11 +244,17 @@ def reset_password(self, pwd: str, code: int) -> bool: """ if value := self.db.find_one({"verif_code": code}): email = value["Email"] + + pwd_change_time = datetime.now() + pct_string = pwd_change_time.strftime("%d/%m/%Y %H:%M:%S") + msg = "Password Changed: " + pct_string + self.db.find_one_and_update( {"Email": email}, update={ "$set": {"Password": self.hash_password(pwd)}, "$unset": {"verif_code": "", "timestamp_created": ""}, + "$push": {"Notes": msg}, }, ) return True @@ -237,25 +270,69 @@ def __init__(self) -> None: client = pymongo.MongoClient(DATABASE["mongo_uri"]) self.db = client[DATABASE["db"]][os.getenv("CONTACT_US_DATA_COLLECTION")] - def insert_contact_us_data(self, name: str, email: str, message: str) -> bool: - """Inserts Contact Us Data + def generate_query_id(self) -> str: + """Generates a unique query id + + Args: + None + + Returns: + str + """ + q_id = "".join( + random.choice( + string.ascii_uppercase + string.ascii_lowercase + string.digits + ) + for _ in range(16) + ) + q_id = "query_" + q_id + + if self.db.find_one({"query_id": q_id}): + q_id = self.generate_query_id() + return q_id + + def validate_query_id(self, qid: str) -> bool: + """Validates query id for particular user + + Args: + qid: Query ID + + Returns: + bool + """ + value = self.db.find_one({"query_id": qid}) + if value: + return True + + raise InvalidQIDError(f"Query With query_id {qid} NOT Found") + + def insert_contact_us_data( + self, name: str, email: str, message: str, status: str + ) -> bool: + """Inserts Contact Us Data & Updates User Profile With Query ID Args: name: Name of User email: User Email ID message: Contact Us Message + status: Status of Query Returns: bool """ data = { + "query_id": self.generate_query_id(), "Name": name, "Email": email, "Message": message, + "Status": status, } try: self.db.insert_one(data) + + # UPDATE USER CONTACTUS[] WITH QUERY ID + return True except Exception: raise ContactUsDataInsertionError("Error Inserting Contact Us Data") diff --git a/server/authentication/tests/test_models.py b/server/authentication/tests/test_models.py index 819bcb5..13d03a4 100644 --- a/server/authentication/tests/test_models.py +++ b/server/authentication/tests/test_models.py @@ -1,12 +1,12 @@ -from dotenv import load_dotenv import unittest -from authentication.models import UserAuth, ContactUsData from authentication.errors import ( + InvalidUIDError, InvalidUserCredentialsError, UserDoesNotExistError, - InvalidUIDError, ) +from authentication.models import ContactUsData, UserAuth +from dotenv import load_dotenv class Test_Auth_Model(unittest.TestCase): diff --git a/server/authentication/urls.py b/server/authentication/urls.py index 1b6edbe..8382b83 100644 --- a/server/authentication/urls.py +++ b/server/authentication/urls.py @@ -1,6 +1,7 @@ -from .views import Register, Login, ResetPassword, ResetPasswordLink, GenerateTokens from django.urls import path +from .views import GenerateTokens, Login, Register, ResetPassword, ResetPasswordLink + urlpatterns = [ path("register", Register.as_view()), path("login", Login.as_view()), diff --git a/server/authentication/utils.py b/server/authentication/utils.py index cce7fed..8aead46 100644 --- a/server/authentication/utils.py +++ b/server/authentication/utils.py @@ -1,17 +1,17 @@ -from rest_framework import status from django.http import response +from rest_framework import status +from . import Token_Auth, User_Auth from .errors import ( + InvalidTokenError, + InvalidUIDError, InvalidUserCredentialsError, InvalidVerificationError, - UserDoesNotExistError, TokenGenerationError, - InvalidTokenError, + UserDoesNotExistError, UserExistsError, - InvalidUIDError, ) from .mailer import send_reset_pwd_mail -from . import Token_Auth, User_Auth def register_user(request, **kwargs) -> response.JsonResponse: diff --git a/server/authentication/validate.py b/server/authentication/validate.py index d62b4f1..9069d53 100644 --- a/server/authentication/validate.py +++ b/server/authentication/validate.py @@ -1,7 +1,7 @@ from rest_framework.permissions import BasePermission +from . import Token_Auth, User_Auth from .errors import InvalidTokenError, InvalidUIDError -from . import User_Auth, Token_Auth class ValidateUser(BasePermission): diff --git a/server/authentication/views.py b/server/authentication/views.py index 2a71293..baaf38c 100644 --- a/server/authentication/views.py +++ b/server/authentication/views.py @@ -1,9 +1,9 @@ +from core.throttle import throttle +from django.http import response from rest_framework.permissions import AllowAny from rest_framework.views import APIView -from django.http import response -from .utils import register_user, login_user, reset_pwd, reset_pwd_data, get_tokens -from core.throttle import throttle +from .utils import get_tokens, login_user, register_user, reset_pwd, reset_pwd_data class Register(APIView): diff --git a/server/core/settings.py b/server/core/settings.py index 2c258d9..f886152 100644 --- a/server/core/settings.py +++ b/server/core/settings.py @@ -10,9 +10,10 @@ https://docs.djangoproject.com/en/3.2/ref/settings/ """ -from dotenv import load_dotenv -from pathlib import Path import os +from pathlib import Path + +from dotenv import load_dotenv load_dotenv() diff --git a/server/core/urls.py b/server/core/urls.py index 6c0653f..7a58815 100644 --- a/server/core/urls.py +++ b/server/core/urls.py @@ -13,13 +13,12 @@ 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ -from rest_framework.documentation import include_docs_urls -from rest_framework.schemas import get_schema_view -from django.conf.urls.static import static -from django.urls import path, include from django.conf import settings +from django.conf.urls.static import static from django.contrib import admin - +from django.urls import include, path +from rest_framework.documentation import include_docs_urls +from rest_framework.schemas import get_schema_view urlpatterns = [ path("admin/", admin.site.urls), diff --git a/server/mainapp/__init__.py b/server/mainapp/__init__.py index 7fa6b1f..44fc8e4 100644 --- a/server/mainapp/__init__.py +++ b/server/mainapp/__init__.py @@ -1,4 +1,5 @@ from core.pagination import CustomPagination + from .aws import AWSFunctionsS3 from .models import MusicData diff --git a/server/mainapp/aws.py b/server/mainapp/aws.py index fbf3171..ea57097 100644 --- a/server/mainapp/aws.py +++ b/server/mainapp/aws.py @@ -1,14 +1,14 @@ -from boto3.session import Session -from rest_framework import status -from django.http import response -import botocore import boto3 - +import botocore +from boto3.session import Session from core.settings import ( - AWS_STORAGE_BUCKET_NAME, - AWS_SECRET_ACCESS_KEY, AWS_ACCESS_KEY_ID, + AWS_SECRET_ACCESS_KEY, + AWS_STORAGE_BUCKET_NAME, ) +from django.http import response +from rest_framework import status + from .errors import AWSDownloadError diff --git a/server/mainapp/mailer.py b/server/mainapp/mailer.py index c927e4d..78e6935 100644 --- a/server/mainapp/mailer.py +++ b/server/mainapp/mailer.py @@ -1,6 +1,7 @@ -from dotenv import load_dotenv -import smtplib import os +import smtplib + +from dotenv import load_dotenv load_dotenv() diff --git a/server/mainapp/models.py b/server/mainapp/models.py index bbbe722..6ce1980 100644 --- a/server/mainapp/models.py +++ b/server/mainapp/models.py @@ -1,14 +1,15 @@ -from django.http import response -from dotenv import load_dotenv -import pymongo -import uuid import os +import uuid +import pymongo from core.settings import DATABASE +from django.http import response +from dotenv import load_dotenv + from .errors import ( + DataFetchingError, FileAlreadyExistsForCurrentUserError, FileDoesNotExistForCurrentUserError, - DataFetchingError, ) load_dotenv() diff --git a/server/mainapp/urls.py b/server/mainapp/urls.py index f29f03b..0b231ba 100644 --- a/server/mainapp/urls.py +++ b/server/mainapp/urls.py @@ -1,6 +1,7 @@ -from .views import Contact_Us, Uploads, Posts from django.urls import path +from .views import Contact_Us, Posts, Uploads + urlpatterns = [ path("uploads", Uploads.as_view()), path("posts", Posts.as_view()), diff --git a/server/mainapp/utils.py b/server/mainapp/utils.py index 212e2b3..82c6610 100644 --- a/server/mainapp/utils.py +++ b/server/mainapp/utils.py @@ -1,17 +1,18 @@ -from rest_framework import status -from django.http import response import datetime as d -from core.settings import AWS_BUCKET_FOLDER, AWS_OBJECT_URL_PREFIX from authentication.errors import ContactUsDataInsertionError from authentication.models import ContactUsData from core.errors import PageDoesNotExistError +from core.settings import AWS_BUCKET_FOLDER, AWS_OBJECT_URL_PREFIX +from django.http import response +from rest_framework import status + +from . import Music_Data, Paginate, S3_Functions from .errors import ( - FileAlreadyExistsForCurrentUserError, - DataFetchingError, AWSDownloadError, + DataFetchingError, + FileAlreadyExistsForCurrentUserError, ) -from . import S3_Functions, Music_Data, Paginate Contact_Us = ContactUsData() diff --git a/server/mainapp/views.py b/server/mainapp/views.py index f879386..ce86b2a 100644 --- a/server/mainapp/views.py +++ b/server/mainapp/views.py @@ -1,10 +1,10 @@ +from authentication import validate +from core.throttle import throttle +from django.http import response from rest_framework.permissions import AllowAny from rest_framework.views import APIView -from django.http import response -from .utils import recv_music_data, send_music_data, recv_contact_us_data -from authentication import validate -from core.throttle import throttle +from .utils import recv_contact_us_data, recv_music_data, send_music_data class Uploads(APIView): diff --git a/server/run_tests.py b/server/run_tests.py index 4f1a497..1090236 100644 --- a/server/run_tests.py +++ b/server/run_tests.py @@ -1,18 +1,8 @@ import unittest -from authentication.tests import ( - test_models, - test_jwt, -) -from admins.tests import ( - test_models_adm, - test_jwt_adm, -) -from tests import ( - test_app_models, - test_app_apis, - test_auth, -) +from admins.tests import test_jwt_adm, test_models_adm +from authentication.tests import test_jwt, test_models +from tests import test_app_apis, test_app_models, test_auth def get_unittests(suite): diff --git a/server/tests/base_user.py b/server/tests/base_user.py index de79f3d..10dd250 100644 --- a/server/tests/base_user.py +++ b/server/tests/base_user.py @@ -1,11 +1,11 @@ -from dotenv import load_dotenv -from unittest import TestCase -import requests -import pymongo import json import os +from unittest import TestCase +import pymongo +import requests from core.settings import DATABASE +from dotenv import load_dotenv load_dotenv() diff --git a/server/tests/test_app_apis.py b/server/tests/test_app_apis.py index 80de887..231bee5 100644 --- a/server/tests/test_app_apis.py +++ b/server/tests/test_app_apis.py @@ -1,13 +1,14 @@ -from dotenv import load_dotenv -import requests -import unittest -import pymongo import os +import unittest -from .base_user import CustomUserTests +import pymongo +import requests from core.settings import DATABASE +from dotenv import load_dotenv from mainapp import S3_Functions + from . import Base +from .base_user import CustomUserTests user = CustomUserTests() data = Base() diff --git a/server/tests/test_app_models.py b/server/tests/test_app_models.py index 54652fa..61133cc 100644 --- a/server/tests/test_app_models.py +++ b/server/tests/test_app_models.py @@ -1,18 +1,16 @@ -from dotenv import load_dotenv -import requests -import unittest -import pymongo import os +import unittest +import pymongo +import requests from core.settings import DATABASE +from dotenv import load_dotenv +from mainapp import Music_Data, S3_Functions from mainapp.errors import ( FileAlreadyExistsForCurrentUserError, FileDoesNotExistForCurrentUserError, ) -from mainapp import ( - S3_Functions, - Music_Data, -) + from . import Base data = Base() diff --git a/server/tests/test_auth.py b/server/tests/test_auth.py index c9fcb52..46bad49 100644 --- a/server/tests/test_auth.py +++ b/server/tests/test_auth.py @@ -1,7 +1,9 @@ -from .base_user import CustomUserTests -import requests import json +import requests + +from .base_user import CustomUserTests + class TestAuthentication(CustomUserTests): def setUp(self) -> None: diff --git a/server/userprofile/__init__.py b/server/userprofile/__init__.py index 950dc0f..5809798 100644 --- a/server/userprofile/__init__.py +++ b/server/userprofile/__init__.py @@ -1,4 +1,5 @@ from core.pagination import CustomPagination + from .models import UserData Paginate = CustomPagination() diff --git a/server/userprofile/models.py b/server/userprofile/models.py index 02396dd..a3c746a 100644 --- a/server/userprofile/models.py +++ b/server/userprofile/models.py @@ -1,14 +1,11 @@ -from django.http import response -from dotenv import load_dotenv -import pymongo import os +import pymongo from core.settings import DATABASE +from django.http import response +from dotenv import load_dotenv -from .errors import ( - FileDoesNotExistForCurrentUserError, - ProfileDataUnavailableError, -) +from .errors import FileDoesNotExistForCurrentUserError, ProfileDataUnavailableError load_dotenv() diff --git a/server/userprofile/urls.py b/server/userprofile/urls.py index 13f1692..ca2688e 100644 --- a/server/userprofile/urls.py +++ b/server/userprofile/urls.py @@ -1,6 +1,7 @@ -from .views import Profile from django.urls import path +from .views import Profile + urlpatterns = [ path("profile", Profile.as_view()), ] diff --git a/server/userprofile/utils.py b/server/userprofile/utils.py index c56d58c..0317873 100644 --- a/server/userprofile/utils.py +++ b/server/userprofile/utils.py @@ -1,10 +1,10 @@ -from rest_framework import status +from core.errors import PageDoesNotExistError from django.http import response +from mainapp.aws import AWSFunctionsS3 +from rest_framework import status +from . import Paginate, User_Data from .errors import FileDoesNotExistForCurrentUserError, ProfileDataUnavailableError -from core.errors import PageDoesNotExistError -from mainapp.aws import AWSFunctionsS3 -from . import User_Data, Paginate def send_profile_data(request, **kwargs) -> response.JsonResponse: diff --git a/server/userprofile/views.py b/server/userprofile/views.py index 098b0eb..c3c8c13 100644 --- a/server/userprofile/views.py +++ b/server/userprofile/views.py @@ -1,9 +1,9 @@ -from rest_framework.views import APIView -from django.http import response - -from .utils import send_profile_data, delete_profile_data from authentication import validate from core.throttle import throttle +from django.http import response +from rest_framework.views import APIView + +from .utils import delete_profile_data, send_profile_data class Profile(APIView):