From 2d7cc7b4bab7762ed2d369d17fc0d2cf69321990 Mon Sep 17 00:00:00 2001 From: emile Date: Sat, 6 Apr 2024 18:54:00 +0300 Subject: [PATCH] New changes --- .DS_Store | Bin 6148 -> 8196 bytes osinaweb/.DS_Store | Bin 10244 -> 10244 bytes osinaweb/customercore/.DS_Store | Bin 0 -> 6148 bytes .../__init__.py} | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 195 bytes .../__pycache__/admin.cpython-310.pyc | Bin 0 -> 236 bytes .../__pycache__/apps.cpython-310.pyc | Bin 0 -> 486 bytes .../__pycache__/decorators.cpython-310.pyc | Bin 0 -> 761 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 233 bytes .../__pycache__/urls.cpython-310.pyc | Bin 0 -> 534 bytes .../__pycache__/views.cpython-310.pyc | Bin 0 -> 2270 bytes osinaweb/customercore/admin.py | 3 + osinaweb/customercore/apps.py | 6 + osinaweb/customercore/decorators.py | 13 + osinaweb/customercore/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 206 bytes osinaweb/customercore/models.py | 3 + osinaweb/customercore/templates/.DS_Store | Bin 0 -> 6148 bytes .../templates}/customer_main.html | 0 .../listing_pages/customer-invoices.html | 2 +- .../listing_pages/customer-products.html | 0 .../templates}/pricing.html | 2 +- osinaweb/customercore/tests.py | 3 + osinaweb/customercore/urls.py | 13 + osinaweb/customercore/views.py | 79 +++++ osinaweb/db.sqlite3 | Bin 991232 -> 991232 bytes osinaweb/osinacore/.DS_Store | Bin 10244 -> 10244 bytes .../__pycache__/decorators.cpython-310.pyc | Bin 0 -> 744 bytes .../__pycache__/urls.cpython-310.pyc | Bin 3736 -> 3451 bytes .../__pycache__/views.cpython-310.pyc | Bin 14548 -> 12898 bytes .../add/__pycache__/views.cpython-310.pyc | Bin 11441 -> 11561 bytes osinaweb/osinacore/add/views.py | 36 +- .../api/__pycache__/views.cpython-310.pyc | Bin 1784 -> 1657 bytes osinaweb/osinacore/decorators.py | 13 + .../delete/__pycache__/views.cpython-310.pyc | Bin 2928 -> 2982 bytes osinaweb/osinacore/delete/views.py | 20 +- .../edit/__pycache__/views.cpython-310.pyc | Bin 10557 -> 10617 bytes osinaweb/osinacore/edit/views.py | 37 +- osinaweb/osinacore/templates/.DS_Store | Bin 10244 -> 10244 bytes .../customer_index.html | 2 +- .../osinacore/templates/customer_main.html | 316 ++++++++++++++++++ osinaweb/osinacore/urls.py | 6 - osinaweb/osinacore/views.py | 213 ++++-------- .../__pycache__/settings.cpython-310.pyc | Bin 2754 -> 2779 bytes .../osinaweb/__pycache__/urls.cpython-310.pyc | Bin 1207 -> 1240 bytes osinaweb/osinaweb/settings.py | 6 +- osinaweb/osinaweb/urls.py | 1 + 47 files changed, 565 insertions(+), 209 deletions(-) create mode 100644 osinaweb/customercore/.DS_Store rename osinaweb/{osinacore/templates/customer_dashboard/listing_pages/customer-products.html => customercore/__init__.py} (100%) create mode 100644 osinaweb/customercore/__pycache__/__init__.cpython-310.pyc create mode 100644 osinaweb/customercore/__pycache__/admin.cpython-310.pyc create mode 100644 osinaweb/customercore/__pycache__/apps.cpython-310.pyc create mode 100644 osinaweb/customercore/__pycache__/decorators.cpython-310.pyc create mode 100644 osinaweb/customercore/__pycache__/models.cpython-310.pyc create mode 100644 osinaweb/customercore/__pycache__/urls.cpython-310.pyc create mode 100644 osinaweb/customercore/__pycache__/views.cpython-310.pyc create mode 100644 osinaweb/customercore/admin.py create mode 100644 osinaweb/customercore/apps.py create mode 100644 osinaweb/customercore/decorators.py create mode 100644 osinaweb/customercore/migrations/__init__.py create mode 100644 osinaweb/customercore/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 osinaweb/customercore/models.py create mode 100644 osinaweb/customercore/templates/.DS_Store rename osinaweb/{osinacore/templates/customer_dashboard => customercore/templates}/customer_main.html (100%) rename osinaweb/{osinacore/templates/customer_dashboard => customercore/templates}/listing_pages/customer-invoices.html (98%) create mode 100644 osinaweb/customercore/templates/listing_pages/customer-products.html rename osinaweb/{osinacore/templates/customer_dashboard => customercore/templates}/pricing.html (99%) create mode 100644 osinaweb/customercore/tests.py create mode 100644 osinaweb/customercore/urls.py create mode 100644 osinaweb/customercore/views.py create mode 100644 osinaweb/osinacore/__pycache__/decorators.cpython-310.pyc create mode 100644 osinaweb/osinacore/decorators.py rename osinaweb/osinacore/templates/{customer_dashboard => }/customer_index.html (99%) create mode 100644 osinaweb/osinacore/templates/customer_main.html diff --git a/.DS_Store b/.DS_Store index 952c9f83f3d9bbb949798af88cbd4205ae47c493..5e4ef4e683a4db60d44de3e4873f83ff670df789 100644 GIT binary patch delta 590 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8FDWo2aMA$g?qEH}hr%jz7$c**Q2S7O*h# zZ02FHVdOBjw9rv7G%}qWz#3SenOs(ol#`zXH0w}OK~83IiGjg=0RcuPW)@a9b`DN1 zZXRAfegQ!tVL=f=QBhGbabXEb3F&wN;iSam?DV4i(!3Ps{G9wEr<~H%==7q@l;DEI zyF=kEP$SN{< uA?uRO>O9Yxxg@xO60V?Bv00GgJM(0I5zoo~JRBTA?Vtq1usNP*4l@AEZ(n}wHbOgzN6n4N<|kQt~22n4u+geyq*#>DT;llf&lL1r;9LCghN#jrV^ HXAUy}5%d&? diff --git a/osinaweb/.DS_Store b/osinaweb/.DS_Store index 2836bb7338df0638d1de065b060f856f15b623f4..0f91ee0058cec75f8197befd14a6cb876035eac5 100644 GIT binary patch delta 200 zcmZn(XbG6$mJU^hRb`eYt~&7M3A$qc0o#SA43`3$)XsSHIxem;;)^~}jnPRhwo zVqjnpU|?YU3B-K=!2l@2z<{A|@)n^^b_+`#1tTNF$u7bUf|x4wMZ`Dn7pP_8Ft)VN nQ7|+z-RvUl$2j@8P#Lnu&3>ZgoSWGdez8nGAbbgnYzZR(OpG@2 delta 168 zcmZn(XbG6$C7U^hRb%48ma&6|X3nK+Cr4RjQYj0`3Rh&gOND#FLexMQ-6V4=E1 zb+wVDsg8oNrFpH6Lbat4P??FbS#2#Rhp4i?bx?eEPHtX)*W?8f@{HY+H;RdDUMQBv Xxv{~CaWlKZFBUD%cmZ;ZSjq$d@li1* diff --git a/osinaweb/customercore/.DS_Store b/osinaweb/customercore/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d46515213d894d761eaa6655f320d0e008ebd699 GIT binary patch literal 6148 zcmeHK&x_MQ82zSO?R1OSgMuD}fF8@*R$&z{wbp}IBYIG&%_g+LG!vS1%Tfxx>)o5+ z&6{Wc055_^J&XT^Cw=py(54agq($Z{GjB3^FW=-PnduM_>rVX^QJsi5ip26hs)CT` zW!Z|7={XN%>KY+s)W`3Dk}bCFunt%UcFh6#?bg&c8&XW`-|xwTNE~^Q@W7DM!(Ehv zUn>{mJVzPj>|CQxO_ zA&@2A91;7O(^R1m7*jw|ahB3>OOb&+#;78dC&=fZ_fWiB^Qwx`ovq2aK6D0`! z0F-A>!q^wHu9(Jtsh(Jh z`!Az$ETp{%hRI#UIfE;BjYh$(MZ=bRB*yDYKmltkdOc$R|MKI_wa?!_$ycn9>7SCB zj82pJ*qy|Yh~;CIcgEGjNl_QRWTmg*tiSl2j`3;*G%Mz-59RIJ!-sq~!#q}A+s)zG zQCSD91OLzgIX^fk5<3Q$8r9T+N^JpvWpt}RTmD&)8pmMA;8G*bAefc{wUn7H2Ger% zJBHUWxYVfS#LVV{nas@WP?*Y&>pO~0tfSG^)&c9lrUQHWurAmC`+wg5Z;I@Zb-+6C zUpc_aJ-64zEt$1->*nNI>!7?qks*0YjY@*bEXS%Lm*Pt(Dsaw`4PeLMQX_g0_K$$F L!B*CRzv{qmNOJA= literal 0 HcmV?d00001 diff --git a/osinaweb/osinacore/templates/customer_dashboard/listing_pages/customer-products.html b/osinaweb/customercore/__init__.py similarity index 100% rename from osinaweb/osinacore/templates/customer_dashboard/listing_pages/customer-products.html rename to osinaweb/customercore/__init__.py diff --git a/osinaweb/customercore/__pycache__/__init__.cpython-310.pyc b/osinaweb/customercore/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f8f1ccefe4bc3e7144c81e790c32e35951f1419 GIT binary patch literal 195 zcmd1j<>g`k0^1nDG!Xq5L?8o3AjbiSi&=m~3PUi1CZpdyU!WhHn3I{S;FDMY;`kS5mL%ur>gN|{<|XRqrIv#kDOrhm z>G=@B^3){#Y31J*9&2Y3yP2!@IUv4q5+KoVC;E7VWomspwj1t#3GaFWly z8_tJmI%I_TaeQ9VezoEs35gX=%!oA8+%m@xoHLyiEbqO^WjTNLrFO<|^W-qnSLrV} zRp_f=PN5BWu+XE`(MO4Wgb)QdV*#u+4Tv?wTZN@4q&04`k!34((NqeZz-YV_9`4=o ki~pH-I0;q93LON60YukgS~kzY%%QF=EI9p*ZHJ6~0pLnL;{X5v literal 0 HcmV?d00001 diff --git a/osinaweb/customercore/__pycache__/apps.cpython-310.pyc b/osinaweb/customercore/__pycache__/apps.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb2e1ba9e2f267d65b47a2344c7b1ae4a0bd43d2 GIT binary patch literal 486 zcmYjN%}&EG3{IL3mHix;c17B?m*xckZ4AK$jl;yHLW;7+odRi7npV@e!ej6Pyi%{6 zcm+-*?Idc+j{VvGVp~rpLuBRh=`8)U@3#y3;@eFo-R62t) z(Is>|Z|CBf=Q|yVZIo#N%0$<4x2!9DD?y27ob+1O;h+f^%XtQjHABX1N3EPcX6&`* z>X?}dNO`R)#w`y^TO!}(zEJ7z(wg5beKb%S3Yk;@O34Gz8!#`GF6f3Una%Hc;erPv zt3+p18<}&O!@hO8xjS$VTiPF#@}e+NaVUxX&E49ZSQ8*02e`%7A!$a(&0THjxv^aJ X|A3u0vRD&bbemqeD;q~RMltLhz4SC=_Sfyw{_;k#dfHM%Bhps1^x)c zW&e_|ocI?w@m@M4cEFN9zZd)a-mmEK_!h(UTuLlwPaJmP~3HXHExgr&n@$Y59C2WwNVYzjUxf=eSRhc-N}fbOpsg^6&7 zxa|RgW0!0TU)UTt@ZciZ!e`h3%7(``h(sXbLn1y!*sz+_U`8&e!#X05!&k5qH{ih* z1upT$0;RsgTPE2i_yON`vY1rVSz-Lp%0;U?m&PVWK|hhUC_A?lt&>&h1o!(dI_q>J z%p0TUQVBoQr#04PeT=RX#!yOW=!Zsp=!A7XD$N3K&(?HePxd}au`cFaTV1i=%ltjY zwYg|eODHAJMgCIQGpASiNvUM>=vBEQ=e3ot(oL?dY|FeA>)zmX*)H_%<64~N)pc@} zHX`Q&kJ4#lv(>pD7c`5N;047WP|v8ugD`>n!Kdsmvru{=+k%qEdGYK}>8e!rD7!&7 zG_*7@6Fkgaf+@j1!5swu;6HlQoIY+0w;>vud*~mhvEQS9IIWd6G*&;^RhHSMHm>TN r?b|w=^i@-JS);kY*CenD-e=H5pFwhnFFGZT=wGu5!ibF^ff4)x(e%eW literal 0 HcmV?d00001 diff --git a/osinaweb/customercore/__pycache__/models.cpython-310.pyc b/osinaweb/customercore/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ae1b72a1e324042359a15fbc8545fbc8351261e GIT binary patch literal 233 zcmYjLF$%&!5WI^bDg@#WY}4dwLB+ySvfKeJiYt?|*13pVzh&a*8EDuT1nG>oqvqo4{c_MPCdof%d hhBc%jtFW{NTxK1JAwg6$?Q~7L(y-<97`qSw`vE}LJ|_SG literal 0 HcmV?d00001 diff --git a/osinaweb/customercore/__pycache__/urls.cpython-310.pyc b/osinaweb/customercore/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..901ec3caf9f8ed635dba2827b9734560d1ed2609 GIT binary patch literal 534 zcmYk3O>V+45QS}$K*CQ{dV+4*;0sh$7hP8E0#&LaRVc*MU`XP~c0h249;659C9>^` zE3})A0aw`a*x%E5{A|n7s86tcy^Y^4=Lc`nIfbv@1JRa)Z;@-xu1l5G$WJvfYr%_wtk(OSSyi57|>R5NQN{HVrqN%`v-x>p*H{k literal 0 HcmV?d00001 diff --git a/osinaweb/customercore/__pycache__/views.cpython-310.pyc b/osinaweb/customercore/__pycache__/views.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c81f13d6040bc91f1fedd89c9291e2ed6cd7fba8 GIT binary patch literal 2270 zcmai0OK;mo5ayB;B~i3uC2{jEbO>6wKq%R1ZO2HB2DXd13G5)UTa-W{Y`ANAV~S*U zSC&mkMGEJde~^QH%s=UG;I*e*+oFdaiq2A^>;!#~*wr`7+1Z)dc_^BivNd=fN44Fk ztZBa};{0O(@f8fQ2NTf<3bZcr5K>qV^seC<88!m5Tkr}QHUrDENP$>Eaa*G$QY58U z+A;FVfXl?runo9EoD5e0PmyYd9b&e$*$eOBH0>=)Elxv1`7BDSLDXSko6{FP#wmdn z=Nl1)PpOEbP|(eH2zJ0K`pj1-e@p;sY{B?#8YZR<4XF*ll7Vq-z*+icaywu`var*R zafgbA-xD(GQhtYp2NCnBaQ9?4;5zJnYoJEDy>D)wa*H(EGg-TGr3D`HD9=||m0Bv^fseW(*- zXb^K~lEMHD^npRFfvEyh1th7wv4@3ZO=`~(aRvo4^;#cVQYY1c_1riyPqkwmX@Cpl z!oJQQ0kVcgStQe>_DUNRPfFzCDO!UNKSsmSpmb6umrl{JoT1BrY-tb51Dnje(T~x0 zT1x}jA1QfCuC&P&a+M)+ja+}NtFNXeD@TV&8&;5(Tms%3gUW>S<{77@eGh3kto&GM zjeq;7ug%`tOlBZ@{XHB?cYD3H-CUTPUtDT7z53n7rOy}Uzi8rxMSrnL7kBBs-KBYd zcfrR?bG!HMdd_+Nq%w}pIs~j&+t}RL-gvOR-d=sUzWQiuXWJ`1*?GG9@IhB2F_PHWA(OsMcVizSP~cC_1$xXNSOb8yVIV#=}l;8lQ9c@p9-&4?#hh(7Ro zrQC#MhCyO+?5hoKly6P0onOwGT_q?fWrw+pB+dxoZqy59QXNr#k3(7UkCNJmKBsB& zcu&e$EH@fH6d5K1_6&!Zi8~=xNve*aZU;-+$471#3sB6*oVY51!IVaL5H}7W?LpPX z;yjcilVFLHT3)8=tEx(ba{1lQ5S;I2hAJ;AafKS!VfqQG)DNX08lV%n-c$6ghO`$t zL8@k@=*vxzUJ!A>B#^q>Oido{2a%5hvEoj){E0qEY(a%G2fXP`i=GeVP;7*R`B+9APR_r#8A)s7?@*1# z49U#I@|MK1C%^%OE~f>`dBl?&Ut_3_q%Na+u1`JJhy4z99Bi~iwlT5S4}F@2({eJi zp+X|WLA^ye_`ANY#LYTsXv~$bg1M7h02pdXC1COWfs5fULLY4nxSiqW44lqAvnXEnh+```DG;z)El*{bSg(} z6(C+E##~U65j?AJw-i63AKqsz_tWIwJ_Sax0+VT&NWHqLqYq!}54~DN)4Hu&=qj?| zokos+5mj{?-9)9A`d|DGh?t#9r$?Q~6?+kveoqRn{sN>QkC#=KdvecJ&V)pc zxZomOb>*b4>$bYu~&r50g@a*bTU&RBBe zwW)I03dMpQu#h+4vH3jZ#rQLS%Lb27)DqcYC^#TEItLSpy@1x_DQZ2f+DCupxU4NM K@)YSN^wb-TGdKhQ literal 0 HcmV?d00001 diff --git a/osinaweb/customercore/models.py b/osinaweb/customercore/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/osinaweb/customercore/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/osinaweb/customercore/templates/.DS_Store b/osinaweb/customercore/templates/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f25a0aa62d3edf539c785ff8f7796fb7e4a5bc9c GIT binary patch literal 6148 zcmeHKJxc>Y5PhpD0xAS6%l!iiHiF#|VqtA7XmSP>E}kT&-{0mR)Awdq$>~|x2!h+g-j)8YA9EXkm-!al2;W>88aQhDs!Gv`Q!2utUBY-(h;hR z-n#;>Kvx0XeQ6`@{}=padN28w;+-qt3T&$aVKBLxjQMqCZ~gY2+G``*Et^bvNe+#E k=McaLts_S^n8%}h=2Zn#M$MwQ(TRQ#FhRU?1^z&RchSN;5&!@I literal 0 HcmV?d00001 diff --git a/osinaweb/osinacore/templates/customer_dashboard/customer_main.html b/osinaweb/customercore/templates/customer_main.html similarity index 100% rename from osinaweb/osinacore/templates/customer_dashboard/customer_main.html rename to osinaweb/customercore/templates/customer_main.html diff --git a/osinaweb/osinacore/templates/customer_dashboard/listing_pages/customer-invoices.html b/osinaweb/customercore/templates/listing_pages/customer-invoices.html similarity index 98% rename from osinaweb/osinacore/templates/customer_dashboard/listing_pages/customer-invoices.html rename to osinaweb/customercore/templates/listing_pages/customer-invoices.html index fb65a7ae..39c2d9d0 100644 --- a/osinaweb/osinacore/templates/customer_dashboard/listing_pages/customer-invoices.html +++ b/osinaweb/customercore/templates/listing_pages/customer-invoices.html @@ -1,4 +1,4 @@ -{% extends "customer_dashboard/customer_main.html" %} +{% extends "customer_main.html" %} {%load static%} {% block content %} diff --git a/osinaweb/customercore/templates/listing_pages/customer-products.html b/osinaweb/customercore/templates/listing_pages/customer-products.html new file mode 100644 index 00000000..e69de29b diff --git a/osinaweb/osinacore/templates/customer_dashboard/pricing.html b/osinaweb/customercore/templates/pricing.html similarity index 99% rename from osinaweb/osinacore/templates/customer_dashboard/pricing.html rename to osinaweb/customercore/templates/pricing.html index 221cd1a9..1b64d884 100644 --- a/osinaweb/osinacore/templates/customer_dashboard/pricing.html +++ b/osinaweb/customercore/templates/pricing.html @@ -1,4 +1,4 @@ -{% extends "customer_dashboard/customer_main.html" %} +{% extends "customer_main.html" %} {%load static%} {% block modules_section %} diff --git a/osinaweb/customercore/tests.py b/osinaweb/customercore/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/osinaweb/customercore/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/osinaweb/customercore/urls.py b/osinaweb/customercore/urls.py new file mode 100644 index 00000000..c99dda18 --- /dev/null +++ b/osinaweb/customercore/urls.py @@ -0,0 +1,13 @@ +from django.urls import path +from . import views + + +urlpatterns = [ + + path('invoices/', views.customer_invoices, name='customerinvoices'), + path('products/', views.customer_products, name='customerproducts'), + path('pricing/', views.pricing, name='pricing'), + path('initiate_checkout/', views.initiate_checkout, name='initiatecheckout'), + + +] diff --git a/osinaweb/customercore/views.py b/osinaweb/customercore/views.py new file mode 100644 index 00000000..445ee279 --- /dev/null +++ b/osinaweb/customercore/views.py @@ -0,0 +1,79 @@ +from django.shortcuts import render +from django.contrib.auth.decorators import login_required +from django.http import JsonResponse +import requests +from .decorators import * + +# Create your views here. +@customer_login_required +def customer_invoices(request, *args, **kwargs): + + context = { + + } + + return render(request, 'listing_pages/customer-invoices.html', context) + + +@customer_login_required +def customer_products(request, *args, **kwargs): + + context = { + + } + + return render(request, 'listing_pages/customer-products.html', context) + + +@customer_login_required +def pricing(request, *args, **kwargs): + + context = { + + } + + return render(request, 'pricing.html', context) + + + +@customer_login_required +def initiate_checkout(request): + # Your Mastercard API credentials + api_username = "merchant.TEST06127800" + api_password = "37846250a67c70e7fe9f82cf6ca81f93" + merchant_id = "TEST06127800" + merchant_name = "Ositcom Sal" + + # Data for Initiate Checkout operation + data = { + "apiOperation": "INITIATE_CHECKOUT", + "apiUsername": api_username, + "apiPassword": api_password, + "merchant": merchant_id, + "interaction.operation": "PURCHASE", + "interaction.merchant.name": merchant_name, + "order.id": "123", + "order.amount": "100.00", + "order.currency": "USD", + "order.description": "description_of_order" + } + + + try: + response = requests.post("https://creditlibanais-netcommerce.gateway.mastercard.com/api/nvp/version/72", data=data) + + print("Response Content:", response.content.decode()) # Print response content + + if response.status_code == 200: + response_data = response.text + parsed_data = dict(item.split("=") for item in response_data.split("&")) + session_id = parsed_data.get("session.id") + success_indicator = parsed_data.get("successIndicator") + return JsonResponse({"session_id": session_id, "success_indicator": success_indicator}) + else: + print("Response Status Code:", response.status_code) # Print status code + return JsonResponse({"error": "Failed to initiate checkout"}, status=500) + + except Exception as e: + print("Exception:", e) # Print exception traceback + return JsonResponse({"error": "Internal Server Error"}, status=500) \ No newline at end of file diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index a0055b77b15ee6197a00f6eabd9eb2a7924717ef..9d7b087b76f9daa994bb98b3d716c6b58af9d9bf 100644 GIT binary patch delta 14008 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 diff --git a/osinaweb/osinacore/.DS_Store b/osinaweb/osinacore/.DS_Store index 1e8469528d28a9eed489334e780e3152a658f912..70c987c705ee33dace3a73ede7c03c1f1ed3bcf4 100644 GIT binary patch delta 419 zcmZn(XbG6$gHU^hRb@@5`^C?;uUhD3$}hD^_#{N$vZ{3Hej1_1^J#%>_yn;b1v zEzHZ1!jQ_4%#hDe1XNi9q9+%Mh_n6#sn~p4XfhMKrG<`yp^@q22Z9chmx{_Uo}GL| zREbkeR9r$-Qc6;0@_W%c((wZP#TohKp2_)n0Y#~0nW^OwnLu`MW>xCsXJTs1$_{pu z*~I0zIF%g&fNlVS$$H|7mXeH0jM|JQjJAySj2?`Ej6saaj46znj9CyhOpFkkK^96w tDaPVS5@L(zh;wXaSNO#;d7;Q&8amR4Y)1lJ%Lxq9REAt&6y$(|7XTx|S*8F0 delta 335 zcmZn(XbG6$UDU^hRb;$|L!D5l9hLIs=6ggcnn4J~yP3@r^OKM-`7%qk|wcxbYU zm=dR`sF=8@grtP>L~Y^G9(p Zj)@J~o7ok9u}n@BjU8m}oBUC{4gfH-N1Xrw diff --git a/osinaweb/osinacore/__pycache__/decorators.cpython-310.pyc b/osinaweb/osinacore/__pycache__/decorators.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87de171471555b6a7e04622034512dcec1c6bfef GIT binary patch literal 744 zcmZuv!EV$r5cMS4Bt^Su3kCHC*8tkwI8_w~j;J6OE_;d6*x5RD;>C7Y6)mT&L@)3W zh)aKfkMWgLe}NM-Ss_sgOMael{NA%?q9>C(49CxQzYYS%eo^x8z&-W?r+tRN83)B$ zSO8EQsGtoOA;uw(RP>JV5sxp~V#Jd<%hDTUuxs$6wJBFN1D_hfr4g080sMj+@T8*X z?;x)TXNc1tA~<%%w(y13z<~#s=@vf222eXZxkV%b5g!rpIl_iDtN}B2K@&C+WgNbO zow^YZwkU9gCzdGn9o{m@Ho*`0wv)w6MZFcqCsr;y-McI{2@3kDv_;vwGtoI&l}>O! zp1ZQH-xys>C48b!8+@7dF{Vx!L-)x-pBV9>7uNZxG)w$?zNQtcviDJnby4?Sbd zaSin<3(P()=78WH!Ia=Wfr^E1}%gz7j7bmAl(Te(o8m@GcX!LTh|8hZCV6H zo7UlPXca-%MH7@=7XE^6LN%Y~@IE}8cXJMcy>ZmsZl}eZ(~Y4m7WXm09G;0ChO?DJ zQc7~RSmJ?@gOxH(rU@hsdLS>#qU?~la>PtjT5mzpk{6|H&JxbGdG;KZc0CoXq^R*! zt*$T1)uK{K#|@!>D>Rh)cAmj09appTqoBryuJs3Z4SVo-1h|q$-dLS4Hqp9j5S7_{cJ!wU1C8B}e=!=chVm zf@Ivsi4#+-7D3<{x&UVW5a1VW&_g@?paZ^f0KSlePjtcu@nCet4_yqvI|ktmC*Tz) v;RUClgVXSgGw{UE!XrNi20srED8fBP;0~j3i!r#tI9y`_u5iJ6=}-OxD#BxU delta 676 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 a@x6_5j^jMw>~RwMeX5m5(MZgaPX0fsmIMa? diff --git a/osinaweb/osinacore/add/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/add/__pycache__/views.cpython-310.pyc index d3c8d4e512e71974a6e3421fe9e18f8130d2089f..0e555e33d84d7f34d0830aa71ba510e7ea2a96eb 100644 GIT binary patch delta 684 zcmYk&&ubGw6bJBqvx}xXn@!T}CfQ_@ruoq(-6sBoNWFN|TZMXYwXM;YXdomusV5Jq z7!bsRWx}X$N!YP8B~(z0(sc;M^4GvpFh@I4?(BatX`Qd2$7-(gpGYE=tdl zYgm^ql9$kvo+mG3L%Kw6;tA<8p2So1*$U>@l=_(;;lHS>VjWBsnCNSH4Qk?XTAhjK^)uft>L&g zXx|!+I!)}*(%v49#$T=RcDvi%><@4E2AiYK*1g`SgTXiN(ajCI$5J9-9C;(aR2^83 ma+cDhc>mI(HA|tr$Z4t5e7Ll96=wV-`DSOOeK~o%Q#>dX@|LXg^~$ZU zTSvtZ{iETXhYQTd)}*vQM@=`jo?ucIU0^ZO711S@GhG#3VKvi>q8I69+M~~!boi{Z zA*`{~hRA!eyT2hA=WQS~9XUI8vJpJSwlTpphdpz*{RR46It~6@zt;T) zoR}-oBj}%hYx6Lldt+PA+Y%g0a1KWGFG2THqb!Cbt`BPR@INEDzdFNKvN!b2?X?Jc zCmnfNHaTAZgnKfI&`aXsVX`@TTDvME&r)#z+saA4jl8b9s9Gvi^Y(%Zb;EAtp$5uV L9aU0g<+C)MdKkL>LHK~Dg;E9?cQY8d4%p>0$~;p z>p>8~rSYUf@*h0e7LwPO?kjcl zH|lYg3O-O;!B+_N6UrdcpXodFd)6K3=(kn{EgjfvFRtJ?1298fh>fqYZ8Z59p&}!~ z;5ijBdT>e^J%b4-Yh;g{3YhfB}u`LOPLn^4TB})8-p@WvhpA;l3$SA zJ6V1txzOM2H9v0DZqC(V$wZ`YIxE}mFwGPfwKGhGRKmx)qJHV%6u)<8Cr;vzxI_dBLrPU4t5p#TEWpBtP=`n~LWoERmE1LniR0?-+Ct=r zA*>9M#l`>w6aN4MJK|sP$p3%@6TEYa#K=9p@8{q7{qC3h)ALi$s}nr@O1S^2y7Vu? zm*wUY4ulh4n|O)e_miL>lzDy9Ou~K$MA*DBgavSyd#}j?`YZo6?en0VKEsbry^X5&(PShh9G+8o6(e|0IsE{0nAJ3kt(a!O z*&CSCM`RjW1Z(!o4IoBzglQ(`^J&(lbbg^K#}N m;1hIg6wZw#<%bh-%e;!}pmB){MjVtTdZP}jL$igR`tS$*UXwHc diff --git a/osinaweb/osinacore/decorators.py b/osinaweb/osinacore/decorators.py new file mode 100644 index 00000000..719cda1b --- /dev/null +++ b/osinaweb/osinacore/decorators.py @@ -0,0 +1,13 @@ +from functools import wraps +from django.shortcuts import redirect +from .models import * +def staff_login_required(view_func): + @wraps(view_func) + def _wrapped_view(request, *args, **kwargs): + # Check if the user is logged in and is a staff member + if not request.user.is_authenticated or not StaffProfile.objects.filter(user=request.user): + return redirect('signout') # Redirect to login URL if not staff + + return view_func(request, *args, **kwargs) + + return _wrapped_view diff --git a/osinaweb/osinacore/delete/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/delete/__pycache__/views.cpython-310.pyc index 8922dba199fd2dc32c1a634503d5ca2bccc6c281..8af339fb11f050a59f434957f16a37d39867df2b 100644 GIT binary patch delta 280 zcmew$woIHapO=@50SL`Ci2NJ?wF|UT%W>_!j!`u!jQ_7!j{6`!qChZ#S3I} zq;P`Sd_Xo=3OAU|4`lPC@PgR_KsH|rKbS2DWDBGSg4seqwor;Nm@N!si=>Ex*&;x; zSc*89Et(<`%%Cax66BhVPhT=Ja!x+a^odb?^C9N-Y>Z-)i@0iZqD1nGGxHLY^NUjT zQc{6bVo82c@hy?!lEk#M_?-Oo%)I!b)WXutqSTbh@3;a?41k7-FmN#PfFTDX6Ehbh T6E6_+Kxq(L2#EP$n2!+vedR&G delta 211 zcmZ1`{y~f{pO=@50SHXQ1=G&)PUMqe+%QqwxjvOGg)N1>g`t@-iW|u0NZ|ytd4O!L z6mBq^7s%#G;RUn#fNZ`LelVLK$QDQu1hWNzY@rlkFk2AF7D*8WvxR_cu@rGITR24` zm_bwWCCC+;%(vKzQu9(aetpQu$T9gk(faE{!=nQz%vev9wT7u@EE#XCsl2#Uz#@qF+EBg0+o; zVDsA8+6AmE1PiMm*b3S?48Gyd{H7SDcu!luTVB^R4TWB>6{v5oU3qONU(Ifwp@Pu# z>?n?jqo`jh7qI6gkD=aF)$7%!d)R1I+s^SxqwSzLDxS{l(vRti1)l%XLDdXU RmnkL6Jf%V@8z9V5`43GVe@*}Z delta 412 zcmXBQD@?;+5C`yHJ4W|tyKe2eN4GKP*aHGvm?s2|aJGr#*McjA6K4;`~_7*U0)?b-YHYa`Q#V6?Dx(hK7> z>OJ|WmbjFaEJ8m1GA}-Q5up-*tgq9kaCcviH&Az~%T+BVH zFpxifL4`|cms%>^iS_ajp5;@Sj(^Fw;9U({s-g^*#7D3!zN--^ib?fUjBCeMhaRsh R4#fXkH0!Rax5P%h`3HlDX~6&h diff --git a/osinaweb/osinacore/edit/views.py b/osinaweb/osinacore/edit/views.py index 41f02212..d6d9690f 100644 --- a/osinaweb/osinacore/edit/views.py +++ b/osinaweb/osinacore/edit/views.py @@ -4,9 +4,10 @@ from django.contrib.auth.decorators import login_required from django.http import HttpResponseRedirect from django.urls import reverse from django.http import HttpResponse +from osinacore.decorators import * -@login_required +@staff_login_required def edit_customer(request, customer_id): customer = get_object_or_404(CustomerProfile, customer_id=customer_id) @@ -60,7 +61,7 @@ def edit_customer(request, customer_id): -@login_required +@staff_login_required def edit_business(request, business_id): business = get_object_or_404(Business, business_id=business_id) business_types = BusinessType.objects.all().order_by('name') @@ -102,7 +103,7 @@ def edit_business(request, business_id): return render(request, 'edit_templates/edit-business.html', context) -@login_required +@staff_login_required def edit_staff(request, staff_id): staff = get_object_or_404(StaffProfile, staff_id=staff_id) positions = StaffPosition.objects.all().order_by('name') @@ -148,7 +149,7 @@ def edit_staff(request, staff_id): -@login_required +@staff_login_required def edit_project(request, project_id): project = get_object_or_404(Project, project_id=project_id) @@ -210,7 +211,7 @@ def edit_project(request, project_id): -@login_required +@staff_login_required def edit_task(request, task_id): task = get_object_or_404(Task, task_id=task_id) projects = Project.objects.all().order_by('-id') @@ -259,7 +260,7 @@ def edit_task(request, task_id): - +@staff_login_required def edit_task_status_modal(request, *, task_id): task = get_object_or_404(Task, task_id=task_id) @@ -280,7 +281,7 @@ def edit_task_status_modal(request, *, task_id): -@login_required +@staff_login_required def edit_epic(request, *args, **kwargs): context = { @@ -290,7 +291,7 @@ def edit_epic(request, *args, **kwargs): -@login_required +@staff_login_required def edit_project_type(request, projecttype_id): projecttype = get_object_or_404(ProjectType, id=projecttype_id) @@ -304,7 +305,7 @@ def edit_project_type(request, projecttype_id): return render(request, 'edit_templates/edit-project-type.html', {'projecttype': projecttype}) -@login_required +@staff_login_required def edit_staff_position(request): context = { @@ -316,7 +317,7 @@ def edit_staff_position(request): -@login_required +@staff_login_required def edit_business_type(request, businesstype_id): businesstype = get_object_or_404(BusinessType, id=businesstype_id) @@ -330,7 +331,7 @@ def edit_business_type(request, businesstype_id): return render(request, 'edit_templates/edit-business-type.html', {'businesstype': businesstype}) -@login_required +@staff_login_required def edit_reference(request, reference_id): reference = get_object_or_404(Reference, id=reference_id) @@ -345,7 +346,7 @@ def edit_reference(request, reference_id): -@login_required +@staff_login_required def edit_tag(request, tag_id): tag = get_object_or_404(Tag, id=tag_id) @@ -368,7 +369,7 @@ def edit_tag(request, tag_id): #Mark points -@login_required +@staff_login_required def mark_point_working_on(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -401,7 +402,7 @@ def mark_point_working_on(request, point_id, task_id): -@login_required +@staff_login_required def mark_point_working_on_task_page(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -431,7 +432,7 @@ def mark_point_working_on_task_page(request, point_id, task_id): -@login_required +@staff_login_required def mark_point_paused(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -457,7 +458,7 @@ def mark_point_paused(request, point_id, task_id): -@login_required +@staff_login_required def mark_point_paused_task_page(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -483,7 +484,7 @@ def mark_point_paused_task_page(request, point_id, task_id): -@login_required +@staff_login_required def mark_point_completed(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -524,7 +525,7 @@ def mark_point_completed(request, point_id, task_id): -@login_required +@staff_login_required def mark_point_completed_task_page(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) diff --git a/osinaweb/osinacore/templates/.DS_Store b/osinaweb/osinacore/templates/.DS_Store index a1d4d95ffd8ed03f39aae80ec1f462b19a1b9622..97587ba848d2cb17300fce9e39f845cc2f0bf517 100644 GIT binary patch delta 391 zcmZn(XbG6$FRI4Cz`)4BAi%(o%82Hwr=94s92AQeIki9p#D zpd6AapjakD-eg4y2{xvyKt-1(+X<*mz97oa8U*CUZ?+RS&nzs=kjzlZPz*FTpCK2h zyNDrvvbcn@_D-O+{{O)Ms2F4ehB}~nxD9-aT0jkM5DowTPxccrXH1-YLPQT}A0Hdz zL!b#Un@@;HGjhhm44r&YOkp#R*grlwo3Yn*3JM8)%TFlr!V`$+c3U?B^j` eHWvD^Y-U&Z#loMHp9Itm3`k~uAWfX(@)!Zcy?N{a delta 236 zcmZn(XbG6$FRIMIz`)4BAi%&-!jQ_4%TU0O!;rYKa2or>2Hwr=94s7+%98^G4B55+ zgTdqp!U~&L2&`mw6k + + + + + + {% block title %} Osina {% endblock %} + + + + + + + + + +
+ +
+ + +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+ +

My Projects

+
+ +
+ +

Tickets

+
+ +
+ +

Invoices

+
+ +
+ +

Products

+
+ +
+ +

Knowledgebase

+
+ +
+ +

Contact Us

+
+
+
+ + +
+
+
+ Ositcom Logo +

Powered By OSITCOM

+
+

Copyrights © 2024 All Rights Reserved

+
+
+
+ + + + + + + +
+ +
+
+
+
+
+
+
+
+ +
+
+
+ {{ request.user.first_name.0 }}{{ request.user.last_name.0 }} +
+ +
+

{{request.user.first_name}} {{request.user.last_name}}

+ + +
+
+ + + +
+
+ + + +
+ + + + +
+
+
+
+
+ + +
+ + {% block modules_section %} + +
+
+
+
+

Invoices

+ +
+
+

2

+
+
+
+ +
+
+
+

Projects

+ +
+
+

2

+
+
+
+ +
+
+
+

Tickets

+ +
+
+

2

+
+
+
+
+ {% endblock modules_section %} + + + + {% block content %} + replace me + {% endblock content %} + + +
+
+
+ Ositcom Logo +

Powered By OSITCOM

+
+

Copyrights © 2024 All Rights Reserved

+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/osinaweb/osinacore/urls.py b/osinaweb/osinacore/urls.py index b388e61e..f4bdd6ff 100644 --- a/osinaweb/osinacore/urls.py +++ b/osinaweb/osinacore/urls.py @@ -72,12 +72,6 @@ urlpatterns = [ path('add_reaction///', views.add_reaction, name='add_reaction'), - #CUSTOMER DASHBOARD - path('customerdashboard/', views.customer_index, name='customerdashboard'), - path('customerinvoices/', views.customer_invoices, name='customerinvoices'), - path('customerproducts/', views.customer_products, name='customerproducts'), - path('pricing/', views.pricing, name='pricing'), - path('initiate_checkout/', views.initiate_checkout, name='initiatecheckout'), ] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/osinaweb/osinacore/views.py b/osinaweb/osinacore/views.py index 5f02c153..b11e3e0a 100644 --- a/osinaweb/osinacore/views.py +++ b/osinaweb/osinacore/views.py @@ -10,24 +10,26 @@ from django.http import JsonResponse from .models import Task, Epic from django.template.loader import render_to_string from .custom_context import calculate_time_ago -import requests from django.core.validators import validate_email from django.core.exceptions import ValidationError +from django.template.loader import get_template +from .decorators import * def login_with_email(request, email): user = User.objects.filter(email=email).first() if user is not None: - login(request, user) - return redirect('customerdashboard') + login(request, user) + return redirect('home') else: - return render(request, 'lsogin.html') + return render(request, 'login.html') # Pages views def signin(request): if request.user.is_authenticated: - return redirect('home') + if StaffProfile.objects.filter(user=request.user) or CustomerProfile.objects.filter(user=request.user): + return redirect('home') if request.method == 'POST': form = CustomLoginForm(request.POST) @@ -46,10 +48,7 @@ def signin(request): if user is not None: login(request, user) Connection.objects.create(status='Online', date=datetime.now(), user=user) - if CustomerProfile.objects.filter(user=user): - return redirect('customerdashboard') - else: - return redirect('home') + return redirect('home') else: form.add_error(None, 'Invalid email or password. Please try again.') @@ -76,28 +75,36 @@ def go_online(request): + @login_required def home(request, *args, **kwargs): - notes = Note.objects.filter(user=request.user).order_by('-date')[:6] - recent_note = Note.objects.filter(user=request.user).last() + if StaffProfile.objects.filter(user=request.user): + notes = Note.objects.filter(user=request.user).order_by('-date')[:6] + recent_note = Note.objects.filter(user=request.user).last() + if request.user.is_superuser: + # Superadmin can see the last 8 tasks for all users + tasks = Task.objects.filter(Q(status='Open') | Q(status='Working On')).order_by('-status_date', '-id')[:8] + else: + # Non-superadmin user can only see their assigned tasks + tasks = Task.objects.filter(Q(assigned_to=request.user.staffprofile) & (Q(status='Open') | Q(status='Working On'))).order_by('-status_date', '-id') + context = { + 'notes': notes, + 'recent_note': recent_note, + 'tasks': tasks, + } + return render(request, 'index.html', context) + - if request.user.is_superuser: - # Superadmin can see the last 8 tasks for all users - tasks = Task.objects.filter(Q(status='Open') | Q(status='Working On')).order_by('-status_date', '-id')[:8] - else: - # Non-superadmin user can only see their assigned tasks - tasks = Task.objects.filter(Q(assigned_to=request.user.staffprofile) & (Q(status='Open') | Q(status='Working On'))).order_by('-status_date', '-id') + context = { + } + template = get_template('customer_index.html') + return HttpResponse(template.render(context, request)) - context = { - 'notes': notes, - 'recent_note': recent_note, - 'tasks': tasks, - } - return render(request, 'index.html', context) +@staff_login_required def status_mobile_modal (request, *args, **kwargs): context = { @@ -105,7 +112,7 @@ def status_mobile_modal (request, *args, **kwargs): return render(request, 'details_templates/status-on-mobile-modal.html', context) - +@staff_login_required def user_recent_activities_modal(request, user_id): current_time = timezone.now() @@ -135,7 +142,7 @@ def user_recent_activities_modal(request, user_id): -@login_required +@staff_login_required def customers(request, *args, **kwargs): customers = CustomerProfile.objects.all().order_by('-customer_id') @@ -146,7 +153,7 @@ def customers(request, *args, **kwargs): return render(request, 'listing_pages/customers.html', context) -@login_required +@staff_login_required def businesses(request): businesses = Business.objects.all().order_by('-business_id') context = { @@ -155,7 +162,7 @@ def businesses(request): } return render(request, 'listing_pages/businesses.html', context) -@login_required +@staff_login_required def staffs(request): staffs = StaffProfile.objects.all().order_by('-staff_id') @@ -168,8 +175,7 @@ def staffs(request): - -@login_required +@staff_login_required def my_projects(request, *args, **kwargs): user = request.user @@ -210,9 +216,7 @@ def my_projects(request, *args, **kwargs): - - -@login_required +@staff_login_required def my_tasks(request, *args, **kwargs): if request.user.is_superuser: # Superadmin can see all projects @@ -229,7 +233,7 @@ def my_tasks(request, *args, **kwargs): -@login_required +@staff_login_required def my_notes(request): my_notes = Note.objects.filter(user=request.user).order_by('-id') @@ -241,6 +245,8 @@ def my_notes(request): return render(request, 'listing_pages/notes.html', context) + +@staff_login_required def daily_reports(request): user = request.user @@ -256,7 +262,7 @@ def daily_reports(request): -@login_required +@staff_login_required def project_types(request): projecttypes = ProjectType.objects.all().order_by('-id') @@ -267,7 +273,7 @@ def project_types(request): -@login_required +@staff_login_required def staff_positions(request): staffpositions = StaffPosition.objects.all().order_by('-id') @@ -281,7 +287,7 @@ def staff_positions(request): return render(request, 'listing_pages/staff-positions.html', context) -@login_required +@staff_login_required def business_types(request): businesstypes = BusinessType.objects.all().order_by('-id') @@ -291,7 +297,7 @@ def business_types(request): return render(request, 'listing_pages/business-types.html', context) -@login_required +@staff_login_required def references(request): references = Reference.objects.all().order_by('-id') @@ -303,7 +309,7 @@ def references(request): return render(request, 'listing_pages/references.html', context) -@login_required +@staff_login_required def tags(request): tags = Tag.objects.all().order_by('-id') @@ -322,7 +328,7 @@ def tags(request): #Details -@login_required +@staff_login_required def customerdetails(request, customer_id): customer = get_object_or_404(CustomerProfile, customer_id=customer_id) context = { @@ -331,7 +337,7 @@ def customerdetails(request, customer_id): } return render(request, 'details_templates/customer-details.html', context) -@login_required +@staff_login_required def businessdetails(request, business_id): business = get_object_or_404(Business, business_id=business_id) context = { @@ -340,7 +346,7 @@ def businessdetails(request, business_id): } return render(request, 'details_templates/business-details.html', context) -@login_required +@staff_login_required def staffdetails( request, staff_id): staff = get_object_or_404(StaffProfile, staff_id=staff_id) @@ -350,7 +356,7 @@ def staffdetails( request, staff_id): return render(request, 'details_templates/staff-details.html', context) -@login_required +@staff_login_required def taskdetails(request, task_id): task = get_object_or_404(Task, task_id=task_id) points = Point.objects.filter(task=task).order_by('-id') @@ -364,6 +370,7 @@ def taskdetails(request, task_id): return render(request, 'details_templates/task-details.html', context) +@staff_login_required def show_points_modal(request, task_id): task = get_object_or_404(Task, task_id=task_id) points = Point.objects.filter(task=task).order_by('-id') @@ -375,9 +382,7 @@ def show_points_modal(request, task_id): return render(request, 'details_templates/showpoints-modal.html', context) - - - +@staff_login_required def timeline_modal(request, task_id): task = Task.objects.get(task_id=task_id) point_activities = PointActivity.objects.filter(point__task=task) @@ -412,7 +417,7 @@ def timeline_modal(request, task_id): -@login_required +@staff_login_required def projectdetails(request, project_id): project = get_object_or_404(Project, project_id=project_id) epics = Epic.objects.filter(project=project).order_by('-id') @@ -439,6 +444,7 @@ def projectdetails(request, project_id): #FETCH EPIC RELATED TASKS +@staff_login_required def get_tasks(request, epic_id): epic = get_object_or_404(Epic, id=epic_id) related_tasks = Task.objects.filter(epic=epic).order_by('-id') @@ -452,6 +458,7 @@ def get_tasks(request, epic_id): # TO DISPALY ALL THE OPEN TASKS OF THIS PROJECT +@staff_login_required def open_tasks_for_project(request, project_id): project = Project.objects.get(pk=project_id) open_tasks = Task.objects.filter(project=project, status='Open').order_by('-id') @@ -466,6 +473,7 @@ def open_tasks_for_project(request, project_id): # TO FETCH THE EPICS OF THE SELECTED PROJECT WHEN EDITING A TASK +@staff_login_required def fetch_epics(request): project_id = request.GET.get('project_id') epics = Epic.objects.filter(project_id=project_id).values('id', 'title') @@ -474,6 +482,7 @@ def fetch_epics(request): # TO UPDATE THE STATUS CONTAINER +@staff_login_required def get_updated_last_status(request): if request.user.is_authenticated: last_status = Status.objects.filter(staff=request.user.staffprofile).last() @@ -507,6 +516,7 @@ def get_updated_last_status(request): # TO GET USER ACTIVITIES +@staff_login_required def get_latest_activities(request): latest_connections = Connection.objects.filter( user__staffprofile__isnull=False @@ -555,6 +565,7 @@ def get_latest_activities(request): return HttpResponse(recent_activities) +@staff_login_required def recent_activities_page(request): context = { @@ -564,6 +575,7 @@ def recent_activities_page(request): return render(request, 'recent-activities-page.html', context) +@staff_login_required def add_reaction(request, status_id, emoji): status = get_object_or_404(Status, pk=status_id) user = request.user @@ -577,112 +589,3 @@ def add_reaction(request, status_id, emoji): # If the user hasn't reacted yet, create a new reaction new_reaction = Reaction.objects.create(status=status, emoji=emoji, user=user) return JsonResponse({'message': 'Reaction added successfully.'}) - - - - - - - - - - - - - -# CUSTOMER DASHBOARD -# LISTING PAGES - - -@login_required -def customer_index(request, *args, **kwargs): - - context = { - - } - - return render(request, 'customer_dashboard/customer_index.html', context) - - -@login_required -def customer_invoices(request, *args, **kwargs): - - context = { - - } - - return render(request, 'customer_dashboard/listing_pages/customer-invoices.html', context) - - -@login_required -def customer_products(request, *args, **kwargs): - - context = { - - } - - return render(request, 'customer_dashboard/listing/customer-products.html', context) - - -@login_required -def pricing(request, *args, **kwargs): - - context = { - - } - - return render(request, 'customer_dashboard/pricing.html', context) - - - -@login_required -def customer_products(request, *args, **kwargs): - - context = { - - } - - return render(request, 'customer_dashboard/listing/payment.html', context) - - - -def initiate_checkout(request): - # Your Mastercard API credentials - api_username = "merchant.TEST06127800" - api_password = "37846250a67c70e7fe9f82cf6ca81f93" - merchant_id = "TEST06127800" - merchant_name = "Ositcom Sal" - - # Data for Initiate Checkout operation - data = { - "apiOperation": "INITIATE_CHECKOUT", - "apiUsername": api_username, - "apiPassword": api_password, - "merchant": merchant_id, - "interaction.operation": "PURCHASE", - "interaction.merchant.name": merchant_name, - "order.id": "123", - "order.amount": "100.00", - "order.currency": "USD", - "order.description": "description_of_order" - } - - - try: - response = requests.post("https://creditlibanais-netcommerce.gateway.mastercard.com/api/nvp/version/72", data=data) - - print("Response Content:", response.content.decode()) # Print response content - - if response.status_code == 200: - response_data = response.text - parsed_data = dict(item.split("=") for item in response_data.split("&")) - session_id = parsed_data.get("session.id") - success_indicator = parsed_data.get("successIndicator") - return JsonResponse({"session_id": session_id, "success_indicator": success_indicator}) - else: - print("Response Status Code:", response.status_code) # Print status code - return JsonResponse({"error": "Failed to initiate checkout"}, status=500) - - except Exception as e: - print("Exception:", e) # Print exception traceback - return JsonResponse({"error": "Internal Server Error"}, status=500) \ No newline at end of file diff --git a/osinaweb/osinaweb/__pycache__/settings.cpython-310.pyc b/osinaweb/osinaweb/__pycache__/settings.cpython-310.pyc index c485ea2bc5af6d319ceadae94fcf5e687c71b1f3..60710cff51e82363a616e9ea9cdfd0c30290f9a9 100644 GIT binary patch delta 307 zcmX|6yH3MU42>P<(I`!tw&^Qr%TofOGVm*GR}54*L_t(VX<+3WsxWpS{6YqHKBFwG zYz#;U2Fj&FEuEut>?2!#@n3ysTCG}&tk1D`>AQ0$grE6QbkA;~M(UOKSdR>@{ks_1 zU@um<{sakdV?i;91~)~MeQwEAJ5ac@zyyTPUGB+DmxDEjYwjlylW6fkw0S5xY>2Kz zkGDjyxwKuN+!}JQBl?@>Zh>OJdt%7ysdBhq9>6nzoxfpVE$xfjSvH+SY59fcSWij5 zvaDp$lBy%2shKWWNDexH RzepzHioR(@t^C0{{sX^?NQM9a delta 283 zcmX|6J5Iwu6!cqfFfsCiCX6)N zNfa{QAO-4GJOQ-G!anuMZc|REkXx}7&?b-kHsevS(r~3w3JFJt2I$fdJ<`x`8PEvB z_0n$5+SZ8n&>yVL{hHyB4sb;3xpH*a9K#2ATPSi_%q}N+Je7}GezWLiMS2%EntH{I zMRz8r_qXv(7CCR8Iu(G?INA@}7`IRJaoN!y;G%ri150q7@dy}fGPdM@e95iyT|fN? DYV}Bz diff --git a/osinaweb/osinaweb/__pycache__/urls.cpython-310.pyc b/osinaweb/osinaweb/__pycache__/urls.cpython-310.pyc index 8fe701a32ff591ad9073c7fc06298c93ded98018..e0e62148580879f132bcde9f27ecc77082e7c4dd 100644 GIT binary patch delta 149 zcmdnad4p3spO=@50SLI_1k;pQ7#JRdILLqv$Z-JT;+BcpVa9B!tSOw$jLl4`EGb;6 zOj%r6+|5ksEKxkEJgMxdoLRg;%$LI5%Vf?F#goDl%%I7;am79+PQm2T;*$K_)S}HX c%+8EbVn72~7