# -*- coding: utf-8 -*- import datetime from django.db import models from redactor.fields import RedactorField from access.models import User from lms.settings import DOMAIN from lms.tools import random_string, user_fabric, out_date_format ACCESS = ( ('A', u'Только администратору'), ('S', u'Для сотрудников'), ('U', u'Только студентам'), ('O', u'Общедоступна') ) class WorkshopTools(models.Model): name = models.CharField(verbose_name=u'Название', max_length=255) icon = models.ImageField(verbose_name=u'Иконка', upload_to='tmp', blank=True, null=True) url = models.URLField(verbose_name=u'Ссылка', blank=True) description = models.TextField(verbose_name=u'Описание', blank=True, default='') def __unicode__(self): return u'%s' % self.name def __str__(self): return self.name def get_face(self): return { 'name': self.name, 'url': self.url if self.url else '', 'icon': self.icon.url if self.icon else '{0}/static/img/1441673088_new_seo3-01.png'.format(DOMAIN), 'description': self.description } class Meta: verbose_name = u'Инструмент' verbose_name_plural = u'Инструменты' class DataSheet(models.Model): # 'https://codemy.ru/practice/ title = models.CharField(verbose_name=u'Название', max_length=255, default='') key = models.CharField(verbose_name=u'Ключ данных', max_length=100, unique=True, blank=True, default='', help_text=u'Если пуст, сгененируется при сохранении') access = models.CharField(verbose_name=u'Доступ', choices=ACCESS, max_length=1, default='A') password = models.CharField(verbose_name=u'Пароль для доступа', max_length=100, blank=True, default='', help_text=u'Если его не указать, он не потребуется') password_help = models.TextField(verbose_name=u'Подсказка к паролю', blank=True, help_text=u'Будет отправлена, если пароль ввести не верно') data = models.TextField(verbose_name=u'Данные') split_char = models.CharField(verbose_name=u'Разделяющий символ', max_length=10, default=', ', blank=True) date = models.DateTimeField(verbose_name=u'Дата создания', default=datetime.datetime.now, editable=False) users = models.ManyToManyField(User, verbose_name=u'Пользователи', blank=True, null=True, editable=False) def __unicode__(self): return u'%s' % self.title def __str__(self): return self.title def get_data(self, password='', user=None): result = {'access': False, 'response': u'', 'data': ''} if self.password and self.password != password: result['response'] = self.password_help if self.password_help else 'Доступ отклонен' return result access = False if self.access == 'A': if user_fabric(user) and user.is_admin: access = True; self.append_user(user) elif self.access == 'S': if user_fabric(user) and user.is_staff or user.is_admin: access = True; self.append_user(user) elif self.access == 'U': if user_fabric(user): access = True; self.append_user(user) elif self.access == 'O': access = True if access: result['access'] = True result['data'] = self.data.split(self.split_char) if self.split_char else self.data else: result['response'] = u'Доступ отклонен' return result def append_user(self, user): if user_fabric(user) and not self.users.filter(id=user.id).exists(): self.users.add(user) def users_length(self): return self.users.count() def save(self, *args, **kwargs): if not self.key: self.key = random_string() super(DataSheet, self).save(*args, **kwargs) class Meta: verbose_name = u'Данные' verbose_name_plural = u'Данные' class Workshop(models.Model): title = models.CharField(verbose_name=u'Заголовок', max_length=255) key = models.CharField(verbose_name=u'Ключ', max_length=255, unique=True, blank=True, default='', help_text=u'Если пуст, сгененируется при сохранении') access = models.CharField(verbose_name=u'Доступ', choices=ACCESS, max_length=1, default='A') head = models.TextField(verbose_name=u'Заголовок', blank=True, default='', help_text=u'Добавление перед /') body = models.TextField(verbose_name=u'Объекты, вставляемые в body', blank=True, default='') description = RedactorField(verbose_name=u'Описание задачи', blank=True, null=True, default='') content = RedactorField(verbose_name=u'Описание методов', blank=True, default='', help_text=u'Добавление в /, после описаний и решений') variables = RedactorField(verbose_name=u'Описание переменных', blank=True, default='') tools = models.ManyToManyField(WorkshopTools, verbose_name=u'Используемые инструменты', blank=True, null=True) open_resolve = models.BooleanField(verbose_name=u'Открыть ответ', default=False) resolve = RedactorField(verbose_name=u'Ответ', blank=True, default='') will_open_resolve = models.DateTimeField(verbose_name=u'Открыть ответ в дату', blank=True, null=True, help_text=u'Доступ к ответу открыть в указанную дату, если это вообще нужно') date = models.DateTimeField(verbose_name=u'Дата создания', default=datetime.datetime.now, editable=False) users = models.ManyToManyField(User, verbose_name=u'Пользователи', blank=True, null=True, editable=False) views = models.IntegerField(verbose_name=u'Просмотров комнаты', default=0) def __unicode__(self): return u'%s' % self.title def __str__(self): return self.title def get_url(self): return u'{0}/practice/workshop/{1}'.format(DOMAIN, self.key) def append_view(self, request=None): if request: if not request.session.get('workshop#%s' % self.key): self.views += 1 request.session['workshop#%s' % self.key] = True self.save() def online_users_count(self): return self.users.filter(status='ON').count() def get_online_users(self): result = [] for user in self.users.filter(status='ON').order_by('id'): result.append(user.get_face()) return result def have_resolve(self): return bool(self.resolve) def get_resolve(self, user=None): if self.resolve: if self.open_resolve: return self.resolve return False def get_content(self, user=None, request=None): self.append_view(request) result = {'access': False, 'response': u'', 'data': ''} access = False if self.access == 'A': if user_fabric(user) and user.is_admin: access = True; self.append_user(user) elif self.access == 'S': if user_fabric(user) and user.is_staff or user.is_admin: access = True; self.append_user(user) elif self.access == 'U': if user_fabric(user): access = True; self.append_user(user) elif self.access == 'O': access = True if access: result['access'] = True result['data'] = {'content': self.content, 'head': self.head, 'resolve': self.get_resolve(user), 'description': self.description, 'tools': [i.get_face() for i in self.tools.all()], 'variables': self.variables, 'body': self.body } else: result['response'] = u'Доступ отклонен' return result def append_user(self, user): if user_fabric(user) and not self.users.filter(id=user.id).exists(): self.users.add(user) def get_face(self): return { 'title': self.title, 'access': self.get_access_display(), 'key': self.key, 'resolve': self.have_resolve(), 'date': out_date_format(self.date), 'students': self.users_length(), 'views': self.views, 'online': self.online_users_count(), 'now_users': self.get_online_users() } def users_length(self): return self.users.count() def save(self, *args, **kwargs): if not self.key: self.key = random_string() super(Workshop, self).save(*args, **kwargs) class Meta: verbose_name = u'Мастерская' verbose_name_plural = u'Мастерские'