You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
4.6 KiB
169 lines
4.6 KiB
# coding=utf-8
|
|
from datetime import timedelta
|
|
import os
|
|
from django.db import models
|
|
from django.conf import settings
|
|
from django.shortcuts import resolve_url
|
|
from django.utils import timezone
|
|
from django.utils.translation import ugettext as _
|
|
from abonapp.models import Abon
|
|
from .handle import handle as task_handle
|
|
|
|
TASK_PRIORITIES = (
|
|
('A', _('Higher')),
|
|
('C', _('Average')),
|
|
('E', _('Low'))
|
|
)
|
|
|
|
TASK_STATES = (
|
|
('S', _('New')),
|
|
('C', _('Confused')),
|
|
('F', _('Completed'))
|
|
)
|
|
|
|
TASK_TYPES = (
|
|
('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'))
|
|
)
|
|
|
|
|
|
class ChangeLog(models.Model):
|
|
task = models.ForeignKey('Task', on_delete=models.CASCADE)
|
|
ACT_CHOICES = (
|
|
('e', _('Change task')),
|
|
('c', _('Create task')),
|
|
('d', _('Delete task')),
|
|
('f', _('Completing tasks')),
|
|
('b', _('The task failed'))
|
|
)
|
|
act_type = models.CharField(max_length=1, choices=ACT_CHOICES)
|
|
when = models.DateTimeField(auto_now_add=True)
|
|
who = models.ForeignKey(
|
|
settings.AUTH_USER_MODEL,
|
|
on_delete=models.CASCADE, related_name='+'
|
|
)
|
|
|
|
def __str__(self):
|
|
return self.get_act_type_display()
|
|
|
|
|
|
def delta_add_days():
|
|
return timezone.now() + timedelta(days=3)
|
|
|
|
|
|
class Task(models.Model):
|
|
descr = models.CharField(
|
|
_('Description'), max_length=128,
|
|
null=True, blank=True
|
|
)
|
|
recipients = models.ManyToManyField(
|
|
settings.AUTH_USER_MODEL, verbose_name=_('Recipients'),
|
|
related_name='them_task'
|
|
)
|
|
author = models.ForeignKey(
|
|
settings.AUTH_USER_MODEL, related_name='+',
|
|
on_delete=models.SET_NULL, null=True,
|
|
blank=True, verbose_name=_('Task author')
|
|
)
|
|
priority = models.CharField(
|
|
_('A priority'), max_length=1,
|
|
choices=TASK_PRIORITIES, default=TASK_PRIORITIES[2][0]
|
|
)
|
|
out_date = models.DateField(
|
|
_('Reality'), null=True,
|
|
blank=True, default=delta_add_days
|
|
)
|
|
time_of_create = models.DateTimeField(
|
|
_('Date of create'), auto_now_add=True
|
|
)
|
|
state = models.CharField(
|
|
_('Condition'), max_length=1, choices=TASK_STATES,
|
|
default=TASK_STATES[0][0]
|
|
)
|
|
attachment = models.ImageField(
|
|
_('Attached image'), upload_to='task_attachments/%Y.%m.%d',
|
|
blank=True, null=True
|
|
)
|
|
mode = models.CharField(
|
|
_('The nature of the damage'), max_length=2,
|
|
choices=TASK_TYPES, default=TASK_TYPES[0][0]
|
|
)
|
|
abon = models.ForeignKey(
|
|
Abon, on_delete=models.CASCADE, null=True,
|
|
blank=True, verbose_name=_('Subscriber')
|
|
)
|
|
|
|
class Meta:
|
|
db_table = 'task'
|
|
ordering = ('-id',)
|
|
permissions = (
|
|
('can_viewall', _('Access to all tasks')),
|
|
('can_remind', _('Reminders of tasks'))
|
|
)
|
|
|
|
def finish(self, current_user):
|
|
self.state = 'F' # Finished
|
|
self.out_date = timezone.now() # End time
|
|
ChangeLog.objects.create(
|
|
task=self,
|
|
act_type='f',
|
|
who=current_user
|
|
)
|
|
self.save(update_fields=('state', 'out_date'))
|
|
|
|
def do_fail(self, current_user):
|
|
self.state = 'C' # Crashed
|
|
ChangeLog.objects.create(
|
|
task=self,
|
|
act_type='b',
|
|
who=current_user
|
|
)
|
|
self.save(update_fields=('state',))
|
|
|
|
def send_notification(self):
|
|
task_handle(
|
|
self, self.author,
|
|
self.recipients.all()
|
|
)
|
|
|
|
def get_attachment_fname(self):
|
|
return os.path.basename(self.attachment.name)
|
|
|
|
def is_relevant(self):
|
|
return self.out_date < timezone.now().date() or self.state == 'F'
|
|
|
|
|
|
class ExtraComment(models.Model):
|
|
text = models.TextField(_('Text of comment'))
|
|
task = models.ForeignKey(
|
|
Task, verbose_name=_('Owner task'),
|
|
on_delete=models.CASCADE
|
|
)
|
|
author = models.ForeignKey(
|
|
settings.AUTH_USER_MODEL, verbose_name=_('Author'),
|
|
on_delete=models.CASCADE
|
|
)
|
|
date_create = models.DateTimeField(_('Time of create'), auto_now_add=True)
|
|
|
|
def __str__(self):
|
|
return self.text
|
|
|
|
def get_absolute_url(self):
|
|
return resolve_url('taskapp:edit', self.task.pk)
|
|
|
|
class Meta:
|
|
db_table = 'extra_comments'
|
|
verbose_name = _('Extra comment')
|
|
verbose_name_plural = _('Extra comments')
|
|
ordering = ('-date_create',)
|