From a905b3bc8b51c70b31a35f59946c57737b9167d1 Mon Sep 17 00:00:00 2001 From: emile Date: Tue, 12 Sep 2023 23:11:53 +0300 Subject: [PATCH] Create project and epic done --- .DS_Store | Bin 6148 -> 6148 bytes osinaweb/db.sqlite3 | Bin 290816 -> 294912 bytes .../__pycache__/models.cpython-310.pyc | Bin 5733 -> 5975 bytes .../__pycache__/views.cpython-310.pyc | Bin 4361 -> 6386 bytes ...oject_end_date_alter_project_start_date.py | 23 ++++ .../osinacore/migrations/0018_epic_status.py | 18 +++ ...ter_epic_end_date_alter_epic_start_date.py | 23 ++++ ...e_alter_project_start_date.cpython-310.pyc | Bin 0 -> 732 bytes .../0018_epic_status.cpython-310.pyc | Bin 0 -> 701 bytes ...date_alter_epic_start_date.cpython-310.pyc | Bin 0 -> 691 bytes osinaweb/osinacore/models.py | 15 ++- osinaweb/osinacore/views.py | 117 +++++++++++++++++- .../osinaweb/__pycache__/urls.cpython-310.pyc | Bin 2194 -> 2428 bytes osinaweb/osinaweb/urls.py | 13 +- osinaweb/templates/create-epic.html | 29 +++-- osinaweb/templates/create-project.html | 69 ++++++----- osinaweb/templates/project-details.html | 45 ++++--- 17 files changed, 277 insertions(+), 75 deletions(-) create mode 100644 osinaweb/osinacore/migrations/0017_alter_project_end_date_alter_project_start_date.py create mode 100644 osinaweb/osinacore/migrations/0018_epic_status.py create mode 100644 osinaweb/osinacore/migrations/0019_alter_epic_end_date_alter_epic_start_date.py create mode 100644 osinaweb/osinacore/migrations/__pycache__/0017_alter_project_end_date_alter_project_start_date.cpython-310.pyc create mode 100644 osinaweb/osinacore/migrations/__pycache__/0018_epic_status.cpython-310.pyc create mode 100644 osinaweb/osinacore/migrations/__pycache__/0019_alter_epic_end_date_alter_epic_start_date.cpython-310.pyc diff --git a/.DS_Store b/.DS_Store index 1bcaeb960a88ec22125e9d4f8961016203faba95..684dd60e7dde9fd25bfe15b0048f64be79419334 100644 GIT binary patch delta 45 zcmZoMXffCj&BVBUatu=;r+9U>fsTT)p~>VMOfrm}lfN>_Gj?qjW&XsnnU&)|KLAVn B4v+u< delta 96 zcmZoMXffCj&BVBKatu?Uhh%lNiK(%Uf}xpNt&T#qp@E5|j)IwyVQnoZhp4i?bx?eE gPHtX)Hv;GmjD0& diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index 1d181ab665fd8ddf17da35af1f15fc13b827144f..9c1f2332c024e9cbb0f0971d2cecc507586318a3 100644 GIT binary patch delta 3390 zcmcguYj6|S72dm7+Vx7-UJ1pPg)v?*9&C)H-IZ3aKtXiGD}W7#KpGNRwuL3fmW(Xh zq{ED?03|dJ8$9(*C{Q}-Oxv_gO3g$+`om?C_DAxg&@=-f87QUD4AiAfI%%3d=-rj& z7ck9qrqyWA?w0qt(Pe0&W&fDaRy53AQozb+iD7zhEz#++k6bQ=Rpr|+{uj~I~U?t9Xy&RAP!Zd66}{R8s{C4bPZIDI5Czh~EC zV!gX)eGJ$D$2>t5vq(qUf?Od2fb(dXiO5$nilZ8sRjHKR7FWLHV}zS5Im=VU6i5w}AbWIj?_})Wop9?wJ~c ze)EAHp{F|g2Kq96UES@y`~2Si{=R*!>2$okt2G(*Cc1q+Bg5Z3yRpO56$CbQMn=m0q>k!+9cQAb*D!k;gbn=P_-p(p`~?5|{HD|3IUe7A4e0Hn9sXidz)=E&2{Rg!Z5}(K=Lz zh-%EzbDqcCU0_DD^JmBt55YBPhbQ|KS)ujpemfj&alNsK>0c>F58#Gnp{RRuFL zan(kU7b)~P`UL#}-9T5+MS^@2@p@KA0glx(>W#rS?$Fg=5P4Ta-sAn3=pM&>mO^i! z{V0q~{JVUXOhF@`?XAwi%0(PkxoAslKxkBV!OnPRysN8Ih;L&JRQ0+!U$@74Gs1&J z6WJ{j$&RTK7n@|aD2m>qLUQ{VVzbPyd0Z0{vf+I_v2;eY7i!BS`ePbW5*?zyKvjxV zQS#~xl)bDFjuwDNm2+H5a)CFs%p_TXDzD&D zQ3l)AdXQ6cmUdh|3Ri#?*z!DGfu9|{E8yxUTlHe0KbmffN7Hq(DAo&G8n+8uc5K>IpA#ai z?J*a~g>lm`EXQx3gk|{UlQ3yG$UMo~TrP0KC6{af&+Yq_v^y5By~`i4hY zTXz`bx;5(~O-^I}?s52YQaBWS!nTw64Hf*>pM($L&rZOmWe3ZM-#`Ey4rijRU9mZR zce0skTDki+-`8laX-G=E$5h2RV%-|Egae&7Pg1hYzhmD z3pTHf!t9J;|2NsKYGLm;$}V7d1^mp6(4Q$9-KNlOvM1g~w@JN!fNHgR*OB_*SV*My zsyCr$3AB+yjpzco8VPh2%KCIAl-;oilr0LAK?ss2+he_L=|qou0?-zswx6(#J+Z>8 z=y%9|Vs`^VDly(V1@g=Q1stM6K+Ob15m3Acl6}*L0_5c9b?8Y5_NfqLErh8}LY`q$ zi$gt#Rv2TLJx`W}F-8tq4x_8V&QN8QTqr|!w3@km*?yER7p48XhrNxXaut zTo+eLoc^(->PeBKkOUqBT*%i{I9Lj)R`q--)cNq_9~&=#iX?N0tNL16+ea&B`GM;pTTO(|s>&CNoz2tsoChlInl* f+5bg9nvSc`NFLCR)CPuMsD}10(2^|ow4{FnD*=uB delta 1407 zcmbtUYitx%6u$SK>CDbUpVCEaeN zmH5ZFh4Ko4J~r;f2Bb!lCPuJj)iJ>YLH&V3(nQb{QIv!R(UoV=fKq3qHH7%jo7|I| zbH4MPbHDqDM$@7{I{UMoE<(ssW6q4WfhQ_cT%=;t_*m-zrkNqN+Ayx!cEc8kw_=i` zF5z{Lh>2U7D2rVrO(7&^ap#ClN{!-H5?<|`eXycQbGg7nBVD16!1~DMU~}i@$fn@> zZUKi#hWv;-Cmm`jzp;a5i9$gdET?>YE6b%q?8^%7Doe9L$wNdPk?!EE*cML_!?Upi zo_S?Pb8_pZKu24oInWvobu_m}+FaBqKJ5&L+BOHeLy?ZIf}`5kwTiFCTUDb~S9q%{ zy?%exD>5e#V?DAtVF&?jyGc3vk!DY$>>R5<_%6$yu zg@m)^gp!yzQZ@!on#-jYS}354yvQqB=s|wCk2UJK0Xkx*8~EM@bfvm#uBZlUDG7D7 z24CrVsXf#k>~Z8sX0T5`7NN^EC{w1mG)(LCHN$j|66r+Q)3WYK(<-lq;dYl>cp&Vktk$$Wx`ah<{~>!iNa z?NW`Hq({m8lq)I4!V9q2HYPXo;wa<%+1H^&KfQ}pF|KcOVM7+#O)Tb}(cjz42B<&?8{iB3*nIuOR<@e)x3;mf`p_Ph&iK=P>?HrHg*LKP zetxEf`nf$qvp?!*!h%!*lLY_7-|;3Ujo#l!e*7XUvM!Ewe}kNaWH==WGCfJ_C`fN2%vj>4!5Z(BoXe-Enw|OJwFzQeBKl{AZ-Ea*pU&!fKY8f?)VqP3o2hJBYEQa9SZwbmPXbFF%PsqkUl-xro6~RFokPc3QqX_Dt;s>75K^&U`Ui0#DR|zzKOq(DX1&6 z%@kh`D^LTSX-tO-B7t&a+)92F=3_w|NFft}Oyb83docgR7Bfa9FIrQ3mgi^r7VO6j zfG2x$O&weg7WsZStm)mQrEa4Y7mh zM~ox75xe5UZf)6v5Zf->0Bl($wu)`zS@FH_r0$X@WLL~2o06w!>UA?s_+gk|cZSK4 zcy*@1s%nkdV-POU#Cydx@gTuIuAloP*l($cx_t)H)qk6!eFnBGR^6}cIb^T@8YbK# nRCg{a4I4SEo?{#Q5P_R>Tock&Eh9S8g?N)=I0;8{^mODKHeH0; delta 434 zcmcbv_f&^3pO=@50SIQeGNgVK+sMbl!?9a~4Yq zUkWo2^7k@FiM2DNF{TKl2)1xUiMKPbFhoggKE#vA#3(s=A-DWwXZ{?fBEiXP_|v#J z7&#aP7)2P1A|`)em0|omIR|Kduz(lSN`9bH$;mqeLZ$0~ZYT%h&pbeagMkOAMF@y_ z7>nvaniPs^f#RBMw^&>YGLwtyft(@^AQ4hz0VMs38YU|W%W#8*TR?KHKuxlfrwes5 zHc#HjDk0hi6l@3LVm2TFGG2_as12+pTR4cZeeyoxc!)~LPN0GwkV;UnfK-B<0#w}z zR-Gdf15|xdBod-}a)KC(=p21h2?55U-pQ3>RZ<{t k7qx;2kPC}ImKT9+2TE^b6`!mkuE8xQ!~uk?LTqB}080L1H~;_u diff --git a/osinaweb/osinacore/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/__pycache__/views.cpython-310.pyc index c7fd8d7549b9f0a20fe0d47d030a16b2ef299c88..c0c1c1a439a4916b4b6c3e4de1c4ba0d998f76d2 100644 GIT binary patch literal 6386 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 literal 4361 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 WQOYRPPo;!6P$>+d@Zq1As_cK&d9gzP diff --git a/osinaweb/osinacore/migrations/0017_alter_project_end_date_alter_project_start_date.py b/osinaweb/osinacore/migrations/0017_alter_project_end_date_alter_project_start_date.py new file mode 100644 index 00000000..b2fa2996 --- /dev/null +++ b/osinaweb/osinacore/migrations/0017_alter_project_end_date_alter_project_start_date.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.5 on 2023-09-12 18:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('osinacore', '0016_rename_projectcredentials_projectcredential'), + ] + + operations = [ + migrations.AlterField( + model_name='project', + name='end_date', + field=models.CharField(max_length=200), + ), + migrations.AlterField( + model_name='project', + name='start_date', + field=models.CharField(max_length=200), + ), + ] diff --git a/osinaweb/osinacore/migrations/0018_epic_status.py b/osinaweb/osinacore/migrations/0018_epic_status.py new file mode 100644 index 00000000..69d5eea4 --- /dev/null +++ b/osinaweb/osinacore/migrations/0018_epic_status.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.5 on 2023-09-12 19:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('osinacore', '0017_alter_project_end_date_alter_project_start_date'), + ] + + operations = [ + migrations.AddField( + model_name='epic', + name='status', + field=models.CharField(choices=[('Open', 'Open'), ('Closed', 'Closed')], max_length=200, null=True), + ), + ] diff --git a/osinaweb/osinacore/migrations/0019_alter_epic_end_date_alter_epic_start_date.py b/osinaweb/osinacore/migrations/0019_alter_epic_end_date_alter_epic_start_date.py new file mode 100644 index 00000000..87347491 --- /dev/null +++ b/osinaweb/osinacore/migrations/0019_alter_epic_end_date_alter_epic_start_date.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.5 on 2023-09-12 19:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('osinacore', '0018_epic_status'), + ] + + operations = [ + migrations.AlterField( + model_name='epic', + name='end_date', + field=models.CharField(max_length=200), + ), + migrations.AlterField( + model_name='epic', + name='start_date', + field=models.CharField(max_length=200), + ), + ] diff --git a/osinaweb/osinacore/migrations/__pycache__/0017_alter_project_end_date_alter_project_start_date.cpython-310.pyc b/osinaweb/osinacore/migrations/__pycache__/0017_alter_project_end_date_alter_project_start_date.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9096da765bb56e528c46ca6b1204a63850bca94b GIT binary patch literal 732 zcmZWn&2H2%5VoCUH;Jgkg`PNYLdvCCE^t9;`BAw*IaFM7vD|n_9h^AWS(TpY4fR0~ zFTykU%BinV3Bfq&Y72}sqxr_;`T1NR~#WTPW7TT7OK^1_2@CT z(2EZEU`-44SX+?Lk4k9wf5E;nmmhvfwbDwjLcQzW(zr*>bjnLCrh$IZy4f}Mo5mn3pP+dm)x2HdcY zSG-HAgtHe65)hvm2;?jANmK&lDO=1gsg^C0P;_nM^w`?ohqSYR#@8`*b7e#hX#0Hv zWEBTiCBPeA36!f@6u@*f2MMz#ffVMDT?oi81XW~Ekld}1zxt;`qPg{LuWReD+TYuI z_(*9pqEmyjE38L_Jt)v4{ulP6cH@+&Bo1vIQi_agPYvbCfW4d3^@ya0#(D%7uYLKA z;Ppa;dA+o4jh+V9AClVFBNHS#40G`JlPDGj?F14F@DC~fL9sk1IUCK`It0~`jbiTx{ zHHgNv=U5)0e>d8pJk_S{?!VMSBqzQdYulBRi5vWYXPZOxw7h=OlH7f)qFHL=)$VZa z;(tkL`)z`ZB|=`wS;7;(&E@axYRVrkWXNHq`^N6V*)-BL$dtUk^yYMr`h@Js#+;}0 MMVXHpcak0P2RsYJ6aWAK literal 0 HcmV?d00001 diff --git a/osinaweb/osinacore/migrations/__pycache__/0019_alter_epic_end_date_alter_epic_start_date.cpython-310.pyc b/osinaweb/osinacore/migrations/__pycache__/0019_alter_epic_end_date_alter_epic_start_date.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b21cfe201e8f907cf0992f5cb4c4bec4e4de59f GIT binary patch literal 691 zcmY*X&2H2%5cXeolZZ;a&;#PY2`QJR+(1I86a*52a;UiEV!82xBz++l?LieUE$1jl&&eKeYAYDr5g z+OmpK@{(w#`B$Pj&=vo}E3U;EDUxffB?Sw4Ynnlg#&td{TBpJKI;M8d62UQEe}V=` zMK!6IrVXt)h*c5^V6j?ip_41B7gw9;^8aYVs#K>)o`vkqh80K1oHw1S-2m18(b0p4 z5_(fhKdN!a(=aHRDCW5yin}r&gpc2)2Bvl+{)@Y;3Zfv{pVShQqe`A5y-$j!W#>F3zFv@67#qX_`-b|IJg$S8m jsjhK{`g~e`T6jusmz%u<>=@F=vy4w@B#CVM?129T8oj;H literal 0 HcmV?d00001 diff --git a/osinaweb/osinacore/models.py b/osinaweb/osinacore/models.py index 86688436..a136f81a 100644 --- a/osinaweb/osinacore/models.py +++ b/osinaweb/osinacore/models.py @@ -100,8 +100,8 @@ class Project(models.Model): ('Cancelled', 'Cancelled'), ) status = models.CharField(max_length=200, choices=STATUS_CHOICES) - start_date = models.DateField() - end_date = models.DateField() + start_date = models.CharField(max_length=200) + end_date = models.CharField(max_length=200) project_id = models.CharField(max_length=20, null=True, blank=True) # Allow null and blank for initial creation def save(self, *args, **kwargs): if not self.project_id: @@ -114,8 +114,6 @@ class Project(models.Model): super(Project, self).save(*args, **kwargs) - - class Milestone(models.Model): title = models.CharField(max_length=150) description = models.TextField() @@ -126,10 +124,15 @@ class Milestone(models.Model): class Epic(models.Model): title = models.CharField(max_length=150) + STATUS_CHOICES = ( + ('Open', 'Open'), + ('Closed', 'Closed') + ) + status = models.CharField(max_length=200, choices=STATUS_CHOICES, null=True) description = models.TextField() project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True) - start_date = models.DateField() - end_date = models.DateField() + start_date = models.CharField(max_length=200) + end_date = models.CharField(max_length=200) class ProjectRequirement(models.Model): diff --git a/osinaweb/osinacore/views.py b/osinaweb/osinacore/views.py index 66fa26a5..e7581e2d 100644 --- a/osinaweb/osinacore/views.py +++ b/osinaweb/osinacore/views.py @@ -5,9 +5,11 @@ from django.contrib.auth.decorators import login_required from django.contrib import messages from .forms import * from django.utils import timezone +from django.urls import reverse -# Create your views here. + +# Pages views def signin(request): if request.user.is_authenticated: @@ -84,9 +86,12 @@ def my_tasks(request, *args, **kwargs): @login_required def detailed_project(request, project_id): project = get_object_or_404(Project, project_id=project_id) + epics = Epic.objects.filter(project=project) + context = { 'project' : project, + 'epics' : epics } @@ -106,14 +111,24 @@ def createtask_project(request, project_id): @login_required def create_project(request): + staffs = StaffProfile.objects.all().order_by('-first_name') + project_types = ProjectType.objects.all() + customers = CustomerProfile.objects.all().order_by('-first_name') context = { + 'staffs' : staffs, + 'project_types' : project_types, + 'customers' : customers, + + } return render(request, 'create-project.html', context) @login_required -def create_epic(request): +def create_epic(request, project_id): + project = get_object_or_404(Project, project_id=project_id) context = { + 'project' : project, } return render(request, 'create-epic.html', context) @@ -134,6 +149,11 @@ def createtask_epic(request): return render(request, 'createtask-epic.html', context) + + + +# Modals views + def add_note_modal(request, *args, **kwargs): context = { @@ -141,7 +161,6 @@ def add_note_modal(request, *args, **kwargs): return render(request, 'addnote-modal.html', context) - def add_status_modal(request, *args, **kwargs): context = { @@ -198,6 +217,15 @@ def update_status_modal(request, *args, **kwargs): return render(request, 'update-status-modal.html', context) + + + + + + +#Save Functions + + @login_required def save_note(request): if request.method == 'POST': @@ -215,6 +243,85 @@ def save_note(request): note.save() - # return redirect('home') # Redirect to a success page or another view + + return render(request, 'addnote-modal.html') + + +@login_required +def save_project(request): + if request.method == 'POST': + name = request.POST.get('name') + customer_username = request.POST.get('customer') + manager_username = request.POST.get('manager') + project_type = request.POST.getlist('project_type') # Use getlist for multi-select fields + details = request.POST.get('details') + members_usernames = request.POST.getlist('members') # Use getlist for multi-select fields + status = request.POST.get('status') + start_date = request.POST.get('start_date') + end_date = request.POST.get('end_date') + + # Fetch the associated profiles + try: + customer_profile = CustomerProfile.objects.get(user__username=customer_username) + manager_profile = StaffProfile.objects.get(user__username=manager_username) + members_profiles = StaffProfile.objects.filter(user__username__in=members_usernames) + except (CustomerProfile.DoesNotExist, StaffProfile.DoesNotExist): + + pass + + # Create and save the project + project = Project( + name=name, + customer=customer_profile, + manager=manager_profile, + details=details, + status=status, + start_date=start_date, + end_date=end_date, + ) + project.save() + + + project.project_type.set(project_type) + project.members.set(members_profiles) + + return redirect('my-projects') + + return render(request, 'createproject.html') + + +@login_required +def save_epic(request): + if request.method == 'POST': + title = request.POST.get('title') + status = request.POST.get('status') + description = request.POST.get('description') + project_id = request.POST.get('project') # Get project ID as a string + + # Retrieve the Project instance + try: + project = Project.objects.get(id=project_id) + except Project.DoesNotExist: + # Handle the case where the project with the provided ID doesn't exist + # You might want to display an error message or redirect to an appropriate page. + pass + + start_date = request.POST.get('start_date') + end_date = request.POST.get('end_date') + + # Create the Epic object with the Project instance + epic = Epic( + title=title, + status=status, + project=project, # Assign the Project instance + description=description, + start_date=start_date, + end_date=end_date + ) + + # Save the Epic object to the database + epic.save() - return render(request, 'addnote-modal.html') \ No newline at end of file + # Redirect to the detailed project page + redirect_url = reverse('detailed-project', args=[project.project_id]) + return redirect(redirect_url) diff --git a/osinaweb/osinaweb/__pycache__/urls.cpython-310.pyc b/osinaweb/osinaweb/__pycache__/urls.cpython-310.pyc index b314849c583e18e436bf78675090e2b2841844bf..9050fd04c54c52124e738ecf80f22cf47e02f907 100644 GIT binary patch delta 484 zcmbOv_(w=PpO=@50SGqjWk`L*$-wX!#6bqKK#l_t7cbeUozCc#%93J`%9bUcVwl3& z%M9ch0eK23#!#LKkf)ep3gwvrc}gkfAYQs;lyZtiFoUM$<~fY1%rY{`MX8A;si_5- z$@(_MB}G;RMfq8&$tCfbDRz^2SSPr0B&MX~<(H)DN3la$RUo0X%p9l?h*iZ86at!* zlA2eNnV3_oAH|0vFnJcM{N%^1d45$~#ffF9@n8dQal+YEykI8OZv9(4$Xuu%uoIzr zKx{uvmCYe++>H7ltH374=jNv*=76n^2e}H$7X`^995*?fU3PLOdzfkw4=^~3ctHdo zkhsNNT9i|eSW=Q&lvlixp-2oQAvXCdd$N-qkjcWp!_UJAhOB&ye2hY12x7q@3!H@z KV+M(FJOBV$vxXD^ delta 243 zcmew(G)Yi9pO=@50SM;VF{Do5U|@I*;vfS_AjbiSi*q(=r!#V;i$=+(7z8tD8g9PA zn99t}om`ZfSdyArkeNI=ly$;n9X8p?Pg#Y/', views.detailed_project, name='detailed-project'), path('createproject/', views.create_project, name='createproject'), - path('createepic/', views.create_epic, name='createepic'), + path('createepic//', views.create_epic, name='createepic'), path('createtask/', views.create_task, name='createtask'), path('createtask//', views.createtask_project, name='createtaskproject'), path('createtaskepic/', views.createtask_epic, name='createtaskepic'), + + # Modals urls path('addstatus/', views.add_status_modal, name='addstatus'), path('addnote/', views.add_note_modal, name='addnote'), path('addfile/', views.add_file_modal, name='addfile'), path('addcredentials/', views.add_credentials_modal, name='addcredentials'), path('updatestatus/', views.update_status_modal, name='updatestatus'), - path('save_note/', views.save_note, name='save_note'), - path('addpoint/', views.add_point_modal, name='addpoint'), path('showpoints/', views.show_points_modal, name='showpoints'), path('addtime/', views.add_time_modal, name='addtime'), path('timeline/', views.timeline_modal, name='timeline'), path('deletetask/', views.delete_task_modal, name='deletetask'), + + # Save Urls + path('save_note/', views.save_note, name='save_note'), + path('save_project/', views.save_project, name='save_project'), + path('save_epic/', views.save_epic, name='save_epic'), ] diff --git a/osinaweb/templates/create-epic.html b/osinaweb/templates/create-epic.html index 21a23448..8563bb5d 100644 --- a/osinaweb/templates/create-epic.html +++ b/osinaweb/templates/create-epic.html @@ -5,40 +5,47 @@

- Create Epic + Create Epic for {{project.name}}

-
- + {% csrf_token %} + - -
-
-
-
-
+
diff --git a/osinaweb/templates/create-project.html b/osinaweb/templates/create-project.html index 739a4996..56fb52eb 100644 --- a/osinaweb/templates/create-project.html +++ b/osinaweb/templates/create-project.html @@ -10,48 +10,53 @@ Create Project -
- + {% csrf_token %} + - - - - - + + {% for staff in staffs %} + + {% endfor %} - - + -
@@ -69,13 +74,13 @@
-
-
@@ -107,11 +112,11 @@ -->
- + Project
-
+
diff --git a/osinaweb/templates/project-details.html b/osinaweb/templates/project-details.html index fd31b1d3..23b39849 100644 --- a/osinaweb/templates/project-details.html +++ b/osinaweb/templates/project-details.html @@ -90,7 +90,7 @@ {% endif %} - {% if project.projectfile_set.all %}

Related Files:

@@ -248,10 +242,8 @@
- {%endif%} - {% if project.projectcredential_set.all %}

Credentials:

@@ -296,7 +288,6 @@
- {%endif%}
@@ -323,21 +314,20 @@
+ + +