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