2020-01-26 21:04:45 +01:00
|
|
|
from django import forms
|
|
|
|
from django.contrib.auth.models import User
|
|
|
|
from django.db.models import Q
|
|
|
|
from django.utils.translation import gettext as _
|
|
|
|
from .models import Task, Project, Comment, Search, TASKSTATE_CHOICES, PROJECTSTATE_OPEN, ModelList
|
|
|
|
from .search import INDEX_STATES
|
|
|
|
|
|
|
|
|
|
|
|
class TaskForm(forms.ModelForm):
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
# get request from kwargs
|
|
|
|
try:
|
|
|
|
self.request = kwargs.pop('request')
|
|
|
|
except KeyError:
|
|
|
|
raise TypeError("needed request object is missing in kwargs")
|
|
|
|
plist = self.__projectlist_taskedit__(self.request.user)
|
|
|
|
if self.request.POST:
|
|
|
|
project = Project.objects.get(id=self.request.POST.get('project'))
|
|
|
|
else:
|
|
|
|
try:
|
|
|
|
project = kwargs.get('instance').project
|
|
|
|
except Task.project.RelatedObjectDoesNotExist:
|
|
|
|
if len(plist) > 0:
|
|
|
|
project = plist[0]
|
|
|
|
# init TaskForm
|
|
|
|
super(TaskForm, self).__init__(*args, **kwargs)
|
|
|
|
# set projectchoice for project
|
|
|
|
self.fields['project'].queryset = plist
|
|
|
|
self.fields['project'].empty_label = None
|
|
|
|
# set userlist (projectdepending)
|
|
|
|
self.fields['assigned_user'].empty_label = _('----- choose a user -----')
|
|
|
|
if project is not None:
|
|
|
|
self.fields['assigned_user'].queryset = self.__userlist_taskedit__(self.request.user, project)
|
|
|
|
|
|
|
|
def __projectlist_taskedit__(self, user):
|
|
|
|
if user.is_superuser:
|
|
|
|
rv = Project.objects.all()
|
|
|
|
else:
|
|
|
|
rv = Project.objects.filter(
|
|
|
|
Q(role_leader__id__exact=user.id) | Q(role_member__id__exact=user.id),
|
|
|
|
state=PROJECTSTATE_OPEN,
|
|
|
|
).distinct()
|
|
|
|
rv = ModelList(rv)
|
|
|
|
rv.sort()
|
|
|
|
return Project.objects.filter(pk__in=[p.pk for p in rv])
|
|
|
|
|
|
|
|
def __userlist_taskedit__(self, user, project=None):
|
|
|
|
if user.is_superuser:
|
|
|
|
return User.objects.all().order_by('username')
|
|
|
|
elif user in project.role_leader.all():
|
|
|
|
uids = [u.id for u in project.role_leader.all() | project.role_member.all()]
|
|
|
|
else:
|
|
|
|
uids = [user.id]
|
|
|
|
return User.objects.filter(id__in=set(uids)).order_by('username')
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = Task
|
|
|
|
fields = ['project', 'assigned_user', 'name', 'state', 'priority', 'targetdate', 'progress', 'description']
|
|
|
|
widgets = {
|
|
|
|
'assigned_user': forms.Select(attrs={'required': True}),
|
|
|
|
'project': forms.Select(attrs={'onchange': 'submit()'}),
|
|
|
|
'state': forms.Select(choices=TASKSTATE_CHOICES),
|
|
|
|
'targetdate': forms.DateInput(format="%Y-%m-%d"),
|
|
|
|
'description': forms.Textarea(attrs={'rows': 5}),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class TaskFormLimited(forms.ModelForm):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
# remove request from kwargs
|
|
|
|
kwargs.pop('request')
|
|
|
|
super(TaskFormLimited, self).__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = Task
|
|
|
|
fields = ['state', 'progress', 'description']
|
|
|
|
widgets = {
|
|
|
|
'state': forms.Select(choices=TASKSTATE_CHOICES[:2]),
|
|
|
|
'description': forms.Textarea(attrs={'rows': 5}),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class ProjectForm(forms.ModelForm):
|
|
|
|
class Meta:
|
|
|
|
model = Project
|
|
|
|
fields = ['name', 'state', 'role_leader', 'role_member', 'role_visitor', 'description', 'days_late', 'days_very_soon', 'days_soon']
|
|
|
|
widgets = {
|
|
|
|
'description': forms.Textarea(attrs={'rows': 5}),
|
|
|
|
}
|
|
|
|
labels = {
|
|
|
|
'days_late': _('Days to deadline (late)'),
|
|
|
|
'days_very_soon': _('Days to deadline (very soon)'),
|
|
|
|
'days_soon': _('Days to deadline (soon)'),
|
|
|
|
}
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super(ProjectForm, self).__init__(*args, **kwargs)
|
|
|
|
self.fields['role_leader'].queryset = User.objects.order_by('username')
|
|
|
|
self.fields['role_member'].queryset = User.objects.order_by('username')
|
|
|
|
|
|
|
|
|
|
|
|
class CommentForm(forms.ModelForm):
|
|
|
|
class Meta:
|
|
|
|
model = Comment
|
2020-02-06 15:23:58 +01:00
|
|
|
fields = ['type', 'comment']
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
try:
|
|
|
|
acc = kwargs.pop('acc')
|
|
|
|
except KeyError:
|
|
|
|
disable_type = True
|
|
|
|
else:
|
|
|
|
disable_type = not acc.modify_comment
|
|
|
|
super(forms.ModelForm, self).__init__(*args, **kwargs)
|
|
|
|
self.fields['type'].disabled = disable_type
|
2020-01-26 21:04:45 +01:00
|
|
|
|
|
|
|
|
|
|
|
class TaskCommentForm(forms.ModelForm):
|
|
|
|
class Meta:
|
|
|
|
model = Comment
|
|
|
|
fields = ['comment']
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super(forms.ModelForm, self).__init__(*args, **kwargs)
|
|
|
|
self.fields['comment'].required = False
|
|
|
|
|
|
|
|
|
|
|
|
class SearchForm(forms.ModelForm):
|
|
|
|
class Meta:
|
|
|
|
model = Search
|
|
|
|
fields = ['name', 'search_txt']
|
|
|
|
labels = {
|
|
|
|
'search_txt': _('Search Text'),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class EasySearchForm(forms.Form):
|
|
|
|
user_ids = forms.MultipleChoiceField(required=False, label=_('Assigned User(s)'), widget=forms.widgets.SelectMultiple(attrs={'size': 6}))
|
|
|
|
states = forms.MultipleChoiceField(required=False, label=_('State(s)'))
|
|
|
|
prj_ids = forms.MultipleChoiceField(required=False, label=_('Project(s)'), widget=forms.widgets.SelectMultiple(attrs={'size': 10}))
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super(EasySearchForm, self).__init__(*args, **kwargs)
|
|
|
|
self.fields['user_ids'].choices = [(u.id, u.username) for u in User.objects.order_by('username')]
|
|
|
|
self.fields['states'].choices = [(INDEX_STATES.get(task_num), task_name) for task_num, task_name in TASKSTATE_CHOICES]
|
|
|
|
self.fields['prj_ids'].choices = [(p.id, p.name) for p in Project.objects.order_by('state', 'name')]
|