From 75e14992254fae9c65c148219e6f5bd464933e7b Mon Sep 17 00:00:00 2001 From: jakobsn Date: Mon, 11 Nov 2019 18:16:27 +0100 Subject: [PATCH] Add docstrings and generate documentation --- .../docs/build/doctrees/environment.pickle | Bin 11294 -> 15300 bytes src/app/docs/build/doctrees/index.doctree | Bin 14260 -> 96920 bytes .../docs/build/html/_sources/index.rst.txt | 35 ++ src/app/docs/build/html/genindex.html | 140 ++++- src/app/docs/build/html/index.html | 541 +++++++++++++++++- src/app/docs/build/html/objects.inv | Bin 327 -> 577 bytes src/app/docs/build/html/py-modindex.html | 34 +- src/app/docs/build/html/searchindex.js | 2 +- src/app/docs/source/index.rst | 35 ++ src/app/models/login.py | 13 + src/app/models/project.py | 66 +++ src/app/models/register.py | 23 + src/app/views/new_project.py | 29 +- src/app/views/open_projects.py | 6 +- src/app/views/project.py | 7 +- src/app/views/register.py | 12 +- src/app/views/utils.py | 5 + 17 files changed, 926 insertions(+), 22 deletions(-) diff --git a/src/app/docs/build/doctrees/environment.pickle b/src/app/docs/build/doctrees/environment.pickle index 8cad08d5e742e8c19b694ef6074baf95a10986e6..5be76d5bd014c9a1ca3983f848e68e81714da5bc 100644 GIT binary patch delta 5149 zcmb7IYiJx*6i(7jttM^lBWcp+FD0gP> zJ>U18d+wccPI~l-%M6)50$wCud7}qmu-Wbg5W4QvEZ{q=aQ7t4Git?@S!Fa;u9uOVqh*~yNpwb|q zm#H$Npz|elEN7T%iD3V(?#I*G`*^s3 zhwou1r;^%5cw(&&;JL@qKBA9H^zku$e2TJNYpg5qL%W3sLhvoT&6IPYgn-FfM}T|Royg0TxPk0ozY{B4fDWd>crpZzvwQDY~(NE#VjKMwtF1L zaTR{hSkR5Avvb9xNYrRwR5-4|TREj&hev2IzL{y^yO|cwp$#!7#{AF0C3; zvXGI?WC~wO>UuAZ$sF#%0Gf`qh<7127ZUKN5<>4Tbj^igl;;pbIOk)i(XO63*S)j0 z_5y0?eXVvcdb>9U5cD^6ted$#M-`J`bu2OYa9V4`e!WG6G5 zKdzctJ%jCX^@T@9E;ll0IlFwk zaE&Mj3c-YLw7)tit&dwp-B1%x>ZS2uJO`?y#~`PgN#m(RS}zye@Nvh%w&|}zBYaH) zNeh2L-cff`$tsxe=&&o|R;kN-C~Lql+|@Rp z^`esE@+xqKXp_9QOQII|Pz(h}nY&ozsL)IDvR0eL$}?lzLI>n7G%jygZ#PgP(oayY zwabtS;8S6Hqn!qkNbXCdk|oT%&TgcA1^p=fz-E4lI9E2*5;`m|Z?#wW*2a@&I-4M? zK)TUh#8#P?e%f~bA|XyEO?6B!;JUvzdYIipi3hOXrHo zf|-DXoiNO#S;h+Y*z0ZsC8h>JG2bS!=30Aj_CS520O0~uo4ry%8F13>5rTmiPd2Gw z1N^~Z_`UXG26wNWKcFqbDgm>@XtMUhEx?V*C3woDeagnNvFG3;o({}h56s*Q%={tF zlrlAL$qX6mEd{_+Swghhq`a@7eD>c*&?`?T3M|(>k z+TgFJv!-&icLb&ZUy%*O6Bk#@%`^st^n`$4;|pn(TI}7MQv!uFN-Jv(K@Y(zn%o zdr(PF0PE&D0(=i~TA|sNLqJqN7v!uaFoXY)pt*$;T*d_XWrtUcVMSb?48I-^0Ku;W z!EUd~z&OiuQ~=%(fNrb8!pXUcw*XPX$sF&58Tg!yV`nSf3Fone3z8oQPTvx=$%!*w z+PQ@8nOOkA4+6o%+(q#9G?uTa;T#L~>qmk1L6J73->L4YrTr{$ZmPmbTA}KM+Ajj1 z%r!|tsO23PgzZ-W+wJyGL7)%!yMPm0Deki1ZkW3)54hRDcU^k0F238Lx-JA9{u3RH MZ>gJ#py~L?|Kg~|od5s; delta 1404 zcmb7E-Afcv6yMoVv&;t#N{n=@RY#a=72FWZmx72QEtd$(WM}v0?qwWnXQq#bP!SYi z=%I51qtw7MBS}=EB(fI^G$^Hyr~ZVX_ntcUPJZUX?#u7od(OGPd(Q8E%-D4b9lq;cp~YNaulRa!1R@%wy^Zn-;*PP5%k z*aorK9Y$m5reg?}n`L)K*LFdLebnxlL*o#HUf;Rk}FN9YV%zWpn-t&G0* z%&ceLdgdL_{lTvHIHBJ-2!drCrA;7s94aWjtWtau6!Zg{twf-oG2m`P0qrCq$5M5e zUI!NrjO>(TEZHmKH%Nh&F44#@QAL_cU~Vh>$1#r+PYbURlAf4r6m34bu*&ffM~+Sx z(QGNkQmVlBRDlVoD_73&b9W0*nXyEaSW3iL7JKJPv>s(9q_Ks+#DGm8?e=(Nvqg#32W5B~)cg-*_!M$FVTrV%Kr@f4{8=kN>ikrFq`$T4O<}NqzsGId$mDc3Ws>0kI^w4xOvxZ zAMEIic|8a>-w1buf|}<1ZjpP|MhWI*xL#9{-@C!n9jf(Xpy5bJ8UU^Sq<=vMr@rwo DvrDA{ diff --git a/src/app/docs/build/doctrees/index.doctree b/src/app/docs/build/doctrees/index.doctree index eaded888016e91d8e5dfe08add07a66d379226ad..2f8e05fee12caa7a6f7444733a4b19222b70015b 100644 GIT binary patch literal 96920 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 diff --git a/src/app/docs/build/html/_sources/index.rst.txt b/src/app/docs/build/html/_sources/index.rst.txt index e01cea5..55e9d89 100644 --- a/src/app/docs/build/html/_sources/index.rst.txt +++ b/src/app/docs/build/html/_sources/index.rst.txt @@ -13,9 +13,44 @@ Welcome to beelance2's documentation! .. autoclass:: views.index.Index :members: +.. autoclass:: views.login.Login + :members: + + +.. autoclass:: views.logout.Logout + :members: + + +.. autoclass:: views.new_project.New_project + :members: + + +.. autoclass:: views.open_projects.Open_projects + :members: + + +.. autoclass:: views.project.Project + :members: + + +.. autoclass:: views.register.Register + :members: + .. automodule:: views.forms :members: +.. automodule:: views.utils + :members: + +.. automodule:: models.login + :members: + +.. automodule:: models.project + :members: + +.. automodule:: models.register + :members: + Indices and tables ================== diff --git a/src/app/docs/build/html/genindex.html b/src/app/docs/build/html/genindex.html index 91b71d4..3368857 100644 --- a/src/app/docs/build/html/genindex.html +++ b/src/app/docs/build/html/genindex.html @@ -35,19 +35,69 @@

Index

- G + C + | G | I + | L + | M + | N + | O + | P + | R + | S | V
+

C

+ + +
+

G

@@ -60,10 +110,98 @@ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + +
+ +

O

+ + +
+ +

P

+ + + +
+ +

R

+ + +
+ +

S

+ + + +
+

V

+
diff --git a/src/app/docs/build/html/index.html b/src/app/docs/build/html/index.html index 6c5df4c..6adec13 100644 --- a/src/app/docs/build/html/index.html +++ b/src/app/docs/build/html/index.html @@ -53,11 +53,245 @@ determine which projects to show.

+
+
+class views.login.Login
+
+
+GET()
+

Show the login page

+
+
+
return
+

The login page showing other users if logged in

+
+
+
+
+ +
+
+POST()
+
+
Log in to the web application and register the session
+
return
+

The login page showing other users if logged in

+
+
+
+
+
+ +
+ +
+
+class views.logout.Logout
+
+
+GET()
+
+
Log out of the application (kill session and reset variables)
+
return
+

Redirect to main page

+
+
+
+
+
+ +
+ +
+
+class views.new_project.New_project
+
+
+GET()
+

Get the project registration form

+
+
+
return
+

New project page

+
+
+
+
+ +
+
+POST()
+

Create a new project

+
+
+
return
+

Redirect to main page

+
+
+
+
+ +
+
+compose_form(data, add)
+

Compose a new project form by adding or removing a task

+
+
+
param data
+

The data object from web.input

+
+
param add
+

True or False

+
+
type add
+

boolean

+
+
return
+

A complete project form object

+
+
+
+
+ +
+
+get_task_count(data)
+

Determine the number of tasks created by removing +the four other elements from count and divide by the +number of variables in one task.

+
+
+
param data
+

The data object from web.input

+
+
return
+

The number of tasks opened by the client

+
+
+
+
+ +
+ +
+
+class views.open_projects.Open_projects
+
+
+GET()
+

Get all open projects

+
+
+
return
+

A page containing all open projects

+
+
+
+
+ +
+ +
+
+class views.project.Project
+
+
+GET()
+

Show info about a single project

+
+
+
return
+

Project info page

+
+
+
+
+ +
+ +
+
+class views.register.Register
+
+
+GET()
+

Get the registration form

+
+
+
return
+

A page with the registration form

+
+
+
+
+ +
+
+POST()
+

Register new user in database

+
+
+
return
+

Main page

+
+
+
+
+ +
+
+
+views.forms.get_new_project_form(elements)
+

Combine a project form element and task elements to make a complete project form

+
+
+
param elemets
+

All the project and task form elements

+
+
return
+

The ready to use project form

+
+
+
+
+ +
+
+views.forms.get_project_form_elements(project_title='', project_description='', category_name='')
+
+
Generate a set of project form elements
+
param project_title
+

Project title

+
+
param project_description
+

Project description

+
+
param category_name
+

Name of the belonging category

+
+
type project_title
+

str

+
+
type project_description
+

str

+
+
type category_name
+

str

+
+
return
+

A set of project form elements

+
+
+
+
+
+ +
views.forms.get_task_form_elements(identifier=0, task_title='', task_description='', budget='')
-
Define the task form elements
+
Generate a set of task form elements
param identifier

The id of the task

@@ -90,6 +324,311 @@ determine which projects to show.

+
+
+views.utils.get_nav_bar(session)
+

Generates the page nav bar

+
+
+
return
+

The navigation bar HTML markup

+
+
+
+
+ +
+
+models.login.get_users()
+
+
Retreive all registrered users from the database
+
return
+

users

+
+
+
+
+
+ +
+
+models.login.match_user(username, password)
+

Check if user credentials are correct, return if exists

+
+
+
param username
+

The user attempting to authenticate

+
+
param password
+

The corresponding password

+
+
type username
+

str

+
+
type password
+

str

+
+
return
+

user

+
+
+
+
+ +
+
+models.project.get_categories()
+

Get all categories

+
+
+
return
+

List of categories

+
+
+
+
+ +
+
+models.project.get_project_by_id(projectid)
+
+
Retrieve a project by its id
+
param projectid
+

The project id

+
+
type projectid
+

str

+
+
return
+

The selected project

+
+
+
+
+
+ +
+
+models.project.get_projects_by_participant_and_status(userid, project_status)
+

Retrieve all projects where the user is a participant with specific status

+
+
+
param userid
+

The id of the participant

+
+
param project_status
+

The status to filter on

+
+
type userid
+

str

+
+
type project_status
+

str

+
+
return
+

A list of projects

+
+
+
+
+ +
+
+models.project.get_projects_by_status_and_category(categoryid, project_status)
+

Retrieve all projects from a category with a specific status

+
+
+
param catergoryid
+

The id of the category

+
+
param project_status
+

The status to filter on

+
+
type catergoryid
+

str

+
+
type project_status
+

str

+
+
return
+

A list of projects

+
+
+
+
+ +
+
+models.project.get_projects_by_status_and_owner(userid, project_status)
+

Retrieve all projects owned by a user with a specific status

+
+
+
param userid
+

The id of the owner

+
+
param project_status
+

The status to filter on

+
+
type userid
+

str

+
+
type project_status
+

str

+
+
return
+

A list of projects

+
+
+
+
+ +
+
+models.project.set_project(categoryid, userid, project_title, project_description, project_status)
+

Store a project in the database

+
+
+
param categoryid
+

The id of the corresponding category

+
+
param userid
+

The id of the project owner

+
+
param project_title
+

The title of the project

+
+
param project_description
+

The project description

+
+
param project_status
+

The status of the project

+
+
type categoryid
+

str

+
+
type userid
+

str

+
+
type project_title
+

str

+
+
type project_description
+

str

+
+
type project_status
+

str

+
+
return
+

The id of the new project

+
+
+
+
+ +
+
+models.project.set_task(projectid, task_title, task_description, budget)
+

Create a task

+
+
+
param projectid
+

The corresponding project id

+
+
param task_title
+

The title of the task

+
+
param task_description
+

The description of the task

+
+
param budget
+

The task budget

+
+
type projectid
+

str

+
+
type task_title
+

str

+
+
type task_description
+

str

+
+
type budget
+

str

+
+
+
+
+ +
+
+models.register.set_user(username, password, full_name, company, phone_number, street_address, city, state, postal_code, country)
+
+
Register a new user in the database
+
param username
+

The users unique user name

+
+
param password
+

The password

+
+
param full_name
+

The users full name

+
+
param company
+

The company the user represents

+
+
param phone_number
+

The phone number of the user

+
+
param street_address
+

The street address of the user

+
+
param city
+

The city where the user lives

+
+
param state
+

The state where the user lives

+
+
param postal_code
+

The corresponding postal code

+
+
param country
+

The users country

+
+
type username
+

str

+
+
type password
+

str

+
+
type full_name
+

str

+
+
type company
+

str

+
+
type phone_number
+

str

+
+
type street_address
+

str

+
+
type city
+

str

+
+
type state
+

str

+
+
type postal_code
+

str

+
+
type country
+

str

+
+
+
+
+
+

Indices and tables

diff --git a/src/app/docs/build/html/objects.inv b/src/app/docs/build/html/objects.inv index 008777f765bf63b1f7ae20e074d3287b6bcac552..b464226a9c6efe2b0058a0504ff6c1794c44d22e 100644 GIT binary patch delta 468 zcmV;_0W1E;0>K23cYm#wO-{ow5QXA@L_bVi`HkG%+}Kl$lVn;~HF# zlTh1jngVT{!lply_r2##rqj}9ppk2vE5oYxth8C9fgLktGI-+!mHIH$rblc#DSL9B z10@YYjSieOMv}6Io%GQkOeshfo{EC1+CGD%_>(OGe>N!ya(`PZz%f}KU4Bl|Hc{EW zG&;NzH7ThoVJHzMOOOOL_$SL?;oX+E*#4KFottq_hU407G)DqoqM#abg%nN}HwP=i z=M0bAtAaW5nXOBV$mpqkGY!nUiE-8Ftc_W7l>{`DU4;62I+#8*JhZHm;Ff<07BhH+@`4x0CLB>uhJt z4`R=t$bo1`>G=KU)nWgM*CZ7KD>et?D-0<+(;@}UrcEboRrNaN_se80%dB*wp5h7g zVmyJ7WhsCbM#Aam`vqIx&-M4@v2SUTWYd z1SLHt4EN9*v4iABft;Z|AerWv-mf=HPqgtXGQZj&d0yp5x4KJTg&4Pr2aSC#*ol{) Sj;KX=6YFbMAb9|K_mJPKUT0kZ diff --git a/src/app/docs/build/html/py-modindex.html b/src/app/docs/build/html/py-modindex.html index 5404f09..8125a11 100644 --- a/src/app/docs/build/html/py-modindex.html +++ b/src/app/docs/build/html/py-modindex.html @@ -37,24 +37,54 @@

Python Module Index

+ m | v
+ + + + + + + + + + + + + + + id="toggle-2" style="display: none" alt="-" /> - + + + +
 
+ m
+ models +
    + models.login +
    + models.project +
    + models.register +
 
v
views
    views.forms
    + views.utils +
diff --git a/src/app/docs/build/html/searchindex.js b/src/app/docs/build/html/searchindex.js index 59b678b..af43ccb 100644 --- a/src/app/docs/build/html/searchindex.js +++ b/src/app/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["index.rst"],objects:{"views.forms":{get_task_form_elements:[0,1,1,""]},"views.index":{Index:[0,2,1,""]},"views.index.Index":{GET:[0,3,1,""]},views:{forms:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method"},terms:{"class":0,"int":0,"return":0,The:0,budget:0,defin:0,descript:0,determin:0,element:0,form:0,get:0,get_task_form_el:0,identifi:0,index:0,input:0,main:0,modul:0,page:0,param:0,project:0,search:0,self:[],set:0,show:0,str:0,task:0,task_descript:0,task_titl:0,titl:0,type:0,url:0,using:0,variabl:0,view:0,which:0},titles:["Welcome to beelance2\u2019s documentation!"],titleterms:{beelance2:0,document:0,indic:0,tabl:0,welcom:0}}) \ No newline at end of file +Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["index.rst"],objects:{"models.login":{get_users:[0,1,1,""],match_user:[0,1,1,""]},"models.project":{get_categories:[0,1,1,""],get_project_by_id:[0,1,1,""],get_projects_by_participant_and_status:[0,1,1,""],get_projects_by_status_and_category:[0,1,1,""],get_projects_by_status_and_owner:[0,1,1,""],set_project:[0,1,1,""],set_task:[0,1,1,""]},"models.register":{set_user:[0,1,1,""]},"views.forms":{get_new_project_form:[0,1,1,""],get_project_form_elements:[0,1,1,""],get_task_form_elements:[0,1,1,""]},"views.index":{Index:[0,2,1,""]},"views.index.Index":{GET:[0,3,1,""]},"views.login":{Login:[0,2,1,""]},"views.login.Login":{GET:[0,3,1,""],POST:[0,3,1,""]},"views.logout":{Logout:[0,2,1,""]},"views.logout.Logout":{GET:[0,3,1,""]},"views.new_project":{New_project:[0,2,1,""]},"views.new_project.New_project":{GET:[0,3,1,""],POST:[0,3,1,""],compose_form:[0,3,1,""],get_task_count:[0,3,1,""]},"views.open_projects":{Open_projects:[0,2,1,""]},"views.open_projects.Open_projects":{GET:[0,3,1,""]},"views.project":{Project:[0,2,1,""]},"views.project.Project":{GET:[0,3,1,""]},"views.register":{Register:[0,2,1,""]},"views.register.Register":{GET:[0,3,1,""],POST:[0,3,1,""]},"views.utils":{get_nav_bar:[0,1,1,""]},models:{login:[0,0,0,"-"],project:[0,0,0,"-"],register:[0,0,0,"-"]},views:{forms:[0,0,0,"-"],utils:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method"},terms:{"boolean":0,"class":0,"int":0,"new":0,"return":0,"true":0,The:0,about:0,add:0,adding:0,address:0,all:0,applic:0,attempt:0,authent:0,bar:0,belong:0,budget:0,categori:0,category_nam:0,categoryid:0,catergoryid:0,check:0,citi:0,client:0,code:0,combin:0,compani:0,complet:0,compos:0,compose_form:0,contain:0,correct:0,correspond:0,count:0,countri:0,creat:0,credenti:0,data:0,databas:0,defin:[],descript:0,determin:0,divid:0,element:0,elemet:0,exist:0,fals:0,filter:0,form:0,four:0,from:0,full:0,full_nam:0,gener:0,get:0,get_categori:0,get_nav_bar:0,get_new_project_form:0,get_project_by_id:0,get_project_form_el:0,get_projects_by_participant_and_statu:0,get_projects_by_status_and_categori:0,get_projects_by_status_and_own:0,get_task_count:0,get_task_form_el:0,get_us:0,html:0,identifi:0,index:0,info:0,input:0,its:0,kill:0,list:0,live:0,log:0,login:0,logout:0,main:0,make:0,markup:0,match_us:0,model:0,modul:0,name:0,nav:0,navig:0,new_project:0,number:0,object:0,one:0,open:0,open_project:0,other:0,out:0,own:0,owner:0,page:0,param:0,particip:0,password:0,phone:0,phone_numb:0,post:0,postal:0,postal_cod:0,project:0,project_descript:0,project_statu:0,project_titl:0,projectid:0,readi:0,redirect:0,regist:0,registr:0,remov:0,repres:0,reset:0,retreiv:0,retriev:0,search:0,select:0,self:[],session:0,set:0,set_project:0,set_task:0,set_us:0,show:0,singl:0,specif:0,state:0,statu:0,store:0,str:0,street:0,street_address:0,task:0,task_descript:0,task_titl:0,titl:0,type:0,uniqu:0,url:0,use:0,user:0,userid:0,usernam:0,using:0,util:0,variabl:0,view:0,web:0,where:0,which:0},titles:["Welcome to beelance2\u2019s documentation!"],titleterms:{beelance2:0,document:0,indic:0,tabl:0,welcom:0}}) \ No newline at end of file diff --git a/src/app/docs/source/index.rst b/src/app/docs/source/index.rst index e01cea5..55e9d89 100644 --- a/src/app/docs/source/index.rst +++ b/src/app/docs/source/index.rst @@ -13,9 +13,44 @@ Welcome to beelance2's documentation! .. autoclass:: views.index.Index :members: +.. autoclass:: views.login.Login + :members: + + +.. autoclass:: views.logout.Logout + :members: + + +.. autoclass:: views.new_project.New_project + :members: + + +.. autoclass:: views.open_projects.Open_projects + :members: + + +.. autoclass:: views.project.Project + :members: + + +.. autoclass:: views.register.Register + :members: + .. automodule:: views.forms :members: +.. automodule:: views.utils + :members: + +.. automodule:: models.login + :members: + +.. automodule:: models.project + :members: + +.. automodule:: models.register + :members: + Indices and tables ================== diff --git a/src/app/models/login.py b/src/app/models/login.py index 813519c..7c12600 100644 --- a/src/app/models/login.py +++ b/src/app/models/login.py @@ -1,6 +1,10 @@ from models.database import db def get_users(): + """ + Retreive all registrered users from the database + :return: users + """ cursor = db.cursor() query = ("SELECT userid, username from users") cursor.execute(query) @@ -9,6 +13,15 @@ def get_users(): return users def match_user(username, password): + """ + Check if user credentials are correct, return if exists + + :param username: The user attempting to authenticate + :param password: The corresponding password + :type username: str + :type password: str + :return: user + """ cursor = db.cursor() query = ("SELECT userid, username from users where username = \"" + username + "\" and password = \"" + password + "\"") diff --git a/src/app/models/project.py b/src/app/models/project.py index e545fad..5d4e1b3 100644 --- a/src/app/models/project.py +++ b/src/app/models/project.py @@ -1,6 +1,11 @@ from models.database import db def get_categories(): + """ + Get all categories + + :return: List of categories + """ cursor = db.cursor() query = ("SELECT * FROM project_category") cursor.execute(query) @@ -9,6 +14,21 @@ def get_categories(): return categories def set_project(categoryid, userid, project_title, project_description, project_status): + """ + Store a project in the database + + :param categoryid: The id of the corresponding category + :param userid: The id of the project owner + :param project_title: The title of the project + :param project_description: The project description + :param project_status: The status of the project + :type categoryid: str + :type userid: str + :type project_title: str + :type project_description: str + :type project_status: str + :return: The id of the new project + """ cursor = db.cursor() query = ("INSERT INTO projects VALUES (NULL, \"" + categoryid + "\", \"" + userid + "\", \"" + project_title + "\", \"" + @@ -20,6 +40,12 @@ def set_project(categoryid, userid, project_title, project_description, project_ return projectid def get_project_by_id(projectid): + """ + Retrieve a project by its id + :param projectid: The project id + :type projectid: str + :return: The selected project + """ cursor = db.cursor() query = ("SELECT * FROM projects WHERE projectid = \"" + projectid + "\"") @@ -28,6 +54,15 @@ def get_project_by_id(projectid): return project def get_projects_by_status_and_category(categoryid, project_status): + """ + Retrieve all projects from a category with a specific status + + :param catergoryid: The id of the category + :param project_status: The status to filter on + :type catergoryid: str + :type project_status: str + :return: A list of projects + """ cursor = db.cursor() query = ("SELECT * FROM projects WHERE project_status = \"" + project_status + "\" AND categoryid = \"" + categoryid + "\"") @@ -36,6 +71,15 @@ def get_projects_by_status_and_category(categoryid, project_status): return projects def get_projects_by_status_and_owner(userid, project_status): + """ + Retrieve all projects owned by a user with a specific status + + :param userid: The id of the owner + :param project_status: The status to filter on + :type userid: str + :type project_status: str + :return: A list of projects + """ cursor = db.cursor() query = ("SELECT * FROM projects WHERE project_status = \"" + project_status + "\" AND userid = \"" + userid + "\"") @@ -44,6 +88,15 @@ def get_projects_by_status_and_owner(userid, project_status): return projects def get_projects_by_participant_and_status(userid, project_status): + """ + Retrieve all projects where the user is a participant with specific status + + :param userid: The id of the participant + :param project_status: The status to filter on + :type userid: str + :type project_status: str + :return: A list of projects + """ cursor = db.cursor() query = ("SELECT * FROM projects, projects_users WHERE projects.project_status = \"" + project_status + "\" AND projects_users.userid = \"" + userid + @@ -53,10 +106,23 @@ def get_projects_by_participant_and_status(userid, project_status): return projects def set_task(projectid, task_title, task_description, budget): + """ + Create a task + + :param projectid: The corresponding project id + :param task_title: The title of the task + :param task_description: The description of the task + :param budget: The task budget + :type projectid: str + :type task_title: str + :type task_description: str + :type budget: str + """ cursor = db.cursor() query = ("INSERT INTO tasks (projectid, title, task_description, budget, task_status) VALUES (\"" + projectid + "\", \"" + task_title + "\", \"" + task_description + "\", \"" + budget + "\", \"waiting for delivery\")") cursor.execute(query) db.commit() + cursor.close diff --git a/src/app/models/register.py b/src/app/models/register.py index 8ffeefd..9758033 100644 --- a/src/app/models/register.py +++ b/src/app/models/register.py @@ -2,6 +2,29 @@ from models.database import db def set_user(username, password, full_name, company, phone_number, street_address, city, state, postal_code, country): + """ + Register a new user in the database + :param username: The users unique user name + :param password: The password + :param full_name: The users full name + :param company: The company the user represents + :param phone_number: The phone number of the user + :param street_address: The street address of the user + :param city: The city where the user lives + :param state: The state where the user lives + :param postal_code: The corresponding postal code + :param country: The users country + :type username: str + :type password: str + :type full_name: str + :type company: str + :type phone_number: str + :type street_address: str + :type city: str + :type state: str + :type postal_code: str + :type country: str + """ cursor = db.cursor() query = ("INSERT INTO users VALUES (NULL, \"" + username + "\", \"" + password + "\", \"" + full_name + "\" , \"" + company + "\", \"" + diff --git a/src/app/views/new_project.py b/src/app/views/new_project.py index e3f3e25..dabd294 100644 --- a/src/app/views/new_project.py +++ b/src/app/views/new_project.py @@ -37,7 +37,6 @@ class New_project: # Add a set of task fields to the form if data["Add Task"]: project_form = self.compose_form(data, True) - print("add task") return render.new_project(nav, project_form) except Exception as e: try: @@ -49,12 +48,9 @@ class New_project: try: # Post the form data and save the project in the database if data["Create Project"]: - print("Create project") projectid = models.project.set_project(data.category_name, str(session.userid), data.project_title, data.project_description, "open") - print("id:", projectid) task_count = self.get_task_count(data) - print(task_count) # Save the tasks in the database for i in range(0, task_count): models.project.set_task(str(projectid), (data["task_title_" + str(i)]), @@ -64,19 +60,26 @@ class New_project: raise e def get_task_count(self, data): - task_count = 0 - # Remove the four other elements from count and divide by the number of variables in one task. + """ + Determine the number of tasks created by removing + the four other elements from count and divide by the + number of variables in one task. + + :param data: The data object from web.input + :return: The number of tasks opened by the client + """ task_count = int((len(data) - 4) / 3) - """while True: - try: - if data["task_title_"+str(task_count)] or data["task_description_"+str(task_count)] or data["task_budget_"+str(task_count)]: - task_count += 1 - except Exception as e: - pass - break""" return task_count def compose_form(self, data, add): + """ + Compose a new project form by adding or removing a task + + :param data: The data object from web.input + :param add: True or False + :type add: boolean + :return: A complete project form object + """ task_count = self.get_task_count(data) # A task is either added or removed if not add and task_count >= 1: diff --git a/src/app/views/open_projects.py b/src/app/views/open_projects.py index 4c5fa60..dc427ba 100644 --- a/src/app/views/open_projects.py +++ b/src/app/views/open_projects.py @@ -7,8 +7,12 @@ render = web.template.render('templates/') class Open_projects: - # Get projects def GET(self): + """ + Get all open projects + + :return: A page containing all open projects + """ session = web.ctx.session data = web.input(categoryid=0) open_projects=[] diff --git a/src/app/views/project.py b/src/app/views/project.py index 98270bf..a3850ed 100644 --- a/src/app/views/project.py +++ b/src/app/views/project.py @@ -8,8 +8,13 @@ render = web.template.render('templates/') class Project: - # Get main page def GET(self): + """ + Show info about a single project + + :return: Project info page + """ + # Get session session = web.ctx.session # Get navbar diff --git a/src/app/views/register.py b/src/app/views/register.py index b44e26f..52bef93 100644 --- a/src/app/views/register.py +++ b/src/app/views/register.py @@ -9,14 +9,22 @@ render = web.template.render('templates/') class Register: - # Get the registration form def GET(self): + """ + Get the registration form + + :return: A page with the registration form + """ session = web.ctx.session nav = get_nav_bar(session) return render.register(nav, register_form) - # Register new user in database def POST(self): + """ + Register new user in database + + :return: Main page + """ data = web.input() models.register.set_user(data.username, data.password, data.full_name, data.company, data.phone_number, data.street_address, diff --git a/src/app/views/utils.py b/src/app/views/utils.py index ccb1d53..102e545 100644 --- a/src/app/views/utils.py +++ b/src/app/views/utils.py @@ -1,5 +1,10 @@ def get_nav_bar(session): + """ + Generates the page nav bar + + :return: The navigation bar HTML markup + """ result = '