17 changed files with 738 additions and 474 deletions
-
38taskapp/forms.py
-
2taskapp/handle.py
-
464taskapp/locale/ru/LC_MESSAGES/django.po
-
93taskapp/migrations/0002_auto_20180219_1255.py
-
46taskapp/models.py
-
151taskapp/templates/taskapp/add_edit_task.html
-
19taskapp/templates/taskapp/comments/extracomment_confirm_delete.html
-
38taskapp/templates/taskapp/comments/task_comments.html
-
38taskapp/templates/taskapp/details.html
-
26taskapp/templates/taskapp/tasklist.html
-
23taskapp/templates/taskapp/tasklist_all.html
-
2taskapp/templates/taskapp/tasklist_failed.html
-
2taskapp/templates/taskapp/tasklist_finish.html
-
2taskapp/templates/taskapp/tasklist_own.html
-
51taskapp/templates/taskapp/view.html
-
7taskapp/urls.py
-
210taskapp/views.py
@ -1,30 +1,44 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from django.utils.translation import ugettext as _ |
|||
from datetime import timedelta |
|||
from django import forms |
|||
from django.utils import timezone |
|||
from .models import Task |
|||
from .models import Task, ExtraComment, _delta_add_days |
|||
from accounts_app.models import UserProfile |
|||
|
|||
|
|||
class TaskFrm(forms.ModelForm): |
|||
def __init__(self, *args, **kwargs): |
|||
super(TaskFrm, self).__init__(*args, **kwargs) |
|||
self.fields['recipients'].queryset = UserProfile.objects.filter(is_admin=True) |
|||
|
|||
class Meta: |
|||
model = Task |
|||
exclude = ['time_of_create', 'author', 'recipients', 'device'] |
|||
exclude = ['time_of_create', 'author', 'device'] |
|||
widgets = { |
|||
'descr': forms.TextInput(attrs={ |
|||
'placeholder': _('Short description'), |
|||
'class': "form-control", |
|||
'autofocus': '' |
|||
}), |
|||
#'device': forms.Select(attrs={'class': 'form-control', 'required':''}), |
|||
'priority': forms.Select(attrs={'class': 'form-control'}), |
|||
'state': forms.Select(attrs={'class': 'form-control'}), |
|||
'recipients': forms.SelectMultiple(attrs={ |
|||
'size': 10 |
|||
}), |
|||
'out_date': forms.DateInput(attrs={'class': 'form-control'}), |
|||
'attachment': forms.FileInput(attrs={'class': 'form-control'}), |
|||
'mode': forms.Select(attrs={'class': 'form-control'}), |
|||
'abon': forms.Select(attrs={'class': 'form-control'}) |
|||
} |
|||
initials = { |
|||
'out_date': timezone.now()+timedelta(days=3) |
|||
'out_date': _delta_add_days() |
|||
} |
|||
|
|||
|
|||
class ExtraCommentForm(forms.ModelForm): |
|||
|
|||
def make_save(self, author, task): |
|||
comment = super(ExtraCommentForm, self).save(commit=False) |
|||
comment.author = author |
|||
comment.task = task |
|||
return comment.save() |
|||
|
|||
def save(self, commit=True): |
|||
raise Exception('You must use ExtraCommentForm.make_save() method') |
|||
|
|||
class Meta: |
|||
model = ExtraComment |
|||
fields = ['text'] |
|||
@ -0,0 +1,93 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Generated by Django 1.11 on 2018-02-19 12:55 |
|||
from __future__ import unicode_literals |
|||
|
|||
from django.conf import settings |
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
import taskapp.models |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
|||
('taskapp', '0001_squashed_0015_auto_20170816_1109'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.CreateModel( |
|||
name='ExtraComment', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('text', models.TextField(verbose_name='Text of comment')), |
|||
('date_create', models.DateTimeField(auto_now_add=True, verbose_name='Time of create')), |
|||
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Author')), |
|||
], |
|||
options={ |
|||
'verbose_name': 'Extra comment', |
|||
'verbose_name_plural': 'Extra comments', |
|||
'db_table': 'extra_comments', |
|||
'permissions': (('can_view_comments', 'Can view comments'),), |
|||
}, |
|||
), |
|||
migrations.AlterModelOptions( |
|||
name='task', |
|||
options={'ordering': ('-id',), 'permissions': (('can_viewall', 'Access to all tasks'), ('can_remind', 'Reminders of tasks'))}, |
|||
), |
|||
migrations.AlterField( |
|||
model_name='changelog', |
|||
name='act_type', |
|||
field=models.CharField(choices=[('e', 'Change task'), ('c', 'Create task'), ('d', 'Delete task'), ('f', 'Completing tasks'), ('b', 'The task failed')], max_length=1), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='task', |
|||
name='abon', |
|||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='abonapp.Abon', verbose_name='Subscriber'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='task', |
|||
name='attachment', |
|||
field=models.ImageField(blank=True, null=True, upload_to='task_attachments/%Y.%m.%d', verbose_name='Attached image'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='task', |
|||
name='author', |
|||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Task author'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='task', |
|||
name='descr', |
|||
field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Description'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='task', |
|||
name='mode', |
|||
field=models.CharField(choices=[('na', 'not chosen'), ('ic', 'ip conflict'), ('yt', 'yellow triangle'), ('rc', 'red cross'), ('ls', 'weak speed'), ('cf', 'cable break'), ('cn', 'connection'), ('pf', 'periodic disappearance'), ('cr', 'router setup'), ('co', 'configure onu'), ('fc', 'crimp cable'), ('ni', 'Internet crash'), ('ot', 'other')], default='na', max_length=2, verbose_name='The nature of the damage'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='task', |
|||
name='out_date', |
|||
field=models.DateField(blank=True, default=taskapp.models._delta_add_days, null=True, verbose_name='Reality'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='task', |
|||
name='priority', |
|||
field=models.CharField(choices=[('A', 'Higher'), ('C', 'Average'), ('E', 'Low')], default='E', max_length=1, verbose_name='A priority'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='task', |
|||
name='state', |
|||
field=models.CharField(choices=[('S', 'New'), ('C', 'Confused'), ('F', 'Completed')], default='S', max_length=1, verbose_name='Condition'), |
|||
), |
|||
migrations.AlterField( |
|||
model_name='task', |
|||
name='time_of_create', |
|||
field=models.DateTimeField(auto_now_add=True, verbose_name='Date of create'), |
|||
), |
|||
migrations.AddField( |
|||
model_name='extracomment', |
|||
name='task', |
|||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='taskapp.Task', verbose_name='Owner task'), |
|||
), |
|||
] |
|||
@ -0,0 +1,19 @@ |
|||
{% load i18n %} |
|||
<form action="{% url 'taskapp:comment_del' task_id object.pk %}" method="post">{% csrf_token %} |
|||
|
|||
<div class="modal-header warning"> |
|||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> |
|||
<h4 class="modal-title"><span class="glyphicon glyphicon-exclamation-sign"></span>{% trans 'Delete comment' %}</h4> |
|||
</div> |
|||
|
|||
<div class="modal-body"> |
|||
<p>{% blocktrans %}Are you sure you want to delete "{{ object }}"?{% endblocktrans %}</p> |
|||
</div> |
|||
|
|||
<div class="modal-footer"> |
|||
<button type="submit" class="btn btn-sm btn-danger"> |
|||
<span class="glyphicon glyphicon-remove"></span> {% trans 'Delete' %} |
|||
</button> |
|||
</div> |
|||
|
|||
</form> |
|||
@ -0,0 +1,38 @@ |
|||
{% load i18n %} |
|||
{% load bootstrap3 %} |
|||
<div class="panel panel-default"> |
|||
<div class="panel-heading"> |
|||
<h3 class="panel-title">{% trans 'Task comments' %}</h3> |
|||
</div> |
|||
<div class="panel-body"> |
|||
<div class="list-group"> |
|||
{% for comment in comments %} |
|||
{% with author=comment.author %} |
|||
<div class="list-group-item"> |
|||
{% if comment.author == request.user %} |
|||
<a href="{% url 'taskapp:comment_del' task_uid comment.pk %}" class="btn btn-link pull-right btn-modal" title="{% trans 'Delete' %}" data-toggle="tooltip"> |
|||
<span class="glyphicon glyphicon-remove"></span> |
|||
</a> |
|||
{% endif %} |
|||
<h5><b>{{ author.get_short_name }}</b> |
|||
<small>{{ comment.date_create|date:'d M, H:i:s' }}</small> |
|||
</h5> |
|||
<p>{{ comment.text }}</p> |
|||
</div> |
|||
{% endwith %} |
|||
{% empty %} |
|||
<div class="list-group-item clearfix"> |
|||
<p class="list-group-item-text">{% trans 'Comment history is empty' %}</p> |
|||
</div> |
|||
{% endfor %} |
|||
</div> |
|||
<form action="{% url 'taskapp:comment_add' task_uid %}" method="post">{% csrf_token %} |
|||
{% bootstrap_form comment_form %} |
|||
{% buttons %} |
|||
<button type="submit" class="btn btn-primary"> |
|||
{% bootstrap_icon "send" %} {% trans 'Send' %} |
|||
</button> |
|||
{% endbuttons %} |
|||
</form> |
|||
</div> |
|||
</div> |
|||
@ -0,0 +1,38 @@ |
|||
{% load i18n %} |
|||
<div class="panel panel-default"> |
|||
<div class="panel-heading"> |
|||
<h3 class="panel-title">{% trans 'Task details' %}</h3> |
|||
</div> |
|||
<div class="panel-body"> |
|||
|
|||
<p>{% trans 'Description' %}: {{ task.descr }}</p> |
|||
|
|||
{% trans 'Task author' %}: <a href="{% url 'acc_app:other_profile' task.author.pk %}" title="{{ task.author.get_full_name }}" data-toggle="tooltip" target="_blank">{{ task.author.username }}</a><br> |
|||
|
|||
{% trans 'Implementers' %}: |
|||
<ul> |
|||
{% for recipient in task.recipients.all %} |
|||
<li><a href="{% url 'acc_app:other_profile' recipient.pk %}" target="_blank">{{ recipient.get_full_name }}</a></li> |
|||
{% endfor %} |
|||
</ul> |
|||
{% trans 'A priority' %}: {{ task.get_priority_display }}<br> |
|||
{% trans 'The task is valid until' %} {{ task.out_date|date:'d E Y' }}<br> |
|||
{% trans 'Date of create' %} {{ task.time_of_create|date:'d E Y H:i:s' }}<br> |
|||
{{ time_diff }}<br> |
|||
{% trans 'Task type' %}: {{ task.get_mode_display }}<br> |
|||
{% trans 'Condition' %}: {{ task.get_state_display }}<br> |
|||
{% trans 'Subscriber' %} |
|||
{% if task.abon %} |
|||
<a href="{% url 'abonapp:abon_home' task.abon.group.pk task.abon.pk %}" target="_blank">{{ task.abon.get_full_name }}</a> |
|||
{% else %} |
|||
<i>{% trans 'Not assigned' %}</i> |
|||
{% endif %}<br> |
|||
{% if task.attachment %} |
|||
{% trans 'Attachment' %}: |
|||
<a href="{{ task.attachment.url }}" class="thumbnail" target="_blank"> |
|||
<img src="{{ task.attachment.url }}"> |
|||
</a> |
|||
{% endif %} |
|||
|
|||
</div> |
|||
</div> |
|||
@ -1,51 +0,0 @@ |
|||
{% extends request.is_ajax|yesno:'bajax.html,base.html' %} |
|||
{% load i18n %} |
|||
{% block main %} |
|||
|
|||
<ol class="breadcrumb"> |
|||
<li><span class="glyphicon glyphicon-home"></span></li> |
|||
<li><a href="{% url 'taskapp:home' %}">{% trans 'Tasks' %}</a></li> |
|||
<li class="active">#{{ task.pk }}</li> |
|||
</ol> |
|||
|
|||
{% include 'message_block.html' %} |
|||
|
|||
<div class="panel panel-default"> |
|||
<div class="panel-heading"> |
|||
<h3 class="panel-title">{% trans 'Task description' %}</h3> |
|||
</div> |
|||
<div class="panel-body"> |
|||
|
|||
<p>{% trans 'Description' %}: {{ task.descr }}</p> |
|||
|
|||
{% trans 'Task author' %}: <a href="{% url 'acc_app:other_profile' task.author.pk %}" title="{{ task.author.get_full_name }}" data-toggle="tooltip" target="_blank">{{ task.author.username }}</a><br> |
|||
|
|||
{% trans 'Implementers' %}: |
|||
<ul> |
|||
{% for recipient in task.recipients.all %} |
|||
<li><a href="{% url 'acc_app:other_profile' recipient.pk %}" target="_blank">{{ recipient.get_full_name }}</a></li> |
|||
{% endfor %} |
|||
</ul> |
|||
{% trans 'A priority' %}: {{ task.get_priority_display }}<br> |
|||
{% trans 'The task is valid until' %} {{ task.out_date|date:'d E Y' }}<br> |
|||
{% trans 'Date of create' %} {{ task.time_of_create|date:'d E Y H:i:s' }}<br> |
|||
{{ time_diff }}<br> |
|||
{% trans 'Task type' %}: {{ task.get_mode_display }}<br> |
|||
{% trans 'Condition' %}: {{ task.get_state_display }}<br> |
|||
{% trans 'Subscriber' %} |
|||
{% if task.abon %} |
|||
<a href="{% url 'abonapp:abon_home' task.abon.group.pk task.abon.pk %}" target="_blank">{{ task.abon.get_full_name }}</a> |
|||
{% else %} |
|||
<i>{% trans 'Not assigned' %}</i> |
|||
{% endif %}<br> |
|||
{% if task.attachment %} |
|||
{% trans 'Attachment' %}: |
|||
<a href="{{ task.attachment.url }}" class="thumbnail" target="_blank"> |
|||
<img src="{{ task.attachment.url }}"> |
|||
</a> |
|||
{% endif %} |
|||
|
|||
</div> |
|||
</div> |
|||
|
|||
{% endblock %} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue