Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added additional user functionality and linking (contact us query_ids) #149

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions server/admins/__init__.py
Original file line number Diff line number Diff line change
@@ -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()
Expand Down
10 changes: 6 additions & 4 deletions server/admins/create_admin.py
Original file line number Diff line number Diff line change
@@ -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()

Expand Down
7 changes: 4 additions & 3 deletions server/admins/issue_jwt.py
Original file line number Diff line number Diff line change
@@ -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()
Expand Down
14 changes: 8 additions & 6 deletions server/admins/models.py
Original file line number Diff line number Diff line change
@@ -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()
Expand Down
2 changes: 1 addition & 1 deletion server/admins/tests/test_jwt_adm.py
Original file line number Diff line number Diff line change
@@ -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):
Expand Down
6 changes: 3 additions & 3 deletions server/admins/tests/test_models_adm.py
Original file line number Diff line number Diff line change
@@ -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):
Expand Down
3 changes: 2 additions & 1 deletion server/admins/urls.py
Original file line number Diff line number Diff line change
@@ -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()),
Expand Down
17 changes: 8 additions & 9 deletions server/admins/utils.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down
4 changes: 2 additions & 2 deletions server/admins/validate_admins.py
Original file line number Diff line number Diff line change
@@ -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


Expand Down
6 changes: 3 additions & 3 deletions server/admins/views.py
Original file line number Diff line number Diff line change
@@ -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):
Expand Down
2 changes: 1 addition & 1 deletion server/authentication/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from .models import UserAuth, ContactUsData
from .jwt import TokenAuth
from .models import ContactUsData, UserAuth

Contact_Us = ContactUsData()
Token_Auth = TokenAuth()
Expand Down
8 changes: 8 additions & 0 deletions server/authentication/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ class InvalidVerificationError(AuthenticationErrors):
...


class NoContactUsQueriesFoundError(ContactUsErrors):
...


class ContactUsDataInsertionError(ContactUsErrors):
...

Expand All @@ -31,3 +35,7 @@ class UserExistsError(AuthenticationErrors):

class InvalidUIDError(AuthenticationErrors):
...


class InvalidQIDError(ContactUsErrors):
...
4 changes: 3 additions & 1 deletion server/authentication/jwt.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down
5 changes: 3 additions & 2 deletions server/authentication/mailer.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from dotenv import load_dotenv
import smtplib
import os
import smtplib

from dotenv import load_dotenv

from . import UserAuth

Expand Down
97 changes: 87 additions & 10 deletions server/authentication/models.py
Original file line number Diff line number Diff line change
@@ -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()
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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")
6 changes: 3 additions & 3 deletions server/authentication/tests/test_models.py
Original file line number Diff line number Diff line change
@@ -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):
Expand Down
3 changes: 2 additions & 1 deletion server/authentication/urls.py
Original file line number Diff line number Diff line change
@@ -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()),
Expand Down
Loading