From a2ae0403e7f5c3a19462625dfec6008e4d7d85ea Mon Sep 17 00:00:00 2001 From: paras singhal Date: Thu, 20 Jul 2023 15:30:07 +0530 Subject: [PATCH] test --- .DS_Store | Bin 6148 -> 6148 bytes workx/.DS_Store | Bin 6148 -> 6148 bytes workx/{user => accounts}/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 171 bytes .../__pycache__/admin.cpython-311.pyc | Bin 0 -> 226 bytes .../accounts/__pycache__/apps.cpython-311.pyc | Bin 0 -> 546 bytes .../accounts/__pycache__/form.cpython-311.pyc | Bin 0 -> 788 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 3922 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 0 -> 1704 bytes .../__pycache__/views.cpython-311.pyc | Bin 0 -> 1549 bytes workx/{user => accounts}/admin.py | 0 workx/{user => accounts}/apps.py | 4 +- workx/accounts/form.py | 7 ++ workx/accounts/migrations/0001_initial.py | 28 +++++++ ...e_income_project_reimbursement_and_more.py | 72 ++++++++++++++++ .../{user => accounts}/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1616 bytes ...ect_reimbursement_and_more.cpython-311.pyc | Bin 0 -> 3746 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 182 bytes workx/accounts/models.py | 76 +++++++++++++++++ workx/accounts/serializers.py | 19 +++++ workx/{user => accounts}/tests.py | 0 workx/accounts/views.py | 17 ++++ .../authUser/__pycache__/view.cpython-311.pyc | Bin 648 -> 0 bytes workx/authUser/view.py | 8 -- .../__pycache__/__init__.cpython-311.pyc | Bin 160 -> 169 bytes .../client/__pycache__/admin.cpython-311.pyc | Bin 667 -> 676 bytes workx/client/__pycache__/apps.cpython-311.pyc | Bin 531 -> 540 bytes .../client/__pycache__/models.cpython-311.pyc | Bin 3490 -> 3499 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 160 -> 169 bytes .../common/__pycache__/admin.cpython-311.pyc | Bin 579 -> 588 bytes workx/common/__pycache__/apps.cpython-311.pyc | Bin 531 -> 540 bytes .../common/__pycache__/models.cpython-311.pyc | Bin 2752 -> 2761 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 1261 -> 1270 bytes workx/common/migrations/0001_initial.py | 48 +++++++++++ workx/common/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 2222 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 180 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 161 -> 170 bytes .../company/__pycache__/admin.cpython-311.pyc | Bin 368 -> 377 bytes .../company/__pycache__/apps.cpython-311.pyc | Bin 534 -> 543 bytes .../company/__pycache__/form.cpython-311.pyc | Bin 778 -> 787 bytes .../__pycache__/models.cpython-311.pyc | Bin 2764 -> 2773 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 821 -> 830 bytes .../company/__pycache__/views.cpython-311.pyc | Bin 1986 -> 2093 bytes workx/company/migrations/0001_initial.py | 47 +++++++++++ workx/company/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 3084 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 181 bytes workx/company/views.py | 3 +- .../__pycache__/__init__.cpython-311.pyc | Bin 162 -> 171 bytes .../__pycache__/admin.cpython-311.pyc | Bin 474 -> 384 bytes .../employee/__pycache__/apps.cpython-311.pyc | Bin 537 -> 546 bytes .../__pycache__/forms.cpython-311.pyc | Bin 894 -> 903 bytes .../__pycache__/models.cpython-311.pyc | Bin 2126 -> 2325 bytes .../__pycache__/permissions.cpython-311.pyc | Bin 0 -> 2052 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 1040 -> 2253 bytes .../__pycache__/views.cpython-311.pyc | Bin 1933 -> 2016 bytes workx/employee/admin.py | 4 +- workx/employee/migrations/0001_initial.py | 42 ++++++++++ .../migrations/0002_alter_employee_user.py | 21 +++++ workx/employee/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 2640 bytes .../0002_alter_employee_user.cpython-311.pyc | Bin 0 -> 1159 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 182 bytes workx/employee/models.py | 19 +++-- workx/employee/permissions.py | 45 ++++++++++ workx/employee/serializers.py | 23 ++++- workx/employee/views.py | 34 ++++---- workx/google_auth/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 174 bytes .../__pycache__/admin.cpython-311.pyc | Bin 0 -> 229 bytes .../__pycache__/apps.cpython-311.pyc | Bin 0 -> 554 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 226 bytes .../__pycache__/urls.cpython-311.pyc | Bin 0 -> 501 bytes .../__pycache__/views.cpython-311.pyc | Bin 0 -> 2189 bytes workx/google_auth/admin.py | 3 + workx/google_auth/apps.py | 6 ++ workx/google_auth/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 185 bytes workx/{user => google_auth}/models.py | 2 +- workx/google_auth/tests.py | 3 + workx/google_auth/urls.py | 9 ++ workx/google_auth/views.py | 34 ++++++++ workx/templates/home.html | 12 +++ workx/user/views.py | 3 - .../__pycache__/__init__.cpython-311.pyc | Bin 159 -> 168 bytes .../__pycache__/settings.cpython-311.pyc | Bin 3103 -> 2548 bytes workx/workx/__pycache__/urls.cpython-311.pyc | Bin 1861 -> 2546 bytes workx/workx/__pycache__/wsgi.cpython-311.pyc | Bin 677 -> 686 bytes workx/workx/settings.py | 79 ++++++++---------- workx/workx/urls.py | 23 +++-- 92 files changed, 593 insertions(+), 98 deletions(-) rename workx/{user => accounts}/__init__.py (100%) create mode 100644 workx/accounts/__pycache__/__init__.cpython-311.pyc create mode 100644 workx/accounts/__pycache__/admin.cpython-311.pyc create mode 100644 workx/accounts/__pycache__/apps.cpython-311.pyc create mode 100644 workx/accounts/__pycache__/form.cpython-311.pyc create mode 100644 workx/accounts/__pycache__/models.cpython-311.pyc create mode 100644 workx/accounts/__pycache__/serializers.cpython-311.pyc create mode 100644 workx/accounts/__pycache__/views.cpython-311.pyc rename workx/{user => accounts}/admin.py (100%) rename workx/{user => accounts}/apps.py (62%) create mode 100644 workx/accounts/form.py create mode 100644 workx/accounts/migrations/0001_initial.py create mode 100644 workx/accounts/migrations/0002_client_expense_income_project_reimbursement_and_more.py rename workx/{user => accounts}/migrations/__init__.py (100%) create mode 100644 workx/accounts/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 workx/accounts/migrations/__pycache__/0002_client_expense_income_project_reimbursement_and_more.cpython-311.pyc create mode 100644 workx/accounts/migrations/__pycache__/__init__.cpython-311.pyc create mode 100644 workx/accounts/models.py create mode 100644 workx/accounts/serializers.py rename workx/{user => accounts}/tests.py (100%) create mode 100644 workx/accounts/views.py delete mode 100644 workx/authUser/__pycache__/view.cpython-311.pyc delete mode 100644 workx/authUser/view.py create mode 100644 workx/common/migrations/0001_initial.py create mode 100644 workx/common/migrations/__init__.py create mode 100644 workx/common/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 workx/common/migrations/__pycache__/__init__.cpython-311.pyc create mode 100644 workx/company/migrations/0001_initial.py create mode 100644 workx/company/migrations/__init__.py create mode 100644 workx/company/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 workx/company/migrations/__pycache__/__init__.cpython-311.pyc create mode 100644 workx/employee/__pycache__/permissions.cpython-311.pyc create mode 100644 workx/employee/migrations/0001_initial.py create mode 100644 workx/employee/migrations/0002_alter_employee_user.py create mode 100644 workx/employee/migrations/__init__.py create mode 100644 workx/employee/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 workx/employee/migrations/__pycache__/0002_alter_employee_user.cpython-311.pyc create mode 100644 workx/employee/migrations/__pycache__/__init__.cpython-311.pyc create mode 100644 workx/employee/permissions.py create mode 100644 workx/google_auth/__init__.py create mode 100644 workx/google_auth/__pycache__/__init__.cpython-311.pyc create mode 100644 workx/google_auth/__pycache__/admin.cpython-311.pyc create mode 100644 workx/google_auth/__pycache__/apps.cpython-311.pyc create mode 100644 workx/google_auth/__pycache__/models.cpython-311.pyc create mode 100644 workx/google_auth/__pycache__/urls.cpython-311.pyc create mode 100644 workx/google_auth/__pycache__/views.cpython-311.pyc create mode 100644 workx/google_auth/admin.py create mode 100644 workx/google_auth/apps.py create mode 100644 workx/google_auth/migrations/__init__.py create mode 100644 workx/google_auth/migrations/__pycache__/__init__.cpython-311.pyc rename workx/{user => google_auth}/models.py (52%) create mode 100644 workx/google_auth/tests.py create mode 100644 workx/google_auth/urls.py create mode 100644 workx/google_auth/views.py create mode 100644 workx/templates/home.html delete mode 100644 workx/user/views.py diff --git a/.DS_Store b/.DS_Store index 1758272024c20e2756cf261c48c0fd2cc759dc91..57d034792c11a2b2dd4fc819255f35e4cbf6d146 100644 GIT binary patch delta 27 icmZoMXffFEhlS6`xK>A@+S15CN5RC*WHT4*FChSWRR|*h delta 27 icmZoMXffFEhlS6?q*h0v+S15CN5RC{Y%>?@FChSWga{=7 diff --git a/workx/.DS_Store b/workx/.DS_Store index 0d45dc9b003a6a6814bc1bb6c838bad67b863fed..bacb587e98bc40e79f88999ceabfb97669a7344d 100644 GIT binary patch delta 48 zcmZoMXfc@JFUrBdz`)4BAi%(o$54_~UR;orlb^I%kYhPBBgbYIR%Ygj4L>%sbNuB8 E02HhY%K!iX delta 99 zcmZoMXfc@JFUrNhz`)4BAi%&7%23RZ%21S4URTC**X650|5JC6`}wD diff --git a/workx/user/__init__.py b/workx/accounts/__init__.py similarity index 100% rename from workx/user/__init__.py rename to workx/accounts/__init__.py diff --git a/workx/accounts/__pycache__/__init__.cpython-311.pyc b/workx/accounts/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76d71cd61662b97c5021f916f21cf04735a034ad GIT binary patch literal 171 zcmZ3^%ge<81k28BO##u5K?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCUv~PT#i>Qb z`sJxfB}JL(`FZ-``9;}aq9Q&iF*!RmFGar`C{&@Jn4FwnnpaY+A0MBYmst`YuUAm{ li^C>2KczG$)vkyYXdKAGVtyd;ftit!@dE>lC}IYR0RVTYDuMt2 literal 0 HcmV?d00001 diff --git a/workx/accounts/__pycache__/admin.cpython-311.pyc b/workx/accounts/__pycache__/admin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1312480926d8484ee562e56de3ac463472c14544 GIT binary patch literal 226 zcmZ3^%ge<81k28BO|b{kk3k$5V1hC}3jrC^8B!Qh7;_kM8KW2(8B&;n88n$+f)r>n z-eOHm$<563(`35Emy(s3m!7YeoS#=xl$lh-3{)> zo_=_KQ8t*Uh)+sP&Q8rs(Ju!IRp=)sC+C;ul@#lP4c05D{Ka9Do1apelWJGQ0W^yd Yh>K-`#0O?ZM#dWq3Ky`UA~v8307$Sq{r~^~ literal 0 HcmV?d00001 diff --git a/workx/accounts/__pycache__/apps.cpython-311.pyc b/workx/accounts/__pycache__/apps.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27d88f6b76ad22e233624d2974727a4fa1b609ca GIT binary patch literal 546 zcmZutJxjwt7=ABFrS=OEEOc;i%#y4kB2+~Op^J!^<+$dqAvR57K4^97;16&R`VT7N z?7wj67_vIKRqE8qyCfAv-^)Gsy!Sr$T<(3U*DJtd`u0j6`T8!BRg?;{&^Va@1&SOP zAOj(g;1sBI4^(DoDg(UmnTH`!H( zO9l+%w1P2L$By7NjBjG%6qQZNdL(utOt=T`WhRQKJ;Or$;BrsD2w4#7L)MJ~+wxrf z(hK?-jBuBjedbbq$hSuN>TaF*eyI7kfoNX_3MXNU!}w<;t=*Z@OsZSsV=;pIO50K8 zv|7AU7zLuSxm8WDOxWOTS>Dedbr5XuRP-}E<1m*ILJ925et+{d2{q^N7ap!Y#qQTX HrR=hATGxyA literal 0 HcmV?d00001 diff --git a/workx/accounts/__pycache__/form.cpython-311.pyc b/workx/accounts/__pycache__/form.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b78b20fd48535eb95777d101f49d2c4ef632489 GIT binary patch literal 788 zcmZuvJxe4(5UuW>+3{;(6}=NK7Tm;FI)5^51R zieZBsuZuzB)Agk--3lLJyICv7q)fv^OIb`vnPjRR(|$_I({>o!j3K=W7n3?JJl%=n zw$g^=?c;*MvcH>ally0SuVoGovef^bnd1^VaxaXIb*lU`40Zg_>XG{-)6&U#;ZP@L z9BHUXK96wmF}jVPS8jJ^_R6DS8kjUQ2-{7^Op-H2P_M#eOZL<>#k>kg@q7hgNZsSy zo$J9@c%|6eHwjBjoFrRK9fj#ZX6Q#KYNa%})oFZ-bfQPH4UkU5rUqjxR^(MfuSHLn lON5?ajCEoDd31K+*YoJ?If7y1U*US;#($;w+c(Lwf&cV(t_A=A literal 0 HcmV?d00001 diff --git a/workx/accounts/__pycache__/models.cpython-311.pyc b/workx/accounts/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b63266a06d8b1de35b06485cede619962c20478c GIT binary patch literal 3922 zcmcJS&2QUA7QlxR^<|2pE6LrYi5)j}8YnU1-7J!RY|uEiEXQ!_q_yLs>Y{`!P82#6 z=?*D34)!1{dhh}{_^?3s7!*a;L2~dRTlCQXpce|@LEx!CFU?JXbIPIUd!!WEl;E`3 z-Ld#IA8$r)hVS>@_}`*9K%j(b-ztBP6Y>)_IwjJs?EVaudqg1$r;#dGmMHvJM2S#tHQHI|L70$7@c5+|^R%L%6+1vH?rFtAD{+8U!qXZ6 zE#UyI0Z%IlTH*m(f|6P!Iq4~ynd97O)ljHrLM=X1UDJ#WN}(=HmGoPAYL!&YEVp;$ zeRcM?dmfti2qi^MA;nOL(C{kXQB=6cp$8nC20VT#MwIYZq!?9r`0a=roz_&UTTc}j zeaN{3)zWQQqk6@Szs!n_5T%Il>n#cz{pH%y!``r^XG zb(1o4;!C<>F|}go6Q3CDmM3n@E2Z)+sw)#;Lf7qyQn_r@bjzIZPvOkkh8vS*(_*rG zC*>P?rrj1`?Ok-EI%!IoyBl`=&@S4t@G$1aWf|>|Wp_Z9VX2yi^`tC+Q7dWw2*ZuI ziRqgqR#2&?uoSde8pK1wvRHo&MXV#RvimNG`pdtjaAfnmBOJMJ+QR9EaM}@0*Ym9? z7dhM_y~1AVH$qS zKL~**!{e7?G@uiC91Zw7kiT!0UJalgH1OEG@&M$ccAbzSa15j9Z(gBEXyI{r<#8-v zPb#1-9jHC1K&&agrX+yF0XI6QmyIgTh1}SjzHX>x%HD)ufp$EvuB!@w!j417Q}p|X zA%xjAx%xsULNtV7M;L~g;>hN*BaZxQedqNjBepo%5GNgRvR-JWj&0s> zQpfJccFsTfz)npyQd3T9sy>V1WpQQ*JJQw6f<*IW-zA>b(-@ZTU$ zAs`Oc+LJqiJoRe)H#|iG_8iPpPFK}2WEMV8r2v^duSwqo680v8=SthG&6hk<4^m57B2%r6@zW~un8-wrnO096S(FdQTz!7 zMrC#ugd3;rO9;a#>?T*>9wN81w40nV42_m_A5js|tgh6UNvm*|@KR}zJ-nna6u4#c z2M}HMTA}EnXp3}&&1YMKWN>tI-I0!M|Ji=`vMtRuq&Y{Lt6%O9h6u9s(tA#nJnRc9x%fZcF)wly{^&ESVYGI`3r0?tk`O;rj(UGvCO}JDK_V zm1g$jR>8@hY-DpzHdp`f6-46h`V;vLjJ%pi;Bh}~K96{B@QT7Kn7{Vtz~91KH;eK> zeK2bYULH!e^N{%Q-dC9mBNEq2s={W#255xyHOdNpJ$7}SG6mYR(C+3S_7*gsVwwhh z??S1l71c7`ltRmDwWP^wS_!ijvh%+qW@w+~9d72)v_0I2L2gouOP7|eFZNR7vy#mF zHn(#T!(5cTW|*p_uG2Xku!7^jTcjI@8>SBVbHk0AR>`WFeL2XZJt!{1WBvogUJm#y zaL^I;1;|620b8vm~Vk>g*lFElB4$iPb*5e6E+#!`)LyB z+4pJj5e}~6y<&6u?q8o_|MTwPV6U1tb@Rqutw&elARYG#e_iN*-W?pvpl+}5*M71LXh4dPC=jAZ3L=Db&FbvkAmh7p*s~P_4FyF? zy5tuGMfCgx>J%=lZK={Za;j9!?D>K1#3BlNcc1oV=f0WyW@o?Wa%lqNN%WJqC?UV` zr9bT6qcO{#nW4)kU2r>0#%tv$cpDzJ_#9}z`u}!shn3~xfTeOc+uPu zVI)-UwWtK8hKxiY!g@K*Dn_gK(tQMzeIkfUIdKi03WZdRLj!&Vo_M$>HzB;G=HeJz zgXklym4-nYJuE1u3F*w-tM_p zi5DkGbd6;e5`y}Ui-Zj%=Md%*#^gd}jiKfj$TFpoi)!DX$9>zA4 zCfJpudo|LHD|N{+T{XLbEj-jJZVz259cFYloF~`g^Wd3$0AJ&Y6a50{n3U2sd3Zc} yx5?V^<#)$2DKy(8eEZzWubtw;*>E*G>8HOv$h4Lo|Fd(ob?@o8^B{)aj(-3;bY77F literal 0 HcmV?d00001 diff --git a/workx/accounts/__pycache__/views.cpython-311.pyc b/workx/accounts/__pycache__/views.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92b404fe88666e95b8847c812fc8b79a0f6dc09a GIT binary patch literal 1549 zcmcIkK~EDw6rR~_yW7%sK?@i)F$js>9$3T4MB_;#9^@cF&0aR!-O&_ww=lC6@Sq$# za^QwXPZ)z|e@7urXy&RHZWugqa^7r9X%TKrr{7NB`)1~S@4fD~LLrC5m}Nix83mzV z@S{7@oyGAFvDijF@^OGdY-5ak#a9C*RBbg(*{LvXr==|wWJ1l>LfzKGtewS3LC=t% z{*3$#!He=HICDouXjgobVGl``CRq9H+BH%L4bZsA(Jx=6g3an%h1uCFu*T^FgLIyi^fsb0qm zT*khmV~F77p|v1f%vvSYnAYCaBkOgYE=gE(s;;+0BHvmSrZvm;ym}*wnI)4xy}VBI z;sgm005b(_oPOHI=;p@*V`AT!*fS9uXma3=ApqYzAP;(F`~Cw@>s0*! literal 0 HcmV?d00001 diff --git a/workx/user/admin.py b/workx/accounts/admin.py similarity index 100% rename from workx/user/admin.py rename to workx/accounts/admin.py diff --git a/workx/user/apps.py b/workx/accounts/apps.py similarity index 62% rename from workx/user/apps.py rename to workx/accounts/apps.py index 36cce4c..3e3c765 100644 --- a/workx/user/apps.py +++ b/workx/accounts/apps.py @@ -1,6 +1,6 @@ from django.apps import AppConfig -class UserConfig(AppConfig): +class AccountsConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' - name = 'user' + name = 'accounts' diff --git a/workx/accounts/form.py b/workx/accounts/form.py new file mode 100644 index 0000000..cc8dc5e --- /dev/null +++ b/workx/accounts/form.py @@ -0,0 +1,7 @@ +from django import forms +from .models import Account + +class AccountForm(forms.ModelForm): + class Meta: + model = Account + exclude = () # \ No newline at end of file diff --git a/workx/accounts/migrations/0001_initial.py b/workx/accounts/migrations/0001_initial.py new file mode 100644 index 0000000..d341f2a --- /dev/null +++ b/workx/accounts/migrations/0001_initial.py @@ -0,0 +1,28 @@ +# Generated by Django 4.1.9 on 2023-07-17 23:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Account', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('address', models.CharField(max_length=200)), + ('phone_number', models.CharField(max_length=20)), + ('email', models.EmailField(max_length=254)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('total_revenue', models.DecimalField(decimal_places=2, default=0, max_digits=10)), + ('total_expenses', models.DecimalField(decimal_places=2, default=0, max_digits=10)), + ('total_investments', models.DecimalField(decimal_places=2, default=0, max_digits=10)), + ], + ), + ] diff --git a/workx/accounts/migrations/0002_client_expense_income_project_reimbursement_and_more.py b/workx/accounts/migrations/0002_client_expense_income_project_reimbursement_and_more.py new file mode 100644 index 0000000..edf0fd0 --- /dev/null +++ b/workx/accounts/migrations/0002_client_expense_income_project_reimbursement_and_more.py @@ -0,0 +1,72 @@ +# Generated by Django 4.1.9 on 2023-07-18 11:13 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0001_initial'), + ('employee', '0002_alter_employee_user'), + ('accounts', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Client', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Expense', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('category', models.CharField(choices=[('Food', 'Food'), ('Fuel', 'Fuel'), ('Traveling', 'Traveling'), ('Gifts', 'Gifts')], max_length=100)), + ('title', models.CharField(max_length=100)), + ('bill_number', models.CharField(max_length=100)), + ('date', models.DateField()), + ('reimbursement', models.BooleanField()), + ('bank_account', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='common.bankdetails')), + ('employee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='employee.employee')), + ], + ), + migrations.CreateModel( + name='Income', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('type', models.CharField(choices=[('Invoice', 'Invoice'), ('Dividend', 'Dividend')], max_length=10)), + ('title', models.CharField(max_length=100)), + ('invoice_number', models.CharField(max_length=100)), + ('date', models.DateField()), + ('client', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.client')), + ], + ), + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Reimbursement', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100)), + ('rate', models.DecimalField(decimal_places=2, max_digits=10)), + ('quantity', models.PositiveIntegerField()), + ('status', models.CharField(max_length=10)), + ], + ), + migrations.DeleteModel( + name='Account', + ), + migrations.AddField( + model_name='income', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.project'), + ), + ] diff --git a/workx/user/migrations/__init__.py b/workx/accounts/migrations/__init__.py similarity index 100% rename from workx/user/migrations/__init__.py rename to workx/accounts/migrations/__init__.py diff --git a/workx/accounts/migrations/__pycache__/0001_initial.cpython-311.pyc b/workx/accounts/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d68dcb3a0785bf501c53696a446931b8e938f72a GIT binary patch literal 1616 zcma)6J#5=X6h2b_vZRoXV@0Z4Rkk5iNnqIxVnDSL*o`ZrMIF?M(*hdGo^)rKHbtr= z<)2O-I&=)W)T1XCg*{{`;L)R};skIIZVJ#zn*wLbQ1p(JR5bRGBk%FOyYJrLy~p3< z@hD*9(O-X}X+Hpeb73$7ede;nnBM>bNYFq-s0a zy@QEggGsm;H?dqdx^WFgaxo))<1DqO@)dtZT}*6SF+<%Ugf)P+hMrP)P(KqISz8(gQMrCQBs={6NrRHovW%XvSI!Io_(H4{S{BRbMF z)dn>8m2JFFBNjGQsHs0;8r#8U)v&Ol!v>~)PP>TN$_uPS;GUvky>4&P5Jbqtmesvr zdo{#JI0p+xB*qI`w!=%eWMDrnHtXz-Pl!_4jQ)&8)}M)cd*{VT^^Xp zNta(z-bWJ%*O;T4($ruLTQr3525f1z=M7Tps%_DPrv&dcv2HPt?8&OWgDty(b=%5| zW`esC+)%NGtS9*d4J&SpibA7`!YaO{VaCT4<;ND(c-%}1sk&;j%+MIZOgF-MO~sbU zyNHfFc2l{^d&T4hO=F*{^(B_%GPgk^k2j&|vC%JhGCV%M%<{jkHn1ngmc97;K%GOiZRS>Cmo4oTpm*t3;lExk%+Aiv zDg7vBn)@d2QI~MWddQmWVEDXBj2^7?{K8o9;Okx(L^8ibo$yB;IsHn$MUr=3>^R9g zXa0+6Qc;L*lBCs6T29g;lHHM$B$YoLcT)M6&q%7+P8FS0kw~Ah!(`&#VcD6ucjhA# zrS?S0nJ5wIVMor8?A+0~lbt(zO0tXX?4pxhB+^nxzD?414|7iX?n{fL7ux9sC%r(V zQb+!fWbPmCIGOwBV&6VKx+UUPg_rRe4s)@yjC&g{ yc?I{#{FI6OPiKA0NY5t-LN5q}JOQ6veS5)iA=m>~$&08XO~2+FZ?4&O?fwfN7rW{J literal 0 HcmV?d00001 diff --git a/workx/accounts/migrations/__pycache__/0002_client_expense_income_project_reimbursement_and_more.cpython-311.pyc b/workx/accounts/migrations/__pycache__/0002_client_expense_income_project_reimbursement_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..297c24fa7f9be9ef6329fdfc491e951fe0bc5611 GIT binary patch literal 3746 zcmb_f&2!tv6$e2Q{17FRj4T8I3 z3O5B5{;Pl@IJ6eb5w^mD@I8F~Q;8z+u277=;LW1Qk`1kHsg7nEHj^4A!n%FC)*I{n zN%tDBCP3pi0v0MEBviyY`0#D05*7s4RQInT4#nUF_k>mn+gFf!*3XgeaW(Ay$&{=`^~9D$Ye7OY0!0jvMV zt{Hm=d&k)e;~rW;r4Y~sh~4{#@^8W$l?ih6P_}t>Ou5KB(s4|baA`5zlMO$ z$l7~*{gY_QvvQI>HGMF$+n4s&)_SZmh)PghXINq-D67RVR9UHJHX5eEQnRzOzfv?q zb2L>4c^o&Iy4l8sZ%}x|R1O(VN;TxPR7f#cB^st%hyuG_+aN(HtGKzN)6{iqUFRvBe??EU|tIYmI8l zvT=j2H&s=Qhe{8N&8!b;i3<^SR86^ZIW~)b-BJxerOhPUQJofqVA0QjVyG7y z&G$dn^i6H1_nhcSieXU6k8>~9{;a4M(A&k+EUtKBMPW%rfnhBj1D{e9u&nd6;4Oq9 z>;OVdgHZ7c1nVn%3AV!ZTKp(ysZX@}BBb68o+>O+exO=Cb_o{iv#C!^Q^%^|w~{wZ z2y5NA1*s{aHPxt_Ohi={_reDE5Ed&h-YqXKeaccxK1Tk;!8@i6`(_<48<2&#XQyw; zi?-(yi!UP7vtl-J?^^Sn@CrN?e%_qn^!m@}_0M>F33^dqcbe?!1V=2@ilAXoOKtD+hRptW$R*|zv$?Gb)2vMGT1c<*&1 zkwM870`mAXcR)y-|67vA&vi5MzcZ)F@Z^(qIy|`(`RM|wD8#VHu-zH9>99@GPB$}5 ziTzYz+7B0DhFn3El zK))3K#6{=+EWY&Uu17(V`AY0&&XC;X(+QfJd|o5Dg-&jP<`zi$*WJuHGBW#2q9e0A zWioQTGjg4dTqo(pHx|;7r>Hzd($n3{2pRkE*#sT?uroGC$L2`-YBzJ9j9z{=L`N_0 z-2d^9^x6u&cAsAR3#mOKqZ^&k4LZ6(((P^roG)?bOFKh9%5;92&VNDYD@3tK!R{1n zTHx@xnFL2E#ZdyX%ZZyiVF1XLWpb-VE+g`_O=PDdJ5+W^y7fQ67$xIZo_$2euk6@l zyxbWt)A2G%FC7hrO!CuDKce~R=j%VT>D)~^cZbe>Nxm{j-t6Q}nm0+h>GsF?ijsUq zKz2EChhDGfIB`E=N{t*NrG7Cjz~(ehy1(verFyh75qy+~f=k-XX|EYO0V zMS#T=$71TaMe+-s`~uDM4!2L@t55LN1KH)o9eiW;Zdl}fKz2ECB_VN^Z?=4Q_t@HFOwjE3KUTLjTKbrlZqm}{RIJruJsw`JXN=W`#Js_zd(O%{SKP^pCelb;)X+^ o5O^Od65-)ic?A)Yt?1xg3TI{*Lx literal 0 HcmV?d00001 diff --git a/workx/accounts/migrations/__pycache__/__init__.cpython-311.pyc b/workx/accounts/migrations/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..504cef4d1ccb9c94881afa63cfd03939f6e1c5c9 GIT binary patch literal 182 zcmZ3^%ge<81k28BO##u5K?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCU!MA*#i>Qb z`sJxfB}JL(`FZ-``9;}aq9Q&iF*!RmFGar`C{&@Jn4FwnnpaY+pPQLplvt9PpI59O wAD@|*SrQ+wS5Wzj!zMRBr8Fniu80+AGRW>?ejxFInURt40|SgGVg`x<0My1V`2YX_ literal 0 HcmV?d00001 diff --git a/workx/accounts/models.py b/workx/accounts/models.py new file mode 100644 index 0000000..083b2ae --- /dev/null +++ b/workx/accounts/models.py @@ -0,0 +1,76 @@ +from django.db import models + +# Create your models here. +from employee.models import Employee +from common.models import BankDetails + +class Client(models.Model): + name = models.CharField(max_length=100) + # Other fields for client information + + def __str__(self): + return self.name + + +class Project(models.Model): + name = models.CharField(max_length=100) + # Other fields for project information + + def __str__(self): + return self.name + + +class Income(models.Model): + TYPE_CHOICES = [ + ('Invoice', 'Invoice'), + ('Dividend', 'Dividend'), + ] + + type = models.CharField(max_length=10, choices=TYPE_CHOICES) + title = models.CharField(max_length=100) + invoice_number = models.CharField(max_length=100) + date = models.DateField() + client = models.ForeignKey(Client, on_delete=models.CASCADE) + project = models.ForeignKey(Project, on_delete=models.CASCADE) + # Other fields specific to income + + def __str__(self): + return self.title + + +class Expense(models.Model): + CATEGORY_CHOICES = [ + ('Food', 'Food'), + ('Fuel', 'Fuel'), + ('Traveling', 'Traveling'), + ('Gifts', 'Gifts'), + # Other expense categories + ] + + category = models.CharField(max_length=100, choices=CATEGORY_CHOICES) + title = models.CharField(max_length=100) + bill_number = models.CharField(max_length=100) + date = models.DateField() + employee = models.ForeignKey(Employee, on_delete=models.CASCADE) + bank_account = models.ForeignKey(BankDetails, on_delete=models.CASCADE) + reimbursement = models.BooleanField() + # Other fields specific to expenses + + def __str__(self): + return self.title + + +class Reimbursement(models.Model): + STATUS_CHOICES=[ + ('Paid','Paid'), + ('Due', 'Due'), + ('Overdue', 'Overdue'), + ] + title = models.CharField(max_length=100) + rate = models.DecimalField(max_digits=10, decimal_places=2) + quantity = models.PositiveIntegerField() + status = models.CharField(max_length=10, choices=STATUS_CHOICES) # Paid, Due, Overdue + # Other fields specific to reimbursements + + def __str__(self): + return self.title diff --git a/workx/accounts/serializers.py b/workx/accounts/serializers.py new file mode 100644 index 0000000..973f8a8 --- /dev/null +++ b/workx/accounts/serializers.py @@ -0,0 +1,19 @@ +from rest_framework import serializers +from .models import Income, Expense, Reimbursement + +class IncomeSerializer(serializers.ModelSerializer): + class Meta: + model = Income + fields = '__all__' + + +class ExpenseSerializer(serializers.ModelSerializer): + class Meta: + model = Expense + fields = '__all__' + + +class ReimbursementSerializer(serializers.ModelSerializer): + class Meta: + model = Reimbursement + fields = '__all__' diff --git a/workx/user/tests.py b/workx/accounts/tests.py similarity index 100% rename from workx/user/tests.py rename to workx/accounts/tests.py diff --git a/workx/accounts/views.py b/workx/accounts/views.py new file mode 100644 index 0000000..c504766 --- /dev/null +++ b/workx/accounts/views.py @@ -0,0 +1,17 @@ +from rest_framework import viewsets +from .models import Income, Expense, Reimbursement +from .serializers import IncomeSerializer, ExpenseSerializer, ReimbursementSerializer + +class IncomeViewSet(viewsets.ModelViewSet): + queryset = Income.objects.all() + serializer_class = IncomeSerializer + + +class ExpenseViewSet(viewsets.ModelViewSet): + queryset = Expense.objects.all() + serializer_class = ExpenseSerializer + + +class ReimbursementViewSet(viewsets.ModelViewSet): + queryset = Reimbursement.objects.all() + serializer_class = ReimbursementSerializer diff --git a/workx/authUser/__pycache__/view.cpython-311.pyc b/workx/authUser/__pycache__/view.cpython-311.pyc deleted file mode 100644 index 13d1b91dc5c032d41ed3a2aeccddf589b4a0cdc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 648 zcmZuvF>4z!6qbDQ)%21!(6wNd(7{l0?bM~@2W0S)mIM=1Jm)p_Ggr z0v+-X5<>pW1u~R_Or5$Jyk+Xs5u1kgA$@#$`lR3V47WP@)N$LEA-1j_mHtRMZ zYD8C<`gwrxu>@m{D=Tkbh3^cY38yf!m?gRh_cVS8_h7UiPKkXARcTYF36C~j delta 18 ZcmZ3)TEN4%=G*`{qX#vY%oy~pOl!Kotl?2`3&QE0J19* AyZ`_I delta 39 vcmZ3&I-7OFMn-7^{m|mnqGJ8>)TEN4%=G*`{qX#vZ2j=mq=?B^8P5X%8Waxa diff --git a/workx/client/__pycache__/apps.cpython-311.pyc b/workx/client/__pycache__/apps.cpython-311.pyc index 9ae5302c4f85905becea23a87f4d2885dddbce42..7ac63217b193ae06698842e6bfa77da8fc17e821 100644 GIT binary patch delta 30 lcmbQtGKXb@3?rk(WLZXWp8TThiuk0&~j delta 18 ZcmZ3gdQx=5BPJCq{m|mnqGJ8>)TEN4%=G*`{qX#vY%oy~pOl!Kotl@j`7hI9b^zkN B6Q%$F delta 40 vcmX>pdO&o;BPMA>{m|mnqGJ8>)TEN4%=G*`{qX#vZ2j=mq=?OI%!knO diff --git a/workx/common/__pycache__/serializers.cpython-311.pyc b/workx/common/__pycache__/serializers.cpython-311.pyc index ded7e156cdc3f5b13555841501fcda240ec47976..35af4f250d30bfeecdcd8d377196a5d2a46c56fe 100644 GIT binary patch delta 49 zcmaFM`HgeK4n`Gw{m|mnqGJ8>)TEN4%=G*`{qX#vY%oy~pOl!Kotl@j`7)yvGXUnE B66yc| delta 40 vcmeyy`Id9T4n}D+{m|mnqGJ8>)TEN4%=G*`{qX#vZ2j=mq=?OT7^Rp2L@^H) diff --git a/workx/common/migrations/0001_initial.py b/workx/common/migrations/0001_initial.py new file mode 100644 index 0000000..fb012b1 --- /dev/null +++ b/workx/common/migrations/0001_initial.py @@ -0,0 +1,48 @@ +# Generated by Django 4.1.9 on 2023-07-17 22:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Address', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('address_line_1', models.CharField(max_length=200)), + ('address_line_2', models.CharField(blank=True, max_length=200)), + ('city', models.CharField(max_length=50)), + ('state', models.CharField(max_length=50)), + ('zip_code', models.CharField(max_length=10)), + ('country', models.CharField(max_length=50)), + ], + options={ + 'db_table': 'address', + }, + ), + migrations.CreateModel( + name='BankDetails', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('beneficiary_name', models.CharField(max_length=50)), + ('bank_name', models.CharField(max_length=50)), + ('account_number', models.CharField(max_length=20)), + ('ifsc_code', models.CharField(max_length=20)), + ('branch_name', models.CharField(max_length=50)), + ('upi_id', models.CharField(blank=True, max_length=50)), + ], + ), + migrations.CreateModel( + name='NatureOfBusiness', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ], + ), + ] diff --git a/workx/common/migrations/__init__.py b/workx/common/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/workx/common/migrations/__pycache__/0001_initial.cpython-311.pyc b/workx/common/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fe61a98f6071d528c0ec8ba192b5a0413742276 GIT binary patch literal 2222 zcmb7FJy07*6uvwCOCU}JEcAmc=OBr&jrfT@5QMQM0^=lxOn&f;nwyh$B@U#Ma(A-9 z6-A1a?xK>4OvV&6nW6NgqFl{fq1j2{nN)P=fyz~OPYAG35`3q9db{s?`+j!cyWe_y zy$pGt{`m*^)WtA=(@FbroG~XU!u-kr2CyZj%x2j#m*rT7W0o1f{mcLxWH)SWr9HyE zI-g~2!2Ugxa2!){g2UdjTvR1pt|%IImMZ|3w0v8W{`Z|tPX6MkNyubbz+^eVW^F|# zYv&l~*l@NL00(Sj#kJu+Uts|Y?7*?_+_Mum$Y?zU4!A6&r@aE)`<^|PV8}SfcsnpG zLHYKGC$GpjNA+}|db{l8zXqnS1H*UOC(wcEVyox^{oo^+-5+>A^+fY>t_D9KS2zCO zDhOT!Gt_|zb%`*14NRm1(N|$fJ~91bmU5s zvZ?X}i|u(?-#(tAtV7d@W$b<-SH(Oj)nnQzuq$7wDZ09i-5@9GQmzEC>&$4vhV7OY z&Vmd}K*O#|wN>iAG%>IUbxAI1n9o547UaB4qp|Rw91*tz$XfC^>~2V^vDG* zZ~1_IIaN~f>n*UeR+U8=BseufU}}_N`4vg8sc^NBu4yC(nr6vX5ly@GRoLXa*u^_-=j87`}VhkA_o?;gm6)Li{{&5k>FRmyGD0Lk>mf8qql;I*0g_ z+2V-%Zj#O96IJmMc*4qrt=x*?(e&2}PJ{WmDg(6Fh$dVCRLi}lIY~;;_lhPbtkwwJTx;nhUbIm>)=dU}j`w{J;PsikN|703{SH#{d8T literal 0 HcmV?d00001 diff --git a/workx/company/__pycache__/__init__.cpython-311.pyc b/workx/company/__pycache__/__init__.cpython-311.pyc index 69c81a24d4d65bb5e7478035ef871cdb491076f5..c34bd8fa9816609d7ac3296507392b63200c6808 100644 GIT binary patch delta 27 icmZ3;xQcOt1EcLkM{%C~qU?(Jq{QUx)V!35(QW{ItqE=b delta 18 ZcmZ3*xR7yz1Ea}AM{(xVq=<)W<~&=mI_Y* delta 22 dcmbQt*2T6Vhmp}>axSAdb81q=<_V0=i~vgs26_Mh diff --git a/workx/company/__pycache__/models.cpython-311.pyc b/workx/company/__pycache__/models.cpython-311.pyc index 4c7c09fe97f32d3f5ca89ce5bde8551fb1dec139..bce67e705e480bddf727c797b91b5104134f2573 100644 GIT binary patch delta 49 zcmX>jdR2787Zw$3{m|mnqGJ8>)TEN4%=G*`{qX#vY%oy~pOl!Kotl@jnV)qpD*)#g B65s#; delta 40 vcmcaAdPa1^7ZzzF{m|mnqGJ8>)TEN4%=G*`{qX#vZ2j=mq=?NDtb17jL=g`Q diff --git a/workx/company/__pycache__/serializers.cpython-311.pyc b/workx/company/__pycache__/serializers.cpython-311.pyc index aad0d6c4319f11926188f53713e0f28f0d0aad16..d410f516207926b7cb8826a6f172638dd9dbbca1 100644 GIT binary patch delta 49 zcmdnWwvTN?BcqCgerR!OQL%n`YEns2W_o^}et3RSHkhc0PfASAPR&c%Jcn^6BLK%) B5`+K% delta 40 vcmdnTwv}x|BcrsrerR!OQL%n`YEns2W_o^}et3RSwtjeOQpDz^j58SlD)cRS5J8dBR*GOLVi5!_d#T%Wh z9$^mG8zn4&_E9I~3+$o!Zuia9w3a!~BK}HOQ3b06r6mRb>?c=bVF03=sJ!U9>K`{o3qd?Ru|zqi0N|p;dSD zd`w-dd+B@Y^6s#%6(@`fB~iGfrIAWC)a~BG#E0-_51^I2<|R!3r(@tOz*}v> zm*f>7C~Wls;7F&G_Q{3b@io&YS9>R|^uB#_euB;%k^kZC`r+xhUr78ufz7r21=RPh ASpWb4 delta 595 zcmZvYF-sjm5XX1!yxqHZcX=;Qf=_ux5|Y4)jVUbTDM&yIi3mcFYZ8;);K`nbU6WuM zA(+BS9}DIiL_)B#79oBGtNR9a22uozkeL%=ku2uAz3@UEax>P2Es0!Z|>b+H){nL3^bTK?hB0S!wj`$ zVA^yDlj31+5t;-+Ajz}{w+VxYo9U+GCW6N>=!#%VjG(lT#qJ__2;4P!w-@3~)w0SI zE4uig%=1@z#ac5=gSv>X%uti*5a@Mkkgc6}eg4Ru@hqt;NLxUp#s2d7ozWj8{QQqv8~gz))qT(a diff --git a/workx/company/migrations/0001_initial.py b/workx/company/migrations/0001_initial.py new file mode 100644 index 0000000..793e574 --- /dev/null +++ b/workx/company/migrations/0001_initial.py @@ -0,0 +1,47 @@ +# Generated by Django 4.1.9 on 2023-07-19 21:26 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('common', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Company', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('legal_name', models.CharField(max_length=256)), + ('trade_name', models.CharField(max_length=256)), + ('cin', models.CharField(max_length=64)), + ('cin_proof', models.FileField(null=True, upload_to='company_proofs/')), + ('gstin', models.CharField(max_length=16)), + ('gstin_proof', models.FileField(null=True, upload_to='company_proofs/')), + ('date_of_incorporation', models.DateField()), + ('date_of_incorporation_proof', models.FileField(null=True, upload_to='company_proofs/')), + ('pan', models.CharField(max_length=16)), + ('pan_proof', models.FileField(null=True, upload_to='company_proofs/')), + ('iec', models.CharField(max_length=16)), + ('iec_proof', models.FileField(null=True, upload_to='company_proofs/')), + ('msme_code', models.CharField(max_length=64)), + ('msme_proof', models.FileField(null=True, upload_to='company_proofs/')), + ('provident_fund_code_number', models.CharField(max_length=32)), + ('provident_fund_code_number_proof', models.FileField(null=True, upload_to='company_proofs/')), + ('se_registration_number', models.CharField(max_length=32)), + ('se_registration_number_proof', models.FileField(null=True, upload_to='company_proofs/')), + ('phone_number', models.CharField(max_length=13)), + ('support_email', models.EmailField(max_length=254, null=True, unique=True)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.address')), + ('nature_of_business', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.natureofbusiness')), + ], + options={ + 'db_table': 'company', + }, + ), + ] diff --git a/workx/company/migrations/__init__.py b/workx/company/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/workx/company/migrations/__pycache__/0001_initial.cpython-311.pyc b/workx/company/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7b280b3d6057606ed6d6e49a54540f4c9c98de0 GIT binary patch literal 3084 zcmbtWO>o;p6qe+~i5(}ELKBBH*iI;I>`=?04gH}dDfxk>t@&x26qi9GdpC|!Su&Cx z`op2aaNx*|9D537$ic@Pd*F}*htH*X zefw75_4bB2XahI4(U&2P`^6PntnZ*hd9LRT#3)|B_Sv9t}N(*T!+BD%b~zm z9O}UQTFZvp3~<~J@HAVl6A9P2Waq9cCIuEQX+=w|Xr^JaV97*Sx3dLb*L%f%;n}Z% z@hykB9FMr1fcRVh2}RzW6?d)$TP7%g+@7wr?!6u!@u(98x4Jevz!P|yZAC!co+hle z*-&UJyvc(OJk16=J#FYj_UZH6HVb9cv3I-Ud>l zEu_(XNMi^1^s1*5X>BJu3faVOz4rH$277$W)9c;S<8j~Gp_a7Pwa1BjoYdmb@vZR} z@RI)nFZCi`F^VS8>l(jx;_oxTsqRNrgC$1+!E#4Hn5{GLwpCXcbM> zS=X#tDyzm_CTM7Z376)Q9W0_&E2dJguv)>0^^`5Gq*`~C+xRXE+1LUz?H*>4b!_EL z8!Lud!Yr)gqN;oRE(awb$wPHg?)X%iwT_QPp)8s+M(AMM}kFokhC>rf$GlkH|kvRWPlx*{q4|$bsFy zO#o(NAs{VT!vz)s;>)3uUBXHMiYhF`Wj#OHFuc|^gpG=_QZ$R(8SZqbXB~{aRe}}$g!0LyW z6?MmhRYUu%idmP6kcDmgUSBf>(!LDJo?ZxifV%@%FcTom{f1hpT3$T!Ra-M$%cyVJ z95Pp01FRe6m5Q3zVHSS}lL6Q{Hzk5A8rG4`y3De7MP-vOv2Mjn5k+BPMS&Zus$<|I zit<@i)m~szLAZ23w&mV}tY_BC%B${OXSuf#i@c*1FG9X9xRbHa?5b+{ z?1H9apPhsJXtLpXH&#BsU|Lu!8kZrlgJ?}PiY60K9@gXr19paWUz@+KWN%!#!op@5 z`&aGv+%uS%`|XN+15Sf2e~$ANODmd&ylh&xJ#t6MtA*R(yZkwH-I4v!$ba6~@?TG3 zx_sAiFJX_kmBs!U?zIPdzbAeD58iDAxzMYPfN(hY;7TLRh2md_X?LtH4L^|vNHq1$ zI*q2bJ9dteoI(tXL~SQ()2L0vN?m$|#N~~38ke_ElK8X}pQiC?BF_BFz#thK-w4v7 z@!C6N=(IC*nhu>N;+eWMLSpHS6&g#|=E&R)5?gX&OEk7b#O1m)M21rv$LMgXmM6n! zo#C@|_$(36)uk9oWF7`-B2z~B2PbBr}Fg98$`}Ja+b13+pOqJ+V ziHJsBN|K4U9=%B?-g<12iA85(kxncU@p4^~$>hb_Af3GUxI&g!$)x5?YIIT~;#ysb zlhMhCgLHIq`y(Z#9*7^4Zc#VG`JoV^vk3x_1q0o?r4)--qang~EOOUPueT~zxQ1~ea>P{wCAAY(d13PUi1CZpdjgTMmTiD7CJH;D2v-r{i0Ey&5QOilIEWSe+jdon+xgo?F(XmM&$v3_}KQb|!} zdVZdMcz#hfn5c+PN=(j9%}bf=#Hh^012l^fh>JZZ=QGNQs$F1EMMfXk7#P_m?_rc; H0XY-^F0(Fb delta 278 zcmZo*zQxSDoR^o20SFSjN>bKMp1_Mm=fPuAz>pFw*B?jRMUKbhUuQ148V35CoB;)Jq;s%-t E0EnwY0{{R3 diff --git a/workx/employee/__pycache__/apps.cpython-311.pyc b/workx/employee/__pycache__/apps.cpython-311.pyc index 0377123a90c7448c09082933349f260d049881eb..5dd947c4cc8e75c5d0b7e5426daaf35527f468fc 100644 GIT binary patch delta 30 lcmbQqvWR7a0wbfi_@% diff --git a/workx/employee/__pycache__/forms.cpython-311.pyc b/workx/employee/__pycache__/forms.cpython-311.pyc index 4ae7ff1cbbee58fa5af2b2f6293abe14e47437d2..350bae6a621bccc8b976d505244d76d23168d293 100644 GIT binary patch delta 49 zcmeyz*3Q1+7^8}{erR!OQL%n`YEns2W_o^}et3RSHkhc0PfASAPR&c%{E%@jBLLTu B6CeNp delta 40 vcmZo?|HroB7^Ae2erR!OQL%n`YEns2W_o^}et3RSwtjeOQpDz0jB^7fK6yCMhzw0$gJGLxlkq`5#n_M6U?h*bZ*Wiacysgz9!S zz~u{?c_U9NT3NSwWR?&{Z5t5MRhzO>+lcq+I`OB7PEesB5}^?Oqg_N0@UiYlYJ__5aStzd5#dJUG1z|!uipxZ4CqTJpz*MW80el`CW%Jh;{bRMuipxT9_DTQKYBO*jbsn{ z2Z^TxVvZBWXiwA}+n#4J+2IbOaOQ%cO07Ig4 z$*k)7&d1ONw!{tXj;d30rLv0bs+#4SRl3s$i#r4b?%2UYgMJT7$}8oH&69+d%7&(^ z>$+B=z&lTOse8Gw1DTHR-Wd=Ng?qvpeEs$a@(9LV^dsS?AUGCK-iX6!Xt~VnihuT) zuC=>QfZI0Jmu=iO{AN0bM7MLdX|ck}E0&r2)?zn2aYrp`r5n^Fx!W*xC)bHl&QG4v z^$i|TRlCAe^=_&Y%F*^r2DID9K-7fRp}`+=PXBp$w)4Lze$R=X-$O5y>@glyy+f)h zkE<#uuj&-~301vW)pQKKsxk}#@B7B2OBRTWWvUZ~dB!7ivsdP3^YdJ)f+IYB(PFf` zVtz$8c=XErlB!%?T;vjitK+e`RgL*ukHS`l$K&yN19IP+<;isjg=NBhP@LpRYk9d` zDtE_;^;OHHs#!IPlrby_Jfis}gU8maqFO0ez)m9X->R=PSgMp55|k&3P-}o&Ua?_F zohJetf)6{10#nBmsMtOQ_fzZsTJq55q$>|?OV7g3lP?R7e7z}OcjfD~{NM5kTsraN zwfe2b_kS!o@RwbSvP*Ne(1%l6Q60uXWaNqZLXC$ zhq}+zFZXwHm{XZSOM>|5dArNCJ&uPlX8K zA5I}mLXb#dmVoU$;~+5Y`{Bz{Aok@arjeJQxUxS#L4~N`e+hD!9fx&4>HO=)`@fsO zn$pP`B&Cg|0&=E5^I*e?9`XEBvJo~6(`*FADHLdtWl>C_KwWGC#alYz**ymap<{mz z;$1o&N6sAIX3x$z@>Elva^aVT!`v%;wWv|a#(9jaY37PGN{a2YELnzOnWKJP z@VM?L$FVlBWSLN0ilbV!vf4p;$s76_|A&3%d*|Kn!<*=|Uk+y2G}y*a+dqTY4T_@J z5>7b#pO!G{yzglVpE&!UU8!FLJ{=UBw;tSkh4Zi9E}oJ^h{r*(Ir(7v70$nY&!QKx Fe*wE`B(MMg literal 2126 zcmb7F%}*Og6yNo?*T&cwC`m{|lon(T7~vGPQbk38L~Y4dDx|4=SuLIcO!kA!u9G;5 zD!1x^Lk?7m#38E0p-LTnj(6X_nR)ZR z=KY?3?&*;P7hUpNUy^oThyfY}j-6*q!&!VA#&3%vd)$2_ShNX7m`Do)}{LLt$?Lj{q?bdylcDuj6IhHBiKr?y(v zEFPaFgi*_?94YrcfvJOOnC=KvD2qfWhe84kZ$tt?BJPD=h~OB!{wPP$^>U0vz;KjH z^K?^XwoVPZGX)YaMK0;;BSoXen!R2*J_cLJqtSybkR9QPumN9xfGSZ2|09N~Q&17H zsJ3e1fsw;f@s35AReVTSY*t+}jpALC-7DUuD_<8M0{5s$^-ayJQ(E++pV+MPxT07# zQMx@dx9C*jCBDb)1@(fMq{rhfj8j|n(Okq&)d%j`y@e-YZv%OT8^bkn{7A}w;DBuiFEF2YL=Uq6#l0cRblr^JzzeYP493V4k8VZ1v+7!yY zrfD4l>m97e4!Qvn9)L)7t!i65LujR{tD3T@sTFD!L^cdUr*MV!=;7);U{2%eIdmbw z*)a;A3qOXz)sTEBj-a8{Dzj{_;(1b2k64C|`rz|R88iAg8w3}?Xb7b)0s$EH4L&P6 zz1QK{o&QPpIVW-5t6aHok@bNX!^E?GB&iSvxzj9dolI z%^Oa(*vb~&Y_aiadth|?D|cYDNt}UFYoO!~lp6B+i}`EY({BD+lR5dRR({IOPc;_X znJZhXZsy8v{MYH}KS~tz&a@PIj`DopiI4U@kX?j*T^?R<7jcO5l}r zd27^_E;svL%{tOdOPX<|nZ{f@KZe%EnyFV0e*ebF%dNcZ=H#e+d0Ez`xhI%jel=`YxPokI?acPkNuWC!#;vDSoPKq zK=#9;D7J-R=k(JSCYW8rR>Pv+0HZ E5Aj>^=>Px# diff --git a/workx/employee/__pycache__/permissions.cpython-311.pyc b/workx/employee/__pycache__/permissions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..032326de3857be78338a5fc9f846d2b6624f3804 GIT binary patch literal 2052 zcma)+%}*Og6u@V^>o06?VQN=(M;Ud{l1eLmSm`Sj)y<}z` zNaaKvIQS4%94f(qN*tmlQFH1kz4cF6MLt*~RYK}1H&^t4a_XBgUfYnS9q&BP*L!c~ zz2D5U-rgPrWjXVT_0u_N| zs~^5@QJ%8wi)=1rRJY# zAg_0*;n9Ob^?^%2R%!!N)rER&`0%O|n{;By=L;_ve~&v;Nhh2<`6D_|i-HCY4z)!+ zHn=;zJKfM=^yK8^DAZS-=3(&h!{8)(7QLqZhOcRFWUdU%g7CKr)h(?Y9>-y54^gy& zi6jsMhZ^xf)HQLj70KD98%r)HU6{y(D@>j$Go6^&E)0-lxBUPyaFUkTxL8P7@-hXg zuqo)dz_U*}dwIB0&GJaE=)|+G?4DZGiFVo#b?$@cEuX{-$MU5z!aGZfxsnQs;St(= zG9$F5TbVh-FMLI6uUUl2&53Y&b}nfyCNm4)Tu(E(Cnh(*B)&o~WsB7CvXC5+ac8|! z$WB*!gS`J~ej~jaSRZ;18u<=ptaM?VG0PG0mby%5WZ2giZ5)Ia`niGfj1t z7l;jmO7n0RWJ?Me2|f;D+x;~>VeiETIxm{~Qfn2eTmBEAqw|(^uRv!z--G`G^-J*Z zZ|@mbXc7J5d#ZXCGes5|*n@7?qn2*yC2 zCqQf?mG4?~O1%K;@;7`a9NV8fNH`$_zUEjD>Wf!x71R_P0Zk@tbR_9x*_GlWsP9Np zTqfzPXzEL?lo1dS2JfeNmjMRyEmW69(E!)SBDBEO)e@1fvz)f`p~z64&ur;!;HxHK zGt2-FGV}ab5b(5NTt}Ze-CslZ90A>tjf4$S3W_MwA&xX$3QmAnik0J;1Sh+8nDuc# z%Ap`#;p#+z6bcFo2tlcl=%GMV&dJhQBT>N>*Ew>kRJ=Fq*pBVcFrNK(=DnGDZ{GX% z`KPh55d!V^KYyV=YJ~ialk;Y@2dyVC*e8@wB_N^VDGH9&Kn*od3w2M2xkmNC2u;rn zEzgpABe27Smk39^5rwE^l~D6Bp%zoNM$Zi#fW;$t;^rmgDjQZM{$te`9l1l?(HFSM zRm5n-crhOoA2J@fs+f8wU)p|`Rr19ky3^5!$(xjN7WIf;D7ar0_N{OyC_i9K=pU2= z29nX9BZSr7ScrX$QEyLLAHiUsFybkcc&bX6b^wy2wwe%62bs|)GvzfExTbob!fJTp z=2=vGOgx+Fa6v<)&pqqj0c@?80J>f<&C{vk8B~Q+v@>V$l-Re(RuL5BlXgiYTrt&(%~v0 zTOHe59Vyj|WLNz`d7?bhD~Yb{OV?_0tx@TG5tp62tM3|A`wo1SJIq}ZDY7P#>p*v( z#(Wo6K4!VA@~dE-&mv3#K#H}U@(xFzgjHVOVuea1%mQcm3gcJ-WO`jo=n)GxMCuFp zqA2L7511E|y=G!jvTaMwy5@v^p5X`y^Ge*fgC<@EcsMhJkFg))ppL!**dvX(#bT@eKd#2%Bf9AMP9rw^Zc9!bSQZ@P9dA05=)}6O%&U@IGZpDLY@~`yF zH@SLxp_YCd`r&f?u3FDCv-Qkt^~_=|^VzS-KQ`fo{gd{fYB$E6>bPXsnw#Jg==LN+ z8bL>pk;T#&hZlJ$ZzcmBb5q_ni3$XaL$nFdL+H#xEwgZ(Sp-k^-fyI?)l%1vQ}gxI z{N8F)SB=>w8H5v*opu$rZA>@GAjCePkLf%5I$A=&{6@!$0UF{7`0rn5V*Pqs>-aJ9Y=@6}q F_rJ*Q{fqzr delta 438 zcmX>rIDvz2IWI340}w2GRG$*YIFV0+F=V2;wjLt`6N5WL3Tq2P3R@~;7CT4@2rOe} zU|0>r5D>+Y!XC_^$uV)48#m)E4%gg*oczkv)XDc)#TWx7J1_>a0A*Pw&t_aLZJ{4p zoLW?@U!Iy&Qk0pVpQj(5UzDvMo|+UfIg3e^l^bXx*W@WoiuJ-kR*@)>@YCcd;stT| zKm93G225gx^c6{y Nk06OJSY*L|0s!OVVX6QC diff --git a/workx/employee/__pycache__/views.cpython-311.pyc b/workx/employee/__pycache__/views.cpython-311.pyc index 5da3ef61fb552310d48d86685e1b29369add53ea..b7f03c79ecfff19d33b761deae369d94df9a0c28 100644 GIT binary patch literal 2016 zcmc&!&2JM&6rb63?DbbRA3$n1)QxCFEhOAaOGQy7K$IXQP814Ads!Us;BMIUh8c$t z+5?C7);k?j-P+~cILgeZ+`F1JS&$A z1jcVa{^9(o6Y>UMk}-Cm?7s!&F>#1PJ>pY~`kJLt;%JWU>3+t_C_Uqi`B^Kg^f52z z8jl{iI~Ums5rdI}l7 zfPXwJQ(2Y3s{9XD6Uu5FtW2<)OuR>8O*s?SNqzDiF4r|_+;`cQU_Bv=8;tv|5N^;F z?-cds zc9PmA6YBXC@Wo)p%Cekg0B5R0a2oVtvfR z+ufGWY+Dv=+Yg*g5A~95-`i|?@e0T2G8e3^vo_GJw>(c8_cj^d2KqUEPELpcwRYQU ziI_xbUK2xX$RbQQzT3S4_Hyd5Zm|;+&&fV!|KYm^T8PFLTkCPR6LcH50)AJ)1ADF2 zzRS8!V+*DpG}u9*8>%19ZftWCA}GMT#d&~7gI{D$|NhHsv-ZlY?V59abMDbXG&3J& zjz!h^e)a2@Kljfy!^(1)IS~v0GzpeoKMR)s)A|)3<_PJ~LFFn*uYFv-=Vd;D+2MiV zQwUjvX@p}4#}ObL;U^HVwfGD|388{eMNoU3MeVZ$FtE4)aFn{4zFB*1o_b}T+BN6< z<~(v&A8;3*TimTKhLxoe@-XKAMBd4Syj5sam)&PKHk>2v&uh5d5envT4guNww-kK4 zv|C*YE6ouKFkG`fEyp<%J^K!a1BcDa@uE~^ky$u;%oD1DvUqr!gsPt$y91Y$;0D^~ z5wNw@(Ti(YhF3ZHQH#V!0Sf>(KpF*VqazG_FfPRR!1w%1@WcyMtOD-ol+uVa!ZeA< zY&a|tITH>`L~7x%MC7Y5O(OD1I4lu49S%!G7Q-~z%jk54?vZqSve2LX=Dk|{>!?Xd pr%mOQhC4?8^YiG`r06s-Dd==rIi=ywLjQ|P=(Mby(oEFB`x}>=-D>~< literal 1933 zcmb_c&2Jk;6rcUD*LIw22o?@%ML}tzt}4}p3l~Zc1ZdPYLW-bhRcW>HPFkCF?9OZw zQaMTvIk;7%B7_u<6I?3wU=&U{@!qU=T^9s7bav+LoA>5@&HQG5 z8XqqZXm9?p<9(m4A*?OA)z^8r|eH;LnwT;L}FSZ*EZv z%Bh53rmW`rwFi`ew3tXgYqCZ)b{kW5Fgf`Gm;*wIt$4&%saDsMWrsc=JPmTzg_%VD3X)!?K{W}8rdT45lNUe^NSoB*AGbQzCfni57KsqH z`3P1Vr>nNrz(|#(t-hkw+S*}S&~P0gqh+x9wsMwoxAnH()|_nO3A~?Sli=vdvK*GW zB=l7{3(F7&qxaV-4}|Wyfh)ATG+C?456CWwO4C2w3`?`mO4ieo_48b>G#{4cJNe(t zb3ZQj%(>8<>*&##`S|Lis}Ha3U+WVsKOL3dJJ|Vtr&qodmM?X#N9Qkg7WQvN#mUEu zj}{-^*uT+{U*CYW(%=MQkr7nkIZITX0`q!N)mDbr;urM@ka?V23%;a?~5E1(0{~9RWXcU?$i;!s{gPD> z6AT^-XO%&9cwZU9Tx6j{>hrjyv0>Ict|NoDm&Z>^@fI!}JjHS5GvH!a&1vqVc*8zs z7AWv}<$FN-nxZHXndy%9h@9_^_J~~Wj`oOL=#KWjKBYkI|0Lht3*Wl@Co2B>7p=_l EZ+G3QFaQ7m diff --git a/workx/employee/admin.py b/workx/employee/admin.py index bc2e6c5..efcb459 100644 --- a/workx/employee/admin.py +++ b/workx/employee/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin # Register your models here. -from employee.models import Department, Employee +from employee.models import Employee + -admin.site.register(Department) admin.site.register(Employee) \ No newline at end of file diff --git a/workx/employee/migrations/0001_initial.py b/workx/employee/migrations/0001_initial.py new file mode 100644 index 0000000..d1b2f1d --- /dev/null +++ b/workx/employee/migrations/0001_initial.py @@ -0,0 +1,42 @@ +# Generated by Django 4.1.9 on 2023-07-17 22:35 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('common', '__first__'), + ] + + operations = [ + migrations.CreateModel( + name='Role', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, unique=True)), + ], + ), + migrations.CreateModel( + name='Employee', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('first_name', models.CharField(max_length=30)), + ('last_name', models.CharField(max_length=30)), + ('personal_email', models.EmailField(max_length=254, unique=True)), + ('official_email', models.EmailField(max_length=254, unique=True)), + ('phone_number', models.CharField(max_length=13)), + ('job_title', models.CharField(max_length=100)), + ('ctc', models.DecimalField(decimal_places=2, max_digits=10)), + ('address', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.address')), + ('bank_details', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='common.bankdetails')), + ('role', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='employee.role')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/workx/employee/migrations/0002_alter_employee_user.py b/workx/employee/migrations/0002_alter_employee_user.py new file mode 100644 index 0000000..2ed2946 --- /dev/null +++ b/workx/employee/migrations/0002_alter_employee_user.py @@ -0,0 +1,21 @@ +# Generated by Django 4.1.9 on 2023-07-17 22:46 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('employee', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='employee', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='employee', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/workx/employee/migrations/__init__.py b/workx/employee/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/workx/employee/migrations/__pycache__/0001_initial.cpython-311.pyc b/workx/employee/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..265d188eb3b131b50c3b097ac48698d1117b5d59 GIT binary patch literal 2640 zcmbtWO>7fK6yCL+jqNzb4k3;q*qA^Y2gObhAX=3)#&MuD0rIB`t75hGjLkahU9-E+ zZx1>2&?7f;jfpkmz3H`iG|y-nfG9qR8X2e~W{xU2*4S*L@8u2Ks#2ZaOic^aQS_5hBeBkQ)T zJ#C#6xTwZk>S}9vz=IAT>~wCs=xX}dqu>B+t+(WBX@CdtJKk*vwW3eUs_5A1I;=Yq z(f2PRb{~o8-#M{;XipSX;3I5;mQ8mHCFnU0IXL-IR=r2!ojL|n-w~V8F*f~{jlYd4 z3{LNyIh;AVy8+AUMB9pofl{y~m8=?OQmLn{JK5sE*`3JY3Z(v`mcLdtasTM;RNLFR zo!AHH&i@Z|gU6t|@L$m#tojde7JWx+l6FELxJbM46XKa^wcY}4L?N%0%bH3&qF9i1 z!xTm0n$r|W95R?9j;|);F5;7_rY7cfD47tDu8J;~C4Eg?f@{QMKwXv;c^wkpGSqXL z0Yz0RL*im||1!;{)$P)%s6e%7J|aR@l^<7O+@Z5$B|<@l3NVN}Q?4l58id4a`7Z>KEL zl;cji*{Y%tkEV+BB7-JPo~aREPEwbs!lVd|^`7P;rflkH3WjJ{J(yPL_0)Z)TzadAE~C(hiP%uEws+d`&$?n+w+J;N?#on5oUcT+B=XbDWQ zqavR4BT2VeZ-%Ac=6#cP>Y6iCnhxcn`ZcW)0hA=Qs1XOq5x12fdhHYUd}cwsyEr{f zy6>rQL8HW8+L=zxr&E&|;??Le+wX{!({ zDZfNFnp~l()nqG^$@g!Xt zmy>94wl+A62WL@W?r*1}C^q)2568xK=TK~-7MsAa2^2^jj5CNL`loCC)3|>c1!n5O(`aC1YYGpHJioGc?Zsy}J&)7h;xt61bu_S18`!`D z8z}HyJxHToWl^v02`@Z&;y#{ufF~qWSVysqT5JQyY%`kSVV2?H=dOc>IaFLm;gwo= z1&3EqVAVQ`5oS2DEBxlc*KgzNv-tW0^ss;*9VITcw ztAyfi(q$KVBCn|hyVX2R4aiwtX}43jtxVYed=jmu&_8c^(^HJIoTn-G&i#em_2c?2 zDzd*ghDk}o$@4rdQa*;ba|ge5ZU`OstsgLJ2U?PX)*gPr8WE5{-Nktqw4eNPuW|!URX@kX^{Uc9s#@#Q}CJ(};LI z*O~lpr)Rl;?UrB+69szDGi^0%6uMSvyW@C=l(NG7{CpK#t`%CQ{trU?HJhyF8hpd%Gn2Hk|W2R#aaeEF0y@2uVp6T#d zjD1cX8w>W$PRDG3pU@6<33Z!?KA#*LuGP1mKTqx_VuyL*qeZ zpEg3@YI$zumFMpy;s7_y<_?rs*$3#LlF?WBdwMEBLq)4ki{z0uj@*=Th3 z^W85KQMDFTm!s-N*WBrL4lWVe6<&xjLU)$M^F#s!dYqRv{TzX~iXS7bKRTn-nFn;DGExA{ujr3G%|C}9hWzFldApzgTN}< literal 0 HcmV?d00001 diff --git a/workx/employee/migrations/__pycache__/__init__.cpython-311.pyc b/workx/employee/migrations/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c18de7bf8f2d37eef65a008033db03078a403303 GIT binary patch literal 182 zcmZ3^%ge<81geL&rhw?jAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFHil@;?$yI z{qoeLlA_G?{5<{e{Gx0yQ4yb%n4F!Om!e+|6spiq%`M2uuS`wV&&^CPN-W9D&nwoC vkI&4@EQycTE2#X%VUwGmQks)$SHuc58Dw`cKalvq%*e?2fdNJoF$2W_cGxa% literal 0 HcmV?d00001 diff --git a/workx/employee/models.py b/workx/employee/models.py index 2513d99..1d4b1de 100644 --- a/workx/employee/models.py +++ b/workx/employee/models.py @@ -1,15 +1,11 @@ from django.db import models from common.models import BankDetails, Address - - -class Department(models.Model): - name = models.CharField(max_length=50) - - def __str__(self): - return self.name +from django.contrib.auth.models import User class Employee(models.Model): - + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee') + # Rest of the fields... + role = models.ForeignKey('Role', on_delete=models.SET_NULL, null=True) first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) personal_email = models.EmailField(unique=True) @@ -17,9 +13,14 @@ class Employee(models.Model): phone_number = models.CharField(max_length=13) address = models.ForeignKey(Address, on_delete=models.SET_NULL, null=True) job_title = models.CharField(max_length=100) - department = models.ManyToManyField(Department) ctc = models.DecimalField(max_digits=10, decimal_places=2) bank_details = models.OneToOneField(BankDetails, on_delete=models.CASCADE) def __str__(self): return f"{self.first_name} {self.last_name}" + +class Role(models.Model): + name = models.CharField(max_length=50, unique=True) + + def __str__(self): + return self.name diff --git a/workx/employee/permissions.py b/workx/employee/permissions.py new file mode 100644 index 0000000..450e850 --- /dev/null +++ b/workx/employee/permissions.py @@ -0,0 +1,45 @@ +from rest_framework import permissions + +def has_permission(self, request, view): + if request.user.is_authenticated: + try: + employee = request.user.employee + return employee is not None and employee.role is not None + except Employee.DoesNotExist: + return False + return False +from .models import Employee + +class EmployeeAPIPermission(permissions.BasePermission): + def has_permission(self, request, view): + if request.method in permissions.SAFE_METHODS: + return True # Allow GET requests for all users + + user = request.user + if user.is_authenticated and user.role: + role_name = user.role.name + if role_name == 'Admin': + return True # Allow CRUD operations for Admin role + elif role_name == 'Employee' and request.method in ['GET', 'PUT']: + return True # Allow GET and PUT requests for Employee role + + return False + +from rest_framework import permissions + + +class GoogleAuthenticatedPermission(permissions.BasePermission): + def has_permission(self, request, view): + # Check if the user is authenticated + if not request.user.is_authenticated: + return False + + # Check if the user is authenticated with a Google account + if 'email' not in request.session: + return False + + # Perform additional checks if needed + # For example, verify the email in request.session with the email from id_token_data + + return True + diff --git a/workx/employee/serializers.py b/workx/employee/serializers.py index e0a5948..4df4888 100644 --- a/workx/employee/serializers.py +++ b/workx/employee/serializers.py @@ -1,12 +1,29 @@ from rest_framework import serializers from common.serializers import BankDetailsSerializer, AddressSerializer -from .models import Employee +from .models import Employee,Role +from common.models import BankDetails, Address class EmployeeSerializer(serializers.ModelSerializer): - address = AddressSerializer() bank_details = BankDetailsSerializer() + address = AddressSerializer() class Meta: model = Employee - fields = '__all__' \ No newline at end of file + fields = '__all__' + + def create(self, validated_data): + bank_details_data = validated_data.pop('bank_details') + address_data = validated_data.pop('address') + + bank_details = BankDetails.objects.create(**bank_details_data) + address = Address.objects.create(**address_data) + + employee = Employee.objects.create(bank_details=bank_details, address=address, **validated_data) + return employee + + +class RoleSerializer(serializers.ModelSerializer): + class Meta: + model = Role + fields = '__all__' \ No newline at end of file diff --git a/workx/employee/views.py b/workx/employee/views.py index 1506d3f..5a3bc0e 100644 --- a/workx/employee/views.py +++ b/workx/employee/views.py @@ -1,25 +1,27 @@ -from rest_framework import viewsets +from rest_framework import viewsets,permissions from .models import Employee from .serializers import EmployeeSerializer from .forms import EmployeeForm +from rest_framework import generics, permissions +from .models import Role +from .serializers import RoleSerializer +from .permissions import EmployeeAPIPermission,GoogleAuthenticatedPermission -class EmployeeViewSet(viewsets.ModelViewSet): +class RoleListCreateAPIView(generics.ListCreateAPIView): + queryset = Role.objects.all() + serializer_class = RoleSerializer + permission_classes = [permissions.IsAuthenticated, permissions.IsAdminUser] + + +class EmployeeListCreateAPIView(generics.ListCreateAPIView): + queryset = Employee.objects.all() + serializer_class = EmployeeSerializer + permission_classes = [permissions.IsAuthenticated| EmployeeAPIPermission] + +class EmployeeRetrieveUpdateAPIView(generics.RetrieveUpdateAPIView): queryset = Employee.objects.all() serializer_class = EmployeeSerializer + permission_classes = [permissions.IsAuthenticated | EmployeeAPIPermission] - def perform_create(self, serializer): - form_data = self.request.data.get('form') - form = EmployeeForm(form_data) - if form.is_valid(): - employee = serializer.save() - form.instance = employee - form.save() - def perform_update(self, serializer): - form_data = self.request.data.get('form') - form = EmployeeForm(form_data, instance=serializer.instance) - if form.is_valid(): - employee = serializer.save() - form.instance = employee - form.save() diff --git a/workx/google_auth/__init__.py b/workx/google_auth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/workx/google_auth/__pycache__/__init__.cpython-311.pyc b/workx/google_auth/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e64916c0b7d5048fa32ac14467b6c4ee588a29c GIT binary patch literal 174 zcmZ3^%ge<81jhnrrhw?jAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFGu~*;?$yI z{qoeLlA_G?{5<{e{Gx0yQ4yb%n4F!Om!e+|6spiq&(BZKNsUh|Ey>W2kI&4@EQycT nE2#X%VUwGmQks)$SHuc55oBjEKalvq%*e?2fdNJoF$2W_$~Y@L literal 0 HcmV?d00001 diff --git a/workx/google_auth/__pycache__/admin.cpython-311.pyc b/workx/google_auth/__pycache__/admin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8e5a5f61c194e8a904738378c1385b8dbd4b9f4 GIT binary patch literal 229 zcmZ3^%ge<81jhnrrq~1N#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ?Pt(u;v#3v;tXQ$?+=$8Y9D)iIy^V4%u;}c6uGW5Y_>lIY~;;_lhPbtkwwJYKP b8pjC4#j-%+12ZEd;|&Id3)oN*8&CxRwU9ix literal 0 HcmV?d00001 diff --git a/workx/google_auth/__pycache__/apps.cpython-311.pyc b/workx/google_auth/__pycache__/apps.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64c8e73b8a27d380e672d3cc22acf879f7b4103b GIT binary patch literal 554 zcmZutJx{|h5IrX;D*Zr+p`rr=W0z!Q0Hgw<15zb~5KO&q`|y|U<4dY!T`C% zRGDIGOhpYX-mD2>ySy58ua_EkJM6~tY@xG;-Vuzup?>7pm=~uGcUhdb69To6QLkj; zETx{+;grTXN|6w`5*H}FjVw3KY%$)lBDX6^g0>PJP3E3qE?>DgFfKzLghr1yx`AU0 z&$tpnJ8^y5u$pb|F{6h^edEXVhUNRA?hgXl#>8m|!ZNzy_n4OVCR%Bl-yWXG5foRo z^@61o2i75DeO*u&)J$n$}{-u9tI!s K^z)xoa@iN?l8)E_ literal 0 HcmV?d00001 diff --git a/workx/google_auth/__pycache__/models.cpython-311.pyc b/workx/google_auth/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb1ca210f184119f6b1f61873d78d3c2f2e1e9d7 GIT binary patch literal 226 zcmZ3^%ge<81jhnrrdR^$#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ?Wa(r=;c-`)M-W;!Md(%uCPLOGzqX21>4E_zY6>%U(aUIJKx)zdSXmq$o2zKTkhA zzbG3_RKzDGCTFMSrRbLfg(~#Z^YhblQsWa#OEUB!=IRwx{^GC!vP*MP?TR>n<}m_s Xu`H1Iz|6?Vc!NRa0yb2{22=q6%T_yD literal 0 HcmV?d00001 diff --git a/workx/google_auth/__pycache__/urls.cpython-311.pyc b/workx/google_auth/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8da82f8724cada5565fe550d15680dc9ae0d498d GIT binary patch literal 501 zcmZ8cJ8!};5VjKs5+a1EE=cVkV1P_z=xgfS1yx8{P{3ArI8Nk*LYWvlG9Xpmy7Z;? zXY>aIi2-G*)QJs=jj1+mq|&o}_uc8c`_9k#d=3bEtli@e5x-=TTILt5nE-bH0}Ltf zpba6w3RbD&skSOGvXKG^#2Qh%TH1^=@7X66fH(1eY|GIFC!Gth@t@-=b{6Mqpkyv( zQwb(0aH94S{v_IUhYZ5Rbba5Yq~Y|V_9#Prx5KPN+eX>J9FL5QmP2XNY4xl`PvK=r zPfXl(nCn;ioQ7QPmH;l7PIM;-8nTsVMam6XGX+cNM})KR6|6-GY|gB!knqqNkY>a? zuFtHx&wE=pY)C=Eur&~+q4j4?OX^jEn~i?z`M6KXIo}i0*;#gm0fM$#@Zi|zn>B&PqM&%hQ&rx}SbWuH+kSTjPj!|`ns&iCbX=*_koAU62 G(E0`>tcA`1 literal 0 HcmV?d00001 diff --git a/workx/google_auth/__pycache__/views.cpython-311.pyc b/workx/google_auth/__pycache__/views.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eaf310270830197696beefd9b170c771478ad339 GIT binary patch literal 2189 zcmaJ>QE%H+6uwUE#BG|jYm$y+jCNzq7Fgq~XaWWuOrtA9qZMs8q)5neZ7*}?*x~wS zTcbqE15Z36#3mS`PX$zX=Z(MMOh$_=Rhq;TJOy=o*%Rm5aawPP>+9olj?X>!o^#K4 zeoQ7u5sbgD|EApM5c-n}!H5i)z3af-LkdzD9o3jJ!%#k=M{3b>)Z?Q%TjR={$Fq8@ z7B9y=p40g<54JIVq{f#=K^Ol5l@kgNbWGvaP+{aRx=Dd?d8{fLR%JqYO%aKCOEoBO zsf1`o#R7f|tG88bsiH15H<$fIpEp#CSTZv>EB!zmC<^c1mq6~J7TSXEi-S;`!BCiO z@US!V5|-MG5+Q70i%@mA@;jtNTMSV4d#)WJBl|Y3NZ1F&$}K-jS4^{_tD@8(H_ywG zu5U>4t>)5ALh9CeL6BtGY#78U`esGhtO=%IQtNqv()X}x)lCCZKsM{@f@~^kUe-0$ zAfl!$G!Ny2EQ$@REi|X|mTZC@yoRRC&X?4hr0MXjWAlcls|C)T+-PXJB1#*UsW*s9 z*Wnn1foT@qBTFkQOIH`gm5bNbKb#jYUA?lnye?k(0MiTaK7gSHf*g zy<-*Yn=YrD70tjC;Eq0r<_(XjTu0WGbw zYVZeb9kd&2pRY1nSM3PYXMnV!C1pr_UsR&uY6?qjs6oQ-TUY7bc_XBy=k-P_s;~<8 zfNQg4JkUW^4?VOZE%uk#Hk@i_c(OLv;mY#<=A z&!TEFP=`H*&OVH28#2B_v+j*{oE!^ygcLrU7usKzU6!Jx`D%bMA58;{ZA^KX?(rNX!yU0PgsqZM#Ki+LY-nC8tr`k&}qTfDToxQ=OcxNP0Dh|5+j)9`k3 zQ_vu_8=ImZrQb!}@d1(sV71)%st;Qq#ylRQo2RM65ib!Gv3^LCzC2hd(vaLkfzEG5 zZYnJMM#-Rud!j{a3*he!OpDItgZ78>AW}SAzXR!@UUufe(I2M2o&IU6n=LunlFd%_ zCeC%P^!^9rk0(y-W{x?TbGzB&PIjU9(#hV`YyCtl7waP+;Ns~aH1*2YpKZNuzp-d% zE_XARoy_IVaxZuKQEu*GZmydXoSa~@M|RUMJLyu7KYITohd;H;A948UE`QwNkMHsm z4uATeIGc$*K|nemKOIG5X*>OTH*v;EoUz$6_%Os!NV*eBRWd4O(SkNeW&%}g&!EXmBz yE7p&X&& + + + Home + + + +

Redirecting...

+ + \ No newline at end of file diff --git a/workx/user/views.py b/workx/user/views.py deleted file mode 100644 index 91ea44a..0000000 --- a/workx/user/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/workx/workx/__pycache__/__init__.cpython-311.pyc b/workx/workx/__pycache__/__init__.cpython-311.pyc index 8821219d73da94bb89e375783c9cd7b4ac749d6f..c8b271a789db3e60899d725b44c7dae2146c6799 100644 GIT binary patch delta 27 icmbQwxPozl1EcjsM{%C~qU?(Jq{QUx)V!35(Jlad8wq9r delta 18 ZcmZ3%IG=HX1EbMIM{(xVq=<`Z=U4*&b{Z{-#s7qzEA#|Uiv^$BoavR;xqh- zAjsFz=0=F?#ZM1;w`3gyE|M@VPG|@aXQ+5Pu;IW`K#CCY0ILyE-Bu;T16{jF6#^8=P4VV}YbOz?cSxAWqnCFr7U3nQr5VG`IHZ*g= zRvkw-&Uev6^mwpcplQ08TPtSQ^2L=_E7xcq(d#;0RE`YoKxY^xuQ^ApoN-`f^N^7( z%g$(~skPOvt#%aCa8$#|DCWUnvCM7pdoNaKT>z%EQYq}~&xNOK<=M-=q&FR=*X?!E z)F2L5RRk2n>9`kTg1ZsQ5VE3}UBj_mEwt!92qh_h;$Id??mEr$-=R-q$Ad@LRA^)x zveHrwurrovJ6cDz58IMuzfnv}%ldfF?6mrQpSTJ7IGts3`GOyAn~L0S1{@#D=a_67 z_i?sbu2fkct8VTFSm)WAPwZ{-{61GJ`Peqc3qH2T)dY7y6wsvmk&yC{g8x+{rNSehc#tH&*Mx=*ON29(4+mI|&ch-R~32SRuIlFL3eGYybcN delta 1166 zcmZ`$OOM-B6!t52-p|P-O@=-gI+`GjM*;~Dh==Q#jv*5VJDFCND$A35NpI`ek?j;s z7G#9@1IQq;7zt4p{DA%kmT1^TUR7cRD@*N$9oLhDf|y?Eo_oLVp6{H`$ImN2)OUZ* z<3NU`1yIDVr863ldI6MmjPw$y;EXcZ09CL#qCgGQvF^$lg>x#Pp>KdD*uqQ` zymAq*Uc_r?n;bEE6T<~`&?FXT+iGN=CiSz&eI&Ee3Q+WxG%COl_|OlwW= zTuSp3*Lj2hbUl9LI3o+TxY^#S;TQp6!6$#xKT-3L1rHqTB23(I+=q8tbjV8G+j3V5 znXYgsg?Xv_v7(BSp@|35q3{QV|G@0cb<33pJ~nI|o5P3D1|Bb91Z^J;O&>Y-ttB0@ zOCKSJoqdih7$)G@Y$Geo;40Ab4F6;TL)Nh^WWyE}CNxp$Nnu79^bd@lpbCfDEWd9~ z&^{bbEawEmeRm^va}bp1%G>+|7Z{IB3xSK){J?{*;K$RQ`cOk-WSK7VPmY!u zjywAx*6v-ZJw!GdPsbf-kNo>D6d%S4{!)eLjK_}MTlsh)`RL_My3;Xq(eQtoAj`c) zZUrJ|1Pe}`bDG?j47nXPG)0t!jv$K4pxZY(3jS4w(lu^N{je5KO6vAyQRvHre^v^$F0Hjadj+-8Knq6WLk0r^Jo zWwJ)YE;Z-gm*T$$OP3T`E%%u@0yCXean2rOnGkBEKj%7RB14aW&$Y zA{!BLpxGRCnu_v7CVR>~ZC*Pk8WBq*-i>Ig$(|FnC`}}CPqWoUwh|@iavI}YlSWET z8EHAqWpO=YWaX?eEDswwImcxQJ#Q4`0-q=K5o1&y<@1z2W)$V3F)oh_D2B-B-nj_O z5lmi33nWjFiC3lma$usSN#O|azJ{mQ1azuxh9u8ynEV?MGPGYzI@T?GT$e*x0e~6OBBzEBKB@v0+hyHFMXZ1`mN-I#Fzb zZ9=LU46W%nExRg7s#Uiu>YidYtQNKQNZqN_Ekh!vv{JbwIaW)n+Y&RDV0&B2tnDiX z#ImcIJ8iSh(Dk`Gx3~~XRib1Z;v-x~Ev#Kk$y|e?w)Pbm{p|G4Lp$tfcCn|#TCB)+B&xnTE zR}{O(f-IEZL$q$z^|q>+4M+mtk5Q|`VMh5`=ZV1p1&)W=l7%wf4O3a|rK@)w6_)S_ zWN3SVC*{m&cXX>EK?0+l=9z%UoiCR&f3tU@ECg{yH8isv3q+RjAQ@Vhhl1R?3B^Dj z0MmQK3G!?EEn?dJ_4pRijGZ>Mi9t*!v;w!OH7F75fRGI+(p5?nhur#Ro#}&*BGndg zs79WU`z>`qeQwLr|LX-9^Q)H8Qp|&B6Cp_Q;-@y?jsq*r3{rJP*LRfq;~)vBnRTb2 z)azE;bZiMo0h7)|UqA=3cSibh(&N}k@T^Dy>SRbr$Cf(d(R_)$fJ=2w4)BSrE<43Y zYfD!()2X%|Uza+Qk#LEIoR`|1bSFW9Ed(85|APTL!wt)7fJ|vSP0;sNHMZiXw^=?P zBx^NzcWbpEAC?PL8KiWFvdb>W4%848K|n7dG7JGEU3^x5r2b4)lo2>1!Rm1v$tDex$_$*$7Yoh^2G(EyUb|5KDS zAf+G?ZOtKp$jU!RhA&!>9k?5QLvJ7udi%L_-zLy+q-DVJ*gijQ0C*qlAoUT(%4VqXNfLK{8ad{@I3Q!(?g3s zT6EE3D04?dHAl6@4A~!SJXUF^F^%}WYR5Obc+jq@uF8;_KVBz v7hk#Jh9_?L;zrM6`eo^5$({Mkn_BUwRy^^tFJ3;*B@2mXS@xrIaJ>Hjz2Vn} delta 867 zcmZ8fJ#5oJ6h6Dx*l}X#kF-Eh`Ds%%l*D4_!qSSuS_xGpCw8O2r)1fAs8yLv$5NfhsskWHpGBnW8%(SgXA*B1us0ayybk`I>7A-{j`@M3@Y_|EZ40OvwDcNRla{ptSnVCwBmP^g53N&pu^ zxG/', EmployeeRetrieveUpdateAPIView.as_view(), name='employee-retrieve-update'), + path('roles/', RoleListCreateAPIView.as_view(), name='role-list-create'), + path('google-auth/', include('google_auth.urls')), + ]