# 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='Тред') user = models.ForeignKey( to=settings.AUTH_USER_MODEL, verbose_name='Инициатор действия или тот, на ком действие инициируется' ) 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='Подписчики', blank=True) groups = models.ManyToManyField(to=Group, verbose_name='Группы подписчиков', 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