feat(project_management): Add manager and users for projects and tasks

!30 #14
This commit is contained in:
2024-06-18 08:37:54 +09:30
parent 9bc4f186d5
commit 3c206f5aef
5 changed files with 122 additions and 1 deletions

View File

@ -34,3 +34,5 @@ class ProjectForm(forms.ModelForm):
self.fields['real_finish_date'].input_formats = settings.DATETIME_FORMAT
self.fields['real_finish_date'].format="%Y-%m-%dT%H:%M"
self.fields['description'].widget.attrs = {'style': "height: 800px; width: 1000px"}

View File

@ -0,0 +1,42 @@
# Generated by Django 5.0.6 on 2024-06-17 23:06
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0005_organization_manager_organization_model_notes'),
('project_management', '0002_projecttask'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='project',
name='manager_team',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='access.team'),
),
migrations.AddField(
model_name='project',
name='manager_user',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='manager_user', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='project',
name='team_members',
field=models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='projecttask',
name='task_members',
field=models.ManyToManyField(help_text='User whom is responsible for completing the task.', related_name='task_members', to=settings.AUTH_USER_MODEL, verbose_name='Team Members'),
),
migrations.AddField(
model_name='projecttask',
name='task_owner',
field=models.ForeignKey(blank=True, help_text='User whom is considered the task owner.', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Task Owner'),
),
]

View File

@ -1,8 +1,11 @@
from django.contrib.auth.models import User
from django.db import models
from .projects import Project
from .project_common import ProjectCommonFieldsName
from access.models import Team
from core.mixin.history_save import SaveHistory
@ -100,3 +103,19 @@ class ProjectTask(ProjectCommonFieldsName, SaveHistory):
model_notes = None
task_owner = models.ForeignKey(
User,
blank= True,
help_text = 'User whom is considered the task owner.',
on_delete=models.SET_NULL,
null = True,
verbose_name = 'Task Owner',
)
task_members = models.ManyToManyField(
to = User,
blank = False,
help_text = 'User whom is responsible for completing the task.',
related_name = 'task_members',
verbose_name = 'Team Members',
)

View File

@ -1,5 +1,8 @@
from django.contrib.auth.models import User
from django.db import models
from access.models import Team
from core.mixin.history_save import SaveHistory
from .project_common import ProjectCommonFieldsName
@ -35,7 +38,6 @@ class Project(ProjectCommonFieldsName, SaveHistory):
# state
# project_type
code = models.CharField(
@ -73,8 +75,30 @@ class Project(ProjectCommonFieldsName, SaveHistory):
verbose_name = 'Real Finish Date',
)
manager_user = models.ForeignKey(
User,
blank= True,
help_text = '',
on_delete=models.SET_NULL,
null = True,
related_name = 'manager_user'
)
manager_team = models.ForeignKey(
Team,
blank= True,
help_text = '',
on_delete=models.SET_NULL,
null = True,
)
model_notes = None
team_members = models.ManyToManyField(
to = User,
blank = True,
)
@property
def percent_completed(self) -> str: # Auto-Calculate

View File

@ -71,6 +71,10 @@
line-height: 30px;
}
hr {
border: 0; border-top: 1px solid #ccc;
}
</style>
<form action="" method="post">
{% csrf_token %}
@ -146,10 +150,40 @@
</div>
<hr />
<div style="display: inline; width: 40%; margin: 30px;">
<h3>Manager</h3>
<div style="display: inline; width: 40%; margin: 30px;">
<div class="detail-view-field">
<label>{{ form.manager_user.label }}</label>
<span>{{ form.manager_user.value }}</span>
</div>
</div>
<div style="display: inline; width: 40%; margin: 30px;">
<div class="detail-view-field">
<label>{{ form.team_members.label }}</label>
<span>{{ form.team_members.value }}</span>
</div>
</div>
</div>
<br />
<br />
<hr />
<div style="display: inline; width: 40%; margin: 30px;">
<h3>Description</h3>
<div style="display:block; border: 1px solid #ccc;">
{{ form.description.value | markdown | safe }}
</div>
</div>
<br />
<br />
<input type="button" value="Edit"