new dynamic version

main
emile 2 years ago
parent c7b7ceff96
commit e06feff139

Binary file not shown.

@ -4,12 +4,28 @@ from .models import *
# Register your models here.
class RequirementInline(admin.TabularInline):
model = ProjectRequirement
extra = 1
class FileInline(admin.TabularInline):
model = ProjectFile
extra = 1
class CredentialInline(admin.TabularInline):
model = ProjectCredential
extra = 1
class ProjectAdmin(admin.ModelAdmin):
inlines=[RequirementInline, FileInline, CredentialInline]
admin.site.register(Reference)
admin.site.register(Business)
admin.site.register(CustomerProfile)
admin.site.register(StaffProfile)
admin.site.register(ProjectType)
admin.site.register(Project)
admin.site.register(Project, ProjectAdmin)
admin.site.register(Milestone)
admin.site.register(Epic)
admin.site.register(Note)

@ -0,0 +1,22 @@
# Generated by Django 4.2.5 on 2023-09-12 10:47
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0011_note_date_alter_note_color_alter_note_text_and_more'),
]
operations = [
migrations.CreateModel(
name='ProjectRequirement',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.CharField(max_length=350)),
('project', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osinacore.project')),
],
),
]

@ -0,0 +1,24 @@
# Generated by Django 4.2.5 on 2023-09-12 10:57
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0012_projectrequirement'),
]
operations = [
migrations.CreateModel(
name='ProjectFile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=350)),
('file', models.FileField(upload_to='')),
('date', models.DateField()),
('project', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osinacore.project')),
],
),
]

@ -0,0 +1,18 @@
# Generated by Django 4.2.5 on 2023-09-12 11:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0013_projectfile'),
]
operations = [
migrations.AlterField(
model_name='projectfile',
name='file',
field=models.FileField(blank=True, upload_to=''),
),
]

@ -0,0 +1,24 @@
# Generated by Django 4.2.5 on 2023-09-12 11:03
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0014_alter_projectfile_file'),
]
operations = [
migrations.CreateModel(
name='ProjectCredentials',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('emailorusername', models.CharField(max_length=350)),
('password', models.CharField(max_length=350)),
('usedfor', models.CharField(max_length=350)),
('project', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osinacore.project')),
],
),
]

@ -0,0 +1,17 @@
# Generated by Django 4.2.5 on 2023-09-12 11:04
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0015_projectcredentials'),
]
operations = [
migrations.RenameModel(
old_name='ProjectCredentials',
new_name='ProjectCredential',
),
]

@ -130,6 +130,24 @@ class Epic(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True)
start_date = models.DateField()
end_date = models.DateField()
class ProjectRequirement(models.Model):
content = models.CharField(max_length=350)
project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True)
class ProjectFile(models.Model):
name = models.CharField(max_length=350)
file = models.FileField(blank=True)
date = models.DateField()
project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True)
class ProjectCredential(models.Model):
emailorusername = models.CharField(max_length=350)
password = models.CharField(max_length=350)
usedfor = models.CharField(max_length=350)
project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True)
class Note(models.Model):

@ -93,6 +93,17 @@ def detailed_project(request, project_id):
return render(request, 'project-details.html', context)
@login_required
def createtask_project(request, project_id):
project = get_object_or_404(Project, project_id=project_id)
context = {
'project' : project,
}
return render(request, 'createtask-project.html', context)
@login_required
def create_project(request):
context = {
@ -114,12 +125,6 @@ def create_task(request):
}
return render(request, 'create-task.html', context)
@login_required
def createtask_project(request):
context = {
}
return render(request, 'createtask-project.html', context)
@login_required
def createtask_epic(request):

@ -29,7 +29,7 @@ urlpatterns = [
path('createproject/', views.create_project, name='createproject'),
path('createepic/', views.create_epic, name='createepic'),
path('createtask/', views.create_task, name='createtask'),
path('createtaskproject/', views.createtask_project, name='createtaskproject'),
path('createtask/<str:project_id>/', views.createtask_project, name='createtaskproject'),
path('createtaskepic/', views.createtask_epic, name='createtaskepic'),
path('addstatus/', views.add_status_modal, name='addstatus'),

@ -1256,6 +1256,11 @@ video {
background-color: rgb(21 128 61 / var(--tw-bg-opacity));
}
.bg-orange-500 {
--tw-bg-opacity: 1;
background-color: rgb(249 115 22 / var(--tw-bg-opacity));
}
.bg-orange-700 {
--tw-bg-opacity: 1;
background-color: rgb(194 65 12 / var(--tw-bg-opacity));
@ -1526,6 +1531,11 @@ video {
color: rgb(21 128 61 / var(--tw-text-opacity));
}
.text-orange-500 {
--tw-text-opacity: 1;
color: rgb(249 115 22 / var(--tw-text-opacity));
}
.text-orange-700 {
--tw-text-opacity: 1;
color: rgb(194 65 12 / var(--tw-text-opacity));
@ -1551,6 +1561,11 @@ video {
color: rgb(255 255 255 / var(--tw-text-opacity));
}
.text-yellow-400 {
--tw-text-opacity: 1;
color: rgb(250 204 21 / var(--tw-text-opacity));
}
.text-yellow-500 {
--tw-text-opacity: 1;
color: rgb(234 179 8 / var(--tw-text-opacity));

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 KiB

@ -76,7 +76,7 @@
<span id="file-name" class="text-gray-500 text-base focus:outline-none outline-none">Upload
Document(s)</span>
<label for="actual-btn"
class="bg-transparent text-gray-500 border border-white px-4 py-2 h-14 cursor-pointer flex items-center"><i
class="bg-transparent text-gray-500 border border-white py-2 h-14 cursor-pointer flex items-center"><i
class="fa fa-upload"></i></label>
</div>

@ -16,7 +16,7 @@
<select id=""
class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md text-gray-500 cursor-not-allowed" disabled>
<option value="" selected disabled>Test 1</option>
<option value="" selected disabled>{{project.name}}</option>
</select>
<select id=""
@ -63,7 +63,7 @@
<span id="file-name" class="text-gray-500 text-base focus:outline-none outline-none">Upload
Document(s)</span>
<label for="actual-btn"
class="bg-transparent text-gray-500 border border-white px-4 py-2 h-14 cursor-pointer flex items-center"><i
class="bg-transparent text-gray-500 border border-white py-2 h-14 cursor-pointer flex items-center"><i
class="fa fa-upload"></i></label>
</div>

@ -64,10 +64,30 @@
<div class="w-full flex items-stretch justify-between gap-[2.5%] px-10 pb-5">
<!-- LEFT SIDE / TASK DETAIL SECTION -->
<div class="w-[74.5%] bg-white h-fit rounded-md shadow-md p-5">
<div class="w-full bg-yellow-500 rounded-t-md flex flex-col justify-center items-center py-2">
{% if project.status == 'Completed' %}
<div class="w-full bg-green-700 rounded-t-md flex flex-col justify-center items-center py-2">
<h1 class="text-3xl text-white font-semibold">{{project.name}}</h1>
<p class="text-white text-base">{{project.project_id}}</p>
</div>
{% endif %}
{% if project.status == 'Cancelled' %}
<div class="w-full bg-red-500 rounded-t-md flex flex-col justify-center items-center py-2">
<h1 class="text-3xl text-white font-semibold">{{project.name}}</h1>
<p class="text-white text-base">{{project.project_id}}</p>
</div>
{% endif %}
{% if project.status == 'Active' %}
<div class="w-full bg-orange-500 rounded-t-md flex flex-col justify-center items-center py-2">
<h1 class="text-3xl text-white font-semibold">{{project.name}}</h1>
<p class="text-white text-base">{{project.project_id}}</p>
</div>
{% endif %}
{% if project.status == 'Pending' %}
<div class="w-full bg-yellow-400 rounded-t-md flex flex-col justify-center items-center py-2">
<h1 class="text-3xl text-white font-semibold">{{project.name}}</h1>
<p class="text-white text-base">{{project.project_id}}</p>
</div>
{% endif %}
<div class="w-full h-[70px] flex justify-between items-center bg-gray-100 shadow-md rounded-md px-3 py-1 mt-4">
<div class="flex justify-start items-center gap-3">
<a href="{% url 'createepic' %}">
@ -75,7 +95,7 @@
class="w-fit text-base px-3 py-2 bg-transparent text-blue-500 outline-none border border-blue-500 rounded-md cursor-pointer hover:bg-white">Create
Epic</button>
</a>
<a href="{% url 'createtaskproject' %}">
<a href="{% url 'createtaskproject' project.project_id %}">
<button
class="w-fit text-base px-3 py-2 bg-transparent text-blue-500 outline-none border border-blue-500 rounded-md cursor-pointer hover:bg-white">Create
Task</button>
@ -99,98 +119,116 @@
<div class="w-full flex flex-col gap-4 mt-5">
<div>
<p class="text-gray-500 text-xl">Client: <span
class="text-slate-800 text-xl font-semibold">{{project.customer}}</span></p>
class="text-slate-800 text-xl font-semibold">{{project.customer.first_name}} {{project.customer.last_name}}</span></p>
</div>
<div>
<p class="text-gray-500 text-xl">Project Manager: <span
class="text-slate-800 text-xl font-semibold">{{project.manager}}</span></p>
class="text-slate-800 text-xl font-semibold">{{project.manager.first_name}} {{project.manager.last_name}}</span></p>
</div>
<div>
<p class="text-gray-500 text-xl">Designer: <span
class="text-slate-800 text-xl font-semibold">Arze</span></p>
</div>
<div>
<p class="text-gray-500 text-xl">Developer(s): <span
class="text-slate-800 text-xl font-semibold">Nataly, Salim</span></p>
<p class="text-gray-500 text-xl">Member(s):
{% for member in project.members.all %}
<span class="text-slate-800 text-xl font-semibold">
{{member.first_name}} {{member.last_name}} {% if not forloop.last %}, {% endif %}
{% endfor %}</span>
</p>
</div>
<div>
<p class="text-gray-500 text-xl">Type: <span
class="text-slate-800 text-xl font-semibold">Administration</span></p>
<p class="text-gray-500 text-xl">Type:
{% for type in project.project_type.all %}
<span class="text-slate-800 text-xl font-semibold">
{{type.name}} {% if not forloop.last %}, {% endif %}
{% endfor %}</span>
</p>
</div>
<div>
<p class="text-gray-500 text-xl">Status: <span
class="text-yellow-500 text-xl font-semibold">Pending</span></p>
<p class="text-gray-500 text-xl">Status:
{% if project.status == 'Cancelled' %}
<span class="text-red-500 text-xl font-semibold">{{project.status}}</span>
{% endif %}
{% if project.status == 'Completed' %}
<span class="text-green-700 text-xl font-semibold">{{project.status}}</span>
{% endif %}
{% if project.status == 'Active' %}
<span class="text-orange-500 text-xl font-semibold">{{project.status}}</span>
{% endif %}
{% if project.status == 'Pending' %}
<span class="text-yellow-400 text-xl font-semibold">{{project.status}}</span>
{% endif %}
</p>
</div>
<div>
<p class="text-gray-500 text-xl">Start Date: <span
class="text-slate-800 text-xl font-semibold">1/2/1023</span></p>
class="text-slate-800 text-xl font-semibold">{{project.start_date}}</span></p>
</div>
<div>
<p class="text-gray-500 text-xl">End Date: <span
class="text-slate-800 text-xl font-semibold">15/2/1023</span></p>
class="text-slate-800 text-xl font-semibold">{{project.end_date}}</span></p>
</div>
<!-- REQUIREMENTS -->
<div>
<p class="text-gray-500 text-xl">Requirements:</p>
<div class="w-full px-8">
<ul class="list-disc text-slate-800">
<li>Web-based Backend Administration System</li>
<li>Web-based Frontend</li>
<li>Mobile Android and IOS</li>
{% for requirement in project.projectrequirement_set.all %}
<li>{{requirement.content}}</li>
{% endfor %}
</ul>
</div>
</div>
<!-- RELATED FILES -->
{% if project.projectfile_set.all %}
<div>
<p class="text-gray-500 text-xl">Related Files:</p>
<div class="w-full px-4">
<div class="w-full border-t border-x border-gray-300 rounded-t-md mt-3">
<!-- HEADER -->
<div class="w-full h-[60px] flex items-center justify-between">
<div class="w-[70%] h-full border-r border-gray-300 flex justify-center items-center">
<div class="w-[50%] h-full border-r border-gray-300 flex justify-center items-center">
<p class="text-sm">File Name</p>
</div>
<div class="w-[30%] h-full flex justify-center items-center">
<div class="w-[25%] border-r border-gray-300 h-full flex justify-center items-center">
<p class="text-sm">File</p>
</div>
<div class="w-[25%] h-full flex justify-center items-center">
<p class="text-sm">Date Entered</p>
</div>
</div>
<!-- BODY -->
<div class="w-full border-t border-gray-300">
<!-- 1ST ROW -->
<!-- ROW -->
{% for file in project.projectfile_set.all %}
<div class="w-full h-[50px] flex justify-between items-center border-b border-gray-300">
<div class="w-[70%] h-full border-r border-gray-300 flex justify-center items-center">
<p class="text-sm">Documentation.pdf</p>
</div>
<div class="w-[30%] h-full flex justify-center items-center">
<p class="text-sm">12-3-2022 13:20 PM</p>
<div class="w-[50%] h-full border-r border-gray-300 flex justify-center items-center">
<p class="text-sm">{{file.name}}</p>
</div>
</div>
<!-- 2nd ROW -->
<div class="w-full h-[50px] flex justify-between items-center border-b border-gray-300">
<div class="w-[70%] h-full border-r border-gray-300 flex justify-center items-center">
<p class="text-sm">database.docx</p>
<div class="w-[25%] border-r border-gray-300 h-full flex justify-center items-center">
<p class="text-sm">{{file.file}}</p>
</div>
<div class="w-[30%] h-full flex justify-center items-center">
<p class="text-sm">14-3-2023 13:20 PM</p>
<div class="w-[25%] h-full flex justify-center items-center">
<p class="text-sm">{{file.date}}</p>
</div>
</div>
{%endfor%}
</div>
</div>
</div>
</div>
{%endif%}
<!-- CREDENTIALS -->
{% if project.projectcredential_set.all %}
<div>
<p class="text-gray-500 text-xl">Credentials:</p>
<div class="w-full px-4">
@ -198,7 +236,7 @@
<!-- HEADER -->
<div class="w-full h-[60px] flex items-center justify-between">
<div class="w-[50%] h-full border-r border-gray-300 flex justify-center items-center">
<p class="text-sm">Account</p>
<p class="text-sm">Email or Username</p>
</div>
<div class="w-[25%] border-r border-gray-300 h-full flex justify-center items-center">
<p class="text-sm">Password</p>
@ -210,22 +248,25 @@
<!-- BODY -->
<div class="w-full border-t border-gray-300">
<!-- 1ST ROW -->
<!-- ROW -->
{% for credential in project.projectcredential_set.all %}
<div class="w-full h-[50px] flex justify-between items-center border-b border-gray-300">
<div class="w-[50%] h-full border-r border-gray-300 flex justify-center items-center">
<p class="text-sm">nataly.aw@ositcom.net</p>
<p class="text-sm">{{credential.emailorusername}}</p>
</div>
<div class="w-[25%] border-r border-gray-300 h-full flex justify-center items-center">
<p class="text-sm">12345678</p>
<p class="text-sm">{{credential.password}}</p>
</div>
<div class="w-[25%] h-full flex justify-center items-center">
<p class="text-sm">Djando administration panel</p>
<p class="text-sm">{{credential.usedfor}}</p>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
{%endif%}
<!-- TAGS -->
<div>

@ -139,7 +139,7 @@
{% endif %}
{% if project.status == 'Active' %}
<div
class="w-[15%] h-full border-r border-gray-300 flex justify-center items-center bg-orange-700">
class="w-[15%] h-full border-r border-gray-300 flex justify-center items-center bg-orange-500">
<p class="text-white">{{project.status}}</p>
</div>
{% endif %}
@ -155,7 +155,7 @@
<i class="fa fa-eye"></i>
</div>
</a>
<div class="text-[18px] text-slate-800 cursor-pointer">
<div class="text-[18px] text-blue-500 cursor-pointer">
<i class="fa fa-edit"></i>
</div>
<div class="text-[18px] text-red-500 cursor-pointer">

Loading…
Cancel
Save