From b75cd6a09af6d3d72dd51f5cb7bd6da840ff10cd Mon Sep 17 00:00:00 2001 From: Salim Elliye Date: Tue, 26 Aug 2025 10:28:42 +0300 Subject: [PATCH] ll --- .DS_Store | Bin 8196 -> 8196 bytes osinaweb/.DS_Store | Bin 14340 -> 14340 bytes .../__pycache__/models.cpython-313.pyc | Bin 32090 -> 32193 bytes .../__pycache__/serializers.cpython-313.pyc | Bin 1710 -> 3579 bytes .../api/__pycache__/urls.cpython-313.pyc | Bin 544 -> 521 bytes .../api/__pycache__/views.cpython-313.pyc | Bin 4928 -> 3021 bytes osinaweb/osinacore/api/serializers.py | 42 +++++- osinaweb/osinacore/api/urls.py | 7 +- osinaweb/osinacore/api/views.py | 127 ++++++++---------- osinaweb/osinacore/models.py | 6 +- osinaweb/osinacore/templates/login.html | 4 - 11 files changed, 101 insertions(+), 85 deletions(-) diff --git a/.DS_Store b/.DS_Store index 3ccb36f08e6c7f638867f6b082beec59d98093ac..65979269c4c3e3ecfce24fd779f68dcf97a403c0 100644 GIT binary patch delta 131 zcmZp1XmQw3Ajn~4W~8HFVq`kGLNJ=~#^fu4${b?i5|UEVGE$rW3(7LeD?9izfB}aH zgocxh$__COlZ}L3bORZK7?T-u7;_nm7^@-jOpH)^=+ diff --git a/osinaweb/.DS_Store b/osinaweb/.DS_Store index 770cd965917fdc6046c1e9d2cc9dcb87cd6b79bf..14d317c3a75783b3b7a32ef72853f3a90d3b7b49 100644 GIT binary patch delta 25 gcmZoEXerq6Pl?0G%t%MU#K?4Vp1A#HSLOX80C(#MhX4Qo delta 16 XcmZoEXerq6PieA&p!;T5<^3W6KcEJ} diff --git a/osinaweb/osinacore/__pycache__/models.cpython-313.pyc b/osinaweb/osinacore/__pycache__/models.cpython-313.pyc index 82d04c2b6a1e411a0e78d892f76b4c865b576b15..96df60ef4320522e7b66bea15d2b20be5fb17796 100644 GIT binary patch delta 7932 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 M{n#Zf-%FhRH@yYF-v9sr diff --git a/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc index 701fe287c0a95fe51a481894225656fdf3ff3748..e625c811c652368f2cc3b436c547728ac03ec845 100644 GIT binary patch literal 3579 zcmbtW&2Jk;6rWwM*I)T?Xk3~&ZB0cf8$=v|k`#gfr4@&SMp3s2q(&NT>~XrV@rK#8 zqV$wg1>(Xb5=XB66Zj7}VtQ~`aYGz(L$Xni@ZPMm_HNcV4tsbzA8+29`TgF!dF}D> zEP-$9pW`P#DTMriowG05ZL~j@2stJ?(WMQtE^(=ZZFxgpkxS$nxkdEEEYX#1>7jbI zwD(_1_-(ET%_L~5Lo|~@GXO@oCV4rBanrEOr;Iz$mF6owvrCyfOJ-gblusufU*A2t!&P-BTGr8khu-m$g z)BR4oBrIc=r`AknRUNNDspA^1S)qpOa&xEQGKW$=2EN;P3~#&q8Q|%Z9YA!CS(bUo z%J=O`V~^Ecr~J9izbe}Rj8U$$1JS5{Y1DUZfAE0q_>GFqS=rb(%YED|>>qjxo|I?6 z5uUbm_(6BArz*ugy|V>Z+coWaANUv?A#bCAKO1Y)N56<$8j60d z&%#CEUjVCUIe@=70RDKk1@>OH8ie8Cr1KW;9|a=h;4OPbew(`eV(QM(dXzF$3xOC= zHsbR%fmynbol?~BDC}Gb8}n&-4J;0)MZu*P;R8bwO$K~S58xyAI=qXUK~cg+FX7-& z2+yF#`T}PD>k4eE5Ajurd{BGIdO}y;leu5Fi25oh4>Ed+XLr+D#+$jor zHrRYR!C8%QRCIM!=%)KWD{{(9juLqeZdIn#(_wjTn5NQYVEL^zU z%!^#{=>AEe)GEyXTA2Ukowc8<&4PZk8NGwJGK73^2mepn6wl%5+fmyiu*&frK3xRS zM;*sI6McSzS6e8@z1jnknz%-5XmMZ(6+G>Dl(THs1vi4^rj|w09GBKO#P|W!hCZoz zQ5a$kxFD)e$D4eBRcJ3?`IVaRg|C=MpCUE{uaWb5=@0zc_e1_EC?llKw;=vXNRsp? zdE<9-qoXFI;t!8o*Y7s3-|Z0Sbh7716wq016_=aE>sb8e+Wpwr32 ls_!4S3X9FcV%Lr;6@SdNN~_J%YKK6_U)A;XH?9&j)4!B(nm_;m literal 1710 zcmbVMOHUL*5bmDGvMi6~AqW_8mBhFvGI&r97%zAd*{Bnvi6os_Xx5S08LXZO(H}ra zym&G3=#_uq&yW+OI1bH=n$VI%AsbImd4S_}MXVgKsk{~a^a!Ad=C^emj= zX{VkY=vh3&v(V_QmUbyXmFq4g!S@3Hodktjesl5gD;Trdo7N3fKC%S{++|?69LzMF zf#J+MNC7RdTnp@mT`lPHqp0DB?g8{Jv64e>-(jr^p5&1i5XC{No^U9*CUi8cs;w^^ zL!6wKvA0XqRZVTnrsoH`xaujj7QvG4_LWe{s)Pj7+hn!PqAm&%dQB;WE(y_$mXd(< zZXwpz2ML_VKL(d82TBoqRgQa15x&>8^t=?>ASFD>;Aj%3owEP7$ZSnRNE{-A8q_^xuYIPwz1lnIrk+s(Ic%=_R7vgZy@Bta8Br+a`l~z^qHU z5EWafm|!rfG>`#^I9*EXopy%q3_KO5YQ`Lt$?X_DDQ^`#AdEcu^C!uNOQ%3wCL0OL zRuTR>BZh07D6a90V{*t*abAu`XA>1inDt|bmi<5;p_>xS#o%b5)fz`}aw=WJIXaW$ ze?`uCr@qrY&8Uu1MVK_}5;A71#nXCHmyhAW5CXt3iPJhYEkzYiDUPCCXb!Gy*gFGP zzxH4I$7)f+1LL83e{|v diff --git a/osinaweb/osinacore/api/__pycache__/urls.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/urls.cpython-313.pyc index 4344a9e78b56facffd9f0b08ff707dd1904ac290..337f462e4330856abd63d2ad580f771ffa638874 100644 GIT binary patch literal 521 zcmaJ-O-n*S6rFi5eSRSFFjuvRXpxal1QJ06MlDhZ>0xbzm~zso_aQUyWl9VC5&ek% zK|e!jAx*Vv<*snsq8UGG*Imp#_ug~QJhBramPciRdpr$`~SEyTWeW z%LUBlOqZ%6bVEsti&RDGmZw66^5Kc>3Ip>qH5RG8fK!)nzK?x8o5rPxbmtT1@<%XI zhD8M_9gaA*sY7g=wh7wzE&_+RK1Zh>yGEW=!pJ49F_`$7G+X3+0xmp85N=YWZ04G6 z5!rFPT40l1X38t-H+VrlpE`u_9W1_q`L77jjqYvFTp5__eRKWU%=PlczE*nC!ri-G cdUcTA=%+WH)0>E9|T8_vH$=8 literal 544 zcmZ8d&r1S96rR~xb=CXs|;PSuiCvO3_xU{ks%vLb*rnHc$}rAt1+9O$xWN|~W~#0kMAx+u!KYT+F^Fk1d}Yx)Y%$GLu}Ox05!eUKA-M^PwnYh6`x^GH zlKUf9IyS71qmvVwba diff --git a/osinaweb/osinacore/api/__pycache__/views.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/views.cpython-313.pyc index 4f8101f9ae37ae6a426482328bd4732afe3a38f0..cb7805737f4b0c48e30993b6cd77427ec3640dd0 100644 GIT binary patch literal 3021 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 WL>nfM?(b?hi4D_z79{)vjQJl6Z}gJ@ diff --git a/osinaweb/osinacore/api/serializers.py b/osinaweb/osinacore/api/serializers.py index 17bf5ae4..d7a7357a 100644 --- a/osinaweb/osinacore/api/serializers.py +++ b/osinaweb/osinacore/api/serializers.py @@ -2,17 +2,49 @@ from rest_framework import serializers from osinacore.models import * -class LoginSerializer(serializers.ModelSerializer): + +class BusinessTypeSerializer(serializers.ModelSerializer): class Meta: - model = User - fields = ['email', 'password', 'is_superuser'] + model = BusinessType + fields = "__all__" + +class StaffProfileSerializer(serializers.ModelSerializer): + class Meta: + model = StaffProfile + fields = "__all__" + +class DepartmentSerializer(serializers.ModelSerializer): + + class Meta: + model = Department + fields = "__all__" + + + +class JobPositionSerializer(serializers.ModelSerializer): + department = DepartmentSerializer() + + class Meta: + model = JobPosition + fields = "__all__" + class UserSerializer(serializers.ModelSerializer): class Meta: model = User - fields = ['username', 'email', 'password', 'first_name', 'last_name'] + fields = "__all__" class CustomerProfileSerializer(serializers.ModelSerializer): + user = UserSerializer() + reference_name = serializers.CharField(source='reference.name', read_only=True) + class Meta: model = CustomerProfile - fields = ['mobile_number'] \ No newline at end of file + fields = "__all__" + +class StaffProfileSerializer(serializers.ModelSerializer): + user = UserSerializer() + + class Meta: + model = StaffProfile + fields = "__all__" \ No newline at end of file diff --git a/osinaweb/osinacore/api/urls.py b/osinaweb/osinacore/api/urls.py index 05fcd334..8a77cbf4 100644 --- a/osinaweb/osinacore/api/urls.py +++ b/osinaweb/osinacore/api/urls.py @@ -1,9 +1,8 @@ from django.urls import path -from . import views +from .views import * urlpatterns = [ - path('login/', views.login_user), - path('register-device/', views.register_device), - path('update-device/', views.update_device, name='update_device'), + path("users/", UserProfilesAPIView.as_view(), name="users-with-profiles"), + path("utilities/", BusinessDataAPIView.as_view(), name="utilities"), ] \ No newline at end of file diff --git a/osinaweb/osinacore/api/views.py b/osinaweb/osinacore/api/views.py index 84556ddf..000fd193 100644 --- a/osinaweb/osinacore/api/views.py +++ b/osinaweb/osinacore/api/views.py @@ -1,72 +1,59 @@ + + from osinacore.models import * +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status +from django.contrib.auth.models import User from .serializers import * -from rest_framework.decorators import api_view -from .utils import * -import calendar -from django.contrib.auth.hashers import check_password -from datetime import datetime -import datetime as datetime2 -from fcm_django.models import FCMDevice - -@api_view(['POST']) -def login_user(request): - try: - username = request.data.get('username') - password = request.data.get('password') - if(not password or not username): - raise ValueError("Missing fields") - user = User.objects.get(username=username) - serial = LoginSerializer(user) - passwordValid = check_password(password, serial.data['password']) - if passwordValid and StaffProfile.objects.filter(user=user): - future = datetime.utcnow() + datetime2.timedelta(days=183) - futuretime = calendar.timegm(future.timetuple()) - encoded_jwt = jwt.encode({"username": username, "exp": futuretime, "is_superuser": serial.data['is_superuser'], "userid":serial.instance.id}, "ibiye4700", algorithm="HS256") - #encoded_jwt = encoded_jwt.decode('utf-8') - return successRes(msg={"token": encoded_jwt,"first_name":user.first_name,"last_name":user.last_name,"email":user.email, "id":user.id}) - else: - raise ValueError("Incorrect password!") - except User.DoesNotExist: - return errorRes(msg="User doesn't exist!") - except ValueError as err: - return errorRes(msg=str(err)) - except Exception as e: - print(e) - return errorRes(msg=str(e)) - - -@api_view(['POST']) -def register_device(request): - try: - registration_token = request.data.get('registration_token') - device_type = request.data.get('device_type') - # Check if the device already exists - existing_device = FCMDevice.objects.get(registration_id=registration_token) - return errorRes(msg='Device already registered') - except FCMDevice.DoesNotExist: - # Create a new device - device = FCMDevice(registration_id=registration_token, type=device_type) - device.save() - return successRes(msg="Device registered successfully.") - except Exception as e: - return errorRes(str(e)) - - - -@api_view(['POST']) -def update_device(request): - try: - registration_token = request.data.get('registration_token') - token_data = verify(request.headers.get("Authorization")) - user_id = token_data['userid'] - user = User.objects.get(id=user_id) - existing_device = FCMDevice.objects.get(registration_id=registration_token) - existing_device.user = user - existing_device.save() - return successRes(msg='Device updated') - except FCMDevice.DoesNotExist: - return errorRes(msg='Device is not registered') - except TokenError as terr: - return errorRes(msg=str(terr), status=450) - except Exception as e: - return errorRes(str(e)) + +class UserProfilesAPIView(APIView): + def get(self, request): + data = [] + + users = User.objects.all() + + for user in users: + user_data = { + "user": UserSerializer(user).data, + "customer_profile": None, + "staff_profile": None + } + + # Check for customer profile + customer = CustomerProfile.objects.filter(user=user).first() + if customer: + user_data["customer_profile"] = CustomerProfileSerializer(customer).data + + # Check for staff profile + staff = StaffProfile.objects.filter(user=user).first() + if staff: + user_data["staff_profile"] = StaffProfileSerializer(staff).data + + data.append(user_data) + + return Response(data, status=status.HTTP_200_OK) + + +def get_all_business_related_data(): + + business_types = BusinessType.objects.all() + departments = Department.objects.all() + job_positions = JobPosition.objects.all() + + business_types_data = BusinessTypeSerializer(business_types, many=True).data + departments_data = DepartmentSerializer(departments, many=True).data + job_positions_data = JobPositionSerializer(job_positions, many=True).data + + return { + 'business_types': business_types_data, + 'departments': departments_data, + 'job_positions': job_positions_data, + } + + +class BusinessDataAPIView(APIView): + + def get(self, request): + data = get_all_business_related_data() + return Response(data) \ No newline at end of file diff --git a/osinaweb/osinacore/models.py b/osinaweb/osinacore/models.py index 54be5cac..bafdbfad 100644 --- a/osinaweb/osinacore/models.py +++ b/osinaweb/osinacore/models.py @@ -16,8 +16,10 @@ from authentication .models import * class Reference(models.Model): name = models.CharField(max_length=50) date = models.DateField() - - def __str__(self): + @property + def display_name(self): + if not self.name: + return "Not seen yet" return self.name diff --git a/osinaweb/osinacore/templates/login.html b/osinaweb/osinacore/templates/login.html index 43f157b5..cbae32b5 100644 --- a/osinaweb/osinacore/templates/login.html +++ b/osinaweb/osinacore/templates/login.html @@ -14,8 +14,6 @@ - - @@ -147,5 +145,3 @@ - - \ No newline at end of file