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.
84 lines
3.3 KiB
84 lines
3.3 KiB
# coding=utf-8
|
|
from __future__ import unicode_literals
|
|
|
|
from django.conf import settings
|
|
from django.contrib.contenttypes.fields import GenericForeignKey
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.db import models
|
|
|
|
from courses.models import Achievements, Course, CourseMap, Diploma
|
|
from management.models import Comment
|
|
from finance.models import Bill
|
|
|
|
|
|
# Новое API
|
|
class Journal(models.Model):
|
|
thread = models.ForeignKey(to='Thread', verbose_name=u'Тред')
|
|
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=u'Инициатор действия')
|
|
content_type = models.ForeignKey(to=ContentType)
|
|
extra_data = models.TextField(default='')
|
|
object_id = models.PositiveIntegerField()
|
|
content_object = GenericForeignKey('content_type', 'object_id')
|
|
action_type = models.ForeignKey(to='Action')
|
|
date = models.DateTimeField(auto_now=True)
|
|
|
|
def __str__(self):
|
|
return '%d Пользователь %s %s %s' % (self.id, self.user.email, self.action_type.name, self.thread.key)
|
|
|
|
|
|
class Thread(models.Model):
|
|
key = models.CharField(max_length=200)
|
|
text = models.TextField(default='', verbose_name=u'Описание треда')
|
|
is_staff = models.BooleanField(default=False, verbose_name=u'Админская ли табличка')
|
|
recurse_step = models.SmallIntegerField(default=0, verbose_name=u'Поле аптимизации поиска')
|
|
subscribers = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name=u'Подписчики', blank=True)
|
|
check_subscribe = models.BooleanField(default=True, verbose_name='Проверять ли подписки')
|
|
parent = models.ManyToManyField(to='self', blank=True, symmetrical=False)
|
|
x = models.SmallIntegerField(default=300)
|
|
y = models.SmallIntegerField(default=300)
|
|
|
|
def get_journals(self, **filter_extra):
|
|
threads = [i for i in self.thread_set.all()].append(self)
|
|
return Journal.objects.filter(thread_in=threads, **filter_extra).order_by('-date')
|
|
|
|
def check_perm(self, user):
|
|
return (user in self.subscribers.all()) or bool(sum([int(i.check_perm(user)) for i in self.parent.all()]))
|
|
|
|
def child_thread_count(self, step=None):
|
|
step = self.recurse_step if step is None else step
|
|
|
|
if step == 0:
|
|
return self.thread_set.count()
|
|
|
|
return sum([i.child_thread_count(step-1) for i in self.thread_set.all()])
|
|
|
|
def journals_count(self, step=None):
|
|
step = self.recurse_step if step is None else step
|
|
children = list(self.get_children(step))
|
|
children.append(self)
|
|
return Journal.objects.filter(thread__in=children).count()
|
|
|
|
def get_children(self, step):
|
|
children = self.thread_set.filter(is_staff=False)
|
|
|
|
if step == 0:
|
|
list(children).append(self)
|
|
return children
|
|
|
|
res = [self]
|
|
|
|
for child in children:
|
|
res += child.get_children(step=step-1)
|
|
|
|
return res
|
|
|
|
def __str__(self):
|
|
return self.key
|
|
|
|
|
|
class Action(models.Model):
|
|
name = models.CharField(max_length=255, verbose_name=u'Наименование действия (на английском)')
|
|
text = models.TextField(verbose_name=u'Описание действия')
|
|
|
|
def __str__(self):
|
|
return "%s (%s)" % (self.name, self.text) |