11 changed files with 304 additions and 0 deletions
-
0taskapp/__init__.py
-
4taskapp/admin.py
-
5taskapp/apps.py
-
33taskapp/forms.py
-
0taskapp/migrations/__init__.py
-
41taskapp/models.py
-
3taskapp/tests.py
-
9taskapp/urls.py
-
64taskapp/views.py
-
74templates/taskapp/add_edit_task.html
-
71templates/taskapp/index.html
@ -0,0 +1,4 @@ |
|||||
|
from django.contrib import admin |
||||
|
import models |
||||
|
|
||||
|
admin.site.register(models.Task) |
||||
@ -0,0 +1,5 @@ |
|||||
|
from django.apps import AppConfig |
||||
|
|
||||
|
|
||||
|
class TicketsappConfig(AppConfig): |
||||
|
name = 'taskapp' |
||||
@ -0,0 +1,33 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from datetime import datetime, timedelta |
||||
|
from django import forms |
||||
|
from models import TASK_PRIORITIES |
||||
|
from accounts_app.models import UserProfile |
||||
|
from devapp.models import Device |
||||
|
|
||||
|
|
||||
|
class TaskFrm(forms.Form): |
||||
|
descr = forms.CharField(max_length=128, required=True, widget=forms.TextInput(attrs={ |
||||
|
'placeholder': u'Краткое описание', |
||||
|
'class': "form-control", |
||||
|
'id': "descr", |
||||
|
'required':'' |
||||
|
})) |
||||
|
recipient = forms.ModelChoiceField( |
||||
|
queryset=UserProfile.objects.all(), |
||||
|
widget=forms.Select(attrs={'class': 'form-control', 'id': 'recipient', 'required':''}) |
||||
|
) |
||||
|
device = forms.ModelChoiceField( |
||||
|
queryset=Device.objects.all(), |
||||
|
widget=forms.Select(attrs={'class': 'form-control', 'id': 'device', 'required':''}) |
||||
|
) |
||||
|
priority = forms.ChoiceField( |
||||
|
choices=TASK_PRIORITIES, |
||||
|
widget=forms.Select(attrs={'class': 'form-control', 'id': 'priority'}), |
||||
|
required=False, |
||||
|
initial=TASK_PRIORITIES[2][0] |
||||
|
) |
||||
|
out_date = forms.DateField( |
||||
|
widget=forms.DateInput(attrs={'class': 'form-control', 'id': 'out_date'}), |
||||
|
initial=datetime.now()+timedelta(days=7) |
||||
|
) |
||||
@ -0,0 +1,41 @@ |
|||||
|
# coding=utf-8 |
||||
|
from __future__ import unicode_literals |
||||
|
|
||||
|
from django.db import models |
||||
|
from djing import settings |
||||
|
from devapp.models import Device |
||||
|
from datetime import datetime, timedelta |
||||
|
|
||||
|
|
||||
|
TASK_PRIORITIES = ( |
||||
|
(b'A', u'Высший'), |
||||
|
(b'B', u'Выше среднего'), |
||||
|
(b'C', u'Средний'), |
||||
|
(b'D', u'Ниже среднего'), |
||||
|
(b'E', u'Низкий') |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class Task(models.Model): |
||||
|
descr = models.CharField(max_length=128) |
||||
|
recipient = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+') |
||||
|
author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+') |
||||
|
device = models.ForeignKey(Device, related_name='dev') |
||||
|
priority = models.CharField(max_length=1, choices=TASK_PRIORITIES, default=TASK_PRIORITIES[2][0]) |
||||
|
out_date = models.DateField(null=True, blank=True, default=datetime.now()+timedelta(days=7)) |
||||
|
time_of_create = models.DateTimeField(auto_now_add=True) |
||||
|
|
||||
|
def __unicode__(self): |
||||
|
return self.descr |
||||
|
|
||||
|
class Meta: |
||||
|
db_table = 'task' |
||||
|
|
||||
|
def save_form(self, frm_instance, auth_user): |
||||
|
cl = frm_instance.cleaned_data |
||||
|
self.descr = cl['descr'] |
||||
|
self.recipient = cl['recipient'] |
||||
|
self.author = auth_user |
||||
|
self.device = cl['device'] |
||||
|
self.priority = cl['priority'] |
||||
|
self.out_date = cl['out_date'] |
||||
@ -0,0 +1,3 @@ |
|||||
|
from django.test import TestCase |
||||
|
|
||||
|
# Create your tests here. |
||||
@ -0,0 +1,9 @@ |
|||||
|
from django.conf.urls import url |
||||
|
import views |
||||
|
|
||||
|
urlpatterns = [ |
||||
|
url(r'^$', views.home, name='task_home'), |
||||
|
url(r'^(?P<task_id>\d+)/edit$', views.task_add_edit, name='task_edit'), |
||||
|
url(r'^(?P<task_id>\d+)/delete$', views.task_delete, name='task_delete'), |
||||
|
url(r'^add$', views.task_add_edit, name='task_add') |
||||
|
] |
||||
@ -0,0 +1,64 @@ |
|||||
|
# coding=utf-8 |
||||
|
from django.contrib.auth.decorators import login_required |
||||
|
from django.shortcuts import render, redirect, get_object_or_404 |
||||
|
from models import Task |
||||
|
from mydefs import pag_mn#, order_helper |
||||
|
from forms import TaskFrm |
||||
|
|
||||
|
|
||||
|
@login_required |
||||
|
def home(request): |
||||
|
tasks = Task.objects.all() |
||||
|
|
||||
|
# filter |
||||
|
#dir, field = order_helper(request) |
||||
|
#if field: |
||||
|
# tasks = tasks.order_by(field) |
||||
|
|
||||
|
for ts in tasks: |
||||
|
print ts.priority, type(ts.priority) |
||||
|
|
||||
|
tasks = pag_mn(request, tasks) |
||||
|
|
||||
|
return render(request, 'taskapp/index.html', { |
||||
|
'tasks': tasks |
||||
|
}) |
||||
|
|
||||
|
|
||||
|
@login_required |
||||
|
def task_delete(request, task_id): |
||||
|
get_object_or_404(Task, id=task_id).delete() |
||||
|
return redirect('task_home') |
||||
|
|
||||
|
|
||||
|
@login_required |
||||
|
def task_add_edit(request, task_id=0): |
||||
|
warntext = '' |
||||
|
if request.method == 'POST': |
||||
|
frm = TaskFrm(request.POST) |
||||
|
if frm.is_valid(): |
||||
|
tsk = Task() |
||||
|
tsk.save_form(frm, request.user) |
||||
|
tsk.save() |
||||
|
return redirect('task_home') |
||||
|
else: |
||||
|
warntext = u'Исправте ошибки' |
||||
|
|
||||
|
if task_id == 0: |
||||
|
task = Task() |
||||
|
frm = TaskFrm() |
||||
|
else: |
||||
|
task = get_object_or_404(Task, id=task_id) |
||||
|
frm = TaskFrm({ |
||||
|
'descr': task.descr, |
||||
|
'recipient': task.recipient.id, |
||||
|
'device': task.device.id, |
||||
|
'priority': task.priority, |
||||
|
'out_date': task.out_date |
||||
|
}) |
||||
|
|
||||
|
return render(request, 'taskapp/add_edit_task.html', { |
||||
|
'warntext': warntext, |
||||
|
'form': frm, |
||||
|
'task': task |
||||
|
}) |
||||
@ -0,0 +1,74 @@ |
|||||
|
{% extends request.is_ajax|yesno:'bajax.html,base.html' %} |
||||
|
{% block main %} |
||||
|
|
||||
|
<ol class="breadcrumb"> |
||||
|
<li><span class="glyphicon glyphicon-home"></span></li> |
||||
|
<li><a href="{% url 'task_home' %}">Задачи</a></li> |
||||
|
<li class="active">Создать</li> |
||||
|
</ol> |
||||
|
|
||||
|
|
||||
|
<div class="panel panel-default"> |
||||
|
<div class="panel-heading"> |
||||
|
<h3 class="panel-title">Добавьте новую задачу</h3> |
||||
|
</div> |
||||
|
<div class="panel-body"> |
||||
|
{% if warntext %} |
||||
|
<div class="alert-danger">{{ warntext }}</div> |
||||
|
{% endif %} |
||||
|
|
||||
|
{% if task.id %} |
||||
|
<form role="form" action="{% url 'task_edit' task.id %}" method="post"> |
||||
|
{% else %} |
||||
|
<form role="form" action="{% url 'task_add' %}" method="post"> |
||||
|
{% endif %} |
||||
|
{% csrf_token %} |
||||
|
|
||||
|
<div class="form-group"> |
||||
|
<label for="descr">Пару слов...</label> |
||||
|
<div class="input-group"> |
||||
|
<span class="input-group-addon"><span class="glyphicon glyphicon-tag"></span></span> |
||||
|
{{ form.descr }}{{ form.descr.errors }} |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="form-group"> |
||||
|
<label for="recipient">Цель, на кого назначаем</label> |
||||
|
<div class="input-group"> |
||||
|
<span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span> |
||||
|
{{ form.recipient }}{{ form.recipient.errors }} |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="form-group"> |
||||
|
<label for="device">С каким устройством связано</label> |
||||
|
<div class="input-group"> |
||||
|
<span class="input-group-addon"><span class="glyphicon glyphicon-hdd"></span></span> |
||||
|
{{ form.device }}{{ form.device.errors }} |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="form-group"> |
||||
|
<label for="priority">Приоритет</label> |
||||
|
<div class="input-group"> |
||||
|
<span class="input-group-addon"><span class="glyphicon glyphicon-sort-by-order"></span></span> |
||||
|
{{ form.priority }}{{ form.priority.errors }} |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="form-group"> |
||||
|
<label for="out_date">Актуальность</label> |
||||
|
<div class="input-group"> |
||||
|
<span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span> |
||||
|
{{ form.out_date }}{{ form.out_date.errors }} |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="btn-group"> |
||||
|
<button type="submit" class="btn btn-sm btn-primary"> |
||||
|
<span class="glyphicon glyphicon-save"></span> Сохранить |
||||
|
</button> |
||||
|
<button type="reset" class="btn btn-sm btn-default"> |
||||
|
<span class="glyphicon glyphicon-remove-circle"></span> Сбросить |
||||
|
</button> |
||||
|
</div> |
||||
|
</form> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
{% endblock %} |
||||
@ -0,0 +1,71 @@ |
|||||
|
{% extends 'base.html' %} |
||||
|
{% block main %} |
||||
|
|
||||
|
|
||||
|
<ol class="breadcrumb"> |
||||
|
<li><span class="glyphicon glyphicon-home"></span></li> |
||||
|
<li class="active">Задачи</li> |
||||
|
</ol> |
||||
|
|
||||
|
|
||||
|
<h3>Задачи, которые необходимо выполнить</h3> |
||||
|
<div class="table-responsive"> |
||||
|
<table class="table table-striped table-bordered"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th>Пару слов..</th> |
||||
|
<th>Кому назначена</th> |
||||
|
<th>Кто назначил</th> |
||||
|
<th>Приоритет</th> |
||||
|
<th>Истечение срока</th> |
||||
|
<th>Дата создания</th> |
||||
|
<th width="50">Ред.</th> |
||||
|
<th width="50">Уд.</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
{% for task in tasks %} |
||||
|
|
||||
|
{% if task.priority == 'E' %}<tr class="danger"> |
||||
|
{% elif task.priority == 'D' %}<tr class="warning"> |
||||
|
{% elif task.priority == 'C' %}<tr class="info"> |
||||
|
{% elif task.priority == 'B' %}<tr> |
||||
|
{% elif task.priority == 'A' %}<tr class="success"> |
||||
|
{% else %}<tr>{% endif %} |
||||
|
|
||||
|
<td>{{ task.descr }}</td> |
||||
|
<td><a href="{% url 'other_profile' task.recipient.id %}" title="{{ task.recipient.get_full_name }}">{{ task.recipient.username }}</a></td> |
||||
|
<td><a href="{% url 'other_profile' task.author.id %}" title="{{ task.author.get_full_name }}">{{ task.author.username }}</a></td> |
||||
|
<td>{{ task.get_priority_display }}</td> |
||||
|
<td>{{ task.out_date }}</td> |
||||
|
<td>{{ task.time_of_create }}</td> |
||||
|
<td colspan="2" class="btn-group"> |
||||
|
<a href="{% url 'task_edit' task.id %}" class="btn btn-sm btn-primary"> |
||||
|
<span class="glyphicon glyphicon-edit"></span> |
||||
|
</a> |
||||
|
<a href="{% url 'task_delete' task.id %}" class="btn btn-sm btn-danger"> |
||||
|
<span class="glyphicon glyphicon-remove-circle"></span> |
||||
|
</a> |
||||
|
</td> |
||||
|
</tr> |
||||
|
{% empty %} |
||||
|
<tr> |
||||
|
<td colspan="8">Нет ни одного задания на этот момент. <a href="{% url 'task_add' %}">Создать задачу</a></td> |
||||
|
</tr> |
||||
|
{% endfor %} |
||||
|
</tbody> |
||||
|
<tfoot> |
||||
|
<tr> |
||||
|
<td colspan="8"> |
||||
|
<a href="{% url 'task_add' %}" class="btn btn-sm btn-success" title="Создать новую задачу"> |
||||
|
<span class="glyphicon glyphicon-plus"></span> |
||||
|
</a> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</tfoot> |
||||
|
</table> |
||||
|
</div> |
||||
|
|
||||
|
{% include 'toolbar_page.html' with pag=tasks %} |
||||
|
|
||||
|
{% endblock %} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue