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.
 
 
 
 
 
 

91 lines
3.4 KiB

# coding=utf-8
from __future__ import unicode_literals
from django.conf import settings
from django.contrib.auth.models import Group
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
ACTION_CHOICES = (
(0, 'try'),
(1, 'yes'),
(2, 'no'),
(3, 'favorite'),
(4, 'watch'),
(5, 'start'),
(6, 'end'),
(7, 'create'),
(8, 'update'),
(9, 'delete'),
)
# Новое 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(null=True, blank=True)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
action_type = models.SmallIntegerField(choices=ACTION_CHOICES)
date = models.DateTimeField(auto_now=True)
def __str__(self):
return '%d Пользователь %s %s %s' % (self.id, self.user.email, self.get_action_type_display(), 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)
groups = models.ManyToManyField(to=Group, 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