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

# 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)